Commit Graph

337 Commits

Author SHA1 Message Date
peanut 2c69da46e5 fix:修复个人档案性别字段保存后在我的页面不显示的问题(中英文格式兼容) 2026-06-15 12:13:49 +08:00
peanut 42543ff8a6 feat:结果页聊天发送消息时显示与心愿生成一致的动态加载效果 2026-06-15 12:01:12 +08:00
peanut c744d92f38 feat:MineView 个人档案调整为两行四列,移除个人中心和 MBTI 2026-06-15 11:42:10 +08:00
peanut 04cdd5585e feat:RecordView 移除 profile-card 相关样式 2026-06-15 10:53:57 +08:00
peanut a62257b21a feat:RecordView 移除无用的 computed 和方法 2026-06-15 10:52:22 +08:00
peanut 816e166e08 feat:RecordView 移除 profile-card 模板 2026-06-15 10:51:30 +08:00
peanut b9bacb36e7 feat:MineView 新增个人档案区块样式 2026-06-15 10:50:48 +08:00
peanut ffa77400c9 feat:MineView 新增个人档案区块模板 2026-06-15 10:50:04 +08:00
peanut d1e223ad23 feat:MineView 新增个人档案字段 computed 属性 2026-06-15 10:49:11 +08:00
peanut 83d3f87cf6 docs:修正实现计划中 .star 样式的保留说明 2026-06-15 10:47:03 +08:00
peanut 16cee44a85 docs:个人信息组件合并实现计划 2026-06-15 10:46:21 +08:00
peanut 49f73679d0 docs:个人信息组件合并设计文档 2026-06-15 10:43:42 +08:00
peanut 74a2c15b6b feat: 完善人生轨迹详情页功能及微信小程序登录优化 2026-06-15 10:17:30 +08:00
peanut cb3c5e6724 feat: 优化人生轨迹详情页布局与顶部安全区
- 合并事件标题卡与描述卡为统一的 event-content-card
- 移除顶部悬浮导航,避免与小程序原生胶囊按钮重叠
- 添加顶部安全区占位(参考 profile/index.vue 等页面)
- 调整按钮布局:收藏、分析、分享、编辑、收起放入内容区域
- 底部只保留居中的'聊聊'主按钮
- 使用 Markdown 组件渲染事件描述
- 添加 scrollToAnalysis 滚动定位功能
- 更新 AGENTS.md 添加操作系统命令执行规则
- 更新 CLAUDE.md 添加操作系统命令执行规则
2026-06-10 20:45:01 +08:00
peanut e021fe8443 docs:补充人生轨迹详情页调整实施计划 2026-06-09 23:05:27 +08:00
peanut d710f529fc docs:补充人生轨迹详情页操作区调整设计 2026-06-09 22:51:46 +08:00
peanut 00a93b66d8 fix: remove hardcoded defaults from profile edit page 2026-06-04 08:11:40 +08:00
peanut e2a02e0d5f fix: remove hardcoded defaults and sampleEvents from RecordView 2026-06-04 08:10:34 +08:00
peanut 675311a1be feat: extend registrationData with city/industry/company/personalityTags/birthday 2026-06-04 08:09:09 +08:00
peanut d4088069dd feat: add city/industry/company/personalityTags/birthday to userProfile transforms 2026-06-04 08:07:24 +08:00
peanut e55c3acc6a feat: extend UserProfileResponse with city/industry/company/personalityTags/birthday 2026-06-04 08:06:32 +08:00
peanut 059e7f8f52 feat: extend UserProfileUpdateRequest with city/industry/company/personalityTags/birthday 2026-06-04 08:05:55 +08:00
peanut b784942079 feat: extend UserProfileCreateRequest with city/industry/company/personalityTags/birthday 2026-06-04 08:05:23 +08:00
peanut b0a82dea13 feat: extend UserProfile entity with city/industry/company/personalityTags/birthday 2026-06-04 08:04:49 +08:00
peanut f7180eb83d db: add city, industry, company, personality_tags, birthday to t_user_profile 2026-06-04 08:03:56 +08:00
peanut 1e2de85f2e docs: add user profile real data implementation plan 2026-06-04 00:43:47 +08:00
peanut 10653edc52 fix(mine): replace hardcoded user info and stats with dynamic store data 2026-06-04 00:40:11 +08:00
peanut 55f06e8caf docs: add user profile real data design spec 2026-06-04 00:39:50 +08:00
peanut 1eb9ef67a4 fix(mine): replace static avatar with dynamic dicebear image 2026-06-04 00:39:42 +08:00
peanut a6dcc0843d docs: add mine view dynamic data design spec 2026-06-04 00:34:48 +08:00
peanut 8fce9ff87a fix(splash): remove profile check on session restore, always go to script page 2026-06-04 00:22:48 +08:00
peanut 0669af0203 fix(login): remove profile check, always redirect to script page after login 2026-06-04 00:22:44 +08:00
peanut 8ded0cc3ad docs: add login route fix design spec 2026-06-04 00:17:55 +08:00
peanut e23eb32c1d test: 集成测试验证 RestTemplate 运行时 User-Agent 为 Mozilla/5.0 2026-06-03 23:46:03 +08:00
peanut 2413b2bf58 feat(exception): GlobalExceptionHandler 新增 WechatApiException handler
解决问题:
- WechatApiException 抛出后未统一处理,会冒泡到 Spring 默认错误页(500 HTML)
- 前端拿不到结构化错误信息

