# Smile First 口腔护理预约小程序 Smile First 是一个微信小程序预约 MVP,覆盖首页、选择项目、选择日期与时间、确认预约、预约成功、我的预约,以及 Go 后端 API。 ## 技术栈 - 小程序:原生 WXML / WXSS / JS - 后端:Go、Fiber、sqlc、Cobra、logrus - 数据库:SQLite - 部署:Docker / docker compose ## 本地运行后端 ```bash cp .env.example .env # 本地开发可使用 GUAHAO_ADMIN_AUTH_MODE=none 直接进入后台 # 生产环境建议使用 GUAHAO_ADMIN_AUTH_MODE=oidc 并填写 OIDC 配置 # 体验版获取手机号还需要填写 GUAHAO_WECHAT_APPID / GUAHAO_WECHAT_SECRET cd backend go run ./cmd/smilefirst serve ``` 默认监听 `:9800`,启动时会自动应用 schema 并插入默认项目、排期与时段。 管理后台入口: - 登录页:`http://127.0.0.1:9800/admin/login` - 默认页:`/admin/price-inquiries` - 价格咨询派单:`/admin/price-inquiries`,展示授权手机号提交的地区、咨询项目、创建时间和更新时间 后台登录模式、OIDC 配置和微信小程序凭证从本地 `.env` 或运行环境变量读取,真实 `.env` 不提交到代码库: ```env GUAHAO_ADMIN_AUTH_MODE=none GUAHAO_ADMIN_SESSION_SECRET= GUAHAO_ADMIN_PASSWORD_CHANGE_REDIRECT_URL=https://gh.yqbmb.com/admin/price-inquiries GUAHAO_OIDC_ISSUER=https://auth.yqbmb.com/oidc GUAHAO_OIDC_CLIENT_ID= GUAHAO_OIDC_CLIENT_SECRET= GUAHAO_OIDC_REDIRECT_URI=http://127.0.0.1:9800/admin/oidc/callback GUAHAO_OIDC_SCOPES=openid profile email phone GUAHAO_WECHAT_APPID= GUAHAO_WECHAT_SECRET= GUAHAO_UPLOAD_DIR=data/uploads ``` `GUAHAO_ADMIN_AUTH_MODE=none` 会跳过后台登录,仅建议本地开发使用;`oidc` 会通过 Logto/OIDC 授权登录,回调地址为 `/admin/oidc/callback`,登录后后台右上角展示授权用户姓名和修改密码入口。修改密码入口会跳转到 Logto Account Center 的 `/account/password`,完成后返回 `GUAHAO_ADMIN_PASSWORD_CHANGE_REDIRECT_URL`。 后台上传的首页图片和项目图片会保存到 `GUAHAO_UPLOAD_DIR`,并通过 `/uploads/...` 访问。 ## Docker 部署 ```bash docker compose up --build ``` 接口健康检查: ```bash curl http://127.0.0.1:9800/healthz ``` ## 小程序开发 用微信开发者工具打开 `uni-guahao/` 目录。小程序请求地址由 `uni-guahao/utils/api.uts` 自动选择,不需要发布前手动改 URL: - 微信开发版 `develop`:`http://localhost:9800` - 微信体验版 `trial` / 正式版 `release`:`https://gh.yqbmb.com` 线上域名需要在微信公众平台配置为 request 合法域名;本地开发时 `manifest.json` 已关闭开发域名校验。 首页不配置底部 `tabBar`。用户可直接选择项目和预约时段;在确认预约时授权手机号,授权成功后自动提交预约。确认页可通过半屏底部弹层查看《预约服务条款》。 ## 关键目录 - `uni-guahao/`:uni-app x 微信小程序前端 - `backend/`:Go API 服务 - `backend/migrations/schema.sql`:SQLite schema - `backend/queries/`:sqlc 查询 - `uni-guahao/static/`:小程序静态资源 - `docs/design-elements.md`:设计元素、裁切坐标和 token