# reality-glitch **Repository Path**: rorop/reality-glitch ## Basic Information - **Project Name**: reality-glitch - **Description**: Reality Glitch(现实漏洞局)是一个面向 iOS、Android 与 Web 的低压力现实创作产品。产品通过每日观察任务,引导用户使用图片、短音频或文字重新注意真实世界,并在完成创作后进入同题展览,看见不同的人如何理解同一个题目。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-15 - **Last Updated**: 2026-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android, IOS, React-native, expo ## README
Reality Glitch 应用图标

Reality Glitch · 现实漏洞局

每天五分钟,重新看见现实。

以每日观察任务连接现实创作、同题展览与个人档案。

Expo 57 React Native 0.86 TypeScript 6 Java 21 Spring Boot 4.1 Apache License 2.0

项目背景 · 项目截图 · 用户流程 · 总体架构 · 工作区 · 快速启动

--- Reality Glitch(现实漏洞局)是一个面向 iOS、Android 与 Web 的低压力现实创作产品。产品通过每日观察任务,引导用户使用图片、短音频或文字重新注意真实世界,并在完成创作后进入同题展览,看见不同的人如何理解同一个题目。 | 维度 | 项目概览 | |---|---| | 产品闭环 | 今日任务 → 三媒介创作 → 草稿与上传 → 审核 → 同题展览 → 创作档案 | | 用户端 | Expo 57、React Native 0.86、Expo Router、HeroUI Native、Uniwind | | 服务端 | Java 21、Spring Boot 4.1、Sa-Token、PostgreSQL、Redis、Reality OSS | | 交付形态 | iOS、Android、Web、Reality API、运营管理前端 | ## 项目背景 ### 为什么要做这个产品 移动互联网提供了近乎无限的内容,但用户越来越容易停留在被动浏览、快速反馈和重复推荐中。很多人有拍照、记录声音或写下片段的愿望,却经常遇到三个问题:不知道创作什么、担心作品不够专业、发布后只得到由热度和排名驱动的反馈。 现实漏洞局从这些问题出发,把创作拆解成每天五分钟内可以理解和完成的小任务。任务不是专业命题,也不是强制打卡,而是一种重新观察日常环境的提示。例如寻找一个“正在假装成另一种东西”的物品、描述一处影子的轮廓,或记录一段容易被忽略的声音。 产品希望完成一次方向转换: ```mermaid flowchart LR A["被动浏览内容"] --> B["收到一个明确的今日任务"] B --> C["离开信息流,观察现实"] C --> D["用图片、声音或文字表达"] D --> E["看见同题作品的不同答案"] E --> F["形成个人现实观察档案"] classDef start fill:#EEF4F1,stroke:#1F746B,color:#15201C,stroke-width:1.5px; classDef signal fill:#FFF2EE,stroke:#F36B4F,color:#15201C,stroke-width:1.5px; class A,F start; class B,C,D,E signal; ``` ### 产品定位 现实漏洞局不是传统摄影社区、效率打卡工具或完整社交网络。它更接近一间每天发布观察任务、收录现实样本的轻型机构: - 用明确限制降低“我不知道创作什么”的启动成本。 - 用图片、声音和短文字覆盖不同表达习惯。 - 用同题展览呈现差异,而不是用粉丝数或公开排名评价用户。 - 用本地草稿、可靠上传和审核状态保护创作过程。 - 用创作日历、周报和分享卡帮助用户回顾自己的观察轨迹。 ### 目标用户 | 用户类型 | 典型问题 | 产品提供的价值 | |---|---|---| | 轻创作者 | 有表达欲,但缺少具体题目并担心作品不专业 | 可立即执行、没有专业门槛的每日任务 | | 城市观察者 | 熟悉的生活路线逐渐失去新鲜感 | 重新注意声音、光线、物品和空间细节的理由 | | 内容参与者 | 想参与有趣活动,但不愿制作复杂内容 | 五分钟内可完成、容易理解和分享的共同主题 | | 创作习惯建立者 | 记录分散,难以持续或回顾 | 草稿恢复、创作日历、周报和个人档案 | ### 核心产品原则 1. **先行动,后消费**:首页优先展示今日任务,展览位于创作动作之后。 2. **限制产生创意**:每个任务只包含清晰动作、媒介和安全边界。 3. **低压力表达**:不使用粉丝排名、公开评分、自由评论和惩罚性连续签到。 4. **尊重现实边界**:不鼓励偷拍、危险地点探索或不必要的精确定位。 5. **允许不完美**:作品可以简单,但应来自用户真实完成的观察。 6. **创作过程可恢复**:普通断网、应用重启和上传失败不应导致内容丢失。 --- ## 项目截图 以下截图均已再真机和模拟器验证通过。 ### 产品入口与主题
欢迎页 今日任务浅色模式 今日任务深色模式
欢迎与新手任务 今日任务 · 浅色模式 今日任务 · 深色模式
### 账号与任务流程
邮箱账号登录页 登录后的今日任务 今日任务详情
邮箱账号登录 运营账号今日任务 任务说明与安全边界
### 作品、展览与官方灵感
登录后的同题展览 已审核作品详情 今日官方灵感
同题展览 审核与公开状态 编辑部今日灵感
### 创作档案与账户设置
创作日历 档案作品列表
创作日历 档案作品
运营账号个人中心 通知设置
个人中心 通知与提醒
--- ## 产品能力 | 能力域 | 主要能力 | |---|---| | 账号与任务 | 游客试用、邮箱注册/登录、会话恢复、当地日期任务、每日一次换题 | | 三媒介创作 | 图片拍摄与压缩、短音频录制与试听、短文字输入与自动保存 | | 草稿与上传 | Zustand 本地草稿、文件持久化、启动恢复、私有上传会话、进度和重试 | | 发布与治理 | 幂等发布、自动/人工审核、公开派生媒体、举报、作品屏蔽和作者屏蔽 | | 展览与档案 | 同题展览、预设回应、收藏、创作日历、作品档案、本周现实报告和分享 | | 运营与体验 | 官方灵感、通知 Outbox、远程开关、埋点、Beta 反馈、Light/Dark 与无障碍基础 | --- ## 核心用户流程 ```mermaid flowchart TD A["打开现实漏洞局"] --> B{"游客试用或邮箱登录"} B -->|"游客"| C["查看任务示例与本机草稿"] B -->|"登录"| D["领取当地日期的今日任务"] C --> D D --> E{"保留任务或使用一次换题"} E -->|"保留"| F["阅读任务详情与安全边界"] E -->|"换题"| G["服务端原子更换任务"] G --> F F --> H{"选择创作媒介"} H -->|"图片"| I["拍摄 / 相册 / 压缩"] H -->|"声音"| J["录音 / 暂停 / 试听"] H -->|"文字"| K["输入 / 计数 / 自动保存"] I --> L["本地草稿"] J --> L K --> L L --> M["可恢复上传队列"] M --> N["Reality 私有上传与幂等发布"] N --> O{"安全审核结果"} O -->|"通过"| P["生成公开派生内容"] O -->|"等待复核"| Q["保持私有并展示处理中"] O -->|"可编辑拒绝"| R["返回草稿修改"] Q --> O R --> L P --> S["同题展览"] S --> T["回应 / 收藏 / 举报 / 屏蔽"] T --> U["创作档案 / 本周现实报告 / 分享"] classDef action fill:#EEF4F1,stroke:#1F746B,color:#15201C,stroke-width:1.2px; classDef decision fill:#FFF2EE,stroke:#F36B4F,color:#15201C,stroke-width:1.2px; classDef trusted fill:#EEF6FB,stroke:#2C6E9A,color:#15201C,stroke-width:1.2px; class B,E,H,O decision; class N,P trusted; class A,C,D,F,G,I,J,K,L,M,Q,R,S,T,U action; ``` 未审核内容始终保持私有;网络失败、应用重启或上传超时不得导致草稿丢失或产生重复作品。 --- ## 总体架构 ```mermaid flowchart TB subgraph Client["用户端 · reality-app"] Router["Expo Router"] UI["HeroUI Native + Uniwind"] Query["TanStack Query + Zod"] Local["Zustand + AsyncStorage + FileSystem"] Native["Camera + Audio + Notifications + SecureStore"] Router --> UI UI --> Query Query --> Local Local --> Native end Gateway["HTTPS · /app/v1"] subgraph Reality["可信服务端 · reality"] Auth["Reality Auth / Sa-Token"] Service["Spring 事务应用服务"] Data["MyBatis-Plus / PostgreSQL"] Cache["Redis / Redisson"] Contract["OpenAPI / Reality 响应 / 请求 ID"] Auth --> Service Contract --> Service Service --> Data Service --> Cache end subgraph Media["媒体与异步能力"] Private["私有原始媒体"] Moderation["自动审核 / 人工复核"] Public["公开派生媒体"] Push["通知 Outbox / Push"] Private --> Moderation Moderation -->|"审核通过"| Public end Query --> Gateway Gateway --> Auth Service --> Private Service --> Push Public --> Query Push --> Native classDef client fill:#EEF4F1,stroke:#1F746B,color:#15201C,stroke-width:1.2px; classDef server fill:#EEF6FB,stroke:#2C6E9A,color:#15201C,stroke-width:1.2px; classDef media fill:#FFF2EE,stroke:#F36B4F,color:#15201C,stroke-width:1.2px; class Router,UI,Query,Local,Native client; class Gateway,Auth,Service,Data,Cache,Contract server; class Private,Moderation,Public,Push media; ``` ### 架构原则 1. 页面保持轻量,业务规则集中在 `src/features/`。 2. TanStack Query 管理服务端状态,Zustand 只管理草稿、上传队列和本地偏好。 3. 所有 API 响应使用 Zod 进行运行时校验。 4. 用户归属、任务发放、作品发布、审核和公开状态由 Reality 服务端决定。 5. 原始媒体上传到私有 Bucket,审核通过后才生成公开派生资源。 --- ## 多项目工作区 本仓库采用多项目工作区,而不是把移动端、服务端和管理端放入一个运行时工程。这样可以让三类交付物保持独立依赖、独立构建和清晰的安全边界,同时在同一仓库内共享接口约定、数据库迁移、CI 配置和品牌规范。 ```text demo/ ├─ reality-app/ 用户使用的 Expo / React Native 应用 ├─ reality/ 可信 Reality Java 服务与 reality-glitch 领域模块 ├─ reality-admin/ 面向运营和管理人员的独立 Web 管理端 ├─ .github/ CI 工作流与 README 截图资源 ├─ .codex/ 项目级开发、质量和协作规则 └─ .agents/ HeroUI Native 等工程能力说明 ``` ### 工作区调用关系 ```mermaid flowchart LR Repo["Reality Glitch Workspace"] subgraph Products["产品交付工程"] App["reality-app
iOS · Android · Web"] Admin["reality-admin
运营与系统管理前端"] end Backend["reality
Reality Auth + Glitch Services"] subgraph Infrastructure["可信数据与基础设施"] PG["PostgreSQL"] Redis["Redis / Redisson"] OSS["Reality OSS"] end subgraph Shared["仓库共享能力"] CI[".github
CI 与 README 资产"] Rules[".codex / .agents
工程协作规则"] end Repo --> App Repo --> Admin Repo --> Backend Repo --> CI Repo --> Rules Repo --> Records App -->|"HTTPS · /app/v1"| Backend Admin -->|"受权限控制的管理 API"| Backend Backend --> PG Backend --> Redis Backend --> OSS classDef product fill:#EEF4F1,stroke:#1F746B,color:#15201C,stroke-width:1.2px; classDef backend fill:#EEF6FB,stroke:#2C6E9A,color:#15201C,stroke-width:1.2px; classDef shared fill:#FFF2EE,stroke:#F36B4F,color:#15201C,stroke-width:1.2px; class App,Admin product; class Backend,PG,Redis,OSS backend; class Repo,CI,Rules,Records shared; ``` 移动端和管理端不会互相引用源码。两者通过不同的服务端 API 边界协作:移动端只调用 `/app/v1`,管理端使用受权限控制的系统管理接口。任务发放、资源归属、审核决定、公开状态和数据清理由 Reality 服务端统一负责。 ### `reality-app/`:用户端应用 `reality-app` 是用户直接安装或访问的产品工程,使用 Expo Router 管理页面,使用 HeroUI Native 与 Uniwind 构建设计系统,并通过 TanStack Query、Zustand 和 Zod 管理远程状态、本地工作流与运行时数据校验。 主要职责: - 欢迎、游客、邮箱账号和会话恢复。 - 今日任务、换题、任务详情和安全提示。 - 图片、短音频和文字创作。 - 本地草稿、上传队列和失败恢复。 - 作品审核状态、同题展览和互动。 - 创作档案、周报、通知、分享和官方灵感。 - Light/Dark 主题、字体缩放和无障碍语义。 客户端只保存完成交互所需的公开配置和本地状态。所有可信业务判断通过 Reality API 完成。 ### `reality/`:可信后端与基础设施 `reality` 是 Java 21 / Spring Boot 4 模块化后端。工作区在既有 Reality 基础能力上增加 `reality-modules/reality-glitch` 领域模块,复用 Sa-Token、MyBatis-Plus、PostgreSQL、Redis/Redisson、Reality OSS、OpenAPI、日志和审计能力。 主要职责: - 移动邮箱账号、会话和 Profile。 - 当地日期任务发放、一次换题和并发控制。 - 私有上传会话、幂等作品创建和状态机。 - 自动审核、人工复核和公开派生媒体。 - 展览、回应、收藏、举报和屏蔽。 - 档案、周报、通知 Outbox、远程配置和分析事件。 - 官方灵感内容、可靠排期和后台调度。 - 数据库迁移、环境部署、冒烟脚本和运维配置。 后端运行入口位于 `reality/reality-admin`,现实漏洞局业务代码集中在独立领域模块中,避免把移动产品规则散落到系统公共模块。 ### `reality-admin/`:运营与管理前端 根目录的 `reality-admin` 是独立的 Vue 3、Vite、TypeScript、Pinia 和 Ant Design Vue 系管理端工程,使用 pnpm 管理依赖。它面向运营、审核和系统管理场景,不参与移动端 Bundle,也不能被移动端直接导入。 规划职责包括: - 任务模板、内容排期和官方灵感管理。 - 待复核作品、举报、申诉和审核记录。 - 用户限制、内容下架和安全审计。 - 运营配置、通知和数据看板。 - Reality 系统配置与权限管理。 移动端功能不应通过修改管理端前端来实现;管理端操作也必须经过 Reality 权限与审计接口。 ### 工程边界 | 事项 | 所属项目 | |---|---| | 页面、组件、设备能力、本地草稿 | `reality-app` | | API、认证、事务、数据库、Redis、OSS | `reality` | | 运营审核和系统管理界面 | `reality-admin` | --- ## 技术栈 ### 客户端 | 分类 | 技术 | |---|---| | 基础框架 | Expo 57、React 19、React Native 0.86、TypeScript 6 | | 路由 | Expo Router Typed Routes | | UI | HeroUI Native、Uniwind、Tailwind CSS v4 | | 服务端状态 | TanStack Query | | 本地状态 | Zustand | | 数据校验 | Zod | | 原生能力 | Expo Camera、Image Picker、Image Manipulator、Audio、FileSystem | | 会话与设备 | SecureStore、AsyncStorage、Notifications、Linking | | 分享 | Expo Sharing、React Native View Shot | | 动画与手势 | Reanimated、Gesture Handler、Worklets、Screens | ### 服务端 | 分类 | 技术 | |---|---| | 运行时 | Java 21、Spring Boot 4.1 | | 认证 | Sa-Token、移动端 `clientid` | | 数据访问 | MyBatis-Plus、PostgreSQL | | 缓存与并发 | Redis、Redisson、数据库约束与事务 | | 对象存储 | S3 Compatible Reality OSS / MinIO | | 接口契约 | Reality `R` 响应信封、Springdoc OpenAPI | | 可靠性 | 请求 ID、幂等键、Outbox、定时任务、审计日志 | | 构建 | Maven Wrapper | ## 移动端模块 移动端入口位于 `reality-app/`,Expo Router 路由文件只负责页面组合,领域实现集中在 `reality-app/src/features/`。 | 模块 | 职责 | |---|---| | `auth` | 游客、注册、登录、会话恢复与认证边界 | | `today` / `challenges` | 今日任务、领取、换题、详情与错误映射 | | `capture` | 图片、声音、文字编辑和媒体准备 | | `drafts` | 本地草稿索引、持久化和启动恢复 | | `uploads` | 上传状态机、重试、取消、进度和恢复 | | `submissions` | 发布预览、幂等发布、审核状态和作品详情 | | `gallery` | 同题展览、多媒介作品卡和互动入口 | | `archive` | 创作日历、作品与收藏归档 | | `recaps` | 周报、代表作品、公共分享和分享卡 | | `notifications` | 通知偏好、设备注册和深链 | | `inspirations` | 官方灵感主题与编辑部回答 | | `profile` / `beta` | 用户资料、设置和 Beta 反馈 | 公共 UI 包装位于 `reality-app/src/components/ui/`,根 Provider 位于 `reality-app/src/providers/`,Reality API Client、会话、埋点和通用工具位于 `reality-app/src/lib/`。 ## Reality 后端 后端入口位于 `reality/`,现实漏洞局领域模块为: ```text reality/reality-modules/reality-glitch/ └─ src/main/java/com/xscha/reality/glitch/ ├─ controller/app/ # /app/v1 移动端接口 ├─ domain/ # Entity、BO、VO ├─ mapper/ # MyBatis-Plus Mapper ├─ service/ # 领域服务接口 ├─ service/impl/ # 事务应用服务 ├─ job/ # 清理、通知、灵感等调度任务 ├─ event/ # 领域事件与异步协作 └─ config/ # 领域配置 ``` 移动端 Controller 覆盖认证、Profile、任务、上传、作品、展览、互动、档案、周报、通知、官方灵感、配置和 Beta 反馈。所有用户资源必须经过登录上下文、`clientid`、Service 层归属检查、事务和数据库约束保护。 数据库迁移位于 `reality/script/sql/postgres/`,当前包含核心表、工作流、账号资料、任务、上传、作品/展览、档案/周报、可靠性优化、文案、官方灵感和正式运行数据脚本。执行迁移前必须先备份并确认目标环境。 --- ## 环境要求 ### 通用 - Git。 - Node.js:Expo 57 支持的 Node 20.19.4、22.13.0、24.3.0 或更高兼容版本。 - npm:仓库使用 `package-lock.json`。 - Java 21:Reality 后端构建与测试。 - PostgreSQL、Redis 和 S3 Compatible OSS:运行完整后端时需要。 ### Android - Android Studio / Android SDK。 - Compile SDK 36、Target SDK 36、Build Tools 36.0.0。 - Android 模拟器或物理设备。 ### iOS - macOS、Xcode 和受支持的 iOS SDK。 - Windows/Linux 只能执行 iOS JavaScript Bundle 导出,不能完成本地原生构建。 ## 快速启动移动端 ```powershell cd reality-app npm ci Copy-Item .env.example .env.local npm start ``` `.env.local` 仅填写公开配置: ```dotenv EXPO_PUBLIC_REALITY_API_URL=https://api.example.com EXPO_PUBLIC_REALITY_CLIENT_ID=reality-glitch-mobile EXPO_PUBLIC_SHARE_BASE_URL=https://example.com EXPO_PUBLIC_APP_ENVIRONMENT=development ``` 常用启动命令: ```powershell npm start # Expo Go npm run start:clear # 清理 Metro 缓存后启动 npm run start:dev-client # Development Build npm run android # 生成/运行 Android 原生项目 npm run ios # macOS 上生成/运行 iOS 原生项目 npm run web # Web 开发服务器 ``` 相机、录音、通知、系统分享、后台中断和文件系统行为必须使用 Development Build 或真实设备验证,Expo Go 和模拟器不能代替完整原生验收。 ## 客户端验证与构建 ```powershell cd reality-app npm run typecheck npm run lint npm run test:unit npm run verify ``` `npm run verify` 依次执行 TypeScript、ESLint、Node 单元测试和 Expo Doctor。 导出三端 Bundle: ```powershell npm run export:web npm run export:android npm run export:ios ``` 本地 Android Release: ```powershell $env:NODE_ENV = 'production' npx expo run:android --variant release ``` EAS Profile: - `development`:Development Client,内部使用。 - `preview`:内部安装 APK。 - `production`:Google Play AAB,自动递增版本号。 正式发布前必须配置 EAS Project、Upload Key、Play App Signing、正式域名、推送凭据、Data Safety、隐私政策和 Google Play 测试轨道。 ## CI 根目录 `.github/workflows/ci.yml` 在 Pull Request 和 `main` 分支推送时执行: 1. Node 24 环境初始化。 2. `npm ci` 安装锁定依赖。 3. `npm run verify`。 4. Web 静态导出冒烟。 后端 Maven 测试、数据库迁移检查、真实 API 冒烟和原生设备测试仍需在对应开发/发布流程中执行。 --- ## License Copyright © 2026 [xscha.com](https://xscha.com). All rights reserved. 本项目基于 [Apache License 2.0](./LICENSE) 授权发布,版权与归属声明见 [NOTICE](./NOTICE)。项目使用的第三方库、框架和资源继续遵循其各自许可证。