From 01bc803ebb52a1801a9952525b95b389c26bb2da Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 12 May 2026 20:50:15 +0800 Subject: [PATCH] =?UTF-8?q?update=E3=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 - README.md | 13 +- backend/.env.example | 1 + backend/README.md | 4 +- backend/app/api/v1/endpoints/readings.py | 8 + backend/app/api/v1/endpoints/reports.py | 2 + backend/app/core/config.py | 1 + backend/app/core/database.py | 2 +- backend/app/models/daily_usage.py | 19 ++ backend/app/schemas/quota.py | 10 + backend/app/services/bazi_analyzer.py | 21 +- backend/app/services/bazi_calculator.py | 75 ++++- backend/app/services/quota_service.py | 63 ++++ backend/app/services/reading_service.py | 3 + backend/app/services/share_poster_service.py | 4 +- backend/tests/test_readings_api.py | 37 ++- miniprogram/app.js | 13 - miniprogram/app.json | 38 --- miniprogram/app.wxss | 48 --- miniprogram/assets/tabbar/archive-active.png | Bin 424 -> 0 bytes miniprogram/assets/tabbar/archive-normal.png | Bin 428 -> 0 bytes miniprogram/assets/tabbar/ask-active.png | Bin 617 -> 0 bytes miniprogram/assets/tabbar/ask-normal.png | Bin 622 -> 0 bytes miniprogram/pages/generating/generating.js | 47 --- miniprogram/pages/generating/generating.json | 3 - miniprogram/pages/generating/generating.wxml | 6 - miniprogram/pages/generating/generating.wxss | 47 --- miniprogram/pages/history/history.js | 52 ---- miniprogram/pages/history/history.json | 3 - miniprogram/pages/history/history.wxml | 43 --- miniprogram/pages/history/history.wxss | 183 ------------ miniprogram/pages/index/index.js | 31 -- miniprogram/pages/index/index.json | 3 - miniprogram/pages/index/index.wxml | 31 -- miniprogram/pages/index/index.wxss | 186 ------------ miniprogram/pages/legal/legal.js | 1 - miniprogram/pages/legal/legal.json | 3 - miniprogram/pages/legal/legal.wxml | 18 -- miniprogram/pages/legal/legal.wxss | 23 -- miniprogram/pages/palm/palm.js | 96 ------ miniprogram/pages/palm/palm.json | 3 - miniprogram/pages/palm/palm.wxml | 31 -- miniprogram/pages/palm/palm.wxss | 104 ------- miniprogram/pages/report/report.js | 128 -------- miniprogram/pages/report/report.json | 4 - miniprogram/pages/report/report.wxml | 99 ------ miniprogram/pages/report/report.wxss | 298 ------------------- miniprogram/project.config.json | 39 --- miniprogram/sitemap.json | 8 - miniprogram/utils/config.js | 5 - miniprogram/utils/modules.js | 30 -- miniprogram/utils/request.js | 61 ---- palm_reading.db | Bin 94208 -> 0 bytes web/app/globals.css | 231 ++++++++++++-- web/app/layout.tsx | 36 ++- web/components/PalmWebApp.tsx | 155 ++++++++-- web/lib/api.ts | 7 + web/public/icon.svg | 7 + web/public/share-card.png | Bin 0 -> 155383 bytes web/public/share-card.svg | 25 ++ 60 files changed, 633 insertions(+), 1785 deletions(-) create mode 100644 backend/app/models/daily_usage.py create mode 100644 backend/app/schemas/quota.py create mode 100644 backend/app/services/quota_service.py delete mode 100644 miniprogram/app.js delete mode 100644 miniprogram/app.json delete mode 100644 miniprogram/app.wxss delete mode 100644 miniprogram/assets/tabbar/archive-active.png delete mode 100644 miniprogram/assets/tabbar/archive-normal.png delete mode 100644 miniprogram/assets/tabbar/ask-active.png delete mode 100644 miniprogram/assets/tabbar/ask-normal.png delete mode 100644 miniprogram/pages/generating/generating.js delete mode 100644 miniprogram/pages/generating/generating.json delete mode 100644 miniprogram/pages/generating/generating.wxml delete mode 100644 miniprogram/pages/generating/generating.wxss delete mode 100644 miniprogram/pages/history/history.js delete mode 100644 miniprogram/pages/history/history.json delete mode 100644 miniprogram/pages/history/history.wxml delete mode 100644 miniprogram/pages/history/history.wxss delete mode 100644 miniprogram/pages/index/index.js delete mode 100644 miniprogram/pages/index/index.json delete mode 100644 miniprogram/pages/index/index.wxml delete mode 100644 miniprogram/pages/index/index.wxss delete mode 100644 miniprogram/pages/legal/legal.js delete mode 100644 miniprogram/pages/legal/legal.json delete mode 100644 miniprogram/pages/legal/legal.wxml delete mode 100644 miniprogram/pages/legal/legal.wxss delete mode 100644 miniprogram/pages/palm/palm.js delete mode 100644 miniprogram/pages/palm/palm.json delete mode 100644 miniprogram/pages/palm/palm.wxml delete mode 100644 miniprogram/pages/palm/palm.wxss delete mode 100644 miniprogram/pages/report/report.js delete mode 100644 miniprogram/pages/report/report.json delete mode 100644 miniprogram/pages/report/report.wxml delete mode 100644 miniprogram/pages/report/report.wxss delete mode 100644 miniprogram/project.config.json delete mode 100644 miniprogram/sitemap.json delete mode 100644 miniprogram/utils/config.js delete mode 100644 miniprogram/utils/modules.js delete mode 100644 miniprogram/utils/request.js delete mode 100644 palm_reading.db create mode 100644 web/public/icon.svg create mode 100644 web/public/share-card.png create mode 100644 web/public/share-card.svg diff --git a/.gitignore b/.gitignore index 27d7f1c..9227349 100644 --- a/.gitignore +++ b/.gitignore @@ -76,15 +76,6 @@ pnpm-debug.log* # Keep package lock tracked !web/package-lock.json -# WeChat Mini Program local files -miniprogram/project.private.config.json -miniprogram/private.* -miniprogram/miniprogram_npm/ -miniprogram/npm/ -miniprogram/node_modules/ -miniprogram/dist/ -miniprogram/.idea/ - # Docker / generated local artifacts *.pid *.log diff --git a/README.md b/README.md index af7efdb..ab730cf 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ -# AI 手相报告 MVP +# 赛博先生 Web App -原生微信小程序 + Python FastAPI 后端的娱乐型手相报告应用。 +面向 Web 的 AI 命理娱乐应用,当前支持手相、面相、八字三类报告生成。产品定位为“娱乐占卜 + 自我反思”,不做确定性人生判断。 ## 目录 - `backend/`: FastAPI API、数据库模型、OpenAI 分析服务、图片存储。 -- `miniprogram/`: 原生微信小程序页面与请求封装。 - `web/`: Next.js Web App 主产品入口。 ## 本地运行后端 @@ -18,16 +17,12 @@ cp .env.example .env venv/bin/uvicorn app.main:app --reload ``` -默认使用 SQLite 和 mock 微信登录,便于本地开发。生产环境配置 `DATABASE_URL` 为 Postgres,配置微信、OpenAI 和对象存储参数。 +默认使用 SQLite 和匿名 Web 登录,便于本地开发。生产环境可配置 `DATABASE_URL` 为 Postgres,并配置 OpenAI 和对象存储参数。 ## 环境变量 见 `backend/.env.example`。 -## 小程序 - -用微信开发者工具打开 `miniprogram/`,把 `utils/config.js` 中的 `API_BASE_URL` 改成后端地址。 - ## Web App ```bash @@ -37,7 +32,7 @@ cp .env.example .env.local npm run dev ``` -默认连接 `http://127.0.0.1:8000/api/v1`。第一版 Web 使用匿名会话,浏览器会自动获取 token 并保存在 `localStorage`。 +默认连接 `http://127.0.0.1:8000/api/v1`。Web 使用匿名会话,浏览器会自动获取 token 并保存在 `localStorage`。 ## Docker Compose 一键部署 diff --git a/backend/.env.example b/backend/.env.example index 371117b..d83db54 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -3,6 +3,7 @@ ENVIRONMENT=development DATABASE_URL=sqlite+aiosqlite:///./palm_reading.db SECRET_KEY=change-me-in-production ACCESS_TOKEN_EXPIRE_MINUTES=43200 +DAILY_READING_LIMIT=5 OPENAI_API_KEY= OPENAI_BASE_URL= diff --git a/backend/README.md b/backend/README.md index cc934b3..cde36f0 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Backend -FastAPI 后端提供微信登录、图片上传、手相报告生成和历史报告管理。 +FastAPI 后端提供匿名登录、图片上传、手相/面相/八字报告生成和历史报告管理。 ## Run @@ -21,4 +21,4 @@ venv/bin/python -m app.cli 所有业务 API 位于 `/api/v1`。 -本地开发默认 `WECHAT_MOCK_LOGIN=true`,`OPENAI_API_KEY` 为空时会返回 mock 报告,便于先联调小程序流程。 +本地开发默认支持匿名登录,`OPENAI_API_KEY` 为空时会返回 mock 报告,便于先联调 Web 流程。 diff --git a/backend/app/api/v1/endpoints/readings.py b/backend/app/api/v1/endpoints/readings.py index 0015493..ce3aa6a 100644 --- a/backend/app/api/v1/endpoints/readings.py +++ b/backend/app/api/v1/endpoints/readings.py @@ -8,8 +8,10 @@ from app.core.security import get_current_user from app.models.reading import Reading from app.models.uploaded_image import UploadedImage from app.models.user import User +from app.schemas.quota import QuotaResponse from app.schemas.reading import BaziInput, ReadingCreate, ReadingDetail, ReadingSummary from app.services.image_service import ImageService +from app.services.quota_service import QuotaService from app.services.reading_service import ReadingService router = APIRouter() @@ -20,6 +22,11 @@ async def generate_reading_task(reading_id: str) -> None: await ReadingService().generate(session, reading_id) +@router.get("/quota", response_model=QuotaResponse) +async def get_reading_quota(user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + return await QuotaService().get_quota(db, user.id) + + @router.post("", response_model=ReadingDetail, status_code=status.HTTP_201_CREATED) async def create_reading( payload: ReadingCreate, @@ -41,6 +48,7 @@ async def create_reading( except ValidationError as exc: raise HTTPException(status_code=422, detail=exc.errors()) from exc + await QuotaService().consume(db, user.id) reading = Reading( user_id=user.id, reading_type=payload.reading_type, diff --git a/backend/app/api/v1/endpoints/reports.py b/backend/app/api/v1/endpoints/reports.py index 94e656e..52f0e7f 100644 --- a/backend/app/api/v1/endpoints/reports.py +++ b/backend/app/api/v1/endpoints/reports.py @@ -13,6 +13,7 @@ from app.models.user import User from app.schemas.share_image import ShareImageJobResponse from app.schemas.report import ReportCreate, ReportDetail, ReportSummary from app.services.image_service import ImageService +from app.services.quota_service import QuotaService from app.services.report_service import ReportService from app.services.share_poster_service import SharePosterService @@ -66,6 +67,7 @@ async def create_report( if image is None: raise HTTPException(status_code=404, detail="Image not found") + await QuotaService().consume(db, user.id) report = PalmReport(user_id=user.id, image_id=image.id, hand_side=payload.hand_side, status="pending") db.add(report) await db.flush() diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 513fac7..6b0a90e 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -11,6 +11,7 @@ class Settings(BaseSettings): secret_key: str = "change-me-in-production" access_token_expire_minutes: int = 60 * 24 * 30 cors_origins: list[str] = Field(default_factory=lambda: ["*"]) + daily_reading_limit: int = 5 openai_api_key: str | None = None openai_base_url: str | None = None diff --git a/backend/app/core/database.py b/backend/app/core/database.py index 1a54f01..a2b8f17 100644 --- a/backend/app/core/database.py +++ b/backend/app/core/database.py @@ -25,7 +25,7 @@ async def get_db() -> AsyncGenerator[AsyncSession, None]: async def init_db() -> None: - from app.models import palm_report, reading, share_image_job, uploaded_image, user # noqa: F401 + from app.models import daily_usage, palm_report, reading, share_image_job, uploaded_image, user # noqa: F401 async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) diff --git a/backend/app/models/daily_usage.py b/backend/app/models/daily_usage.py new file mode 100644 index 0000000..b1ab5b0 --- /dev/null +++ b/backend/app/models/daily_usage.py @@ -0,0 +1,19 @@ +from datetime import date, datetime +from uuid import uuid4 + +from sqlalchemy import Date, DateTime, ForeignKey, Integer, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column + +from app.core.database import Base + + +class DailyUsage(Base): + __tablename__ = "daily_usages" + __table_args__ = (UniqueConstraint("user_id", "usage_date", name="uq_daily_usage_user_date"),) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + user_id: Mapped[str] = mapped_column(String(36), ForeignKey("users.id"), index=True) + usage_date: Mapped[date] = mapped_column(Date, index=True) + count: Mapped[int] = mapped_column(Integer, default=0) + created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) + updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) diff --git a/backend/app/schemas/quota.py b/backend/app/schemas/quota.py new file mode 100644 index 0000000..db31131 --- /dev/null +++ b/backend/app/schemas/quota.py @@ -0,0 +1,10 @@ +from datetime import datetime + +from pydantic import BaseModel + + +class QuotaResponse(BaseModel): + limit: int + used: int + remaining: int + reset_at: datetime diff --git a/backend/app/services/bazi_analyzer.py b/backend/app/services/bazi_analyzer.py index 3d835ec..f2ac7aa 100644 --- a/backend/app/services/bazi_analyzer.py +++ b/backend/app/services/bazi_analyzer.py @@ -5,14 +5,17 @@ from app.services.analyzer_common import DISCLAIMER, BaseAnalyzer USER_PROMPT_TEMPLATE = ( "请基于下面这份八字排盘结果,生成中文八字娱乐报告。" "排盘结果由后端计算,不能自行改动四柱:{chart_json}" - "必须覆盖四柱结构、日主与五行、十神关系、学习成长、事业节奏、关系沟通、近期行动。" + "必须覆盖四柱结构、日主与五行、五行分布、十神关系、学习成长、事业节奏、关系沟通、近期行动。" "写作要求:" - "1. overall_summary 用 2 到 4 句话,像给用户本人看的开场结论。" - "2. dimensions 中每个 interpretation 必须落到现实场景,例如学习效率、职业节奏、沟通方式、情绪恢复、计划执行。" - "3. 每个 advice 必须是今天或本周能做的小建议。" - "4. 可以少量使用日主、五行、十神等术语,但必须用普通人能听懂的话解释。" - "5. 不预测寿命、灾祸、婚姻成败、财富结果,不做宿命论。" - "6. 如果时辰不详,要诚实降低相关维度 confidence,并说明分析会更偏概览。" + "1. dimensions 固定输出 7 项:四柱底色、日主与五行、十神互动、学习成长、事业节奏、关系沟通、近期行动。" + "2. overall_summary 用 2 到 4 句话,像给用户本人看的开场结论,不要像百科解释。" + "3. 每个 interpretation 必须落到现实场景,例如学习效率、职业节奏、沟通方式、情绪恢复、计划执行。" + "4. observations 可以写排盘证据,但不要只堆术语;每条都要让普通用户看得懂。" + "5. 每个 advice 必须是今天或本周能做的小建议,避免空话。" + "6. strengths、challenges、suggestions 要分别覆盖生活、学习、事业、关系,语言要具体。" + "7. 可以少量使用日主、五行、十神等术语,但必须用普通人能听懂的话解释。" + "8. 不预测寿命、灾祸、婚姻成败、财富结果,不做宿命论。" + "9. 如果时辰不详,要诚实降低相关维度 confidence,并说明分析会更偏概览。" ) @@ -49,8 +52,8 @@ class BaziAnalyzer(BaseAnalyzer): }, { "name": "日主与五行", - "observations": [f"日主:{day_master}", f"五行线索:{chart.get('wuxing', {})}"], - "interpretation": "日主象征你处理世界的核心方式。你适合找到自己的稳定补给,再去应对学习、工作和关系里的变化。", + "observations": [f"日主:{day_master}", f"五行分布:{chart.get('wuxing_balance', {})}"], + "interpretation": "日主象征你处理世界的核心方式,五行分布则像精力使用习惯。现实里,你适合先找到稳定补给,再去应对学习、工作和关系里的变化。", "confidence": 0.7, "advice": "这周给自己固定一个恢复时间,别把精力全部交给外界安排。", }, diff --git a/backend/app/services/bazi_calculator.py b/backend/app/services/bazi_calculator.py index 7779557..26ed5f6 100644 --- a/backend/app/services/bazi_calculator.py +++ b/backend/app/services/bazi_calculator.py @@ -7,6 +7,35 @@ except ImportError: # pragma: no cover - production image installs the package Solar = None +STEM_WUXING = { + "甲": "木", + "乙": "木", + "丙": "火", + "丁": "火", + "戊": "土", + "己": "土", + "庚": "金", + "辛": "金", + "壬": "水", + "癸": "水", +} + +BRANCH_WUXING = { + "子": "水", + "丑": "土", + "寅": "木", + "卯": "木", + "辰": "土", + "巳": "火", + "午": "火", + "未": "土", + "申": "金", + "酉": "金", + "戌": "土", + "亥": "水", +} + + class BaziCalculator: def calculate(self, payload: dict) -> dict: birth_date = payload["birth_date"] @@ -25,6 +54,12 @@ class BaziCalculator: solar = Solar.fromYmdHms(year, month, day, hour, minute, 0) lunar = solar.getLunar() eight = lunar.getEightChar() + pillars = { + "year": eight.getYear(), + "month": eight.getMonth(), + "day": eight.getDay(), + "time": eight.getTime() if not time_unknown else "时辰不详", + } return { "calendar_type": calendar_type, "is_leap_month": bool(payload.get("is_leap_month")), @@ -36,12 +71,7 @@ class BaziCalculator: "gender": payload.get("gender"), "solar_date": f"{solar.getYear():04d}-{solar.getMonth():02d}-{solar.getDay():02d}", "lunar_date": f"{lunar.getYear()}年{lunar.getMonth()}月{lunar.getDay()}日", - "pillars": { - "year": eight.getYear(), - "month": eight.getMonth(), - "day": eight.getDay(), - "time": eight.getTime() if not time_unknown else "时辰不详", - }, + "pillars": pillars, "wuxing": { "year": eight.getYearWuXing(), "month": eight.getMonthWuXing(), @@ -54,7 +84,14 @@ class BaziCalculator: "day": "日主", "time": eight.getTimeShiShenGan() if not time_unknown else "时辰不详", }, + "wuxing_balance": self._count_wuxing(pillars), "day_master": eight.getDayGan(), + "chart_notes": [ + "出生地仅用于报告语境,不参与经度校正。", + "时辰不详时,时柱相关判断会降低权重。", + ] + if time_unknown + else ["出生地仅用于报告语境,不参与经度校正。"], } return self._fallback_chart(payload, year, month, day, hour, minute, time_unknown) @@ -67,6 +104,12 @@ class BaziCalculator: def pillar(offset: int) -> str: return stems[(seed + offset) % 10] + branches[(seed + offset) % 12] + pillars = { + "year": pillar(0), + "month": pillar(13), + "day": pillar(27), + "time": pillar(41) if not time_unknown else "时辰不详", + } return { "calendar_type": payload.get("calendar_type", "solar"), "is_leap_month": bool(payload.get("is_leap_month")), @@ -78,15 +121,12 @@ class BaziCalculator: "gender": payload.get("gender"), "solar_date": payload["birth_date"], "lunar_date": "本地未安装 lunar_python,暂用娱乐排盘", - "pillars": { - "year": pillar(0), - "month": pillar(13), - "day": pillar(27), - "time": pillar(41) if not time_unknown else "时辰不详", - }, + "pillars": pillars, "wuxing": {"year": "参考", "month": "参考", "day": "参考", "time": "参考"}, "shi_shen": {"year": "参考", "month": "参考", "day": "日主", "time": "参考"}, + "wuxing_balance": self._count_wuxing(pillars), "day_master": pillar(27)[0], + "chart_notes": ["本地未安装 lunar_python,当前为兜底娱乐排盘。"], } def _parse_date(self, value: str) -> tuple[int, int, int]: @@ -96,3 +136,14 @@ class BaziCalculator: def _parse_time(self, value: str) -> tuple[int, int]: parsed = datetime.strptime(value, "%H:%M") return parsed.hour, parsed.minute + + def _count_wuxing(self, pillars: dict) -> dict: + counts = {"木": 0, "火": 0, "土": 0, "金": 0, "水": 0} + for pillar in pillars.values(): + if not isinstance(pillar, str) or pillar == "时辰不详": + continue + for char in pillar: + element = STEM_WUXING.get(char) or BRANCH_WUXING.get(char) + if element: + counts[element] += 1 + return counts diff --git a/backend/app/services/quota_service.py b/backend/app/services/quota_service.py new file mode 100644 index 0000000..29c7654 --- /dev/null +++ b/backend/app/services/quota_service.py @@ -0,0 +1,63 @@ +from datetime import datetime, time, timedelta +from zoneinfo import ZoneInfo + +from fastapi import HTTPException, status +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.core.config import settings +from app.models.daily_usage import DailyUsage + +SHANGHAI_TZ = ZoneInfo("Asia/Shanghai") + + +class QuotaService: + def today(self): + return datetime.now(SHANGHAI_TZ).date() + + def reset_at(self) -> datetime: + tomorrow = self.today() + timedelta(days=1) + return datetime.combine(tomorrow, time.min, tzinfo=SHANGHAI_TZ) + + async def get_quota(self, db: AsyncSession, user_id: str) -> dict: + usage = await self._get_usage(db, user_id) + used = usage.count if usage else 0 + return self._quota_payload(used) + + async def consume(self, db: AsyncSession, user_id: str) -> dict: + usage = await self._get_usage(db, user_id) + if usage is None: + usage = DailyUsage(user_id=user_id, usage_date=self.today(), count=0) + db.add(usage) + await db.flush() + + if usage.count >= settings.daily_reading_limit: + quota = self._quota_payload(usage.count) + raise HTTPException( + status_code=status.HTTP_429_TOO_MANY_REQUESTS, + detail=f"今日 {settings.daily_reading_limit} 次解读机会已用完,请明天 0 点后再来。", + headers={ + "X-RateLimit-Limit": str(quota["limit"]), + "X-RateLimit-Remaining": str(quota["remaining"]), + "X-RateLimit-Reset": quota["reset_at"].isoformat(), + }, + ) + + usage.count += 1 + await db.flush() + return self._quota_payload(usage.count) + + async def _get_usage(self, db: AsyncSession, user_id: str) -> DailyUsage | None: + result = await db.execute( + select(DailyUsage).where(DailyUsage.user_id == user_id, DailyUsage.usage_date == self.today()) + ) + return result.scalar_one_or_none() + + def _quota_payload(self, used: int) -> dict: + limit = settings.daily_reading_limit + return { + "limit": limit, + "used": used, + "remaining": max(0, limit - used), + "reset_at": self.reset_at(), + } diff --git a/backend/app/services/reading_service.py b/backend/app/services/reading_service.py index 1f39abf..eebd064 100644 --- a/backend/app/services/reading_service.py +++ b/backend/app/services/reading_service.py @@ -16,8 +16,11 @@ class ReadingService: reading = result.scalar_one() reading.status = "processing" await db.flush() + await db.commit() try: + result = await db.execute(select(Reading).where(Reading.id == reading_id)) + reading = result.scalar_one() if reading.reading_type == "palm": data = await self._generate_palm(db, reading) elif reading.reading_type == "face": diff --git a/backend/app/services/share_poster_service.py b/backend/app/services/share_poster_service.py index 01fcbc0..da70d75 100644 --- a/backend/app/services/share_poster_service.py +++ b/backend/app/services/share_poster_service.py @@ -52,7 +52,7 @@ class SharePosterService: response = await self.client.images.generate( model=settings.openai_image_model, prompt=( - "生成一张竖版高端小程序分享海报背景,不要任何文字、不要数字、不要 logo。" + "生成一张竖版高端移动端分享海报背景,不要任何文字、不要数字、不要 logo。" "主题:赛博先生 AI 命理实验室,手相报告。" "必须包含精美的发光手掌、掌纹扫描线、AI 电路线、东方玄学圆形符号。" "设计风格:深墨黑背景 #080d10,青绿色 AI 发光线条 #00e0b8,少量金色点缀 #d8a84e;" @@ -134,7 +134,7 @@ class SharePosterService: hand_side = {"left": "左手", "right": "右手", "unknown": "未知手"}.get(report.hand_side, "未知手") return ( - "生成一张竖版中文小程序分享海报,比例 2:3,精美、高级、可读性很高。" + "生成一张竖版中文移动端分享海报,比例 2:3,精美、高级、可读性很高。" "品牌是“赛博先生”,定位是 AI 命理实验室,功能是手相报告。" "设计风格:深墨黑背景 #080d10,青绿色 AI 发光线条 #00e0b8,少量金色点缀 #d8a84e;" "现代、东方玄学、AI 扫描终端感;不要卡通,不要恐怖,不要传统庙宇风,不要紫色渐变。" diff --git a/backend/tests/test_readings_api.py b/backend/tests/test_readings_api.py index 4675b36..30dfd1a 100644 --- a/backend/tests/test_readings_api.py +++ b/backend/tests/test_readings_api.py @@ -1,5 +1,6 @@ import pytest from httpx import ASGITransport, AsyncClient +from uuid import uuid4 from app.core.database import init_db from app.main import app @@ -11,7 +12,7 @@ async def test_bazi_reading_lifecycle(monkeypatch): await init_db() transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: - auth = await client.post("/api/v1/auth/anonymous-login", json={"client_id": "readings-bazi"}) + auth = await client.post("/api/v1/auth/anonymous-login", json={"client_id": f"readings-bazi-{uuid4()}"}) token = auth.json()["access_token"] headers = {"authorization": f"Bearer {token}"} @@ -43,3 +44,37 @@ async def test_bazi_reading_lifecycle(monkeypatch): deleted = await client.delete(f"/api/v1/readings/{reading_id}", headers=headers) assert deleted.status_code == 200 + + +@pytest.mark.asyncio +async def test_daily_reading_quota_blocks_sixth_request(monkeypatch): + monkeypatch.setattr("app.services.analyzer_common.settings.openai_api_key", None) + await init_db() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + auth = await client.post("/api/v1/auth/anonymous-login", json={"client_id": f"readings-quota-{uuid4()}"}) + token = auth.json()["access_token"] + headers = {"authorization": f"Bearer {token}"} + payload = { + "reading_type": "bazi", + "input_data": { + "calendar_type": "solar", + "birth_date": "1992-08-18", + "birth_time": "09:30", + "time_unknown": False, + "birth_place": "广东深圳", + }, + } + + quota_before = await client.get("/api/v1/readings/quota", headers=headers) + assert quota_before.status_code == 200 + + for _ in range(5): + response = await client.post("/api/v1/readings", headers=headers, json=payload) + assert response.status_code == 201 + + blocked = await client.post("/api/v1/readings", headers=headers, json=payload) + assert blocked.status_code == 429 + + quota_after = await client.get("/api/v1/readings/quota", headers=headers) + assert quota_after.json()["remaining"] == 0 diff --git a/miniprogram/app.js b/miniprogram/app.js deleted file mode 100644 index c6becfe..0000000 --- a/miniprogram/app.js +++ /dev/null @@ -1,13 +0,0 @@ -App({ - globalData: { - token: wx.getStorageSync('token') || '' - }, - setToken(token) { - this.globalData.token = token - wx.setStorageSync('token', token) - }, - clearToken() { - this.globalData.token = '' - wx.removeStorageSync('token') - } -}) diff --git a/miniprogram/app.json b/miniprogram/app.json deleted file mode 100644 index fd32804..0000000 --- a/miniprogram/app.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "pages": [ - "pages/index/index", - "pages/palm/palm", - "pages/generating/generating", - "pages/report/report", - "pages/history/history", - "pages/legal/legal" - ], - "window": { - "navigationBarTitleText": "赛博先生", - "navigationBarBackgroundColor": "#080d10", - "navigationBarTextStyle": "white", - "backgroundColor": "#080d10" - }, - "tabBar": { - "color": "#728389", - "selectedColor": "#00e0b8", - "backgroundColor": "#0b1215", - "borderStyle": "black", - "list": [ - { - "pagePath": "pages/index/index", - "text": "问先生", - "iconPath": "assets/tabbar/ask-normal.png", - "selectedIconPath": "assets/tabbar/ask-active.png" - }, - { - "pagePath": "pages/history/history", - "text": "档案", - "iconPath": "assets/tabbar/archive-normal.png", - "selectedIconPath": "assets/tabbar/archive-active.png" - } - ] - }, - "style": "v2", - "sitemapLocation": "sitemap.json" -} diff --git a/miniprogram/app.wxss b/miniprogram/app.wxss deleted file mode 100644 index 368c745..0000000 --- a/miniprogram/app.wxss +++ /dev/null @@ -1,48 +0,0 @@ -page { - background: #080d10; - color: #f2e9d8; - font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif; -} - -.page { - min-height: 100vh; - padding: 32rpx; - box-sizing: border-box; - background: - linear-gradient(180deg, rgba(0, 224, 184, 0.08), rgba(8, 13, 16, 0) 320rpx), - repeating-linear-gradient(90deg, rgba(242, 233, 216, 0.035) 0, rgba(242, 233, 216, 0.035) 1rpx, transparent 1rpx, transparent 48rpx), - #080d10; -} - -.panel { - background: rgba(16, 25, 28, 0.92); - border: 1rpx solid rgba(0, 224, 184, 0.22); - border-radius: 16rpx; - padding: 28rpx; - box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.24); -} - -.primary-btn { - background: #00e0b8; - color: #06100e; - border-radius: 12rpx; - font-weight: 800; -} - -.ghost-btn { - background: rgba(8, 13, 16, 0.72); - color: #00e0b8; - border: 1rpx solid rgba(0, 224, 184, 0.56); - border-radius: 12rpx; -} - -.muted { - color: #8da0a4; -} - -.section-title { - font-size: 34rpx; - font-weight: 700; - margin: 32rpx 0 16rpx; - color: #f2e9d8; -} diff --git a/miniprogram/assets/tabbar/archive-active.png b/miniprogram/assets/tabbar/archive-active.png deleted file mode 100644 index dbfa2f6d5813f1af1dd2b6643dbe714e46697768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V9fV)aSW-L^Y)If-(dq0w~Jen z6yx~3(=2atdU*H*L@Q2te%}5$&&(^|);?AdvgHG61c3(8ySwUc{rp&YX3^gJ*EkI> zA1dc7v|n|0&kxyS@zM$3j=neO-^H+6r|x4-7Soz-KUzOmS&Qx6U9l^p{^y^*_yw=a z53D};J?_u{D${e_kFVTkJ-hA4+~c?P8TdH`)Es6oB)(?P*w1(Q;JmL6LBoN5mBc;7kxd=KaEFPFJJ&w4@c=eVr%49u=4Vw>E$3)1F!f8#Sa z(0AjzkO>FlAr=l{g`EEF3v+v-&$+*8Fo24j-@cG}BQsdm2PWv#u)+3T8{Z#;4E7eN zTkf^B-DJGYBJprr@qv%`(*K$NH?xmv;F`8 diff --git a/miniprogram/assets/tabbar/archive-normal.png b/miniprogram/assets/tabbar/archive-normal.png deleted file mode 100644 index 0e416cd5bae5325a2eeba4365dee94df0f2bb738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U@Z1@aSW-L^Y+e8KW0M_)(eV{ zx|c6p!wiX|UVBM3Bz?){SUW=~y>+~kb+`LS7- zmrk6?b>F(B=q zzkHGWu;TOH?*H-qzka?cI92YrS#*DS{chF+xlA0w4l@`IP2*qiH_FG|dU1(8drv^e zXTRH>b8mezPAGxMm&LYB4i|nt*Y(Hq@AGPJ7qM+=e7AHPPr?#`r1c9fI$1bBpR|@) zBGE19HLqR&O2X)s`H;Z*QpNQ}PM)^~&lVj)NgT>MU3UyXzb zGgu!`a3?RXF>@JbLQC%Rj=y`){4xKpWoy6vLM`tM)s~gJ+^!)S28k<^hj z?x_SA)l!Cc>#7mps8dQuhbZQ>6yS&>N}?0g^II0-k&8EJKW~gR=GpEm0>>EGb6IJz zFU>osMZK)jZ@b$4v8gEyyT4~NU9T5zko?f^<*Z1)xe}#FeFW5aXLsIyYu5RAw4qr? z3KR7H;{@ojd(UXgA97WHWO!}2MPYs^~WJOO$yv^2Dr zJxLO7d<3-Y&eG`2N53<=EB8u4<<8>Ybx6jTr@jv;zs^youw@0vaG0s{{Zi0^Ab=PI z5Q6|>5MVh0%#H%o_T>p+-1;@K%wgPOXasOgLowd2TmjCKhDzQ#bScO!3PNKKH9$ z*BtAoA~K`l=$K196>)Tt(Lsn;##rVp$sUiK$CDz=d%_dt<)UqoJ&JHKd`E040Tj+K zaQ+nwBmTknf{X~hnB_xwe|V#XDU3`z3o^i`2rmi(h(Q1`2q4CU^4Y|aSW-L^LEbZyu%6tu5(w! z+st0K>(wghx}Bj*+*Ykpv1oZ1cg8ZCy=~{2!$-btV+3l2f&&*VbA<)x$KS7BuPgsP zc+J}qmF4F(j=fyrH{Z4AvQ}TY=%YQlFKUj~Tw`iEA<3uYao9jgW`lZZN^i9WqubUg ziT8GSvD|n)<`H{;sG zLp*!`8!%SAxu<;V)AW$5?er&;(m+~d~e zeVcmz=jIk^IY!;xn@y}f-+Mpj-Kn)f0XsMT2$!8?_-x^O=2Pp7uW05(G8)M|dsVYr zWQ!7q0vqEIg$46@OB701Uj5~ug5-h4dqb45T)rGLeuJuydg zH@OPxwY~4qRc$yV$#-slLgJD7A8``|4~lQD;rPs-zr~<+Vr04_-wlz6p^glOU=Q37 zT`N(b^DtyhCsY9BBZ1`0yf)nKf)`j>V3E$ykjq)ekeTVh$TG9#Hb~Ud)z4*}Q$iB} DJ(UM| diff --git a/miniprogram/pages/generating/generating.js b/miniprogram/pages/generating/generating.js deleted file mode 100644 index 3cf2c3d..0000000 --- a/miniprogram/pages/generating/generating.js +++ /dev/null @@ -1,47 +0,0 @@ -const { request } = require('../../utils/request') - -Page({ - data: { - id: '', - timer: null - }, - - onLoad(query) { - this.setData({ id: query.id }) - this.poll() - const timer = setInterval(() => this.poll(), 2500) - this.setData({ timer }) - }, - - onUnload() { - if (this.data.timer) { - clearInterval(this.data.timer) - } - }, - - async poll() { - if (!this.data.id) return - try { - const report = await request({ url: `/reports/${this.data.id}` }) - if (report.status === 'completed') { - clearInterval(this.data.timer) - wx.redirectTo({ url: `/pages/report/report?id=${this.data.id}` }) - } - if (report.status === 'failed') { - clearInterval(this.data.timer) - wx.showModal({ - title: '生成失败', - content: report.error_message || '照片暂时无法分析,请换一张更清晰的照片。', - showCancel: false, - success: () => wx.switchTab({ url: '/pages/index/index' }) - }) - } - } catch (error) { - wx.showToast({ title: error.message || '查询失败', icon: 'none' }) - } - }, - - backHome() { - wx.switchTab({ url: '/pages/index/index' }) - } -}) diff --git a/miniprogram/pages/generating/generating.json b/miniprogram/pages/generating/generating.json deleted file mode 100644 index f172164..0000000 --- a/miniprogram/pages/generating/generating.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "navigationBarTitleText": "生成中" -} diff --git a/miniprogram/pages/generating/generating.wxml b/miniprogram/pages/generating/generating.wxml deleted file mode 100644 index ec3c12f..0000000 --- a/miniprogram/pages/generating/generating.wxml +++ /dev/null @@ -1,6 +0,0 @@ - - - 先生正在起卦 - 大约需要十几秒。赛博先生正在整理生命线、智慧线、感情线和整体倾向。 - - diff --git a/miniprogram/pages/generating/generating.wxss b/miniprogram/pages/generating/generating.wxss deleted file mode 100644 index 69d5c94..0000000 --- a/miniprogram/pages/generating/generating.wxss +++ /dev/null @@ -1,47 +0,0 @@ -.center { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; -} - -.pulse { - width: 132rpx; - height: 132rpx; - border-radius: 50%; - background: #00e0b8; - opacity: 0.88; - animation: pulse 1.4s ease-in-out infinite; - box-shadow: 0 0 72rpx rgba(0, 224, 184, 0.44); -} - -.title { - margin-top: 44rpx; - font-size: 40rpx; - font-weight: 800; -} - -.subtitle { - margin-top: 20rpx; - color: #9db0b4; - font-size: 28rpx; - line-height: 1.7; -} - -.action { - margin-top: 48rpx; - width: 100%; -} - -@keyframes pulse { - 0% { - transform: scale(0.86); - } - 50% { - transform: scale(1); - } - 100% { - transform: scale(0.86); - } -} diff --git a/miniprogram/pages/history/history.js b/miniprogram/pages/history/history.js deleted file mode 100644 index 9a0158a..0000000 --- a/miniprogram/pages/history/history.js +++ /dev/null @@ -1,52 +0,0 @@ -const { request } = require('../../utils/request') - -const STATUS_TEXT = { - pending: '等待中', - processing: '生成中', - completed: '已完成', - failed: '失败' -} - -Page({ - data: { - reports: [], - reportCount: 0, - completedCount: 0 - }, - - onShow() { - this.loadReports() - }, - - async loadReports() { - if (!getApp().globalData.token) { - this.setData({ reports: [], reportCount: 0, completedCount: 0 }) - return - } - try { - const reports = await request({ url: '/reports' }) - const mappedReports = reports.map((item) => ({ - ...item, - statusText: STATUS_TEXT[item.status] || item.status, - createdDate: (item.created_at || '').replace('T', ' ').slice(0, 16), - fallbackSummary: item.status === 'completed' ? '报告已完成,点击查看完整解读。' : '先生正在整理这份报告。' - })) - this.setData({ - reports: mappedReports, - reportCount: mappedReports.length, - completedCount: mappedReports.filter((item) => item.status === 'completed').length - }) - } catch (error) { - wx.showToast({ title: error.message || '加载失败', icon: 'none' }) - } - }, - - openReport(event) { - const id = event.currentTarget.dataset.id - wx.navigateTo({ url: `/pages/report/report?id=${id}` }) - }, - - goHome() { - wx.navigateTo({ url: '/pages/palm/palm' }) - } -}) diff --git a/miniprogram/pages/history/history.json b/miniprogram/pages/history/history.json deleted file mode 100644 index 94cd99c..0000000 --- a/miniprogram/pages/history/history.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "navigationBarTitleText": "解读档案" -} diff --git a/miniprogram/pages/history/history.wxml b/miniprogram/pages/history/history.wxml deleted file mode 100644 index 7ed5397..0000000 --- a/miniprogram/pages/history/history.wxml +++ /dev/null @@ -1,43 +0,0 @@ - - - ARCHIVE - 解读档案 - 每一次请先生解读,都会在这里沉淀成一份记录。 - - - - - {{reportCount}} - 累计报告 - - - {{completedCount}} - 已完成 - - - - - - - - - - - - 手相报告 - {{item.createdDate}} - - {{item.statusText}} - - {{item.overall_summary || item.fallbackSummary}} - - - - - - - 还没有解读档案 - 先从手相报告开始,让赛博先生留下第一条记录。 - - - diff --git a/miniprogram/pages/history/history.wxss b/miniprogram/pages/history/history.wxss deleted file mode 100644 index 91ad8f3..0000000 --- a/miniprogram/pages/history/history.wxss +++ /dev/null @@ -1,183 +0,0 @@ -.top { - padding: 28rpx 0 20rpx; -} - -.eyebrow { - display: block; - color: #d8a84e; - font-size: 22rpx; - font-weight: 800; -} - -.title { - display: block; - margin-top: 10rpx; - color: #f2e9d8; - font-size: 48rpx; - font-weight: 800; - line-height: 1.2; -} - -.subtitle { - display: block; - margin-top: 14rpx; - color: #9db0b4; - font-size: 27rpx; - line-height: 1.6; -} - -.stats { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 16rpx; - margin: 8rpx 0 28rpx; -} - -.stat-card { - padding: 22rpx; - border: 1rpx solid rgba(242, 233, 216, 0.1); - border-radius: 16rpx; - background: rgba(16, 25, 28, 0.78); -} - -.stat-value, -.stat-label { - display: block; -} - -.stat-value { - color: #00e0b8; - font-size: 38rpx; - font-weight: 800; -} - -.stat-label { - margin-top: 6rpx; - color: #8da0a4; - font-size: 23rpx; -} - -.archive-list { - display: flex; - flex-direction: column; - gap: 18rpx; -} - -.record { - display: flex; - gap: 20rpx; - padding: 24rpx; - border: 1rpx solid rgba(0, 224, 184, 0.2); - border-radius: 18rpx; - background: rgba(16, 25, 28, 0.9); -} - -.record-mark { - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - width: 72rpx; - height: 72rpx; - border-radius: 50%; - color: #06100e; - background: #00e0b8; - font-size: 30rpx; - font-weight: 800; - box-shadow: 0 0 32rpx rgba(0, 224, 184, 0.24); -} - -.record-main { - flex: 1; - min-width: 0; -} - -.record-head { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 16rpx; -} - -.record-title, -.record-date, -.summary { - display: block; -} - -.record-title { - color: #f2e9d8; - font-size: 30rpx; - font-weight: 800; -} - -.record-date { - margin-top: 6rpx; - color: #728389; - font-size: 22rpx; -} - -.status { - flex-shrink: 0; - color: #f2e9d8; - background: #728389; - border-radius: 999rpx; - padding: 7rpx 16rpx; - font-size: 22rpx; - font-weight: 700; -} - -.status.completed { - color: #06100e; - background: #00e0b8; -} - -.status.failed { - background: #9b3d2e; -} - -.summary { - margin-top: 18rpx; - color: #b8c7c8; - font-size: 26rpx; - line-height: 1.65; -} - -.empty { - margin-top: 86rpx; - text-align: center; -} - -.empty-orb { - display: flex; - align-items: center; - justify-content: center; - width: 128rpx; - height: 128rpx; - margin: 0 auto 28rpx; - border-radius: 50%; - color: #06100e; - background: #00e0b8; - font-size: 46rpx; - font-weight: 800; - box-shadow: 0 0 60rpx rgba(0, 224, 184, 0.3); -} - -.empty-title { - display: block; - color: #f2e9d8; - font-size: 34rpx; - font-weight: 800; -} - -.empty-copy { - display: block; - margin-top: 14rpx; - color: #9db0b4; - font-size: 26rpx; - line-height: 1.6; -} - -.action { - margin-top: 36rpx; -} diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js deleted file mode 100644 index 5e22882..0000000 --- a/miniprogram/pages/index/index.js +++ /dev/null @@ -1,31 +0,0 @@ -const { MODULES } = require('../../utils/modules') - -Page({ - data: { - hasToken: false, - modules: MODULES - }, - - onShow() { - this.setData({ hasToken: Boolean(getApp().globalData.token) }) - }, - - tapModule(event) { - const moduleId = event.currentTarget.dataset.id - const module = this.data.modules.find((item) => item.id === moduleId) - if (module && module.status === 'available' && module.path) { - wx.navigateTo({ url: module.path }) - } else { - wx.showToast({ title: '这个功能即将开放', icon: 'none' }) - } - }, - - openPalm() { - const palm = this.data.modules.find((item) => item.id === 'palm') - wx.navigateTo({ url: palm.path }) - }, - - openLegal() { - wx.navigateTo({ url: '/pages/legal/legal' }) - } -}) diff --git a/miniprogram/pages/index/index.json b/miniprogram/pages/index/index.json deleted file mode 100644 index ec4c7a1..0000000 --- a/miniprogram/pages/index/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "navigationBarTitleText": "赛博先生" -} diff --git a/miniprogram/pages/index/index.wxml b/miniprogram/pages/index/index.wxml deleted file mode 100644 index 87ba047..0000000 --- a/miniprogram/pages/index/index.wxml +++ /dev/null @@ -1,31 +0,0 @@ - - - CYBER FORTUNE STUDIO - 赛博先生 - AI 命理实验室。选择一个入口,让先生开始解读。 - - - ONLINE · 玄学模型已接入 - - - - - - {{item.mark}} - - {{item.title}} - {{item.description}} - - 0{{index + 1}} - - - - - 今日可问 - 先看掌心里的行动节奏 - 上传一张清晰掌心照片,先生会从生命线、智慧线、感情线、命运线等维度生成娱乐向报告。 - - - - 继续使用即表示你同意用户协议与隐私政策。赛博先生只提供娱乐与自我反思内容。 - diff --git a/miniprogram/pages/index/index.wxss b/miniprogram/pages/index/index.wxss deleted file mode 100644 index 708b2cd..0000000 --- a/miniprogram/pages/index/index.wxss +++ /dev/null @@ -1,186 +0,0 @@ -.hero { - position: relative; - padding: 38rpx 0 28rpx; -} - -.eyebrow { - display: block; - color: #d8a84e; - font-size: 22rpx; - font-weight: 800; - letter-spacing: 0; -} - -.title { - display: block; - margin-top: 10rpx; - font-size: 64rpx; - font-weight: 800; - color: #f2e9d8; -} - -.subtitle { - display: block; - margin-top: 16rpx; - font-size: 28rpx; - line-height: 1.6; - color: #9db0b4; -} - -.signal { - display: inline-flex; - align-items: center; - margin-top: 24rpx; - padding: 10rpx 18rpx; - border: 1rpx solid rgba(0, 224, 184, 0.34); - border-radius: 999rpx; - background: rgba(0, 224, 184, 0.08); -} - -.signal-dot { - width: 12rpx; - height: 12rpx; - margin-right: 12rpx; - border-radius: 50%; - background: #00e0b8; - box-shadow: 0 0 18rpx #00e0b8; -} - -.signal-text { - color: #bcefe5; - font-size: 22rpx; - font-weight: 700; -} - -.module-grid { - display: grid; - grid-template-columns: 1fr; - gap: 16rpx; - margin: 18rpx 0 28rpx; -} - -.module { - position: relative; - display: flex; - align-items: center; - min-height: 118rpx; - padding: 22rpx; - box-sizing: border-box; - background: rgba(16, 25, 28, 0.9); - border: 1rpx solid rgba(242, 233, 216, 0.12); - border-radius: 16rpx; - overflow: hidden; -} - -.module.active { - background: linear-gradient(135deg, rgba(0, 224, 184, 0.2), rgba(16, 25, 28, 0.96)); - border-color: rgba(0, 224, 184, 0.58); - color: #f2e9d8; -} - -.module.active::after { - content: ""; - position: absolute; - left: 18rpx; - right: 18rpx; - top: 0; - height: 2rpx; - background: linear-gradient(90deg, transparent, #00e0b8, transparent); -} - -.module.disabled { - opacity: 0.54; -} - -.module-mark { - display: flex; - align-items: center; - justify-content: center; - width: 72rpx; - height: 72rpx; - margin-right: 18rpx; - border-radius: 50%; - background: rgba(242, 233, 216, 0.08); - color: #d8a84e; - border: 1rpx solid rgba(216, 168, 78, 0.34); - font-size: 32rpx; - font-weight: 800; -} - -.module.active .module-mark { - background: #00e0b8; - color: #06100e; - border-color: #00e0b8; - box-shadow: 0 0 32rpx rgba(0, 224, 184, 0.32); -} - -.module-copy { - flex: 1; -} - -.module-code { - color: rgba(242, 233, 216, 0.28); - font-size: 24rpx; - font-weight: 800; -} - -.module-title, -.module-desc { - display: block; -} - -.module-title { - font-size: 30rpx; - font-weight: 800; -} - -.module-desc { - margin-top: 8rpx; - color: #8da0a4; - font-size: 24rpx; -} - -.module.active .module-desc { - color: #bcefe5; -} - -.today { - margin-top: 28rpx; -} - -.today-label, -.today-title, -.today-copy { - display: block; -} - -.today-label { - color: #d8a84e; - font-size: 23rpx; - font-weight: 800; -} - -.today-title { - margin-top: 10rpx; - font-size: 32rpx; - font-weight: 800; -} - -.today-copy { - margin-top: 12rpx; - color: #9db0b4; - font-size: 26rpx; - line-height: 1.7; -} - -.today-btn { - margin-top: 22rpx; -} - -.legal { - display: block; - margin-top: 28rpx; - font-size: 24rpx; - line-height: 1.6; - text-align: center; -} diff --git a/miniprogram/pages/legal/legal.js b/miniprogram/pages/legal/legal.js deleted file mode 100644 index ba76804..0000000 --- a/miniprogram/pages/legal/legal.js +++ /dev/null @@ -1 +0,0 @@ -Page({}) diff --git a/miniprogram/pages/legal/legal.json b/miniprogram/pages/legal/legal.json deleted file mode 100644 index 040c7d2..0000000 --- a/miniprogram/pages/legal/legal.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "navigationBarTitleText": "协议与隐私" -} diff --git a/miniprogram/pages/legal/legal.wxml b/miniprogram/pages/legal/legal.wxml deleted file mode 100644 index a0da561..0000000 --- a/miniprogram/pages/legal/legal.wxml +++ /dev/null @@ -1,18 +0,0 @@ - - 赛博先生协议与隐私说明 - - - 服务定位 - 赛博先生提供手相、面相、八字等娱乐占卜与自我反思类内容。报告不构成医学、心理、职业、财务、投资或任何人生决策建议。 - - - - 照片用途 - 你上传的手掌照片仅用于生成本次手相报告、质量校验和必要的问题排查。原始照片默认短期保存,并会按服务端策略自动清理。 - - - - 数据删除 - 你可以在报告详情页删除报告。删除后,报告内容和关联照片会被清理,无法恢复。 - - diff --git a/miniprogram/pages/legal/legal.wxss b/miniprogram/pages/legal/legal.wxss deleted file mode 100644 index bba0f64..0000000 --- a/miniprogram/pages/legal/legal.wxss +++ /dev/null @@ -1,23 +0,0 @@ -.title { - display: block; - padding: 24rpx 0; - color: #f2e9d8; - font-size: 42rpx; - font-weight: 800; -} - -.block { - margin-bottom: 20rpx; -} - -.heading { - display: block; - font-weight: 800; - margin-bottom: 14rpx; -} - -.body { - display: block; - color: #9db0b4; - line-height: 1.7; -} diff --git a/miniprogram/pages/palm/palm.js b/miniprogram/pages/palm/palm.js deleted file mode 100644 index b8fa4c4..0000000 --- a/miniprogram/pages/palm/palm.js +++ /dev/null @@ -1,96 +0,0 @@ -const { request, uploadPalm } = require('../../utils/request') - -Page({ - data: { - hasToken: false, - imagePath: '', - handSide: 'unknown', - submitting: false - }, - - onShow() { - this.setData({ hasToken: Boolean(getApp().globalData.token) }) - }, - - chooseLeft() { - this.setData({ handSide: 'left' }) - }, - - chooseRight() { - this.setData({ handSide: 'right' }) - }, - - chooseUnknown() { - this.setData({ handSide: 'unknown' }) - }, - - async loginDev() { - try { - const login = await wx.login() - const data = await request({ url: '/auth/wechat-login', method: 'POST', data: { code: login.code || 'dev' } }) - getApp().setToken(data.access_token) - this.setData({ hasToken: true }) - wx.showToast({ title: '已登录' }) - } catch (error) { - wx.showToast({ title: error.message || '登录失败', icon: 'none' }) - } - }, - - async loginWithPhone(event) { - try { - const login = await wx.login() - const phoneCode = event.detail && event.detail.code - const data = await request({ - url: '/auth/wechat-login', - method: 'POST', - data: { code: login.code || 'dev', phone_code: phoneCode || null } - }) - getApp().setToken(data.access_token) - this.setData({ hasToken: true }) - wx.showToast({ title: '已登录' }) - } catch (error) { - wx.showToast({ title: error.message || '登录失败', icon: 'none' }) - } - }, - - async chooseImage() { - try { - const res = await wx.chooseMedia({ - count: 1, - mediaType: ['image'], - sourceType: ['album', 'camera'], - sizeType: ['compressed'] - }) - this.setData({ imagePath: res.tempFiles[0].tempFilePath }) - } catch (error) { - if (error.errMsg && !error.errMsg.includes('cancel')) { - wx.showToast({ title: '选择照片失败', icon: 'none' }) - } - } - }, - - async submit() { - if (!getApp().globalData.token) { - await this.loginDev() - } - if (!this.data.imagePath) return - this.setData({ submitting: true }) - try { - const upload = await uploadPalm(this.data.imagePath) - const report = await request({ - url: '/reports', - method: 'POST', - data: { image_id: upload.image_id, hand_side: this.data.handSide } - }) - wx.navigateTo({ url: `/pages/generating/generating?id=${report.id}` }) - } catch (error) { - wx.showToast({ title: error.message || '生成失败', icon: 'none' }) - } finally { - this.setData({ submitting: false }) - } - }, - - openLegal() { - wx.navigateTo({ url: '/pages/legal/legal' }) - } -}) diff --git a/miniprogram/pages/palm/palm.json b/miniprogram/pages/palm/palm.json deleted file mode 100644 index 7fd1464..0000000 --- a/miniprogram/pages/palm/palm.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "navigationBarTitleText": "手相报告" -} diff --git a/miniprogram/pages/palm/palm.wxml b/miniprogram/pages/palm/palm.wxml deleted file mode 100644 index b36111e..0000000 --- a/miniprogram/pages/palm/palm.wxml +++ /dev/null @@ -1,31 +0,0 @@ - - - PALM READING - 手相报告 - 上传掌心照片,先生会扫描掌纹主线并生成娱乐向自我反思报告。 - - - - 拍摄要求 - 掌心完整入镜,纹路清晰 - 光线充足,避免强反光和阴影 - 手掌自然伸展,不要遮挡主线 - - - - - - - - - 可选项:知道左右手会让报告措辞更细;不确定也可以直接生成。 - - - - - - - - - 报告仅用于娱乐与自我反思,不构成任何现实决策建议。 - diff --git a/miniprogram/pages/palm/palm.wxss b/miniprogram/pages/palm/palm.wxss deleted file mode 100644 index e23500b..0000000 --- a/miniprogram/pages/palm/palm.wxss +++ /dev/null @@ -1,104 +0,0 @@ -.hero { - padding: 34rpx 0 28rpx; -} - -.eyebrow { - display: block; - color: #d8a84e; - font-size: 22rpx; - font-weight: 800; - letter-spacing: 0; -} - -.title { - display: block; - margin-top: 10rpx; - font-size: 52rpx; - font-weight: 800; - color: #f2e9d8; -} - -.subtitle { - display: block; - margin-top: 16rpx; - font-size: 28rpx; - line-height: 1.6; - color: #9db0b4; -} - -.guide { - margin-top: 8rpx; -} - -.guide-title, -.guide-line { - display: block; -} - -.guide-title { - font-weight: 700; - margin-bottom: 14rpx; -} - -.guide-line { - color: #9db0b4; - line-height: 1.8; -} - -.section-label { - margin-top: 28rpx; - font-size: 28rpx; - font-weight: 800; -} - -.side-picker { - display: flex; - gap: 16rpx; - margin: 16rpx 0 10rpx; -} - -.side { - flex: 1; - height: 72rpx; - line-height: 72rpx; - padding: 0; - font-size: 26rpx; - color: #9db0b4; - background: rgba(16, 25, 28, 0.92); - border: 1rpx solid rgba(242, 233, 216, 0.12); - border-radius: 12rpx; -} - -.side.active { - color: #06100e; - background: #00e0b8; - border-color: #00e0b8; -} - -.side-note { - display: block; - margin-bottom: 24rpx; - font-size: 24rpx; - line-height: 1.6; -} - -.preview { - width: 100%; - height: 520rpx; - border-radius: 16rpx; - margin-bottom: 24rpx; - background: #10191c; - border: 1rpx solid rgba(0, 224, 184, 0.24); -} - -.action { - margin-top: 20rpx; -} - -.legal { - display: block; - margin-top: 28rpx; - font-size: 24rpx; - line-height: 1.6; - text-align: center; -} diff --git a/miniprogram/pages/report/report.js b/miniprogram/pages/report/report.js deleted file mode 100644 index 61c617b..0000000 --- a/miniprogram/pages/report/report.js +++ /dev/null @@ -1,128 +0,0 @@ -const { API_BASE_URL, authHeader, request } = require('../../utils/request') - -Page({ - data: { - id: '', - report: null, - data: null, - qualityPercent: 0, - dimensionCount: 0, - shareLoading: false, - shareStatusText: '' - }, - - onLoad(query) { - this.setData({ id: query.id }) - this.loadReport() - }, - - async loadReport() { - try { - const report = await request({ url: `/reports/${this.data.id}` }) - const data = report.report_data || {} - if (data.dimensions) { - data.dimensions = data.dimensions.map((item) => ({ - ...item, - confidencePercent: Math.round((item.confidence || 0) * 100) - })) - } - const handSideText = { - left: '左手', - right: '右手', - unknown: '未知手' - }[report.hand_side] || '未知手' - this.setData({ - report: { - ...report, - handSideText, - createdDate: (report.created_at || '').replace('T', ' ').slice(0, 16) - }, - data, - qualityPercent: Math.round(((data.quality_check && data.quality_check.confidence) || 0) * 100), - dimensionCount: data.dimensions ? data.dimensions.length : 0 - }) - } catch (error) { - wx.showToast({ title: error.message || '加载失败', icon: 'none' }) - } - }, - - deleteReport() { - wx.showModal({ - title: '删除报告', - content: '删除后将无法恢复,关联照片也会被清理。', - success: async (res) => { - if (!res.confirm) return - try { - await request({ url: `/reports/${this.data.id}`, method: 'DELETE' }) - wx.showToast({ title: '已删除' }) - wx.switchTab({ url: '/pages/history/history' }) - } catch (error) { - wx.showToast({ title: error.message || '删除失败', icon: 'none' }) - } - } - }) - }, - - generateShareImage() { - this.setData({ shareLoading: true, shareStatusText: '分享图生成中,通常需要 30-120 秒。你可以先继续查看报告。' }) - request({ - url: `/reports/${this.data.id}/share-image-jobs`, - method: 'POST' - }) - .then((job) => this.pollShareImageJob(job.id, 0)) - .catch((error) => { - this.setData({ shareLoading: false, shareStatusText: '' }) - wx.showToast({ title: error.message || '创建任务失败', icon: 'none' }) - }) - }, - - pollShareImageJob(jobId, count) { - if (count > 80) { - this.setData({ shareLoading: false, shareStatusText: '' }) - wx.showToast({ title: '生成时间较长,请稍后再试', icon: 'none' }) - return - } - request({ url: `/reports/share-image-jobs/${jobId}` }) - .then((job) => { - if (job.status === 'completed') { - this.downloadShareImage(jobId) - return - } - if (job.status === 'failed') { - this.setData({ shareLoading: false, shareStatusText: '' }) - wx.showToast({ title: job.error_message || '分享图生成失败', icon: 'none' }) - return - } - setTimeout(() => this.pollShareImageJob(jobId, count + 1), 2000) - }) - .catch((error) => { - this.setData({ shareLoading: false, shareStatusText: '' }) - wx.showToast({ title: error.message || '查询任务失败', icon: 'none' }) - }) - }, - - downloadShareImage(jobId) { - wx.downloadFile({ - url: `${API_BASE_URL}/reports/share-image-jobs/${jobId}/image`, - header: authHeader(), - success: (res) => { - if (res.statusCode >= 200 && res.statusCode < 300) { - wx.previewImage({ current: res.tempFilePath, urls: [res.tempFilePath] }) - } else { - wx.showToast({ title: '分享图下载失败', icon: 'none' }) - } - }, - fail: () => wx.showToast({ title: '分享图下载失败', icon: 'none' }), - complete: () => { - this.setData({ shareLoading: false, shareStatusText: '' }) - } - }) - }, - - onShareAppMessage() { - return { - title: '我在赛博先生生成了一份手相报告', - path: '/pages/index/index' - } - } -}) diff --git a/miniprogram/pages/report/report.json b/miniprogram/pages/report/report.json deleted file mode 100644 index 923e240..0000000 --- a/miniprogram/pages/report/report.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "navigationBarTitleText": "手相报告", - "enableShareAppMessage": true -} diff --git a/miniprogram/pages/report/report.wxml b/miniprogram/pages/report/report.wxml deleted file mode 100644 index fc8b367..0000000 --- a/miniprogram/pages/report/report.wxml +++ /dev/null @@ -1,99 +0,0 @@ - - - PALM REPORT · {{report.handSideText}} - 赛博先生手相报告 - {{report.createdDate}} - - - - 先生结论 - {{data.overall_summary}} - - {{item}} - - - - - - {{qualityPercent}}% - 照片可读性 - - - {{dimensionCount}} - 解读维度 - - - - - {{data.quality_check.reason}} - - - - 核心维度 - 观察 · 解读 · 建议 - - - - - - 0{{index + 1}} - {{item.name}} - - - {{item.confidencePercent}}% - - - - - 观察 - - {{obs}} - - - - - 解读 - {{item.interpretation}} - - - - 先生建议 - {{item.advice}} - - - - - 倾向总结 - 优势与提醒 - - - - - 优势倾向 - {{item}} - - - - 近期提醒 - {{item}} - - - - - 需要留意 - - {{item}} - - - - - {{data.disclaimer}} - - - - - - - - 正在加载报告... - diff --git a/miniprogram/pages/report/report.wxss b/miniprogram/pages/report/report.wxss deleted file mode 100644 index 65ae641..0000000 --- a/miniprogram/pages/report/report.wxss +++ /dev/null @@ -1,298 +0,0 @@ -.header { - padding: 28rpx 0 18rpx; -} - -.eyebrow { - display: block; - color: #d8a84e; - font-size: 22rpx; - font-weight: 800; -} - -.title { - display: block; - margin-top: 10rpx; - color: #f2e9d8; - font-size: 46rpx; - font-weight: 800; - line-height: 1.2; -} - -.time { - display: block; - margin-top: 12rpx; - color: #728389; - font-size: 23rpx; -} - -.insight-card { - position: relative; - overflow: hidden; - border-color: rgba(0, 224, 184, 0.42); - background: linear-gradient(135deg, rgba(0, 224, 184, 0.16), rgba(16, 25, 28, 0.95) 46%); -} - -.insight-card::before { - content: ""; - position: absolute; - top: 0; - left: 26rpx; - right: 26rpx; - height: 2rpx; - background: linear-gradient(90deg, transparent, #00e0b8, transparent); -} - -.insight-label, -.block-label, -.column-title { - display: block; - color: #d8a84e; - font-size: 23rpx; - font-weight: 800; -} - -.summary { - display: block; - margin-top: 16rpx; - color: #d9e4e1; - font-size: 30rpx; - line-height: 1.75; -} - -.keywords { - display: flex; - flex-wrap: wrap; - gap: 12rpx; -} - -.keywords.inline { - margin-top: 22rpx; -} - -.keyword, -.chip { - display: inline-flex; - align-items: center; - min-height: 44rpx; - box-sizing: border-box; - border-radius: 999rpx; - padding: 8rpx 18rpx; - font-size: 24rpx; -} - -.keyword { - color: #06100e; - background: #00e0b8; -} - -.chip { - color: #bcefe5; - background: rgba(0, 224, 184, 0.1); - border: 1rpx solid rgba(0, 224, 184, 0.24); -} - -.chip.warn { - color: #f2d3c9; - background: rgba(255, 107, 74, 0.1); - border-color: rgba(255, 107, 74, 0.28); -} - -.metrics { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 16rpx; - margin-top: 18rpx; -} - -.metric { - padding: 22rpx; - border: 1rpx solid rgba(242, 233, 216, 0.1); - border-radius: 16rpx; - background: rgba(16, 25, 28, 0.78); -} - -.metric-value, -.metric-label { - display: block; -} - -.metric-value { - color: #00e0b8; - font-size: 38rpx; - font-weight: 800; -} - -.metric-label { - margin-top: 6rpx; - color: #8da0a4; - font-size: 23rpx; -} - -.quality-note { - margin-top: 14rpx; - color: #8da0a4; - font-size: 24rpx; - line-height: 1.6; -} - -.section-head { - display: flex; - align-items: flex-end; - justify-content: space-between; - margin: 38rpx 0 16rpx; -} - -.section-title, -.section-subtitle { - display: block; -} - -.section-title { - color: #f2e9d8; - font-size: 34rpx; - font-weight: 800; -} - -.section-subtitle { - color: #728389; - font-size: 22rpx; -} - -.dimension { - margin-bottom: 18rpx; -} - -.dimension-head { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 20rpx; -} - -.dimension-index { - display: block; - color: rgba(242, 233, 216, 0.28); - font-size: 22rpx; - font-weight: 800; -} - -.dimension-name { - display: block; - margin-top: 4rpx; - color: #f2e9d8; - font-size: 32rpx; - font-weight: 800; -} - -.confidence-pill { - flex-shrink: 0; - min-width: 88rpx; - padding: 8rpx 14rpx; - border: 1rpx solid rgba(0, 224, 184, 0.3); - border-radius: 999rpx; - color: #00e0b8; - font-size: 23rpx; - font-weight: 800; - text-align: center; -} - -.block { - margin-top: 22rpx; -} - -.body, -.advice, -.list-item, -.disclaimer { - display: block; - line-height: 1.75; -} - -.body { - margin-top: 10rpx; - color: #c5d4d3; - font-size: 28rpx; -} - -.chips { - display: flex; - flex-wrap: wrap; - gap: 12rpx; - margin-top: 12rpx; -} - -.advice-box { - margin-top: 22rpx; - padding: 22rpx; - border-radius: 14rpx; - background: rgba(216, 168, 78, 0.08); - border: 1rpx solid rgba(216, 168, 78, 0.18); -} - -.advice { - margin-top: 8rpx; - color: #eadcc1; - font-size: 27rpx; -} - -.summary-grid { - display: grid; - grid-template-columns: 1fr; - gap: 22rpx; -} - -.summary-column { - min-width: 0; -} - -.divider { - height: 1rpx; - background: rgba(242, 233, 216, 0.1); -} - -.list-item { - position: relative; - margin-top: 12rpx; - padding-left: 26rpx; - color: #c5d4d3; - font-size: 27rpx; -} - -.list-item::before { - content: ""; - position: absolute; - left: 0; - top: 20rpx; - width: 9rpx; - height: 9rpx; - border-radius: 50%; - background: #00e0b8; -} - -.challenge-card { - margin-top: 18rpx; -} - -.disclaimer-box { - margin-top: 34rpx; - padding-top: 22rpx; - border-top: 1rpx solid rgba(242, 233, 216, 0.1); -} - -.disclaimer { - color: #728389; - font-size: 23rpx; -} - -.action { - margin-top: 28rpx; -} - -.share-status { - display: block; - margin-top: 16rpx; - color: #9db0b4; - font-size: 24rpx; - line-height: 1.6; - text-align: center; -} diff --git a/miniprogram/project.config.json b/miniprogram/project.config.json deleted file mode 100644 index 19fa4b8..0000000 --- a/miniprogram/project.config.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "description": "AI Palm Reading Mini Program", - "packOptions": { - "ignore": [], - "include": [] - }, - "setting": { - "urlCheck": false, - "es6": true, - "enhance": true, - "postcss": true, - "minified": true, - "compileWorklet": false, - "uglifyFileName": false, - "uploadWithSourceMap": true, - "packNpmManually": false, - "packNpmRelationList": [], - "minifyWXSS": true, - "minifyWXML": true, - "localPlugins": false, - "disableUseStrict": false, - "useCompilerPlugins": false, - "condition": false, - "swc": false, - "disableSWC": true, - "babelSetting": { - "ignore": [], - "disablePlugins": [], - "outputPath": "" - } - }, - "compileType": "miniprogram", - "libVersion": "3.6.4", - "appid": "wxe871ab859de77797", - "projectname": "people-reading", - "condition": {}, - "simulatorPluginLibVersion": {}, - "editorSetting": {} -} \ No newline at end of file diff --git a/miniprogram/sitemap.json b/miniprogram/sitemap.json deleted file mode 100644 index 1de189d..0000000 --- a/miniprogram/sitemap.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rules": [ - { - "action": "allow", - "page": "*" - } - ] -} diff --git a/miniprogram/utils/config.js b/miniprogram/utils/config.js deleted file mode 100644 index 3175d91..0000000 --- a/miniprogram/utils/config.js +++ /dev/null @@ -1,5 +0,0 @@ -const API_BASE_URL = 'http://127.0.0.1:8000/api/v1' - -module.exports = { - API_BASE_URL -} diff --git a/miniprogram/utils/modules.js b/miniprogram/utils/modules.js deleted file mode 100644 index b7ec148..0000000 --- a/miniprogram/utils/modules.js +++ /dev/null @@ -1,30 +0,0 @@ -const MODULES = [ - { - id: 'palm', - mark: '掌', - title: '手相报告', - description: '已开放 · 上传掌心照片', - status: 'available', - path: '/pages/palm/palm' - }, - { - id: 'face', - mark: '面', - title: '面相解读', - description: '即将开放', - status: 'coming', - path: '' - }, - { - id: 'bazi', - mark: '字', - title: '八字简批', - description: '即将开放', - status: 'coming', - path: '' - } -] - -module.exports = { - MODULES -} diff --git a/miniprogram/utils/request.js b/miniprogram/utils/request.js deleted file mode 100644 index c1caa76..0000000 --- a/miniprogram/utils/request.js +++ /dev/null @@ -1,61 +0,0 @@ -const { API_BASE_URL } = require('./config') - -function authHeader(extra = {}) { - const app = getApp() - return { - ...(app.globalData.token ? { Authorization: `Bearer ${app.globalData.token}` } : {}), - ...extra - } -} - -function request(options) { - const app = getApp() - return new Promise((resolve, reject) => { - wx.request({ - url: `${API_BASE_URL}${options.url}`, - method: options.method || 'GET', - data: options.data || {}, - header: authHeader({ 'content-type': 'application/json', ...(options.header || {}) }), - success(res) { - if (res.statusCode >= 200 && res.statusCode < 300) { - resolve(res.data) - } else { - reject(new Error(res.data && res.data.detail ? res.data.detail : '请求失败')) - } - }, - fail: reject - }) - }) -} - -function uploadPalm(filePath) { - const app = getApp() - return new Promise((resolve, reject) => { - wx.uploadFile({ - url: `${API_BASE_URL}/uploads/palm`, - filePath, - name: 'file', - header: authHeader(), - success(res) { - if (res.statusCode >= 200 && res.statusCode < 300) { - resolve(JSON.parse(res.data)) - } else { - try { - const data = JSON.parse(res.data) - reject(new Error(data.detail || '上传失败')) - } catch (error) { - reject(new Error('上传失败')) - } - } - }, - fail: reject - }) - }) -} - -module.exports = { - API_BASE_URL, - authHeader, - request, - uploadPalm -} diff --git a/palm_reading.db b/palm_reading.db deleted file mode 100644 index ac9fe14efc8d9f7cc980289918f2e1de1b29770b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94208 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 p(_ span { + padding: 7px 12px; + border: 1px solid rgba(213, 168, 85, 0.24); + border-radius: 999px; + color: var(--gold); + background: var(--gold-soft); +} + +.pillar-row { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; + margin-top: 14px; +} + +.pillar { + padding: 14px; + border: 1px solid var(--line); + border-radius: 14px; + text-align: center; + background: rgba(8, 13, 12, 0.42); +} + +.pillar span, +.chart-facts span, +.wuxing-bar span, +.wuxing-bar em { + color: var(--paper-dim); +} + +.pillar strong { + display: block; + margin-top: 6px; + color: var(--paper); + font-size: 24px; + letter-spacing: 0; +} + +.chart-facts { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.chart-facts span { + padding: 7px 10px; + border-radius: 10px; + background: rgba(245, 236, 216, 0.06); +} + +.wuxing-bars { + display: grid; + gap: 9px; + margin-top: 14px; +} + +.wuxing-bar { + display: grid; + grid-template-columns: 28px 1fr 20px; + align-items: center; + gap: 10px; +} + +.wuxing-bar i { + display: block; + height: 8px; + border-radius: 999px; + background: linear-gradient(90deg, var(--gold), var(--cyan)); +} + .dimension-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -709,6 +861,10 @@ p { min-height: auto; } + .home-stats { + grid-template-columns: 1fr; + } + .service-grid { grid-template-columns: repeat(3, minmax(180px, 1fr)); overflow-x: auto; @@ -824,9 +980,14 @@ p { -webkit-line-clamp: 2; } - .quick-row { - display: grid; - grid-template-columns: 1fr 1fr; + .home-stats { + gap: 12px; + padding: 15px; + border-radius: 18px; + } + + .home-stats h2 { + font-size: 24px; } .workspace { @@ -902,16 +1063,26 @@ p { white-space: nowrap; } - .archive-item { - padding: 14px; + .archive-open { + padding: 14px 0 14px 14px; } - .archive-item b { + .archive-open b { display: none; } - .archive-item small, - .archive-item em { + .archive-open small, + .archive-actions em { + font-size: 12px; + } + + .archive-actions { + padding: 12px 12px 12px 0; + } + + .archive-delete { + min-height: 28px; + padding: 0 9px; font-size: 12px; } @@ -943,6 +1114,22 @@ p { padding: 15px; } + .bazi-chart { + padding: 15px; + } + + .bazi-chart-head { + display: grid; + } + + .pillar-row { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .pillar strong { + font-size: 21px; + } + .dimension-head { grid-template-columns: auto 1fr; } diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 9418661..d211db8 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -2,8 +2,40 @@ import type { Metadata } from "next"; import "./globals.css"; export const metadata: Metadata = { - title: "赛博先生 | AI 手相报告", - description: "上传手相照片,生成一份面向生活、学习、事业与关系的娱乐向 AI 手相报告。", + metadataBase: new URL("https://m.xclaw.ren"), + title: "赛博先生 | AI 玄学档案", + description: "手相、面相、八字三合一 AI 娱乐解读,把日常困惑翻译成生活、学习、事业与关系里的具体提醒。", + applicationName: "赛博先生", + icons: { + icon: "/icon.svg", + apple: "/icon.svg", + }, + openGraph: { + type: "website", + url: "https://m.xclaw.ren", + siteName: "赛博先生", + title: "赛博先生 | AI 玄学档案", + description: "手相、面相、八字三合一 AI 娱乐解读,把日常困惑翻译成具体提醒。", + images: [ + { + url: "/share-card.png", + width: 1200, + height: 630, + alt: "赛博先生 AI 玄学档案", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "赛博先生 | AI 玄学档案", + description: "手相、面相、八字三合一 AI 娱乐解读。", + images: ["/share-card.png"], + }, + appleWebApp: { + capable: true, + title: "赛博先生", + statusBarStyle: "black-translucent", + }, }; export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { diff --git a/web/components/PalmWebApp.tsx b/web/components/PalmWebApp.tsx index 907da15..de1e14d 100644 --- a/web/components/PalmWebApp.tsx +++ b/web/components/PalmWebApp.tsx @@ -4,6 +4,7 @@ import { ChangeEvent, ReactNode, useEffect, useMemo, useState } from "react"; import { Dimension, HandSide, + Quota, Reading, ReadingSummary, ReadingType, @@ -62,6 +63,17 @@ type BaziForm = { birth_place: string; }; +type BaziChart = { + solar_date?: string; + lunar_date?: string; + birth_time?: string | null; + time_unknown?: boolean; + birth_place?: string | null; + pillars?: Record; + day_master?: string; + wuxing_balance?: Record; +}; + const defaultBaziForm: BaziForm = { nickname: "", gender: "", @@ -84,6 +96,7 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie const [busyText, setBusyText] = useState(""); const [error, setError] = useState(""); const [readings, setReadings] = useState([]); + const [quota, setQuota] = useState(null); const [activeReading, setActiveReading] = useState(null); const [activeView, setActiveView] = useState(initialView); const [activeJobId, setActiveJobId] = useState(""); @@ -95,7 +108,7 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie window.addEventListener("popstate", onPopState); ensureToken() - .then(() => loadReadings()) + .then(() => Promise.all([loadReadings(), loadQuota()])) .then(() => setReady(true)) .catch((err) => { setError(err.message || "初始化失败"); @@ -113,7 +126,6 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie }, [palmPreview, facePreview]); const completedReadings = readings.filter((item) => item.status === "completed").length; - const latestReading = readings[0]; const hasActiveJob = Boolean(activeJobId); function pickFile(event: ChangeEvent, type: "palm" | "face") { @@ -137,7 +149,16 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie setReadings(data); } + async function loadQuota() { + const data = await apiFetch("/readings/quota"); + setQuota(data); + } + async function startImageReading(type: "palm" | "face") { + if (quota && quota.remaining <= 0) { + setError("今日 5 次解读机会已用完,请明天 0 点后再来。"); + return; + } const file = type === "palm" ? palmFile : faceFile; if (!file) { setError(type === "palm" ? "请先选择一张清晰的掌心照片。" : "请先选择一张清晰的单人正脸照片。"); @@ -170,6 +191,10 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie } async function startBaziReading() { + if (quota && quota.remaining <= 0) { + setError("今日 5 次解读机会已用完,请明天 0 点后再来。"); + return; + } if (!baziForm.birth_date) { setError("请先填写出生日期。"); return; @@ -210,6 +235,7 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie .catch((err) => setError(err instanceof Error ? err.message : "报告生成失败")) .finally(() => setActiveJobId("")); void loadReadings(); + void loadQuota(); } async function pollReading(readingId: string) { @@ -293,12 +319,7 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie ))} -
- - -
+ ) : null} @@ -309,6 +330,7 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie busyText={busyText} ready={ready} error={error} + quota={quota} onPickFile={(event) => pickFile(event, "palm")} onSubmit={() => startImageReading("palm")} extra={ @@ -320,7 +342,6 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie ))} } - stats={} /> ) : null} @@ -331,10 +352,10 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie busyText={busyText} ready={ready} error={error} + quota={quota} onPickFile={(event) => pickFile(event, "face")} onSubmit={() => startImageReading("face")} extra={null} - stats={} /> ) : null} @@ -345,8 +366,8 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie busyText={busyText} ready={ready} error={error} + quota={quota} onSubmit={startBaziReading} - stats={} /> ) : null} @@ -362,14 +383,21 @@ export default function PalmWebApp({ initialView = "home" }: { initialView?: Vie
{readings.length ? ( readings.map((item) => ( - + + +
+ {statusText[item.status]} + +
+
)) ) : (

暂无档案。生成第一份报告后会出现在这里。

@@ -397,8 +425,8 @@ function ImageReadingForm({ busyText, ready, error, + quota, extra, - stats, onPickFile, onSubmit, }: { @@ -407,8 +435,8 @@ function ImageReadingForm({ busyText: string; ready: boolean; error: string; + quota: Quota | null; extra: ReactNode; - stats: ReactNode; onPickFile: (event: ChangeEvent) => void; onSubmit: () => void; }) { @@ -433,8 +461,8 @@ function ImageReadingForm({ {extra} - {error ?

{error}

: null} @@ -445,7 +473,6 @@ function ImageReadingForm({

提交后可离开等待

提交成功后,系统会在后台生成报告。你可以继续看档案,完成后自动刷新。

-
{stats}
); @@ -457,7 +484,7 @@ function BaziFormView({ busyText, ready, error, - stats, + quota, onSubmit, }: { form: BaziForm; @@ -465,7 +492,7 @@ function BaziFormView({ busyText: string; ready: boolean; error: string; - stats: ReactNode; + quota: Quota | null; onSubmit: () => void; }) { return ( @@ -473,7 +500,7 @@ function BaziFormView({
BAZI READING

填写生辰信息

-

第一版按标准专业排盘,不做真太阳时校正。出生地会用于报告语境,不用于经度校正。

+

输入出生日期与时间,赛博先生会先排出四柱,再把格局翻译成贴近日常的提醒。

- {error ?

{error}

: null}
@@ -532,17 +559,24 @@ function BaziFormView({

先排盘,再解读

后端会先计算四柱、五行和十神线索,再让赛博先生生成更接地气的生活化报告。

-
{stats}
); } -function ReadingStats({ total, completed }: { total: number; completed: number }) { +function HomeStats({ total, completed, quota }: { total: number; completed: number; quota: Quota | null }) { return ( -
- - +
+
+

TODAY STATUS

+

今日解读状态

+
+
+ + + + +
); } @@ -557,6 +591,7 @@ function ReportPanel({ reading, onDelete }: { reading: Reading; onDelete: () =>

{statusText[reading.status]}

{reading.error_message || "先生正在整理报告。"}

+
); } @@ -584,6 +619,8 @@ function ReportPanel({ reading, onDelete }: { reading: Reading; onDelete: () => ))}
+ {type === "bazi" ? : null} +
{data.dimensions.map((dimension, index) => ( @@ -602,6 +639,56 @@ function ReportPanel({ reading, onDelete }: { reading: Reading; onDelete: () => ); } +function BaziChartPanel({ chart }: { chart: BaziChart | null }) { + if (!chart) return null; + const pillars = chart.pillars || {}; + const wuxing = chart.wuxing_balance || {}; + const pillarItems = [ + ["年柱", pillars.year], + ["月柱", pillars.month], + ["日柱", pillars.day], + ["时柱", pillars.time], + ]; + + return ( +
+
+
+

CHART

+

排盘核心

+
+ {chart.time_unknown ? "时辰不详" : chart.birth_time || "已记录时辰"} +
+
+ {pillarItems.map(([label, value]) => ( +
+ {label} + {value || "-"} +
+ ))} +
+
+ 公历:{chart.solar_date || "-"} + 农历:{chart.lunar_date || "-"} + 日主:{chart.day_master || "-"} + {chart.birth_place ? 出生地:{chart.birth_place} : null} +
+
+ {(["木", "火", "土", "金", "水"] as const).map((name) => { + const value = wuxing[name] || 0; + return ( +
+ {name} + + {value} +
+ ); + })} +
+
+ ); +} + function DimensionCard({ dimension, index }: { dimension: Dimension; index: number }) { return (
@@ -621,6 +708,12 @@ function DimensionCard({ dimension, index }: { dimension: Dimension; index: numb ); } +function getBaziChart(reading: Reading): BaziChart | null { + const chart = reading.input_data?.chart; + if (!chart || typeof chart !== "object" || Array.isArray(chart)) return null; + return chart as BaziChart; +} + function SummaryList({ title, items }: { title: string; items: string[] }) { return (
diff --git a/web/lib/api.ts b/web/lib/api.ts index 8b51813..f185fb4 100644 --- a/web/lib/api.ts +++ b/web/lib/api.ts @@ -48,6 +48,13 @@ export type ReadingSummary = { overall_summary?: string | null; }; +export type Quota = { + limit: number; + used: number; + remaining: number; + reset_at: string; +}; + export type Report = Reading & { hand_side?: HandSide }; export type ReportSummary = ReadingSummary & { hand_side?: HandSide }; diff --git a/web/public/icon.svg b/web/public/icon.svg new file mode 100644 index 0000000..410c6e0 --- /dev/null +++ b/web/public/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/web/public/share-card.png b/web/public/share-card.png new file mode 100644 index 0000000000000000000000000000000000000000..a13dfb2717149e051c61efc3bd0d96da2d25e520 GIT binary patch literal 155383 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

W?z^o>`{|9F1QH=do$=Nl?Dr_%z3|O) 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 Gh5kR#0QJKF literal 0 HcmV?d00001 diff --git a/web/public/share-card.svg b/web/public/share-card.svg new file mode 100644 index 0000000..d71f03c --- /dev/null +++ b/web/public/share-card.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + CYBER MISTER + 赛博先生 + AI 玄学档案 + 手相 · 面相 · 八字 + 把日常困惑,翻译成生活里的具体提醒 +