aucms v2.3.0 发布包
构建日期：2026-11-03 12:45:15
包含插件：member, member-community, wallet, tag, seo404, random-cover, multi-site, friend-links
文件数：436（压缩前 4.13 MB）

【本次更新（v2.3.0）】
· 新增「内容读缓存」：内容详情 / 列表 / 计数走多级缓存链，命中时零内容表 SQL。
  失效用版本号实现（内容增删改 → 该模型列表整体换代，模型/字段/栏目变更 → 全局
  换代），O(1) 且不会漏。草稿预览、登录用户、/admin、nocache 一律绕过缓存；
  不缓存未命中结果（否则刚发布的文章会继续 404 到过期）。
  开关在 config/cache.php → content（默认开启，TTL 60 秒），说明见 docs/content-cache.md。
· 数据一致性加固：saveContent() / deleteContent() 把主表行、模型数据表行、
  镜像刷新、content_tag / content_draft 包进同一事务，失败整体回滚；
  钩子 content_create / content_update / content_delete 移到提交之后触发。
  降级底线不变：模型数据表写不进去时仍自动回填主表，建不出表不影响发文。
· 修复删除内容时模型数据表写失败被静默吞掉，留下「主表已删、数据表还在」的
  孤儿行且行数计数不回退；现记录日志并上抛，由事务回滚。
· 统一扩展字段读取口径：新增 extraValue()（真实列 → data JSON → 字段默认值），
  hydrate() 与 contentExtras() 共用同一套取值顺序，模板与插件不再可能读到两个值。
· saveContentExtras() 不再给「主表本无副本」的内容新造 data 副本，
  避免「主表只留索引列」的口径被插件的每次写入重新打破。
· 标签插件修复 6 处（版本 1.0.2）：
  ① 后台标签计数未过滤状态，显示条数与点进去的条数不一致；
  ② 后台标签文章列表手写 LIMIT offset,count，PostgreSQL / SQL Server / Oracle 上报错；
  ③④ 「从标签移除」与「删除标签」只删反向索引、不清 content.tags，
      内容一保存又被自动加回来（表现为「移除了又复活」）；
  ⑤ tag.name 只有普通索引，并发或批量导入会产生同名标签（后台两行、
      /tag/{拼音}{id} 只命中其一）；现加唯一索引，升级安装时自动合并重复项；
  ⑥ 拼音以数字结尾的标签（如 ai2024）链接解析歧义导致 404。
· 其余插件分表兼容修复：member（投稿通过/撤回改走 updateStatus/deleteContent，
  否则留孤儿行且缓存不失效；审核预览改读完整内容）、member-generator（旧数据迁移
  读写主表 data 完全失效；生成内容改走 saveContent，否则按扩展字段筛选查不到）、
  quming-pro（安装示例文章改走 saveContent）。四个插件版本 1.0.1。
· 新增内核出口 forgetContentCache($ids, $modelId)：插件直接改内容表后主动清缓存，
  避免标签页已消失而详情页仍显示旧标签。
· 新增 Schema::unique()：五种驱动统一建唯一索引的入口。
· 文档：新增 docs/content-cache.md；docs/model-sharding.md 补事务、读数口径
  与插件开发两条硬规则；README 全量核对订正（表数 / 字段类型 / 路由数 / 索引数等 14 处）。
· 测试：新增 tests/content_cache_selfcheck.php（26 项）与
  tests/plugin_shard_compat_selfcheck.php（17 项）；模型数据表自检扩到 87 项。

【V2 的主要变化】
· 全新安装即内置「文章」模型与配套扩展字段（副标题/作者/来源/推荐），
  配合随包分发的默认模板（列表 index/node.html、详情 index/article.html），
  装完就能建栏目发第一篇文章，不用先手工建模型。
· 从 1.x 覆盖升级的站点不会重跑安装向导，补种默认模型请执行：
    php aucms seed:models && php aucms cache:rebuild
  （幂等：已有同名模型会跳过，不会覆盖也不会删数据）

