Files
TripLog/README.md
T
laoyang 7ec3ea559e 安装向导:首次部署浏览器引导建库建表(批 26)
- 新增 install.php 独立安装向导:环境检查 → 表单(站点标题/家庭名/数据库/
  高德/管理员)→ 全量建表 → 基本种子数据 → 生成 config.php → 自动自删。
  已安装判定以 config.php 为准,重复访问只显示「已安装」。
- 新增 sql/schema.sql 全量建表脚本(15 张表,按外键依赖排序,全部
  IF NOT EXISTS),由向导执行;tools/migrate.php 继续负责增量迁移。
- index.php 加未安装检测:config.php 缺失或无效时跳转安装页。
- layout.php 标题回退值接通 app.name,安装时填的网站标题在页面上生效。
- 种子数据仅基本款:节点类型 5、角色标签 4、出行方式 9(不含需绑定
  车辆的自驾两类);管理员账号按既有加密方式写入。
- README 部署章节改为向导优先,手动方式降为备选。
- 验证:本地 60 文件 php -l 全过;渲染检查 386 项全过;
  安装流程端到端 46 项全过(临时副本 + 独立 MariaDB:跳转、表单、
  建表、种子、加密可逆、自删、已安装拒绝、错误路径)。
2026-09-28 20:55:16 +08:00

146 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TripLog
**家庭旅行日记** —— 把一次旅行的行程、照片、花销、同行人,完整地记录和回看。
以「活动(一次旅行)」为容器,内部按「节点(当天/某一段行程)」串联,
每个节点可以带时间地点、交通方式、参与人、照片附件与花销分摊;
首页是一张地图,把去过的家和走过的地方标出来。
技术栈:**PHP 8 + MySQL**,无框架、无 Composer、无前端构建工具。
路由自写(`index.php?r=控制器/方法`),视图为原生 PHP 模板,前端为原生 CSS + JS。
---
## 功能
**旅行与行程**
- 活动(旅行)的增删改查,支持封面图、起止时间、状态
- 行程节点:时间、地点(高德选点)、备注,支持「由计划一键成行」
- 节点交通:出行方式(自驾/高铁/飞机…)+ 车辆,可绑定起终点
- 一键跳高德导航 / 搜索(服务端与前端共用一处配置,见下文)
**记录与协作**
- 照片附件:多图上传、可视化裁剪、当前页灯箱浏览(左右切换)
- 封面拖拽上传,自动走裁剪
- 参与人与角色标签(家庭成员角色、当时情绪等)
- 活动级与节点级评论
**花销**
- 只记明细 + 总计,不做预算
- 分摊到参与人
**首页地图**
- 同城活动拥挤时扇形拉出排布,引线带箭头指向真实位置
- 卡片为「左图右文」方形卡片
**存储与基础设施**
- 存储抽象层:**本地磁盘** 或 **阿里云 OSS**,后台可切换与自检
- 媒体代理路由:照片/封面经 `media/*` 输出,**不对外暴露 OSS 地址**
- 站点图标与 PWA 清单(可添加到手机主屏)
---
## 目录结构
```
index.php 入口与路由表(白名单 + 登录拦截)
config.example.php 配置模板(复制为 config.php 使用)
src/
Database.php PDO 连接
Auth.php Access.php 登录态与权限
Migrate.php 幂等迁移定义(VERSION 常量)
Settings.php 站点级键值设置(存储驱动等)
Storage.php Oss.php 存储抽象层 / OSS 客户端
Uploads.php Attachments.php Mime.php
Members.php Expenses.php Comments.php
helpers.php 全局辅助函数(asset()、e()、amap_nav_url() 等)
Controllers/ 各业务控制器
templates/ 视图模板(layout.php 为公共骨架)
assets/ 样式、图标、第三方前端库(cropper)
sql/migrations/ SQL 迁移留档
tools/migrate.php 迁移执行入口(仅命令行)
uploads/ 用户上传内容(不入库)
```
---
## 部署
### 1. 环境要求
- PHP **7.4+**(推荐 8.x;开发与线上均在 8.1 与 7.4 双版本下做过语法检查与冒烟)
- MySQL 5.7+ / 8.0(MariaDB 亦可),字符集 `utf8mb4`
- PHP 扩展:`pdo_mysql`、`curl`、`gd`、`mbstring`、`json`、`openssl`
- 站点根目录对 Web 进程**可写**(安装时生成 `config.php` 用;`uploads/` 始终需要可写)
### 2. 安装向导(推荐)
1. 把代码放入站点目录,确保站点根对 Web 进程可写;
2. 在 MySQL 里创建一个**空的**数据库(表结构由安装向导自动生成):
```sql
CREATE DATABASE trip DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 再创建专用账号并授予 trip 库全部权限(推荐,不要用 root)
```
3. 浏览器访问站点根 —— 未安装时 `index.php` 会自动跳转到 `install.php` 安装向导;
4. 按表单填写:网站标题、家庭名称、数据库连接、高德地图 Key(可留空稍后补)、
管理员账号(手机号 + 密码);
5. 提交后向导会:全量建表(`sql/schema.sql`)→ 执行增量迁移(`src/Migrate.php`)→
写入基本数据(你的家庭、管理员账号、节点类型、角色标签、常用出行方式)→
生成 `config.php` → **自动删除 `install.php`**。
安装完成后即可用管理员账号登录。「已安装」的判定以 `config.php` 为准:
即使 `install.php` 没有被成功删除,再次访问也只会看到「已安装」提示,无法重新安装。
> 种子的出行方式不含「自驾」两种 —— 自驾方式必须关联具体车辆,
> 请先在「车辆管理」里添加车辆,再自行添加自驾出行方式。
### 3. 手动安装(备选)
不想用向导时,也可以完全手动:
```bash
git clone <repo-url> triplog
cd triplog
cp config.example.php config.php # 手工填写数据库与高德参数
php tools/migrate.php # 不够:首次还需要全量建表,见下
```
全量建表:把 `sql/schema.sql` 导入空库(`mysql trip < sql/schema.sql`),
再执行 `php tools/migrate.php` 补齐增量迁移。管理员账号目前需自行向 `families`、
`users` 插入(密码用 `password_hash()`,手机号存 `phone_hash`(SHA-256)与
`phone_encrypted`(AES-256-CBC)),**推荐直接使用安装向导**。
`config.php` 不入库(含口令),只提交模板 `config.example.php`。
所有配置项都支持环境变量覆盖(`DB_HOST` / `DB_NAME` / `AMAP_NAV_SRC` 等)。
### 4. Web 服务器
把站点根指向项目根目录。Apache 需允许 `.htaccess`(`uploads/` 下有一条禁止执行脚本的规则,
不可删除);Nginx 请自行配置等价规则,并注意 `uploads/` 内不得解析 PHP。
### 5. 高德地图
在 `config.php` 的 `amap` 段填写(安装向导里填过的可跳过):
- `key` —— 服务端接口用
- `security_js` —— 前端 JS API 2.0 的安全密钥
- `nav_src` —— URI API 的调用来源(`src`)参数,**仅用于高德侧来源统计**,
填任意英数字串都能工作。服务端 `amap_nav_url()` 与前端表单共用这一个值,
只改这一处即可。示例值用 `trip.example.com`,请替换为你自己的域名。
---
## 使用
访问站点根 → 未登录会跳转登录页。首次部署后由管理员在后台创建用户。
后台可维护:用户、活动、节点类型、出行方式、车辆、角色标签、存储设置。
---
## 许可
见 [LICENSE](LICENSE)。