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 |
|
deploy-bot
|
a277a7325f
|
docs: 添加 nginx 站点启用超时修复实施计划
|
2026-06-02 21:58:49 +08:00 |
|
deploy-bot
|
85ba685bba
|
docs: 修复 spec 评审 3 发现的 3 个问题(步骤 3 两段式、domain 结构校验、步骤 4 warning+步骤 5 验证 default)
|
2026-06-02 21:52:04 +08:00 |
|
deploy-bot
|
78e97f6fee
|
docs: 修复 spec 评审 7 个问题(test 命令、失败短路、变量校验等)
|
2026-06-02 21:43:57 +08:00 |
|
deploy-bot
|
f6b3ba2d8c
|
docs: 添加 nginx 站点启用超时修复设计文档
|
2026-06-02 21:41:07 +08:00 |
|
peanut
|
2189ed24e6
|
docs: refine wechat auth design and plan
|
2026-05-31 23:37:02 +08:00 |
|