【安装步骤】
1. 把本目录全部文件上传到站点根目录（目录应为空）。
2. 浏览器访问 http://你的域名/install，按向导完成 5 步。
3. 安装完成后安装向导会被 runtime/install.lock 自动禁用（重装需先删该文件）。

4. 配置伪静态（前端控制器重写）。Nginx 只需一条兜底规则：
     location / { try_files $uri /index.php?$query_string; }
   注意：不要写成 try_files $uri $uri/，否则 /install 等与真实目录同名的
   路由会被 301 到目录并 403，永远到不了入口。

5. 【关键：否则地址栏永远带 /index.php?/】
   伪静态配好后，进后台 → 系统设置 → 伪静态/SEO 分组 → 「链接形态」，
   选「伪静态（/article/123.html）」或「PATH_INFO（/article/123）」并保存，
   全站链接才会变成干净地址。默认「入口模式」生成的是 /index.php?/路径，
   它在任何服务器都能用（零配置、无需改 nginx），但地址不美观；
   三种形态随时可切换，旧链接会自动 301 到新形态，不会失效。

【覆盖升级必看：新增了 /assets/ 目录的安全规则】
本版把后台模板与后台样式从 view/default/admin/ 迁到了站点根 assets/admin/，
让后台彻底不受前台主题影响（换主题不再后台裸奔）。代价是多了一个需要
保护的目录：assets/ 下只有静态资源可被下载，.html 模板源码必须挡住，
否则 /assets/admin/dashboard.html 会被直接 GET 到，模板逻辑整份暴露。

全新安装：照 nginx.conf.example（或 .htaccess）整份配置即可，已包含该规则。
老站覆盖升级：请在 nginx 站点配置里补这两条（放行在前、拒绝在后）：
    location ~ ^/assets/.+\.(css|js|mjs|map|png|jpe?g|gif|webp|bmp|ico|svg|woff2?|ttf|eot|mp4|webm|pdf)$ { expires 30d; }
    location ~ ^/assets/ { deny all; }
升级后旧目录 view/default/admin/ 可直接删除（程序不会再去找它）。
验证方式：访问 /assets/admin/dashboard.html 应返回 403/404，
而 /assets/admin/static/admin.css 应返回 200，后台页面样式正常。

【随包提供但默认未启用的插件】
本项目所有插件都是可选的，安装包只提供文件、不自动启用。按需开启：
  php aucms plugin:install member && php aucms plugin:enable member    # 会员中心（注册/登录/资料/等级/投稿/关注）
  php aucms plugin:install member-community && php aucms plugin:enable member-community    # 会员主页与预约（/members、/member/{id}）
  php aucms plugin:install wallet && php aucms plugin:enable wallet    # 钱包与账本（余额、充值、分成、提现；论坛悬赏与市场交易依赖它）
  php aucms plugin:install tag && php aucms plugin:enable tag    # 标签聚合
  php aucms plugin:install seo404 && php aucms plugin:enable seo404    # 404 智能跳转
  php aucms plugin:install random-cover && php aucms plugin:enable random-cover    # 随机封面
  php aucms plugin:install multi-site && php aucms plugin:enable multi-site    # 站群（同代码多域名）
  php aucms plugin:install friend-links && php aucms plugin:enable friend-links    # 友情链接（页脚，装完自带一条 aucms 官网）
注意：member-community / forum 依赖 member，请先启用 member。
启用后若前台仍 404，执行 php aucms cache:rebuild（或在后台插件页点一次保存）。

【目录权限】
runtime/ 与 data/ 需要 Web 用户可写：
  chown -R www:www runtime data
  chmod -R 755 runtime data

【详细文档】
  docs/deploy-guide.md    部署向导（含宝塔 / 宝塔外两种路径）
  docs/security.md        安全基线与加固清单
  docs/template-tags.md   模板标签手册

【不在包内的东西】
  data/secret.key            安装时自动生成（不要从别处拷贝）
  data/database.config.php   安装时自动生成
  runtime/*                  运行时自动生成
