Typeloom
更新日志
记录每一个版本的改进与变化。
# Changelog
本项目所有功能自首个版本 `1.0.0` 起即已包含。以下为 `1.0.0` 的完整功能清单。
## [1.0.0] - 2026-07-03
### 🎉 核心功能
- **MBTI 测试平台**
- 100 道专业 MBTI 测试题目(E/I、S/N、T/F、J/P 四个维度)
- 测试计时器(显示用时)
- 题目顺序答题,支持上一题/下一道导航
- 提交后计算类型结果
- **结果报告**
- 显示 MBTI 类型代码和名称
- 各维度得分柱状图(Chart.js)
- 类型详细描述(性格特点、优点、缺点、相处建议)
- 测试证书生成和下载
- **用户系统**
- 用户注册、登录、退出
- 前台用户中心(查看历史测试记录)
- 后台管理员登录
### ✨ 测试增强
- **测试进度自动保存与恢复**
- 草稿键 `localStorage['mbti_test_draft_v2']`,存 `{answers, currentIndex, timerSeconds, userEmail, total, ts}`
- 每次作答/翻页 `saveDraft()`;`beforeunload`/`visibilitychange` 也保存
- `startTest()` 开头 `clearDraft()`(全新开始);`submitTest()` 成功 `clearDraft()`
- 进入 intro 时若有草稿,显示 `#resumeBanner`(继续/重新开始),`resumeTest()` 拉题后跳回原进度
- **测试版本模式(简易 20 / 标准 80 / 进阶 100)**
- 入口:test.php intro 页新增「测试版本选择」三组卡片
- 数据层:`database.php` 新增 `getQuestionsByMode($mode)`(每维度取前 5/20/25 题,按 EI→SN→TF→JP 顺序)与 `getQuestionCountByMode($mode)`;题库由 80 扩到 100
- API:`api.php` 的 `get_questions` 与 `submit_test` 均接收 `mode`;提交按模式校验题数,且仅计分该模式题目(防越权)
- 结果页:`result.php` hero 区显示「测试版本:标准版 · 80 题」徽标(读 `certificates.mode`)
- **类型对比工具**
- 新建 `compare.php`,从 `mbti_types` 拉全部 16 型(含 `type_code/name/nickname/color/icon/description/strengths/weaknesses/cares`)
- 任选两型逐项对比 4 维度(相同/互补),给结论 `X/4` 与类型速览;支持 `?a=&b=` 预填
- 导航「对比」、页脚「类型对比」、match.php 结果区「对比类型差异」均链接至此
- **我的类型·本地身份卡(跨页,无需登录)**
- 键 `localStorage['mbti_my_type_v1']`,由 `result.php` 在查看报告时写入 `{type,name,nickname,color,icon,cert,date}`
- `includes/footer.php` 的 `renderMyType()` 在所有前台页:导航 `#myTypeNavSlot` 显示「你是 XX」chip(可 × 清除);`index.php` 的 `#myTypeHome` 显示欢迎回来卡片
### 🔐 认证架构
- **前后台一体登录**
- 单一会话:前台(`mbti_user` cookie, path `/`)与后台统一为同一用户会话
- 后台 `admin/auth.php` 委托 `includes/user_auth.php`(`admin_is_logged_in()` = `user_is_logged_in() && role==admin`)
- 统一入口:`login.php` 是唯一登录页,按 `role` 分流(管理员→`admin/index.php`,普通用户→`my-results.php`)
- **角色列与初始管理员播种(源码零硬编码)**
- `users` 表新增 `role` VARCHAR(20) DEFAULT 'user'(`UserDB::ensureSchema()` 自举迁移)
- `user_login()` 写 `$_SESSION['user_role']`;`user_is_admin()` 判定角色
- `UserDB::ensureAdminAccount()` 在库内无 `role='admin'` 时播种:凭据仅来自部署环境变量 `MBTI_ADMIN_USERNAME` / `MBTI_ADMIN_PASSWORD`(可选 `MBTI_ADMIN_EMAIL`)
- **源码中已无任何硬编码账号/密码**;未配置环境变量则直接跳过
- 全新部署可用 `database/seed_admin.sql`(幂等 INSERT,默认 admin / 123456,首次登录后改密)注入初始管理员
- **线上实际后台账号为 `admin` / `123456`**
- **账号管理统一**
- 彻底单一账号源:`admin/config.php` 的 `ADMIN_USERNAME/ADMIN_PASSWORD_HASH` 与 `admin/auth.php` 的 `admin_try_login()` 已移除
- 账号统一在 `admin/accounts.php`(左侧「注册用户」)管理:列表显示角色徽章,支持「设为/取消管理员」「重置密码」,并对「最后一名管理员」做封禁/降级保护
### 🗄️ 数据库
- **单一数据库初始化脚本**
- `database/mbti_database.sql` 现为唯一、完整、自洽的数据库初始化脚本(含 100 题 + `certificates.mode` 列 + 初始管理员 `admin`/`123456` 种子,且 `users` 表已含 `role` 列)
- 原 `migrate_add_20_questions.sql`、`seed_admin.sql` 已删除并并入此文件
- 全新部署只导入这一个文件即可
### 📱 UI / UX
- **手机端适配**
- 导航栏在移动端折叠为汉堡菜单
- 首页 Hero 区在手机端垂直居中,字号自适应
- 功能卡片在手机端单列显示
- 测试页在手机端优化间距和按钮大小
- 结果页在手机端优化类型卡片布局
- **主题系统**
- 前后台共用一套设计令牌(浅色默认 + `:root[data-theme="dark"]` 覆盖)
- 主题偏好键:`localStorage['typeloom-theme-preference']`,取值 `dark | light | system`
- 切换主题:点击 `.theme-toggle` 开关,派发 `themechange` 事件(图表监听绑 window)
- **全局 MiSans 字体**
- 从本地字体文件改为 CDN 加载(字节跳动 MiSans)
- 字体加载失败时优雅降级到系统字体
### 🗂️ 后台管理
- 管理员仪表盘(统计图表)
- 用户管理(查看/删除测试记录)
- 题目管理(查看/添加/编辑/删除题目)
- 系统设置(网站名称、描述、logo、每页显示数量等)
- 邮件设置(SMTP 配置)
- 公告管理
### 🧹 清理优化
- 删除无用文件
- 移除 `assets/fonts/smiley-sans/` 文件夹(「得意黑」字体已被 MiSans CDN 取代)
- 移除 `assets/css/bold-type-tokens.css`(实验性设计令牌,从未被加载)
- 移除 `assets/css/editorial-tokens.css`(令牌已内联在 `editorial.css`,冗余)
- 移除 5 个本地预览 HTML 文件
### 🐛 Bug 修复
- **修复首页底部大块空白**
- 原因:`.animate-on-scroll { opacity: 0; }` 默认透明,JS 未正常触发时区块占据空间但不可见
- 修复:改为渐进增强模式(基础态可见,JS 观察前加 `.observing { opacity: 0; }`)
- **优化导航栏 active 状态**
- 之前「首页」用亮橙色 + 加粗显示,在深色导航栏里过于抢眼
- 改为和其他导航项同色系 + 底部 accent 色指示线
### 🛠️ 技术栈
- 前端:HTML5、CSS3、JavaScript(jQuery)、Bootstrap 5、Chart.js
- 后端:PHP、MySQL(PDO)
- 部署:Nginx(当前为普通 `.php` URL,支持伪静态配置)
---
**当前版本:1.0.0**
**最后更新:2026-07-05**