更新日志
版本发布逐版本列出变更说明,站点公告按置顶与时间倒序排列,共 93 条记录;升级前请先阅读对应版本的变更说明与升级步骤。
-
v0.4.64
官网新增用户系统 + 主站总览页「登录官方网站 / 获取授权验证」
随交付包发布需求:"给官网增加一个用户系统用于管理授权网站管理,在主站后台总揽页增加一个登录官方网站的接口用于获取授权验证"。
查看完整变更
需求:"给官网增加一个用户系统用于管理授权网站管理,在主站后台总揽页增加一个登录官方网站的接口用于获取授权验证"。
一、官网:授权用户中心(客户自助管理授权网站)
页面 能力 official/user/login.php登录 / 注册同页(支持邮箱或 11 位手机号;注册限流 10 次/小时;登录限流 12 次/5 分钟);从客户站点跳转时显示「你从客户站点后台跳转而来(域名 xxx)」提示 official/user/index.php我的授权:授权列表(套餐 / 绑定域名 / 到期 / 激活次数 / 换绑次数 / 状态徽标)、凭授权码认领、自助解绑换域名、自助续验、下载安装包入口、修改密码、登录记录 official/user/logout.php退出登录 - 会话隔离:用户中心用
OFFUSERSESSID,与官网后台(OFSESSID)完全分开; - 数据模型:新增
off_users表,并给off_licenses自动迁移user_id列(首次访问自动完成,无需重跑安装向导); - 归属规则:一个账号可管理多个授权;授权码未被他人认领时可自助认领;已被他人认领时明确提示联系客服;越权操作(解绑/续验他人授权)一律拒绝。
二、官网后台:用户管理(
official/admin/users.php)- 列表 / 搜索(账号·称呼·公司)/ 分页;统计卡片:注册用户数、已归属授权数、未归属授权(待认领);
- 用户详情:名下授权逐条列出,可解除归属;可把指定授权码指派给该用户;可重置密码;
- 停用/启用、删除(删除时其授权只解除归属、不删除授权本身)。
三、主站后台总览页:官方网站 · 商业授权卡片
在总览页顶部新增卡片,四块信息 + 三个按钮:
信息块 内容 官网连接 正常 / 不可达 + 当前官网地址 授权状态 已授权商用 / 授权未通过 / 未绑定在线授权(含套餐与到期日) 版本 本站版本 vs 官网最新版(已最新 / 可更新) 用户中心 「查看我的授权 →」直达官网用户中心 按钮 作用 登录官方网站 跳转 官网/user/login.php?from=cms&domain=<本站域名>,带上来源与域名,登录后即可管理本域名授权获取授权验证 提交到「商业授权」页执行 do=check:调官网ping+releases校验授权与最新版本授权设置 进入商业授权页(填官网地址/授权码、激活、续验、解绑) 新增
LicenseManager::officialLoginUrl()与officialHomeUrl()供跳转使用。四、验证
数据层与业务(21 项断言全通过): off_users 自动建表 ✓ off_licenses.user_id 自动迁移 ✓ 注册成功 ✓ 重复注册被拒 ✓ 非法账号被拒 ✓ 弱密码被拒 ✓ 登录成功 ✓ 错误密码被拒 ✓ ★ 认领授权成功 ✓ 授权已归属 ✓ 重复认领提示已在自己账号下 ✓ ★ 我的授权列表可读 ✓ 越权解绑被拒 ✓ 授权可被激活 ✓ ★ 用户自助解绑成功(剩余换绑 1)✓ 未绑域名续验给明确提示 ✓ 旧密码错误拒绝改密 ✓ 两次不一致拒绝 ✓ ★ 改密成功 ✓ 新密码可登录 ✓ ★ officialLoginUrl 可生成且带 from=cms ✓ officialHomeUrl 可用 ✓ (测试用户与授权已删除,库内无残留 ✓) HTTP 真机验证: 官网 /user/login.php HTTP 200 / 6956 B 无报错 ✓ ?from=cms&domain= 变体 200 / 7064 B ✓ /user/index.php 未登录 302 跳登录 ✓(守卫生效) 官网首页 30000 B,导航含「用户中心」✓,零报错 ✓ 官网后台「用户管理」HTTP 200 / 6326 B,含用户表 ✓ ★ 主站总览页 34122 B:含「官方网站 · 商业授权」卡片、「登录官方网站」按钮、「获取授权验证」按钮、 官网连接状态、链接指向 user/login.php,全部命中且零 PHP 报错 ✓ - 会话隔离:用户中心用
-
v0.4.63
主站配置官网接口地址 qdcms.cn + 主站↔官网 API 打通
随交付包发布需求:"给主站配置官网接口地址'qdcms.cn',主站与官网的API相关功能"。
查看完整变更
需求:"给主站配置官网接口地址'qdcms.cn',主站与官网的API相关功能"。
一、官网接口地址已配置
主站设置项
license_api已写入http://qdcms.cn。实测该域名已经在运行官网系统(v1.0.2):接口 结果 ping✓ {"ok":true,"name":"奇点CMS","version":"v1.0.2","plans":4}plans✓ 4 个套餐(个人/商业/多站/体验) plugins✓ 12 个插件 releases✗ unknown_action—— 该动作是 v1.0.5 才新增的,线上官网需升级也就是说:域名与授权链路已经通了,只差把官网升级到新版(同时获得安装向导修复、首页主站介绍、CMS 下载中心与
releases版本检查接口)。二、主站↔官网 API 功能矩阵(4 条链路)
# 主站位置 调用的官网接口 作用 1 后台 →「商业授权」 activate/verify/deactivate/ping在线激活、续验、解绑换域名 2 后台 →「插件与模块」 plugins展示官方插件市场(名称/分类/版本/价格/说明) 3 后台 →「商业授权 → 官网连接与版本」(本次新增) ping+releases连接状态、官网版本、最新版对比、一键下载新版本 4 前台悬浮助手 / 工作面板 无(本地模型或云端模型) 不依赖官网 三、本次新增内容
# 文件 说明 1 official/api.php新增 action=releases:返回最新版本(版本号/体积/SHA256/发布时间/下载数)、下载地址、下载页地址、完整版本列表,并可按传入的current做版本对比(up_to_date);动作白名单与限流同步补充2 includes/LicenseManager.php新增 officialInfo():一次拿到官网 ping 信息 + 最新版本对比(独立缓存 15 分钟,避免每次开页面都请求官网)3 admin/license-online.php新增「官网连接与版本」面板:官网地址与接口 URL、连接状态(正常/不可达)、官网名称与版本、本站版本 vs 官网最新版(含"可更新"提示)、检查连接与更新按钮、官网下载页/下载最新版按钮、上次检查时间 四、验证 → 16 / 16 通过
A. 本地官网地址下: officialInfo 连接成功 ✓ 官网名称+版本 ✓ ★ releases 返回最新版与下载地址 ✓(v0.4.61 / /official/download.php?f=QDCMS-v0.4.61.zip) ★ 版本对比正确(本地官网 v0.4.61 vs 本站 v0.4.62 → up_to_date=true)✓ ★ 插件市场接口可用(12 个插件)✓ releases 结构完整(历史版本 1 个)✓ ping 正常 ✓ B. 写入 http://qdcms.cn: 设置写入成功 ✓ 连接结果 ok=true("授权服务正常")✓ 不可达时返回结构化失败、不抛异常 ✓ ★ 字段完整(api/up_to_date 均在)✓ 授权摘要可读 ✓ C. 后台渲染:商业授权页 HTTP 200 / 16858 B 无报错 ✓(含「官网连接与版本」面板、显示 qdcms.cn) 插件与模块页 HTTP 200 / 27868 B 无报错 ✓ D. 远端实测:qdcms.cn 的 ping/plans/plugins 均正常返回 ✓(releases 需升级官网到 v1.0.5) -
v0.4.62
官网新增 CMS 下载中心
随交付包发布需求:"给官方网站增加一个CMS 下载功能"。
查看完整变更
需求:"给官方网站增加一个CMS 下载功能"。
一、前台:CMS 下载中心(
official/download.php)- 最新版卡片:版本号、体积、发布时间、下载次数、SHA256 校验值、通道(稳定/测试); 「立即下载」按钮 + 「查看安装文档」;右侧给出安装三步(环境确认 → 上传解压 → 运行安装向导);
- 历史版本表:全部版本可回滚下载,显示版本/类型/体积/发布时间/下载次数/SHA256 前 16 位, 文件缺失的版本会明确标注「文件缺失」而不是给个坏链接;
- 三栏说明:环境要求(PHP 8.0+/MySQL 8.0/可选 FFmpeg·Ollama)、授权说明(可自由下载评估,商用需购买授权并绑定域名)、升级与支持;
- 导航新增「下载」入口,首页 Hero 新增「下载安装包」按钮。
二、下载安全
- 下载走
download.php?f=<文件名>:只允许off_releases表中登记过的文件名(先basename再白名单正则), 实测../../config/generated.php、index.php、不存在的文件全部 404 拒绝; - 流式输出(256KB 分块)+ 正确
Content-Type: application/zip+Content-Disposition文件名 +Content-Length+X-Package-Sha256响应头(便于用户校验); releases/目录自动放置.htaccess(禁目录列表 + 禁 PHP 执行)与index.html。
三、后台:下载管理(
official/admin/downloads.php)- 上传 zip(≤300MB):自动计算体积与 SHA256、可从文件名解析版本号;同文件名则更新该条;
- 可选设为最新版(前台优先展示)、通道(稳定/测试)、标题与更新说明;
- 列表操作:编辑信息、设为最新、上架/下架、删除(同时删文件);统计卡片显示已上架版本数、累计下载、当前最新版、存储目录;
- 「扫描本机安装包」:自动发现交付包目录里的
QDCMS-v*.zip并复制登记,一步上架。
四、验证(实测)
① 建表:off_releases 自动创建(无需重跑安装向导)✓ ② 登记:QDCMS-v0.4.61.zip(1.61 MB,sha256 1f9c38d5a40b75b3…)✓ ③ 下载页:HTTP 200 / 10066 B,含最新版卡片与授权说明,零 PHP 报错 ✓ ④ ★ 真实下载:HTTP 200 / 1,686,687 B / application/zip, 下载文件 sha256 = 1f9c38d5a40b75b39bc00c7ca4344f52bc34e2abef146ba7757dd3d033fda63d 与源包**完全一致** ✓ ⑤ 目录穿越防护:../../config/generated.php → 404 ✓ index.php → 404 ✓ nonexist.zip → 404 ✓ ⑥ 后台「下载管理」:HTTP 200 / 8019 B,含上传表单 + 版本列表 + 扫描按钮,零报错 ✓ ⑦ 首页「下载安装包」按钮 ✓ 导航「下载」入口 ✓ 页面标题「CMS 下载 - 奇点CMS 官方网站」✓五、打包说明
交付包内不含安装包本体(避免"包中套包"):
official/releases/只保留说明文件; 部署后到官网后台「下载管理」上传,或点「扫描本机安装包」自动登记交付包目录中的QDCMS-v*.zip。 -
v0.4.61
官网首页改用主站真实内容做介绍
随交付包发布需求:"官方网站的首页介绍内用主站QDCMS相关内容做介绍"。
查看完整变更
需求:"官方网站的首页介绍内用主站QDCMS相关内容做介绍"。
一、首页新增「主站介绍区块」(Hero 之后)
不再只讲功能名词,而是用主站自己的模块与运行数据说话:
- 12 个模块卡片:每个卡片显示模块名、真实计数、真实前台入口文件名(如
video.php、moments.php、qa.php)、 真实后台位置(如「内容 → 短视频」「工作面板 → Agent」)与一句话说明; - 计数为 0 的模块(如小说、短剧:装了但还没内容)显示 「已就绪」,不露"0 部小说"这种尴尬数据;
- 运行实况条:数据库表数、已装载模块数、媒体文件数、注册用户数,以及计数最高的 6 个模块;
- 标注「统计时间 xxx,每 10 分钟自动刷新」。
实测(线上首页,与数据库逐项核对一致):
12 个模块卡片: 小说阅读 已就绪 novels.php 后台:内容 → 小说管理 章节内容 已就绪 后台:内容 → 小说管理 短视频 10 条 video.php 后台:内容 → 短视频 短剧 已就绪 drama.php 后台:内容 → 短剧 动态广场 17 条 moments.php 后台:内容 → 动态 百科词条 3 条 encyclopedia.php 后台:内容 → 百科 问答 8 条 qa.php 后台:内容 → 问答 时政资讯 5 条 news.php 后台:内容 → 资讯 即时通讯 13 条 messages.php 后台:系统 → 聊天设置 AI 知识库 18 条 agent-ai-api.php 后台:工作面板 → Agent Token 计费 38 条 后台:运营 → Token 用户体系 3 条 login.php 后台:用户 → 用户管理 运行实况:数据库表 55 张 · 已装载模块 12 个 · 媒体文件 21 个 · 注册用户 3 位 · 短视频 10 · 动态广场 17 · 百科词条 3 首页体积 21872 B → 29786 B,零 PHP 报错 ✓二、配套改造
# 文件 说明 1 official/includes/main-bridge.php(新增)主站桥接:读取主站数据库(独立部署用官网后台配置的 main_db_*;同机子目录部署自动复用上层主站config/generated.php),输出模块清单与统计;结果缓存 10 分钟(不给主站库添压力);连接失败绝不报错2 official/includes/main-intro.php(新增)首页介绍区块(模块卡片 + 运行实况 + 降级文案),由 index.php一行require引入3 official/admin/main-site.php(新增)官网后台「主站数据」页:启用开关、主机/端口/库名/账号/口令(口令留空=不修改)、保存后自动清缓存立即生效、清除配置;并列出"首页将展示什么"(模块 × 前台入口 × 后台位置 × 当前计数) 4 official/admin/includes/layout.php后台导航加入「主站数据」 5 official/index.phpHero 之后接入介绍区块(仅一行 require,不改动既有结构) 三、降级与容错验证
① 关闭主站数据(main_db_enabled=0)→ 首页 29786 → 24042 B,显示"主站数据暂不可读 + 功能清单"文字介绍, 零 PHP 报错 ✓(不白屏、不报错) ② 恢复为自动模式 → 首页 29787 B,模块卡片与实况数据回归 ✓ ③ 主站数据库不可达时同样走降级分支(连接 3 秒超时 + 10 分钟缓存,不影响首页打开速度)✓ - 12 个模块卡片:每个卡片显示模块名、真实计数、真实前台入口文件名(如
-
v0.4.60
官网安装向导 + 修复 open_basedir 告警
随交付包发布用户实测反馈:Linux 宝塔环境部署官网时报
查看完整变更
用户实测反馈:Linux 宝塔环境部署官网时报
Warning: is_file(): open_basedir restriction in effect. File(/www/wwwroot/config/generated.php) is not within the allowed path(s): (/www/wwwroot/qd/:/tmp/)随后页面显示"官网数据库暂时不可用",并询问"官方网站是否有安装向导"。一、这是真 bug(已修)
官网内核为了兼容"与 CMS 同机子目录部署",会去探测上层目录的
../config/generated.php。 独立部署时上层目录通常在open_basedir之外 →is_file()触发告警;且探测失败后代码 直接走到"数据库暂时不可用",既没说清原因、也没给安装入口。修法:
- 新增
offSafeIsFile():先判断目标路径是否落在open_basedir允许列表内, 不在允许范围就根本不去访问(不再产生任何告警);所有对上层目录/密钥文件的探测统一走它; - 数据库连不上时区分两种情况: · 尚未安装 → 渲染引导页「官网尚未完成安装 → 打开安装向导」(不再是干巴巴一句报错); · 已安装 → 仍提示数据库不可用,并指向
data/official.log。
二、新增图形安装向导(回答"是否有安装向导":原来只有命令行,现在有了)
浏览器打开
install.php即进入向导,三步完成,无需命令行:步骤 内容 ① 环境检测 PHP 版本、必需/可选扩展(pdo_mysql/mbstring/json/openssl/curl/gd)、config 与 data 目录可写、session 可用、open_basedir 现状 ② 数据库与管理员 填主机/端口/库名/账号/口令 + 后台账号密码;库不存在自动创建;建 9 张表、14 项默认设置、12 个插件条目、首条公告;写入 config/generated.php(0600)③ 完成 显示官网/后台/接口入口与安全提醒;写入 data/.install.lock自动锁定向导其它:保留命令行安装(
--db-name/--db-user/--db-pass/--admin/--pass,幂等,适合脚本化/批量部署); 支持网址参数一键安装;已安装后再访问显示"已完成安装",删除锁文件可重装,带?token=可进入。三、复刻用户环境实测(决定性验证)
环境:全新目录(无 config/generated.php)+ 上层目录放一个主站配置(复刻 /www/wwwroot/config/…) open_basedir 严格限制为「站点目录 + C:/Windows/Temp/」——与用户的 /www/wwwroot/qd/:/tmp/ 同构 ① 首页:HTTP 503,显示"官网尚未完成安装 → 打开安装向导" ★ open_basedir Warning:False ✓(修复前为 True) ★ 直接甩"数据库暂时不可用":False ✓ ② 向导第①步环境检测:HTTP 200,4626 B(含 open_basedir 检测行)✓ ③ 向导第②步提交: [ok] 数据库不存在,已自动创建 ✓ [ok] 已建/校验 9 张表 ✓ [ok] 已创建管理员 ✓ [ok] 默认设置新增 14 项 ✓ [ok] 插件条目新增 12 个 ✓ [ok] 已写入首条公告 ✓ [ok] 已写入独立配置 config/generated.php ✓ [ok] 已写入安装锁 ✓ ④ 安装后:首页 HTTP 200 / 21449 B ✓ API ping → ok=true, version=v1.0.2 ✓ ⑤ 再次访问向导 → 显示"已完成安装"并锁定 ✓ ⑥ 清理:停服务器 / 删测试库 / 删模拟目录 ✓ - 新增
-
v0.4.59
官方网站支持独立打包与独立部署 + 一处空值加固
随交付包发布需求:"官方网站独立打包"。
查看完整变更
需求:"官方网站独立打包"。
一、官网现在可以脱离主站独立部署
原来官网内核从主站
../config/generated.php读数据库口令,只能"同机子目录"部署; 本次改造后支持两种形态:形态 访问地址 数据库配置来源 独立站点(新增) http://官网域名/official/config/generated.php(由 install.php 自动生成,或照抄config/generated.example.php)主站子目录(原有) http://主站域名/official/无独立配置时自动复用主站配置,零配置即可启动 install.php支持命令行/网址传入数据库参数,并会自动建库、写独立配置(权限 0600): ``bash php install.php --db-host=127.0.0.1 --db-name=qdcms_official \ --db-user=root --db-pass=口令 --admin=admin --pass=后台密码``- 新增
README.md(部署与接口速查)、docs/官网部署说明.md(独立/子目录/反代/HTTPS/权限/排查/升级全套)、config/generated.example.php配置模板; - 新增独立打包脚本
qdcms-release/pack-official.py,产出QDCMS-Official-v1.0.1.zip(36 个文件 / 128 KB,不含数据库口令、签名密钥、日志、限流计数)。
二、独立部署实测(不是"应该能跑")
① 打包:36 个文件 / 128,277 字节;含 config/generated.php:False ✓;含 data 敏感文件:空 ✓ ② 解压到临时目录 + 建全新库 qdcms_official_test(模拟客户拿到包的干净环境) install.php 退出码 0:9 张表 ✓ 管理员 ✓ 14 项设置 ✓ 12 个插件 ✓ 公告 ✓ 已生成独立配置 ✓ 已生成签名密钥 ✓ ③ 用 PHP 内置服务器真机验证(14 个端点): /index.php 21449B ✓ /features.php 32864B ✓ /plugins.php 25401B ✓ /plugin.php?slug=ai-agent ✓ /pricing.php ✓ /activate.php ✓ /changelog.php ✓ /news.php ✓ /docs.php ✓ /about.php ✓ /admin/login.php ✓ /api.php?action=ping ✓ /api.php?action=plans ✓ /api.php?action=plugins ✓ ping 返回:name=奇点CMS version=v1.0.1 plans=4 sign=64 位 ✓ 重复执行 install.php(幂等):退出码 0,管理员未重复创建 ✓ ④ 清理:停临时服务器 ✓ 删除测试库(残留 False)✓ 删除临时目录 ✓三、顺带修掉的一处真实缺陷
官网导航数组是
[标签, 链接]元组形式,我此前插入的「公告中心」写成了关联数组['label'=>..,'url'=>..],导致该条$item[1]为 null → 在strict_types下offUrl(null)抛TypeError→ 官网首页整体 500(页面从 21872 B 掉到 3450 B)。 已修正为元组形式,并给内核offUrl()/offAsset()增加?string空值容忍(防御同类问题)。 修复后官网 10 个前台页面 + API 全部复测 200 且零报错 ✓ -
v0.4.58
官方网站 + 商业授权激活系统 + 插件市场
随交付包发布需求:"根据网站开发一个官方网站,包含商业授权激活等功能,以及CMS 所需业务的和插件等功能"。
查看完整变更
需求:"根据网站开发一个官方网站,包含商业授权激活等功能,以及CMS 所需业务的和插件等功能"。
一、交付形态
官网位于 站点子目录
official/(http://你的域名/official/),复用现有 nginx/PHP, 无需新增站点、无需重载 nginx;数据存放在独立数据库qdcms_official,与客户站点数据完全隔离。模块 内容 官网前台 首页(产品亮点/库内统计/推荐插件/最新更新/套餐概览)、功能介绍(8 大模块 + 后台入口路径)、插件市场(搜索/分类/分页/详情/安装步骤/下载)、授权方案(4 套餐 + 对照表 + 购买流程 + FAQ)、在线激活与授权查询/解绑、更新日志(分页 + 版本徽标)、公告中心、文档中心(在线渲染 docs/*.md)、关于我们 + 在线留言 官网后台 仪表盘(授权/日志/到期预警)、授权码管理(批量生成/域名绑定/续期/吊销/恢复/重置换绑/导出 CSV)、激活日志(近 7 天统计、失败原因、导出)、订单管理(含一键发码、状态流转、统计)、插件管理(上下架/编辑/排序)、公告与更新、客户留言、站点设置 + 改密码(含管理员列表) 授权服务 API official/api.php:activate/verify/deactivate/query/plans/plugins/ping;响应 HMAC-SHA256 签名、请求ts+nonce防重放、按 IP 限流授权模型 授权码 QDCMS-XXXX-XXXX-XXXX-XXXX,服务端保存域名绑定/有效期/激活次数/换绑次数/吊销状态;激活返回带签名令牌(7 天),客户端本地缓存状态,官网临时不可达不会立刻失效CMS 侧接入 后台新增「商业授权」页:填官网地址 + 授权码 → 在线激活 / 立即续验 / 解绑换域名 / 清除配置; isLicensed()增加"在线授权有效"这一条合法路径(保留原授权码与局域网放行逻辑);checkRemote()由空实现变为真实探测插件体系 off_plugins表(slug/版本/分类/价格/依赖/安装步骤/下载量/评分/推荐位),官网提供市场展示与详情,CMS 侧保留原有模块化结构;已内置 12 个真实插件条目(AI 智能体增强、本地大模型、短剧、动态增强、IM 即时通讯、百科、问答、后台工作面板、官方支付、二维码、批量部署、静态瘦身)二、端到端验证(授权全链路 40/40 通过)
A 段(官网侧 19 项全通过): ping/plans/plugins 接口 ✓ 响应 64 位 HMAC 签名 ✓ 发码(格式校验)✓ ★首次激活成功 ✓ 返回带签名令牌(含套餐/到期/域名)✓ ★换域名激活被拒 domain_mismatch(并带出已绑定域名)✓ ★重复 nonce 被拒(防重放)✓ 过期时间戳被拒 ✓ 公开查询返回脱敏信息(QDCMS-57Z****WU52)✓ 续验成功 ✓ 解绑成功(剩余换绑 4 次)✓ 解绑后可在新域名激活 ✓ 不存在的授权码被拒 not_found ✓ B 段(CMS 侧 21 项全通过): ★CMS 在线激活成功 ✓ 状态 active 且域名正确(剩余 364 天)✓ 授权码脱敏展示 ✓ ★onlineLicenseValid=true ✓ ★isLicensed=true(在线授权生效)✓ ★checkRemote 真实可用 ✓ ★CLI 场景:缺少域名时给出可操作提示 ✓ 显式传域名可激活成功 ✓ 手动续验 ✓ 6 小时内重复续验走缓存(不打官网)✓ 未配置官网地址/官网不可达 → 提示清晰 ✓ ★被吊销后续验失败并说明原因 ✓ ★到期后续验失败 ✓ 续验失败不清空本地状态(保留便于排查)✓ 测试授权码/日志已删除、配置已复位、库内零脏数据 ✓官网页面全量回归:10 个前台页面 + 8 个后台页面 = 18 个页面全部 HTTP 200 且零 PHP 报错 ✓
三、开发中发现并修掉的 6 个真实缺陷
# 缺陷 后果 修法 1 admin/includes/layout.php用dirname(__DIR__)找内核整个后台 Fatal(登录都进不去) 改为上溯两级 2 admin/login.php同样路径写错登录页 Fatal 改为 __DIR__ . '/includes/layout.php'3 admin/index.php重复定义offStatusTag()仪表盘 Cannot redeclare 删除重复定义(统一放 layout) 4 官网内核 e()/money()/fmtDate()等与主站同名两者同进程加载时 Cannot redeclare 全部加 function_exists守卫,官网内核可安全嵌入5 LicenseManager::onlineConfig()走getSetting静态缓存点"在线激活"提示成功、但状态卡仍显示未配置 改为直连数据库读取 6 getCurrentDomain()只读HTTP_HOSTCLI/计划任务下激活报"域名不能为空" 增加回退链( SERVER_NAME→已绑定域名→site_url→SITE_URL),并支持显式传域名另外:子代理还发现并补了一处业务安全漏洞 —— 已取消的订单仍可发码(UI 只是隐藏了按钮),已加服务端守卫。
四、使用步骤
- 官网:浏览器打开
http://你的域名/official/;后台.../official/admin/(初始账号admin,首次安装密码见安装输出,请立即在「站点设置」修改); - 发码:官网后台 →「授权码管理 → 生成授权码」(或在「订单管理」里一键发码);
- 激活:客户站点后台 →「商业授权」→ 填官网地址(
http://你的域名/official)与授权码 → 在线激活; - 续验/换域名:同页面点「立即续验」「解绑换域名」;
- 插件市场:官网「插件市场」展示 12 个插件,可在后台维护上架/版本/价格/安装说明。
- 官网:浏览器打开
-
v0.4.57
交付包与说明文档的站点名称统一为「奇点CMS」
随交付包发布需求:"打包说明站点名称改为『奇点CMS』"。
查看完整变更
需求:"打包说明站点名称改为『奇点CMS』"。
一、依据(你们自己的打包约定)
docs/打包说明.md第 312 行原文:站点名称 SITE_NAMEconfig/config.php奇点CMS 打包的站点默认名称为"奇点CMS",交付包必须使用该通用名称;客户个性化站名由客户安装后自行修改,不得将任何客户特定站名带入交付包 生效版本:自 v0.3.80 起。
核对后发现:
SITE_NAME常量早已是「奇点CMS」,但包内仍有多处旧名残留,其中还有功能性缺陷:# 位置 问题 1 database.sql新装默认站点名竟写入 墨香书阁、页脚写入 Powered by QDCMS —— 客户装完看到的是旧名(真正的问题) 2 includes/footer.php页脚兜底文案 Powered by X-Dream CMS 3 admin/settings.phpSEO 标题占位提示 "如:墨香书阁 - 在线小说阅读平台" 4 install/index.php安装向导标题 QDCMS 安装向导 5 includes/OpsAgent.php/admin/ajax-workbench.phpAI 人设自称 QDCMS; OpsTools体检报告标题 # QDCMS 站点体检报告6 assets/js/agent.jsAI 回复兜底版本名 X-Dream CMS 7 文档标题 ×5、代码/脚本/SQL 头注释 ×60+ 仍为 X-Dream CMS 二、改动(共 60 个文件、84 处)
- 新装默认值:站点名 / 页脚 → 「奇点CMS」;
- 用户可见文案:安装向导标题、SEO 占位提示、AI 人设(后台助手/运维助手)、体检报告标题、AI 回复兜底版本名、对话导出标题、运维巡检日报标题、
qdcms-ffmpeg-win.ps1与各 JS 头注释; - 文档标题:README、打包说明、安装配置说明、Windows 部署说明、架构设计、版本升级说明、网站BUG修复规范、页面模块规范、聊天说明、Go 服务 README → 「奇点CMS」;
- 明确不改(避免破坏功能与历史):
- 技术标识:
x-dream-go/x-dream-go.exe、qdcms-*.ps1脚本名、QDCMS-v*.zip包名正则、assets/images/qdcms-logo.png、数据库名、C:\ProgramData\QDCMS\reports目录; install/install.lock内容(X-Dream CMS Installed,被安装锁逻辑使用);- 历史文档正文:
docs/版本升级说明.md、docs/网站BUG修复.md中的历史条目原文,以及docs/打包说明.md中记录"v0.3.79 及更早沿用旧名属已确认例外"的约定正文。
三、验证
包内品牌核对(13 项): config/config.php SITE_NAME = 奇点CMS ✓ database.sql 新装默认站点名 = 奇点CMS ✓ 默认页脚 = Powered by 奇点CMS ✓ includes/footer.php 兜底 = Powered by 奇点CMS ✓ 文档标题:README / 打包说明 / 安装配置说明 / Windows部署说明 / 版本升级说明 均为「奇点CMS」✓ AI 人设:奇点CMS 的网站运维助手 ✓ 奇点CMS 后台的助手 ✓ 体检报告标题:# 奇点CMS 站点体检报告 ✓ 安装向导标题:奇点CMS 安装向导 ✓ 语法:PHP 全部文件 php -l 通过 ✓ PowerShell 脚本 Parser 解析通过 ✓ 剩余"用户可见旧名":0 处(仅保留打包约定文档中记录历史例外的正文)✓ -
v0.4.56
优化服务器资源调用、减少内存占用
随交付包发布需求:"优化网站在网站服务器的资源调用,减少内存占用"。
查看完整变更
需求:"优化网站在网站服务器的资源调用,减少内存占用"。
一、先量后改(本机 7.73 GB 内存)
指标 实测 结论 物理内存 已用 6.75 GB / 7.73 GB(87.2%),可用 1.01 GB;页面文件已用 13.65 GB 内存确实紧张 ✓ PHP 单请求峰值内存 4 MB,耗时 15~51ms,加载 24 个文件 ★ 站点代码本身很省(无需改代码) php-cgi 20 个进程 / 521 MB(父进程 nginx_server=宝塔进程池) ★ 是进程池太大,不是负载 MySQL max_connections=500✗、max_allowed_packet=1GB(my.ini 里竟写着 100G)✗、key_buffer_size=64M(本站全 InnoDB,用不上)✗、performance_schema=ON✗★ 配置是"大服务器"模板 其他进程 非服务器软件合计 3048 MB(含本 Agent 工具 1240MB、Edge 598MB、手机助手 275MB、Defender 272MB、vivo 199MB、Dell 166MB) 用户侧可释放 二、已做的优化(MySQL,全部在线生效并持久化)
用 MySQL 8 的
SET PERSIST(同时写入mysqld-auto.cnf,重启后依然有效):参数 原值 现值 说明 max_connections500 80 每个连接都会预留缓冲;本站并发极低 max_allowed_packet1 GB(my.ini 里写 100G) 64 MB 上传走 4MB 分片,64MB 绰绰有余;这项决定连接级提交内存上限 key_buffer_size64 MB 16 MB 该参数只服务 MyISAM,本站表全是 InnoDB tmp_table_size64 MB 32 MB 并发查询时按查询累加 innodb_log_buffer_size32 MB 16 MB — performance_schema=OFF已写入 my.ini(含备份),但它属于启动参数,需重启 MySQL 才生效 —— 生效后可再省 150~300 MB。三、新增运维工具:服务器资源与内存
includes/OpsTools.php新增server_memory工具(已注册进工具目录与"一键体检"), 在后台「工作面板 → ③ 运维工具」点一下即可看到:- 物理内存/页面文件占用(已用%、可用量)
- PHP 进程池进程数与占用
- MySQL 关键内存参数(连接上限、packet、key_buffer、tmp_table、performance_schema 状态)
- 进程占用 Top 15
- 非服务器软件占用合计(含进程名与体积)
- 自动给出可执行的省内存建议(例如"进程池 20 个,建议降到 6~8,约省 144MB")
四、验证
$ OpsTools::run('server_memory') 概要: 内存 6.75 GB / 7.73 GB(已用 87.2%,可用 1010 MB);PHP 进程池 20 个 521MB;MySQL 连接上限 80 MySQL: buffer_pool=256MB, max_connections=80, max_allowed_packet=64MB, key_buffer=16MB, tmp_table=32MB, performance_schema=ON(待重启) 建议 4 条:可用内存低于15% / PHP 进程池偏大 / performance_schema 待关 / 3048MB 非服务器软件可关闭MySQL 新连接复核(会话值随新连接刷新,确认不是"只改了会话"):
max_connections=80 ✓ max_allowed_packet=64MB ✓ tmp_table_size=32MB ✓ key_buffer_size=16MB ✓ innodb_log_buffer_size=16MB ✓新增工具已并入"一键体检"清单,共 11 个工具。
五、还想再省内存?两条可选(都在你手上)
- 重启一次 MySQL(宝塔 → 数据库 → 重启),让
performance_schema=OFF生效 → 再省 150~300 MB; - 宝塔 → PHP 设置里把进程数降到 6~8(本站流量很低,20 个是浪费)→ 再省 约 144 MB;
- 不用时可关闭 Edge / 手机助手 / vivo 助手 / Dell 支持助手 等非服务器软件 → 最多可释放 约 1.8 GB。
-
v0.4.55
修复全站客户端加载缓慢
随交付包发布现象:全站页面"打开后图片/内容慢慢才出来",尤其首页与动态广场。
查看完整变更
现象:全站页面"打开后图片/内容慢慢才出来",尤其首页与动态广场。
一、先量后改(关键数据)
指标 实测 判断 服务端 TTFB 首页 0.098s、其他页 0.04~0.11s 服务端不慢 ✓ HTML 大小 9.6~44 KB,gzip 后 6 KB 正常 ✓ gzip(真实入口 65500 + 域名) style.css 26987→7039、HTML38722→6151本来就是好的 ✓ 静态资源缓存 Cache-Control: max-age=2592000+ ETag正常 ✓ 外部 CDN / 字体 0 个 无外链阻塞 ✓ 首页图片 6 张原图 = 886 KB,单张最大 403 KB ★ 元凶 二、根因(两处叠加)
- 图片加速器正则漏掉了带前导斜杠的写法 ✗
includes/fn-core.php的imageAcceleratorBuffer()只匹配src="uploads/…", 而大量模板(首页、列表页)输出的是src="/uploads/…"—— 于是这些图片完全绕过加速器, 既不压缩、也不走 30 天缓存、也不做懒加载,直接下发原图。 - 首页卡片代码直连原图 ✗
index.php的热门动态卡片用baseUrl() . 原图路径直接输出 —— 实测单张 403 KB。
顺带确认:站内的
img-proxy.php本身实现良好(磁盘缓存 + ETag + 30 天头), 同一张 394 KB 原图经它 400px 处理后只有 40.8 KB,命中缓存仅 7.6 ms —— 只是没被用上。三、改动
# 文件 改动 1 includes/fn-core.php加速器正则扩宽为接受 uploads/、/uploads/、http(s)://…/uploads/、//host/uploads/四种写法;已是代理 URL 的原样跳过(防重复代理);thumb_*缩略图按卡片尺寸(400px)压缩而不是按原图尺寸重编码;补decoding="async"减少主线程解码阻塞2 index.php首页热门动态卡片改用 imgUrl($path, 400, 'cover'),直接走 400px 代理版本四、效果(同一入口实测)
页面 修复前 修复后 降幅 首页图片 886 KB(6 张原图直连) 206 KB(6 张走代理,单张 22~46 KB) −77% 动态广场 每张缩略图 ~90 KB 直连 走代理 ~44 KB 且懒加载 −50%(加上懒加载首屏更低) 其他含图页面 同样绕过加速器 统一走代理 同量级下降 五、验证 → 13 / 13 通过
A. 加速器正则:uploads/ ✓ /uploads/(修复点)✓ http://…/uploads/ ✓ //host/uploads/ ✓ 静态资源不动 ✓ 已是代理 URL 原样返回(不嵌套)✓ B. 首页图片:6 张全部走代理 ✓ 无 404 ✓ ★ 总量 206.2 KB < 300 KB(修复前 886 KB)✓ C. 全站回归:首页/动态/短视频/短剧/小说/问答/百科/资讯/登录/分类 共 10 个页面全部 HTTP 200、无 PHP 报错 ✓ D. 代理图片带 30 天缓存头 ✓ 返回 image/jpeg ✓ - 图片加速器正则漏掉了带前导斜杠的写法 ✗
第 1 / 10 页 · 每页 10 条 · 共 93 条
升级前请确认
备份
备份站点目录与数据库,尤其是
uploads/与config/。阅读说明
在
docs/版本升级说明.md中找到对应版本,确认是否需要执行数据库迁移。执行升级
解压覆盖站点目录 → 执行 migration → 后台「系统 → 在线更新」复核版本状态。
复核功能
检查前台首页、播放、支付与后台工作面板等关键入口是否正常。
相关入口
- 文档中心查看随包技术文档(含版本升级说明、打包说明、安装配置说明)
- 插件市场查看插件版本与兼容性
- 授权续验升级后重新查询授权状态,确认未因换机失效
- 遇到问题在线留言,附上版本号与报错信息