改动:
- 新增 @ExceptionHandler(WechatApiException.class) 方法
- code=400 -> Result.badRequest()(微信业务错误)
- code=502 -> Result.error(502, message)(上游/网络错误)
- 其他(code=500) -> Result.error(message)(内部 JSON 解析错误)
- 日志记录 code 和 message(已确保不含敏感信息)
- 风格与现有 BusinessException handler 保持一致
2026-06-03 23:24:44 +08:00
peanut 76d4d7465c feat(wechat): 重写 code2Session 实现 5 步防御性处理
解决问题:
- 微信API返回 text/plain 时 JSONObject.parseObject 抛异常导致用户500
- 网络异常时 RestClientException 未被捕获
- 业务错误码(errcode != 0)未处理

实现 5 步防御:
1. 网络层:捕获 ResourceAccessException / RestClientException -> 502
2. HTTP 状态:手动检查 is2xxSuccessful(因 WechatResponseErrorHandler 让 4xx/5xx 不抛)-> 502
3. Content-Type:检查 isCompatibleWith(APPLICATION_JSON) -> 502
4. JSON 解析:try/catch 包裹 parseObject -> 500
5. 业务码:检查 errcode == 0 -> 400

TDD:先写 10 测试场景覆盖所有分支,再实现
- 正常 JSON 成功
- HTTP 4xx / 5xx
- Content-Type: text/plain / text/html
- JSON 解析失败
- 业务错误码 40029 / 40163
- 网络异常(ResourceAccessException)
- 响应缺少 session_key
2026-06-03 23:14:09 +08:00
peanut 012fa46d3a feat(wechat): 重写 RestTemplateConfig 统一 RestTemplate Bean
解决问题:
- WAF 拦截 Java/17.0.x 默认 User-Agent
- 无超时设置(线程可能被 hang 住)
- 无请求/响应日志(出问题时无排查依据)

改动:
- 用 BufferingClientHttpRequestFactory 包装 SimpleClientHttpRequestFactory
  (响应体缓存为字节数组,Interceptor/ErrorHandler/Converter 可多次读)
