# 万事宜 (Everything Is Suitable) 中国传统文化研究工具 — 紫微斗数排盘 / 黄历查询 / 运势分析 ## 项目概述 **万事宜**是一款纯客户端 UniApp 应用,所有计算和数据存储均在本地完成,无需网络连接、无需后端服务、无需注册账号。支持 H5、微信小程序、App 多端发布。 ## 项目结构 ``` everything-is-suitable/ ├── everything-is-suitable-uniapp/ # UniApp 主应用 │ ├── src/ │ │ ├── algorithms/ # 核心算法(紫微斗数、黄历、运势) │ │ ├── components/ # 通用组件 │ │ ├── locales/ # 国际化(9种语言) │ │ ├── pages/ # 页面 │ │ │ ├── almanac-search/ # 黄历搜索 │ │ │ ├── ziwei/ # 紫微斗数排盘 │ │ │ └── fortune/ # 运势分析 │ │ ├── services/ # 业务服务层(纯本地计算) │ │ ├── types/ # TypeScript 类型定义 │ │ ├── utils/ # 工具函数(存储、缓存、导出等) │ │ ├── App.vue │ │ ├── main.ts │ │ ├── manifest.json │ │ └── pages.json │ ├── e2e/ # E2E 测试(Playwright) │ ├── Jenkinsfile # Jenkins CI/CD 配置 │ ├── Dockerfile # H5 部署 Docker 配置 │ ├── nginx.conf # Nginx 配置(纯静态,无后端代理) │ ├── package.json │ ├── vite.config.ts │ └── vitest.config.ts ├── assets/ # 落地页素材 ├── docs/ # 项目文档 │ ├── plans/ # 历史规划文档 │ ├── baselines/ # 测试基线 │ ├── reports/ # 测试报告 │ └── superpowers/ # Superpowers 工作流计划 ├── index.html # 落地页 ├── i18n.js # 落地页国际化 └── README.md ``` ## 技术栈 | 类别 | 技术 | |------|------| | 框架 | UniApp (Vue 3 + TypeScript) | | 构建 | Vite | | 测试 | Vitest (单元) + Playwright (E2E) | | 国际化 | vue-i18n (9种语言) | | 存储 | uni.getStorageSync/setStorageSync | | CI/CD | Jenkins | | 部署 | Docker + Nginx (H5) | ## 快速开始 ### 前置要求 - Node.js >= 20.0.0 - npm >= 9.0.0 ### 安装与运行 ```bash cd everything-is-suitable-uniapp npm install # H5 开发模式 npm run dev:h5 # 微信小程序开发模式 npm run dev:mp-weixin ``` ### 构建 ```bash # 构建 H5 npm run build:h5 # 构建微信小程序 npm run build:mp-weixin ``` ### 测试 ```bash # 单元测试 npm run test # 单元测试 + 覆盖率 npm run test:coverage # E2E 测试 npm run test:e2e ``` ## 纯客户端架构说明 本应用采用纯客户端架构,核心特征: - **零网络请求**:所有算法(紫微斗数排盘、黄历计算、运势推演)均在客户端本地执行 - **零后端依赖**:无 API 调用、无数据库、无服务器(含云函数) - **本地存储**:用户数据通过 `uni.getStorageSync/setStorageSync` 存储在设备本地 - **无订阅推送**:纯客户端版本不依赖微信订阅消息 / 云函数,订阅管理功能已在纯客户端迁移中移除 - **离线可用**:manifest.json 中 INTERNET 权限设为 false,无需网络即可使用全部功能 - **隐私安全**:用户数据不离开设备,无需注册账号 ## 规划 ### 总体目标 构建一款纯客户端、离线可用的中国传统文化研究工具,支持紫微斗数排盘、黄历查询、运势分析三大核心功能,覆盖 H5、微信小程序、App 多端。 ### 里程碑 | 阶段 | 状态 | 说明 | |------|------|------| | **M1: 核心算法实现** | ✅ | 紫微斗数排盘、黄历计算、运势推演算法完成 | | **M2: 页面与交互开发** | ✅ | 三大核心页面(ziwei / almanac-search / fortune)开发完成 | | **M3: 国际化 & 多端适配** | ✅ | 9 种语言支持,UniApp 多端构建验证通过 | | **M4: 测试与质量保障** | ✅ | 单元测试 685 通过,E2E 测试 156 通过,覆盖率 90.24% | | **M5: 封版发布** | ✅ | 封版确认,通过最终验收 | ## 进度 ### 当前状态:v1.0.0 封版完成 ✅ (最终验收测试通过) > 更新日期: 2026-08-18 (用户旅程测试补充,封版依据强化) ### 用户旅程测试(本次新增) 基于真实用户使用流程新增 **5 个用户旅程、31 个旅程用例**(`e2e/journeys/`),作为封版依据: | 旅程 | 优先级 | 覆盖步骤 | 用例数 | |------|--------|----------|--------| | J-ZIWEI 紫微排盘完整旅程 | Critical | 表单→日期/时辰→性别→出生地识别→排盘→宫位→三方四正→总结 | 7 | | J-ALMANAC 黄历吉日搜索旅程 | Critical | 模板搜索→手动条件→天数→结果→排序 | 6 | | J-FORTUNE 运势分析旅程 | Common | 排盘持久化→跨页→日运→日期切换→月运 | 6 | | J-SUBSCRIBE 订阅管理旅程 | Common | 状态→时间选择→保存→取消订阅弹窗 | 6 | | J-NAV 跨页导航与状态保持 | Edge | 底部导航切换→往返→数据跨页保持 | 6 | **旅程测试发现并修复 2 个真实缺陷(P1):** 1. **底部导航切换失效**:`BottomNavigation` 中 `tabs.find` 应为 `tabs.value.find`(computed ref 未解包),导致三大功能页无法通过底部导航切换 2. **运势页排盘数据不刷新**:`fortune` 页仅用 `onMounted` 加载排盘数据,用户"先看运势→排盘→返回"时页面实例被缓存、数据不更新,已改为 `onShow` 刷新 **小程序端验收发现并修复 1 个 P0 缺陷:** 3. **全部页面异常($t is not a function)**:`createI18n` 使用 `legacy: false` 但缺少 `globalInjection: true`,导致小程序端模板 `$t` 未注入、所有页面渲染中断(报 `TypeError: a.$t is not a function`)。已在 `src/locales/index.ts` 显式启用 `globalInjection: true`(vue-i18n v9 官方要求),并新增防回归测试(TC-I18N-010) **小程序端验收发现并修复 1 个 P0 缺陷(插值失效):** 4. **全部插值文案失效({count} 字面量)**:uni-app 平台限制——小程序/App 端不支持 `{variable}` 字符串插值。已将 9 种语言共 63 处插值消息全部改为 **Messages Functions**(`({ named }) => ...`),并新增插值行为防回归测试 **新增功能:今日黄历默认展示(2026-08-18)** - 进入黄历搜索页默认展示**今日黄历**卡片(公历/农历/值神/吉神/宜忌/冲煞/纳音/胎神/彭祖百忌),组件:`src/components/TodayAlmanacCard/` - 新增 9 种语言 `almanac.*` 翻译 key(todayTitle/lunarDate/jianChu 等 10 项) **UI 层级验收发现并修复 1 个 P1 UI 缺陷(2026-08-19):** 5. **排盘页/运势页缺失底部导航**:三个 tab 页中仅黄历页有 `BottomNavigation`,用户切换到排盘/运势页后无法再通过底部导航切换。已在 `pages/ziwei/index.vue`、`pages/fortune/index.vue` 补上,并在 `navigation-journey.spec.ts` 增加目标页底部导航回归断言 **小程序端体验优化(2026-08-19):** 6. **px→rpx 机型自适应**:源码 97% 样式用 px(小程序端固定像素、不随机型缩放)。已通过 `postcss-px2rpx`(仅 mp-weixin 构建生效,H5 保持 px)将构建产物 px 占比降至 4.3%,布局/字体随机型等比缩放 7. **图标 iconfont 化(修复豆腐块)**:原 Icon 用 Unicode 冷门符号(⌕ ◷ ⏱ 等),Android 微信可能显示为豆腐块。已改为 FontAwesome 子集化图标字体(`scripts/iconfont-build.py` 生成,仅 3KB/36 图标,@font-face base64 内联),跨端可靠渲染 运行命令:`npm run test:journeys`(chromium 基线,跨浏览器兼容由既有 E2E 覆盖) ### 验收标准对照 | 标准 | 阈值 | 实际值 | 状态 | |------|------|--------|------| | 单元测试通过率 | ≥ 90% | **100%** (692/692) | ✅ | | 代码覆盖率 (指令) | ≥ 70% | **90.36%** | ✅ | | 代码覆盖率 (函数) | ≥ 70% | **94.18%** | ✅ | | 代码覆盖率 (分支) | ≥ 60% | **77.82%** | ✅ | | E2E 核心流程通过率 | ≥ 80% | **100%** (160/160) | ✅ | | 算法交叉验证 | 100% | **100%** | ✅ | | 算法执行时间 | < 500ms | **全部 < 200ms** | ✅ | | 页面加载时间 | < 3s | **~1.7s** | ✅ | | 国际化覆盖 | 9/9 语言 | **全部完整** | ✅ | | 浏览器兼容性 | 4/4 浏览器 | **全部通过** | ✅ | | 安全验证 | 全部通过 | **12/12 通过** | ✅ | | 无 P0 缺陷 | 0 | **0** | ✅ | ### 测试结果 - **单元测试**: 692/692 通过 (100%),35 个测试文件,执行时间 7.6s - **专项测试**: 55/55 通过 (性能测试 15 + 并发负载 4 + 安全测试 12 + 国际化验证 9 + 稳定性 4 + E2E 性能 5 + E2E 安全 4 + E2E 兼容 3) - **E2E 测试**: 160/160 通过 (100%),覆盖 Chromium/WebKit/Mobile Chrome/Mobile Safari 4 种浏览器 × 40 个用例 - **覆盖率**: 整体 90.36%,其中算法层 94.19%,服务层 92.68%,工具层 90.35% - **性能**: 算法执行均 < 200ms,页面加载均 < 2s,长时间使用无退化 - **安全**: 12 项安全验证全部通过,无 XSS 风险,网络权限严格受限 - **国际化**: 9 种语言键值完整一致 - **缺陷**: 0 个 P0 遗留,0 个 P1 遗留 ### 已知待办 - [ ] 补充组件层单元测试覆盖(BottomNavigation, Button, Card 等 11 个组件) - [ ] 补充 `lunar.ts` 分支覆盖(当前 64.13%) - [ ] 补充 `fortuneService.ts` 覆盖(当前 72%) - [ ] 逐步消除代码中 `as any` 类型断言 - [ ] 在 CI 标准环境中启用 Firefox 浏览器测试 (当前沙箱环境兼容性限制) - [ ] 修复微信小程序构建问题 (`@dcloudio/vite-plugin-uni` v3 alpha 兼容性限制) — **已修复,当前构建成功** - [ ] 修复 Ziwei 页面测试 i18n locale 配置 (zh → zh-CN) > 详细测试报告见: [docs/reports/v1.0.0-FINAL-ACCEPTANCE-REPORT.md](docs/reports/v1.0.0-FINAL-ACCEPTANCE-REPORT.md) > 测试计划文档见: [docs/plans/v1.0.0-RELEASE-TEST-PLAN.md](docs/plans/v1.0.0-RELEASE-TEST-PLAN.md) ## 功能模块 ### 黄历搜索 (almanac-search) - 每日宜忌查询 - 条件搜索(嫁娶、搬家、开市等) - 搜索历史与模板 ### 紫微斗数 (ziwei) - 自动排盘(支持公历输入) - 十二宫位完整展示 - 十四主星 + 辅星体系 - 三方四正分析 ### 运势分析 (fortune) - 每日/每月/每年运势 - 事业、财运、感情、健康多维度 - 幸运色、幸运数字、幸运方位 ## 许可证 MIT License