- 显式 User-Agent: Mozilla/5.0 (compatible; EmotionMuseum/1.0)
- 显式 Accept: application/json, text/plain, */*
- connect timeout 5s, read timeout 10s
- additionalInterceptors 加 WechatApiLoggingInterceptor(脱敏)
- additionalMessageConverters 加 StringHttpMessageConverter(UTF_8)
- errorHandler 用 WechatResponseErrorHandler(4xx/5xx 不抛)

兼容性:
- 7 个其他 RestTemplate 使用点(DifyProviderAdapter、
  CozeProviderAdapter、HttpTtsEngineClient、AsrServiceImpl、
  ApiEndpointServiceImpl、AiChatServiceImpl、ApiTestProxyController)
  行为完全不变(BufferingClientHttpRequestFactory 兼容所有流式 API)
2026-06-03 22:46:30 +08:00
peanut 9c785a675c feat(wechat): 新增 WechatResponseErrorHandler
- 继承 DefaultResponseErrorHandler
- 显式重写 hasError() 委托父类判断(4xx/5xx)
- handleError() 仅记录日志不抛异常
- 不在 handler 读 body(避免流消费,由 LoggingInterceptor 统一处理)
2026-06-03 22:39:20 +08:00
peanut 4452d0301c feat(wechat): 新增 WechatApiLoggingInterceptor 拦截器(含脱敏单元测试)
- ClientHttpRequestInterceptor 实现
- URL/method/status/content-type 用 INFO 级别
- body 用 DEBUG 级别,MAX_BODY_LOG=2048 截断
- 脱敏正则覆盖 session_key/openid/unionid/access_token/refresh_token/secret/appsecret
- 配合 BufferingClientHttpRequestFactory 使用避免流被消费
- 4 个单元测试覆盖主要脱敏场景
2026-06-03 22:37:22 +08:00
peanut 35baa6c958 feat(wechat): 新增 WechatApiException 业务异常类
- 继承 RuntimeException
- code 字段使用 HTTP 风格状态码(400/500/502)
- rawBody 字段保留原始响应体用于排查
- 配套 Getter 由 Lombok @Getter 生成
2026-06-03 22:23:40 +08:00
peanut 070e7dfbd9 docs(plan): 微信小程序登录修复实施计划
8 个任务,TDD 风格,频繁 commit:

- Task 1: WechatApiException 异常类(30 行)
- Task 2: WechatApiLoggingInterceptor 拦截器 + 4 个脱敏单元测试(60 行)
- Task 3: WechatResponseErrorHandler 错误处理器(30 行)
- Task 4: 重写 RestTemplateConfig 统一 Bean(13 → 40 行)
- Task 5: 重写 code2Session 五步防御 + 8 个单元测试(49 → 90 行)
- Task 6: application.yml 移除 app-id/app-secret 硬编码(2 行)
- Task 7: GlobalExceptionHandler 新增 WechatApiException handler(+25 行)
- Task 8: 端到端验证(mvn + 部署 + H5 + 脱敏检查 + 回滚测试)

总计约 280 行 Java + 2 行 YAML。每个任务独立 commit 便于回滚。

执行方式:Subagent-Driven(用户已选)
依赖技能:superpowers:subagent-driven-development
2026-06-03 22:18:11 +08:00
peanut 82c308b40a docs: 修复 spec 评审 Round 2 发现的 1 P0 编译错误 + 3 P2 一致性问题
P0 编译错误:
- MediaType.includesCompatibleWith() 不存在于 Spring Framework
  改为 MediaType.APPLICATION_JSON.isCompatibleWith(contentType)
  (避免实现阶段 mvn 编译直接阻塞)

P2 一致性:
- WechatResponseErrorHandler 类注释第 1 条错误('显式重写返回 true')
  改为正确的 '委托父类 4xx/5xx 判断'
- hasError() 方法内联注释自相矛盾
  改为正确的 '委托父类 DefaultResponseErrorHandler.hasError()'
- GlobalExceptionHandler.handleWechatApiException rawBody 日志未脱敏
  (Interceptor 已脱敏响应 body,但 rawBody 字段在异常对象中再次传递会绕过脱敏)
  新增 desensitizeForLog() 方法复用正则,覆盖 code 字段(authorization code 也需脱敏)
- 移除 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  (与现有 BusinessException handler 不一致;HTTP 层统一返回 200,业务错误由 Result.code 表达)
2026-06-03 07:42:59 +08:00
peanut 13f773f3f0 docs: 修复 spec 评审 17 个问题(4 P0 阻塞 + 7 P1 重要 + 6 P2 次要)
P0(阻塞):
- BufferingClientHttpRequestFactory 解决响应体流被消费破坏其他 7 个使用点
- WechatApiException 显式 handler 避免泄露原始错误消息给前端
- LoggingInterceptor 脱敏 session_key/openid/unionid 解决敏感信息泄露
- WechatResponseErrorHandler 显式重写 hasError 避免流消费冲突

P1(重要):
- 包结构统一(LoggingInterceptor → interceptor 包,ErrorHandler → config 包)
- WechatApiException 用 HTTP 风格错误码(400/500/502)替代负数
- app-id/app-secret 一致性:都删除硬编码默认值
- WAF 验证改为后端日志验证 UA(不再用 Postman)
- 列出 7 个其他 RestTemplate 使用点逐一评估

P2(次要):
- body 日志改 DEBUG(生产 INFO 不打印)
- 统一 [WeChatAPI] 日志前缀便于 grep
- rawBody 不放在 DTO(保持纯 DTO)
- 增加回滚方案说明
2026-06-03 07:35:50 +08:00
peanut 5631f22566 docs: 修复微信小程序登录 text/plain 错误设计文档(WAF 拦截 + 凭据硬编码) 2026-06-03 07:28:30 +08:00
peanut 76bc979cfe feat(tools): 添加服务器日志下载脚本
- 从生产服务器下载 emotion-single.log 到本地 logs/server/
- 自动创建目录、备份旧日志、显示文件大小信息
- 使用 scp 命令,依赖已配置的 SSH 免密登录
2026-06-03 00:08:14 +08:00
deploy-bot 820ff93dc7 test: 端到端验证 nginx 部署成功(7s 内完成,5 步骤全部通过) 2026-06-02 22:15:12 +08:00
deploy-bot 35834b121e feat(deploy): 实现 enable_nginx_site 步骤 5(验证)+ 集成到 deploy_nginx 2026-06-02 22:08:59 +08:00
deploy-bot b124fe78af feat(deploy): 实现 enable_nginx_site 步骤 3(两段式建链)+ 步骤 4(清 default) 2026-06-02 22:07:05 +08:00
deploy-bot a6df8dcb92 feat(deploy): 实现 enable_nginx_site 步骤 1(诊断)+ 步骤 2(清理) 2026-06-02 22:06:07 +08:00
deploy-bot a649357650 feat(deploy): 添加 enable_nginx_site 函数骨架 + 变量安全校验 2026-06-02 22:04:30 +08:00