PuranCMS 系统概述

什么是 PuranCMS?

PuranCMS 是一款基于 ThinkPHP 8.0 框架开发的轻量级内容管理系统(CMS),专为中小企业和个人开发者设计。系统采用前后端分离的架构思想,后端使用 ThinkPHP 8.0 提供 API 接口,前端使用 Layui 构建管理界面,模板引擎采用 ThinkPHP 原生模板引擎。

设计理念

  • 简洁高效:去除冗余功能,专注于核心内容管理
  • 灵活扩展:采用模型驱动架构,支持自定义内容模型
  • 易于部署:标准 LAMP/LEMP 环境即可运行
  • 安全可靠:内置权限管理、SQL 防注入、XSS 防护

核心特性

  • 多模型内容管理(文章、产品、页面、图片、下载、招聘、分支等)
  • 自定义导航菜单管理
  • 广告位管理
  • 留言管理
  • 后台权限管理
  • 操作日志记录
  • 访客统计
  • 插件扩展机制
  • UEditor 富文本编辑器集成

适用场景

PuranCMS 适用于以下场景:

  • 企业官网建设
  • 产品展示网站
  • 新闻资讯网站
  • 个人博客
  • 小型电商网站

功能特性详解

内容管理

系统支持多种内容模型,每种模型对应不同的业务场景:

模型说明应用场景
Article文章模型新闻资讯、博客文章
Product产品模型产品展示、产品目录
Page单页模型关于我们、联系方式
Image图片模型图片画廊、相册
Download下载模型文件下载、资源分享
Recruitment招聘模型职位发布、招聘信息
Branch分支模型分支机构、门店信息

导航管理

支持自定义导航菜单,可绑定不同的内容模型和模板,实现灵活的页面跳转和内容展示。

广告管理

支持多种广告类型(图片广告、文字广告、HTML 代码),可设置广告位置、排序、状态等。

留言管理

前台用户可提交留言,后台管理员可查看、标记已读、删除留言,支持批量操作。

权限管理

基于角色的权限控制(RBAC),支持菜单权限、操作权限的细粒度控制。

数据统计

提供控制台仪表盘,展示访客统计、地区分布、流量统计、操作日志等数据。

技术栈说明

后端技术栈

技术版本用途
PHP>= 8.0后端编程语言
ThinkPHP8.0Web 框架
MySQL>= 5.7关系型数据库
Composerlatest依赖管理

核心依赖包

包名用途
topthink/frameworkThinkPHP 核心框架
topthink/think-ormORM 数据库操作
topthink/think-filesystem文件系统操作
topthink/think-captcha验证码生成
topthink/think-view模板引擎
topthink/think-workerWorkerman 支持
topthink/think-migration数据库迁移
topthink/think-queue消息队列
bacon/bacon-qr-code二维码生成
phpmailer/phpmailer邮件发送
zoujingli/ip2regionIP 地址解析

前端技术栈

技术用途
Layui后台 UI 框架
UEditor富文本编辑器
jQueryJavaScript 库(Layui 内置)
ECharts数据可视化(控制台图表)

服务器环境

  • Web 服务器:Nginx 1.18+ / Apache 2.4+
  • PHP 扩展:PDO、MBString、OpenSSL、JSON、Fileinfo
  • 推荐配置:2 核 CPU / 4GB 内存 / 50GB SSD

环境要求与准备

服务器环境要求

  • PHP:版本 >= 8.0,推荐 8.1 或 8.2
  • MySQL:版本 >= 5.7,推荐 8.0
  • Web 服务器:Nginx 1.18+ 或 Apache 2.4+
  • Composer:版本 >= 2.0

PHP 扩展要求

确保以下 PHP 扩展已启用:

  • pdo_mysql - 数据库连接
  • mbstring - 多字节字符串处理
  • openssl - 加密支持
  • json - JSON 处理
  • fileinfo - 文件类型检测
  • gd - 图像处理(验证码、二维码)

目录权限要求

以下目录需要写入权限:

  • runtime/ - 运行时缓存目录
  • public/uploads/ - 文件上传目录
  • logs/ - 日志目录(如有)

检查环境

# 检查 PHP 版本
php -v

# 检查 PHP 扩展
php -m | grep -E "pdo_mysql|mbstring|openssl|json|fileinfo|gd"

# 检查 Composer 版本
composer -V

安装步骤指南

方式一:通过安装向导安装(推荐)

  1. 将项目文件部署到 Web 服务器目录
  2. 配置 Web 服务器,将网站根目录指向 public/ 目录
  3. 访问 http://your-domain/install 进入安装向导
  4. 按照向导提示完成环境检测、数据库配置、管理员账号设置
  5. 安装完成后,访问 http://your-domain/admin 登录后台

方式二:手动安装

  1. 克隆或下载项目
    git clone https://github.com/your-repo/purancms.git
    cd purancms
  2. 安装依赖
    composer install
  3. 配置环境变量
    cp .example.env .env
    编辑 .env 文件,配置数据库连接信息
  4. 导入数据库
    mysql -u root -p your_database < database/install.sql
  5. 设置目录权限
    chmod -R 755 runtime/
    chmod -R 755 public/uploads/
  6. 配置 Web 服务器

    参考下方 Nginx/Apache 配置示例

Nginx 配置示例

server {
    listen 80;
    server_name your-domain.com;
    root /path/to/purancms/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Apache 配置示例

项目已包含 public/.htaccess 文件,确保 Apache 启用了 mod_rewrite 模块。

配置参数说明

环境变量配置 (.env)

[APP]
DEBUG = true

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = purancms
USERNAME = root
PASSWORD = your_password
HOSTPORT = 3306
CHARSET = utf8mb4
PREFIX = pr_

配置文件说明

文件说明
config/app.php应用配置(默认控制器、时区等)
config/database.php数据库配置
config/route.php路由配置
config/session.phpSession 配置
config/cache.php缓存配置
config/log.php日志配置
config/view.php模板引擎配置

后台系统配置

登录后台后,可在"系统设置"中配置:

  • 站点名称、Logo、后台 Logo
  • SEO 设置(标题、关键词、描述)
  • 联系方式(电话、邮箱、地址)
  • 版权信息、备案号

后端目录结构

核心目录说明

app/
├── admin/                    # 后台模块
│   ├── controller/           # 后台控制器
│   │   ├── Base.php          # 后台基础控制器
│   │   ├── Dashboard.php     # 控制台
│   │   ├── Content.php       # 内容管理
│   │   ├── System.php        # 系统设置
│   │   ├── Upload.php        # 文件上传
│   │   └── ...
│   └── view/                 # 后台视图
│       ├── layout/main.html  # 后台布局模板
│       └── ...
├── index/                    # 前台模块
│   └── controller/           # 前台控制器
├── common/                   # 公共模块
│   └── controller/Install.php # 安装向导
├── model/                    # 数据模型
│   ├── BaseModel.php         # 模型基类
│   ├── Article.php           # 文章模型
│   ├── Product.php           # 产品模型
│   └── ...
├── service/                  # 服务层
│   ├── ContentService.php    # 内容服务
│   ├── AdminService.php      # 管理员服务
│   └── ...
├── middleware/               # 中间件
│   ├── AdminCheck.php        # 后台权限验证
│   └── InstallCheck.php      # 安装状态检查
└── taglib/                   # 自定义标签库
    └── PuranTag.php          # PuranCMS 模板标签

目录职责

  • controller/:处理 HTTP 请求,调用服务层,返回响应
  • model/:数据库操作,数据验证,业务数据封装
  • service/:复杂业务逻辑,组合多个模型操作
  • middleware/:请求拦截,权限验证,日志记录
  • taglib/:自定义模板标签,简化前端数据调用

前端目录结构

静态资源目录

public/static/
├── admin/                    # 后台静态资源
│   ├── css/                  # 后台样式文件
│   │   ├── admin.css         # 后台全局样式
│   │   ├── dashboard.css     # 控制台样式
│   │   ├── content.css       # 内容管理样式
│   │   └── ...
│   ├── js/                   # 后台 JavaScript 文件
│   │   ├── admin.js          # 后台全局脚本
│   │   ├── content.js        # 内容管理脚本
│   │   ├── dashboard.js      # 控制台脚本
│   │   └── ...
│   └── ueditor/              # UEditor 编辑器
├── index/                    # 前台静态资源
│   ├── css/style.css         # 前台样式
│   └── js/main.js            # 前台脚本
└── layui/                    # Layui 框架

视图模板目录

template/default/             # 默认模板主题
├── layout/main.html          # 前台布局模板
├── index/index.html          # 首页模板
├── product-list.html         # 产品列表模板
└── product-detail.html       # 产品详情模板

前端架构说明

  • 后台采用 Layui 作为 UI 框架
  • JavaScript 采用模块化 IIFE 模式,避免全局污染
  • AJAX 请求统一使用 Layui 内置的 jQuery
  • 样式采用独立文件,按功能模块划分

模板目录说明

模板目录结构

template/
└── default/                  # 默认模板主题
    ├── layout/               # 布局模板
    │   └── main.html         # 主布局(header + content + footer)
    └── index/                # 前台控制器对应模板
        ├── index.html        # 首页
        ├── product-list.html # 产品列表
        └── product-detail.html # 产品详情

模板引擎语法

ThinkPHP 模板引擎支持以下语法:

  • 变量输出:{$variable}
  • 条件判断:{if condition="$status eq 1"}...{/if}
  • 循环遍历:{foreach $list as $item}...{/foreach}
  • 模板继承:{extend name="layout/main" /}
  • 区块定义:{block name="content"}...{/block}
  • 原始输出:{$content|raw}(不转义 HTML)

自定义标签

PuranCMS 提供了自定义标签库 PuranTag,可在模板中直接使用:

{puran:list name="模型标识" limit="10" category_id="分类ID" order="id desc"}
    <h3>{$item.title}</h3>
    <p>{$item.description}</p>
{/puran:list}

{puran:detail name="模型标识" id="$id"}
    <h1>{$item.title}</h1>
    <div>{$item.content|raw}</div>
{/puran:detail}

{puran:model key="模型标识"}
    <h2>{$modelInfo.name}</h2>
{/puran:model}

命名空间规范

PSR-4 自动加载规范

项目遵循 PSR-4 自动加载规范,命名空间与目录结构严格对应:

命名空间映射

命名空间对应目录说明
app\app/应用根命名空间
app\admin\controller\app/admin/controller/后台控制器
app\admin\model\app/admin/model/后台模型(如有)
app\index\controller\app/index/controller/前台控制器
app\model\app/model/数据模型
app\service\app/service/服务层
app\middleware\app/middleware/中间件
app\common\app/common/公共模块

命名空间声明示例

<?php
namespace app\admin\controller;

use app\service\ContentManageService;
use think\facade\View;

class Content extends Base
{
    // ...
}

注意事项

  • 所有 PHP 文件必须声明 <?php 开头
  • 命名空间声明必须在文件顶部(<?php 之后第一行)
  • 使用 use 语句引入外部类,避免使用完整命名空间
  • 类名必须与文件名一致(大小写敏感)

文件命名规范

PHP 文件命名

  • 控制器:大驼峰命名(PascalCase),如 Content.phpSystem.php
  • 模型:大驼峰命名,如 Article.phpProduct.php
  • 服务:大驼峰命名 + Service 后缀,如 ContentService.php
  • 中间件:大驼峰命名,如 AdminCheck.php

视图文件命名

  • 使用小写字母 + 下划线,如 index.htmlform.html
  • 布局文件放在 layout/ 目录下,如 main.html

静态资源命名

  • CSS 文件:小写字母 + 连字符,如 content.cssdashboard.css
  • JavaScript 文件:小写字母 + 连字符,如 content.jsadmin.js

数据库命名

  • 表名:小写字母 + 下划线,前缀 pr_,如 pr_article
  • 字段名:小写字母 + 下划线,如 create_timestatus

代码开发规范

PHP 编码规范

  • 遵循 PSR-12 编码规范
  • 使用 4 个空格缩进
  • 类名使用大驼峰命名(PascalCase)
  • 方法名使用小驼峰命名(camelCase)
  • 属性名使用小驼峰命名
  • 常量使用全大写字母 + 下划线

控制器规范

  • 控制器只负责接收请求、调用服务、返回响应
  • 业务逻辑必须放在 Service 层
  • 使用 $this->success()$this->error() 返回统一格式

模型规范

  • 所有模型继承 BaseModel
  • 开启自动时间戳:protected $autoWriteTimestamp = true;
  • 定义表名:protected $name = 'table_name';
  • 定义关联关系方法

JavaScript 规范

  • 使用 IIFE 模式封装,避免全局污染
  • 变量使用 var 声明
  • 使用 layui.use() 加载模块
  • AJAX 请求统一使用 JSON 格式

数据库配置说明

数据库连接配置

数据库配置在 config/database.php.env 文件中:

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = purancms
USERNAME = root
PASSWORD = your_password
HOSTPORT = 3306
CHARSET = utf8mb4
PREFIX = pr_

数据库表前缀

所有数据表使用 pr_ 前缀,方便多系统部署:

  • pr_admin - 管理员表
  • pr_admin_menu - 菜单表
  • pr_article - 文章表
  • pr_product - 产品表
  • pr_nav - 导航表
  • pr_message - 留言表
  • pr_advertisement - 广告表
  • pr_system_config - 系统配置表

字符集

使用 utf8mb4 字符集,支持 Emoji 和特殊字符。

二次开发指南

开发环境搭建

  1. 安装 PHP 8.0+ 和 Composer
  2. 克隆项目并安装依赖:composer install
  3. 配置 .env 文件
  4. 导入数据库:mysql -u root -p db_name < database/install.sql
  5. 启动开发服务器:php think run

添加新模块

  1. app/admin/controller/ 创建控制器
  2. app/model/ 创建模型
  3. app/admin/view/ 创建视图
  4. route/app.php 添加路由
  5. 在后台菜单管理中添加菜单项

添加新模型

  1. 创建数据库表
  2. app/model/ 创建模型类,继承 BaseModel
  3. 在后台"模型管理"中注册模型
  4. 在导航管理中绑定模型

交互逻辑脑图

用户请求
  │
  ├─ 前台请求
  │   ├─ Index 控制器
  │   │   ├─ 获取导航
  │   │   ├─ 获取内容列表
  │   │   └─ 渲染模板
  │   └─ Upload 控制器
  │       └─ 处理文件上传
  │
  └─ 后台请求
      ├─ AdminCheck 中间件
      │   └─ 验证登录状态
      ├─ 控制器
      │   ├─ 接收参数
      │   ├─ 调用 Service
      │   └─ 返回 JSON/视图
      └─ Service
          ├─ 业务逻辑处理
          ├─ 调用 Model
          └─ 返回结果

v1.0.0 安全中心模块与项目基础架构

发布信息

发布日期2026-05-01
更新类型重大更新

一、项目立项背景

1.1 项目定位

PuranCMS 是一款基于 ThinkPHP 8.0+ 框架开发的企业级内容管理系统(CMS),旨在为企业提供一个功能完善、易于扩展、安全可靠的内容管理解决方案。

核心目标:

目标维度具体描述
企业官网支持企业官网、产品展示、新闻发布、门店展示等常见场景
内容管理完善的内容管理体系:产品/新闻/单页/门店/招聘/案例/下载/留言等
安全可靠内置多层安全防护机制,有效防御 SQL 注入、XSS、CSRF 等常见攻击
易于扩展插件化架构,支持功能模块的独立开发与热插拔
SEO 友好支持静态化生成、伪静态 URL、Sitemap 自动生成等 SEO 优化
会员体系完整的会员注册/登录/等级/积分/权益体系

1.2 技术栈选型

层级技术版本说明
后端框架ThinkPHP8.1.4PHP MVC 框架
PHP 版本PHP>= 8.0服务端脚本语言
数据库MySQL>= 5.7关系型数据库
后台前端Layui2.13.5后台 UI 框架
数据可视化ECharts5.x图表库(仪表盘/地图)
模板引擎ThinkPHP 原生-标签定界符 {}
IP 解析zoujingli/ip2region^3.0IP 地理位置解析
邮件发送PHPMailer^7.0邮件发送库
包管理Composer2.xPHP 包管理器

1.3 系统架构设计

┌─────────────────────────────────────────────────────┐
│                   表现层 (Presentation)                │
│  ┌──────────────────┐  ┌──────────────────┐          │
│  │   后台管理视图     │  │   前台展示模板     │          │
│  │  (Layui + TP模板) │  │  (default/enterprise)        │
│  └──────────────────┘  └──────────────────┘          │
├─────────────────────────────────────────────────────┤
│                    控制层 (Controller)                  │
│  admin/ | index/ | api/ | common/                     │
├─────────────────────────────────────────────────────┤
│                  中间件层 (Middleware)                  │
│  AdminCheck │ AuthCheck │ SecurityGuard              │
├─────────────────────────────────────────────────────┤
│                    业务层 (Service)                    │
│  ContentService │ SecurityService │ MemberService ...  │
├─────────────────────────────────────────────────────┤
│                    模型层 (Model)                      │
│  Product │ News │ Page │ User │ Admin │ Model ...     │
├─────────────────────────────────────────────────────┤
│                 数据存储层 (Database)                   │
│           MySQL 5.7+ (utf8mb4)                       │
└─────────────────────────────────────────────────────┘

1.4 项目目录结构

web.puran.cc/
├── app/
│   ├── admin/controller/    # 后台控制器
│   ├── index/controller/    # 前台控制器
│   ├── api/controller/      # API 控制器
│   ├── model/               # 数据模型
│   ├── service/             # 业务服务层
│   ├── middleware/          # 中间件
│   ├── taglib/              # 自定义标签库
│   └── common/              # 公共模块
├── template/
│   └── default/             # 默认前台主题
│       ├── index/           # 首页/列表页
│       ├── user/            # 会员中心
│       └── common/          # 公共组件(header/footer)
├── public/static/           # 静态资源
├── config/                  # 配置文件
├── database/                # 数据库脚本
├── route/                   # 路由配置
└── extend/                  # 扩展类库

二、基础开发历程(v0.1.0 ~ v0.9.0)

2.1 v0.1.0 — 项目初始化(2026-04-01)

  • 引入 ThinkPHP 8.1.4 框架,完成 Composer 依赖配置
  • 配置单应用模式(auto_multi_app = false
  • 建立项目基础目录结构
  • 初始化路由分组配置
  • 创建入口文件 public/index.php

2.2 v0.5.0 — 项目骨架搭建(2026-04-10)

  • 后台基类控制器 AdminBase.php —— 权限校验、通用方法封装
  • 前台基类控制器 Index.php —— 前台公共逻辑
  • 路由配置 app/route.php —— 前后台路由分组
  • 基础模型层骨架(Admin、SystemConfig、Nav 等)
  • 基础服务层骨架(AdminService、ContentService、AddonService)
  • Layui 2.13.5 前端框架集成
  • 后台布局模板 layout/main.html
  • 登录页面 login/index.html
  • 数据库安装脚本 database/install.sql 初版

2.3 v0.7.0 — RBAC 权限认证系统(2026-04-15)

权限三表模型:

表名说明
pr_auth_rule权限规则表(路由规则 + 菜单规则)
pr_auth_group用户组/角色表
pr_auth_group_access用户与角色关联表

安装向导(4 步骤):

步骤页面功能
Step 1许可协议显示许可协议,用户同意后继续
Step 2环境检测PHP 版本、扩展、目录权限检查
Step 3数据库配置数据库连接测试 + 管理员创建
Step 4安装完成写入安装锁,跳转后台

2.4 v0.8.0 — 内容管理核心(2026-04-20)

8 大内容类型:

模型控制器说明
产品管理Content.php (product)产品分类 + 产品列表/详情
新闻管理Content.php (news)新闻分类 + 新闻列表/详情
单页管理Content.php (page)关于我们、联系我们等
门店管理BranchManage.php门店列表/详情
招聘管理Content.php (recruitment)职位列表/详情
案例展示Content.php (showcase)案例列表/详情
下载中心Content.php (download)文件下载管理
留言管理Message.php留言板功能

前台控制器:

  • Index.php —— 首页渲染
  • Doc.php —— 文档详情
  • Dynamic.php —— 动态内容页
  • BranchPage.php —— 门店页面
  • Member.php —— 会员中心

2.5 v0.9.0 — 站点配置与仪表盘增强(2026-04-25)

  • 站点配置:后台 Logo / 前台 Logo(固定+滑动)/ 公安备案号 / 联系信息
  • 仪表盘增强:ECharts 中国地图访客分布 / 访问流量统计图表 / 流量来源分析
  • 新增服务:DashboardService.php
  • 新增数据表:pr_visitor_log / pr_operation_log

三、v1.0.0 核心新增:安全中心模块

3.1 安全评分仪表盘

ECharts 仪表盘组件展示 0-100 分的安全评分,基于 8 项检测加权计算。

3.2 8 项安全检测

检测项说明权重
ThinkPHP 版本框架是否为最新版本10%
PHP 版本是否 >= 8.015%
调试模式是否已关闭调试模式15%
默认密码是否存在默认密码账号20%
数据库安全数据库配置安全性10%
上传类型允许上传的文件类型限制10%
Session 安全Session 配置安全性10%
目录权限关键目录权限检查10%

3.3 风险等级划分

评分范围风险等级颜色
90-100安全绿色
70-89低风险蓝色
50-69中风险橙色
0-49高风险红色

3.4 安全策略配置(5 大类)

类别配置项示例
登录安全失败锁定开关 / 最大失败次数(5) / 锁定时间(30分钟)
验证码图形 / 滑块 / 点选
接口安全CSRF防护 / XSS过滤 / SQL注入防护 / 请求限流(100次/分)
后台安全路径伪装 / HTTPS强制
数据安全自动备份 / 备份周期(日/周/月)

3.5 IP 黑名单管理

支持精确 IP / CIDR 格式封禁,含封禁原因 + 过期时间(永久可选)

3.6 安全防御中间件 SecurityGuard(7 层防护链)

请求 → IP黑名单拦截 → HTTPS强制 → 请求限流 → CSRF验证
     → SQL注入检测 → XSS检测 → 安全响应头 → 控制器

3.7 新增数据表(3 张)

  • pr_security_config — 安全配置表
  • pr_ip_blacklist — IP 黑名单表
  • pr_login_log — 登录日志表(用户名/IP/归属地/状态/时间)

3.8 新增文件清单

后端文件:

  • app/admin/controller/Security.php — 安全中心控制器
  • app/model/SecurityConfig.php — 安全配置模型
  • app/model/IpBlacklist.php — IP 黑名单模型
  • app/model/LoginLog.php — 登录日志模型
  • app/service/SecurityService.php — 安全服务层
  • app/middleware/SecurityGuard.php — 安全防御中间件

扩展类库:

  • extend/security/IpTool.php — IP 工具类
  • extend/security/SqlInjectFilter.php — SQL 注入过滤器
  • extend/security/XssClean.php — XSS 过滤器
  • extend/security/PathValidator.php — 目录权限验证器
  • extend/security/PasswordChecker.php — 密码强度检查器

前端文件:

  • app/admin/view/security/index.html — 安全中心主页面
  • app/admin/view/security/policy.html — 安全策略配置弹窗
  • app/admin/view/security/ip_blacklist.html — IP 黑名单弹窗
  • app/admin/view/security/permission.html — 目录权限检查弹窗
  • app/admin/view/security/login_log.html — 登录日志弹窗
  • public/static/admin/css/security.css — 样式
  • public/static/admin/js/security.js — 前端逻辑

v1.1.0 图片管理增强与 IP 地理位置集成

发布信息

发布日期2026-05-02
更新类型新增 / 优化

一、图片管理增强

  • 上传弹窗:120×120 占位框 → 多图选择 → 80×80 缩略图网格预览 → 串行上传

  • 图片列表:时间 Y-m-d H:i:s 格式化 / B/KB/MB/GB 大小格式化 / 复制链接按钮

  • 分类操作:悬停显示编辑/删除图标按钮、"全部图片"节点

二、IP 地理位置(ip2region v3.0 集成)

// 全局函数
$location = ip2region('61.142.118.231');
// 输出:中国广东省中山市【电信】

// 类方式(返回数组:country/province/city/isp/ip/version)
$ip2region = new Ip2Region();
$info = $ip2region->getIpInfo('61.142.118.231');

三、Bug 修复

  • finfo_file / SplFileInfo 报错:move() 前先获取文件信息

  • 前端 renderImageItem 空引用 / deleteCategory $ 未定义 / 按钮布局修复

v1.2.0 页面命名空间重构与安装向导优化

发布信息

发布日期2026-05-05
更新类型优化 / 重构

一、8 个页面重构(命名空间隔离)

页面命名空间
标签管理#pr-page-content-tag / PR.TagAdmin
AI 索引管理#pr-page-system-aiindex / PR.AIIndexAdmin
角色管理#pr-page-auth-role / PR.RoleAdmin
权限规则#pr-page-auth-rule / PR.RuleAdmin
渠道管理#pr-page-content-channel / PR.ChannelAdmin
自定义链接#pr-page-content-link / PR.LinkAdmin
表单管理#pr-page-content-form / PR.FormAdmin
用户管理#pr-page-system-user / PR.UserAdmin

规范:IIFE 包裹 + 命名空间对象 + 事件委托 + XSS 防护(escapeHtml)

二、安装向导重构

步骤修改前修改后
步骤1环境检测许可协议
步骤2数据库配置环境检测
步骤3管理员创建数据库与管理员(合并)
步骤4安装完成安装进度与完成

修复步骤间导航 404 Bug(路由 POST→GET 修正)

v1.3.0 标签库加载修复与登录验证码校验失败修复

发布信息

发布日期2026-05-08
更新类型Bug 修复

一、标签库加载问题修复

问题:PuranTag 无法正常加载,{puran:xxx} 标签无法解析

根因:PuranTag 缺少 $tagLib = 'puran' 属性

修复:添加属性 → TagLibService 注册 → ViewInitMiddleware 触发

二、登录验证码校验失败修复

2.1 滑块验证

onEnd 中 setTimeout 1秒自动重置导致 token 失效 → 移除自动重置

2.2 点选验证

clickCount≥4 时 500ms 自动刷新 → 移除自动刷新

2.3 坐标不一致

前端显示坐标 vs 后端原始坐标(310×155) → 新增 scaleClickCoords() 换算函数

v1.4.0 导航样式修复与文档完善

发布信息

发布日期2026-05-12
更新类型修复 / 文档

更新概述

本版本主要修复顶部导航样式问题,并输出完整开发历程文档。

一、顶部导航样式修复

修复项修改前修改后
文字加粗font-weight: 500/600/700normal
文字颜色#333#000
文字阴影text-shadow 存在移除

涉及文件:style.css / simple_header.css / page_detail.css

二、完整开发历程文档

docs/PuranCMS_完整开发历程文档.md — 含项目立项/技术栈/架构设计/数据库设计/开发阶段记录/功能模块/前后台模板/更新迭代日志/未来规划

v1.5.0 ~ v1.5.1 会员等级功能增强与协议修复

一、v1.5.0 会员等级功能增强

发布信息

发布日期2026-05-12
更新类型功能新增 / 增强

1.1 新增功能概览

  • 会员积分系统 — user 表新增 points、total_amount 字段
  • 等级升级条件 — min_points / max_points / min_amount 双重条件判断
  • 会员权益管理 — benefits 字段(JSON 数组),后台动态添加/删除权益项
  • 等级图标与颜色 — icon(layui 图标类名)+ color(如 #FFD700)
  • 自动升级机制 — UserLevelService:checkAndUpgrade / calculateLevel / addPoints / addAmount

1.2 数据库变更

pr_user_level 表新增字段:

字段类型说明
min_pointsint(11)最低积分门槛
max_pointsint(11)最高积分限制(0=不限)
min_amountdecimal(10,2)最低消费金额门槛
iconvarchar(255)等级图标(layui-icon-diamond 等)
colorvarchar(20)等级颜色
benefitstext会员权益(JSON数组)

pr_user 表新增字段:points(积分)、total_amount(累计消费金额)


二、v1.5.1 前台用户协议验证修复

发布信息

发布日期2026-05-13
更新类型Bug 修复

2.1 问题

前台登录/注册/找回密码页面,未勾选同意协议可绕过验证成功提交。根因:user.js 的 submit handler 与页面内联 handler 冲突,user.js 先执行且无协议检查。

2.2 修复方案

  1. 在 user.js 统一添加协议勾选验证(login/register/forgot 三个表单)
  2. 移除各 HTML 页面中的重复 submit handler
  3. 将"记住我"自动填充逻辑迁移至 user.js

2.3 修改文件

  • public/static/index/js/user.js — 统一协议验证 + 找回密码 handler + 记住我逻辑
  • template/default/user/login.html — 移除重复 handler
  • template/default/user/register.html — 移除重复 handler
  • template/default/user/forgot_password.html — 移除重复 handler

v1.6.0 会员体系完善与管理增强

发布信息

发布日期2026-05-14 ~ 2026-05-18
更新类型功能新增

更新概述

在 v1.5.0/v1.5.1 会员等级基础上,进一步完善会员系统的配套功能:会员设置面板积分规则配置标签管理UEditor 集成前台会员中心全套页面(16 个页面)。

一、会员设置管理面板

1.1 配置项(group: member)

配置项默认值说明
member_enable1全局启用/关闭会员功能
member_register_enable1是否允许新用户注册
member_login_enable1是否允许登录
member_close_reason会员功能暂未开放关闭时提示文案
auth_page_bg(空)登录/注册背景图 URL

配套服务:MemberService::getConfig() / isEnabled() / isRegisterEnabled()(带缓存 TTL=3600s)

二、积分规则配置

2.1 规则项(group: points_rule)

配置项默认值说明
points_register_points100注册奖励积分
points_login_points5每日首次登录奖励
points_message_points10发表留言奖励
points_profile_points50完善资料奖励
points_sign_points10每日签到奖励
points_invite_points200邀请好友奖励
points_consume_rate1积分消耗比率

配套服务:PointsService::addPoints($userId, $points, $type, $desc)(带日志+缓存)

三、其他新增模块

3.1 标签管理系统

  • 控制器:TagManage.php | 服务:TagService.php | 模型:Tag.php + TagRelation.php
  • 支持 CRUD + 多对多关联 + 删除保护(有内容不可删)+ SEO 字段

3.2 UEditor 富文本编辑器集成

  • 控制器:Ueditor.php | 支持 7 种 action(config/uploadimage/uploadvideo/uploadfile/listimage/catchimage 等)
  • 安全特性:文件类型白名单、大小限制、远程抓取域名白名单、XSS 过滤

3.3 自定义链接管理

  • 控制器:CustomLinkManage.php | 模型:CustomLink.php
  • 三种类型:导航链接 / 友情链接 / 底部链接

四、前台会员中心(16 个页面)

页面路径功能
loginuser/login.html会员登录
registeruser/register.html会员注册
centeruser/center.html会员中心首页
profileuser/profile.html个人资料编辑
passworduser/password.html修改密码
leveluser/level.html会员等级展示
points_ruleuser/points_rule.html积分规则说明
messagesuser/messages.html站内消息
notificationsuser/notifications.html系统通知列表
appointment_listuser/appointment_list.html预约记录
appointment_detailuser/appointment_detail.html预约详情
pay_orderuser/pay_order.html支付订单
appointment_bookinguser/appointment_booking.html在线预约下单
forgot_passworduser/forgot_password.html找回密码
member_closeduser/member_closed.html关闭提示
erroruser/error.html通用错误

五、新增数据表(3 张)

  • pr_custom_link — 自定义链接表(title/url/type/target/icon/status)
  • pr_tag — 标签表(name/slug/description/cover/SEO字段/article_count/product_count)
  • pr_tag_relation — 标签关联表(tag_id + target_type + target_id 唯一索引)

v1.7.0 文档管理与动态表单系统

发布信息

发布日期2026-05-19 ~ 2026-05-22
更新类型功能新增

更新概述

新增两大核心模块:文档管理系统(树形分类 + 富文本内容)和动态表单系统(12 种字段类型 + JSON 数据收集)。

一、文档管理系统

1.1 模块组成

组件文件路径
分类控制器app/admin/controller/DocCategory.php
内容控制器app/admin/controller/DocContent.php
服务类app/service/DocManageService.php
分类模型app/model/DocCategory.php
内容模型app/model/DocContent.php
前台模板template/default/index/page_detail_doc.html

1.2 文档分类(DocCategory)字段

字段类型说明
id / parent_idint主键/父级(0=顶级)
name / slugvarchar名称/URL别名
descriptiontext分类描述
icon / sort / status-图标/排序/状态

1.3 文档内容(DocContent)字段

字段类型说明
category_idint所属分类
title / slugvarchar标题/URL别名(唯一)
contentlongtextHTML富文本
summary / cover-摘要/封面图
seo_title / seo_keywords / seo_descriptionvarchar/textSEO 信息

二、动态表单系统

2.1 模块组成

组件文件路径
表单控制器app/admin/controller/FormManage.php
字段控制器app/admin/controller/FormField.php
数据控制器app/admin/controller/FormData.php
Form / FormField / FormData 模型app/model/ 下三个模型

2.2 支持的字段类型(12 种)

type说明
text / textarea单行/多行文本
number / email / phone数字/邮箱/手机号
select / radio / checkbox下拉/单选/多选
file / date / datetime文件上传/日期/日期时间
image / rich_text图片上传/富文本

2.3 表单数据存储

所有提交数据以 JSON 格式存储在 FormData.data 字段中,便于灵活扩展。

三、新增数据表(5 张)

  • pr_doc_category — 文档分类表(树形结构)
  • pr_doc_content — 文档内容表(富文本)
  • pr_form — 自定义表单表
  • pr_form_field — 表单字段定义表
  • pr_form_data — 表单提交数据表(JSON)

v1.8.0 自定义内容模型、插件系统与主题管理

发布信息

发布日期2026-05-20
更新类型重大功能

一、自定义内容模型系统

1.1 功能概述

允许管理员在后台动态创建新的内容类型(如"课程"、"案例"、"FAQ"等),无需修改代码即可扩展平台的内容承载能力。每个模型自动生成对应的数据表。

1.2 核心能力

  • 14 种字段类型:文本/多行文本/富文本/数字/日期时间/单选/多选/下拉框/图片上传/文件上传/开关/评分/关联模型/JSON
  • 保留关键字保护:内置 17 个保留 key 防止与系统表冲突
  • 自动建表:创建模型时根据字段定义自动生成数据库表结构
  • 前台渲染支持:通过 {custom:content} 标签在前台展示

二、插件系统(Addon System)

2.1 设计理念

插件系统采用"热插拔"架构设计,开发者可通过标准化的目录结构和接口规范开发独立的功能模块,实现功能的模块化封装与灵活组合。

2.2 插件目录结构

addons/
├── anticode/                    # 示例:防伪码查询插件
│   ├── config.php               # 插件配置文件(元数据+钩子+标签)
│   ├── Plugin.php               # 插件主类(继承 BasePlugin)
│   ├── Install.php              # 安装脚本
│   ├── Uninstall.php            # 卸载脚本
│   ├── route.php                # 插件路由规则
│   ├── controller/              # 控制器层
│   │   ├── Admin.php            # 后台控制器
│   │   └── Index.php            # 前台控制器
│   ├── model/                   # 数据模型
│   │   └── Anticode.php
│   ├── service/                 # 业务服务
│   │   └── Service.php
│   ├── view/                    # 视图模板
│   │   ├── admin/               # 后台视图
│   │   │   ├── index.html       # 列表页
│   │   │   ├── edit.html        # 编辑页
│   │   │   ├── settings.html    # 设置页
│   │   │   └── nav.html         # 导航配置
│   │   ├── index/               # 前台视图
│   │   │   ├── index.html       # 列表页
│   │   │   ├── detail.html      # 详情页
│   │   │   └── widget.html      # 组件模板(可嵌入任意页面)
│   │   └── assets/              # 静态资源
│   │       ├── css/admin.css
│   │       └── js/admin.js
│   ├── logs/                    # 运行日志目录
│   └── README.md                # 说明文档
├── appointment/                 # 示例:在线预约插件
├── multilang/                   # 示例:多语言切换插件
├── timeline/                    # 示例:时间线展示插件
└── .gitignore

2.3 BasePlugin 抽象基类

所有插件必须继承 app\common\BasePlugin,提供以下核心能力:

属性/方法类型说明
$namestring插件唯一标识(小写字母开头)
$titlestring插件显示名称
$versionstring版本号(语义化)
$descriptionstring插件描述
$authorstring作者
$hooksarray注册的钩子列表
$tagsarray注册的标签列表
install()abstract安装逻辑(必须实现)
uninstall()abstract卸载逻辑(必须实现)
renderWidget()public组件渲染方法
tagList() / tagDetail()public标签解析方法
createTable() / dropTable()protected建表/删表工具方法
log()protected日志记录(写入 addons/{name}/logs/)
loadConfig() / saveConfig()public配置读写(config.php 文件)
registerHooks()public向 HookService 注册钩子

2.4 config.php 配置文件结构

 'my_addon',
    'title' => '我的插件',
    'description' => '插件功能说明',
    'version' => '1.0.0',
    'author' => 'AuthorName',
    'icon' => 'layui-icon-app',
    'status' => 0,           // 0=未安装, 1=已安装启用, -1=已停用

    // ===== 钩子系统 =====
    'hooks' => [
        'my_addon_widget' => [
            'method' => 'renderWidget',          // Plugin 类中的方法名
            'description' => '组件(可嵌入任意页面)',
        ],
    ],

    // ===== 标签系统 =====
    'tags' => [
        'list' => ['description' => '列表标签', 'params' => ['limit'=>'显示数量']],
        'detail' => ['description' => '详情标签', 'params' => ['id'=>'内容ID']],
    ],

    // ===== 业务配置项 =====
    'config' => [
        'pagesize' => 10,
        'show_status' => 1,
        'nav_menu_show' => ['type'=>'switch', 'title'=>'前台导航显示', 'value'=>1],
    ],

    // ===== 导航菜单集成 =====
    'nav_menu' => [
        'enable' => true,
        'position' => 'top',
        'menus' => [['title'=>'我的插件', 'url'=>'/addons/my_addon/index', ...]],
    ],
];

2.5 插件生命周期管理

5 大操作流程:

操作触发条件执行步骤
创建后台"新建插件"表单提交名称校验 → AddonTemplate::generate() 自动生成完整骨架(22 个文件)
安装点击"安装"按钮读取 config.php → 写入 pr_addon 表 → 执行 Install::install() → 注册钩子/标签 → 清除缓存
卸载点击"卸载"按钮执行 Uninstall::uninstall() → 删除 pr_addon 记录 → 清理插件目录 → 清除缓存
启用/停用点击开关按钮切换 status 字段 → 更新 config.php → 启用时重注册钩子/标签 → 清除缓存
配置点击"设置"按钮读取 config.php 中的 config 段 → 渲染配置表单 → 保存到 pr_addon.config 字段 + config.php

2.6 钩子机制(HookService)

钩子系统是插件与系统交互的核心桥梁,采用观察者模式实现事件驱动:

请求到达 → 触发钩子 → HookService::trigger('hook_name')
     ↓
遍历所有已注册的回调函数 → 按优先级排序 → 依次执行
     ↓
收集所有返回值 → 返回给调用方

// 系统触发示例(在需要的位置)
HookService::trigger('frontend_header_js');   // 输出前端头部JS
HookService::trigger('frontend_footer_js');   // 输出前端底部JS

// 插件注册示例(在 Plugin.php 中)
$this->hooks = [
    'frontend_header_js' => ['method' => 'injectHeaderScript'],
];

HookService API:

方法说明
HookService::register($name, $callback, $priority)注册钩子回调(支持优先级排序)
HookService::trigger($name, $params)触发钩子,返回所有回调结果数组
HookService::triggerFirst($name, $params)触发钩子,仅返回第一个结果
HookService::hasHook($name)检查是否有注册的钩子
HookService::getHooks($name)获取指定钩子的所有回调
HookService::clearCache()清除钩子缓存

2.7 内置插件一览

插件标识名称功能说明主要特性
anticode防伪码查询产品防伪码生成与验证批量生成/导入导出/二维码/查询统计/操作日志
appointment在线预约服务预约与订单管理分类/时段/字段自定义/用户端预约/订单管理
multilang多语言切换前台多语言支持中英双语/术语映射/前端语言包加载
timeline时间线展示发展历程/大事记展示树形分类/富文本详情/前台组件嵌入

2.8 插件路由与静态资源

  • 路由:每个插件可定义独立的 route.php,通过 /addons/{name}/{action} 访问
  • 静态资源:后台提供 Addons::asset() 方法安全输出 CSS/JS/图片等静态文件,含 MIME 类型检测和目录穿越防护
  • 图标上传:后台支持为每个插件上传专属图标(jpg/png/gif)

2.9 新增数据表

  • pr_addon — 插件主表(name/title/version/status/config/hooks/tags/install_time)

2.10 插件相关新增文件清单

核心框架:

  • app/common/BasePlugin.php — 插件抽象基类
  • app/common/AddonTemplate.php — 插件代码生成器(22 个文件模板)
  • app/service/HookService.php — 钩子服务(事件驱动引擎)
  • app/service/AddonService.php — 插件生命周期管理服务
  • app/model/Addon.php — 插件数据模型

后台管理:

  • app/admin/controller/Addons.php — 插件管理控制器(11 个方法:index/list/install/uninstall/toggle/create/config/saveConfig/manage/checkName/uploadIcon/asset)
  • app/admin/view/addons/index.html — 插件列表页
  • app/admin/view/addons/create.html — 创建插件向导
  • app/admin/view/addons/config.html — 插件配置弹窗

内置插件(4 个):

  • addons/anticode/ — 防伪码查询插件(完整 MVC + 服务层 + 日志)
  • addons/appointment/ — 在线预约插件(分类/时段/订单/字段自定义)
  • addons/multilang/ — 多语言切换插件(中英双语 + 术语映射)
  • addons/timeline/ — 时间线展示插件(树形分类 + 组件嵌入)

三、主题管理系统

3.1 功能概述

主题管理系统允许管理员在后台自由切换、预览、配置不同的前台视觉主题,支持多套主题并存,一键切换生效。

3.2 已有主题

主题名称目录特点截图
Default(默认主题)template/default/企业官网风格,功能最全,包含全部页面模板4 张(首页/列表/详情/总览)
Enterprise(企业版)template/enterprise/精简商务风格,适合正式企业形象展示无(使用默认占位图)

3.3 theme.json 元数据格式

每个主题根目录下的 theme.json 定义主题基本信息:

{
    "name": "default",
    "title": "默认主题",
    "version": "1.0.0",
    "author": "PuranCMS",
    "description": "PuranCMS 默认前台主题,适用于企业官网场景",
    "screenshots": ["screenshot.png", "screenshot-home.png", "screenshot-list.png", "screenshot-detail.png"],
    "config": {
        "primary_color": {"type": "color", "title": "主色调", "value": "#1890ff"},
        "header_style": {"type": "select", "title": "头部样式", "value": "fixed", "options": ["fixed", "static"]}
    },
    "required_files": []
}

3.4 主题管理功能(ThemeService)

功能方法说明
获取所有主题getAllThemes()扫描 template/ 目录下所有子目录,读取 theme.json 元数据
获取当前主题getCurrentTheme()从 system_config 表读取 current_theme 配置项(缓存 1 小时)
切换主题switchTheme($name)校验完整性 → 写入 system_config → 清除缓存
主题验证validateTheme($name)检查必需目录(common/index)和文件(header/footer/layout/index)是否存在
主题配置getThemeConfig() / saveThemeConfig()按 theme_{name} 分组读写配置到 system_config 表
主题预览preview($name)渲染预览页面(不实际切换)
主题统计getThemeStats()返回总数/当前主题/有效主题数
静态资源路径getThemeStaticUrl($name)返回 /static/theme/{name}/ 路径

3.5 后台管理界面(Theme 控制器)

提供 8 个管理方法:

方法功能
index()主题列表主页
getList()AJAX 获取主题列表(含 is_current 标识)
getDetail()获取单个主题详细信息 + 配置
switch()POST 切换主题
config() / saveConfig()GET 显示 / POST 保存主题配置
preview()主题预览
validate()验证主题文件完整性
stats()主题统计概览

3.6 Default 主题模板清单

公共组件 (common/):

  • header.html — 公共头部(Logo/导航/搜索/会员入口)
  • footer.html — 公共底部(版权/备案/友情链接)
  • simple_footer.html — 简洁底部
  • pagination.html — 分页组件
  • layout.html — 布局母版

首页 (index/):

  • index.html — 首页
  • product_list/detail.html — 产品列表/详情
  • article_list/detail.html — 新闻文章列表/详情
  • page_detail.html — 单页详情
  • branch_list/detail.html — 门店列表/详情
  • download_list/detail.html — 下载中心列表/详情
  • recruitment_list/detail.html — 招聘列表/详情
  • image_list/detail.html — 图集列表/详情
  • message.html — 留言板
  • page_detail_contact.html — 联系我们
  • page_detail_doc.html — 开发文档
  • page_detail_anticode.html — 防伪查询(插件页)
  • page_detail_appointment.html — 在线预约(插件页)

会员中心 (user/):

  • center/login/register/forgot_password/profile/password/level/points_rule/messages/notifications/... — 完整会员体系页面

3.7 Enterprise 主题模板清单

  • common/layout.html — 企业版布局母版
  • index/index/article_list/detail/product_list/detail/page_detail/contact — 精简版页面
  • user/auth_layout/center/login/register/layout — 企业版会员页面

3.8 主题相关新增文件清单

  • app/service/ThemeService.php — 主题管理服务(15 个方法)
  • app/admin/controller/Theme.php — 主题管理控制器(8 个方法)
  • app/admin/view/theme/index.html — 主题列表页
  • app/admin/view/theme/config.html — 主题配置页
  • app/admin/view/theme/preview.html — 主题预览页
  • template/default/theme.json — 默认主题元数据
  • template/enterprise/theme.json — 企业版主题元数据
  • template/default/screenshot*.png — 默认主题截图(4 张)

v1.9.0 SEO 管理、缓存管理与 HTML 静态化

发布信息

发布日期2026-05-28 ~ 2026-06-02
更新类型功能新增

更新概述

本版本聚焦于 SEO 优化能力缓存管理HTML 静态化生成 三大基础设施功能。

一、SEO 管理系统

1.1 SEO 配置项(system_config, group=seo)

配置项默认值说明
seo_title_separator| - PuranCMS标题分隔符及后缀
seo_default_titlePuranCMS 企业内容管理系统默认站点标题
seo_default_keywordsPuranCMS,企业CMS,内容管理默认关键词
seo_default_descriptionPuranCMS 是一款基于 ThinkPHP...默认描述
seo_url_suffix.htmlURL 后缀
seo_lowercase_url1URL 小写化
seo_structured_data{}结构化数据 LD-JSON
seo_site_typeWebSite站点类型

1.2 Sitemap 自动生成

SitemapService::generateSitemap();    // 生成 Sitemap XML
SitemapService::getSitemapUrl();      // 获取访问 URL
SitemapService::addUrl($url, $lastmod, $changefreq, $priority); // 添加条目

自动收录:首页、栏目页、详情页、单页、文档页面

1.3 结构化数据(LD-JSON)

{"@context": "https://schema.org", "@type": "WebSite", "name": "PuranCMS", "url": "https://example.com"}

二、缓存管理中心

2.1 可管理的缓存类型

类型清理目标存储路径
template模板编译缓存runtime/temp/
log日志文件runtime/log/
html静态 HTML 缓存public/html/ 或 runtime/html/
cache系统 Cache(TP Cache 驱动)
all全部一键清理

2.2 API 接口

POST /admin/cache_manage/clear?type=template|log|html|cache|all
GET  /admin/cache_manage/index   → 各类型磁盘占用大小

三、HTML 静态化缓存

3.1 支持的生成类型

type说明
home生成首页
nav生成栏目页(nav_id)
content生成内容详情页(content_type + content_id)
all全站生成

3.2 核心方法

HtmlCacheService::generateHome();
HtmlCacheService::generateNavPage($navId);
HtmlCacheService::generateContentPage($type, $id);
HtmlCacheService::generateAll();
HtmlCacheService::getStatistics();  // 统计:总文件数/总大小/各类型数量

3.3 静态文件存储规则

runtime/html/
├── index.html              # 首页
├── article/                # 文章
├── product/                # 产品
├── page/                   # 单页
└── doc/                    # 文档

3.4 Nginx 配置建议

location ~ ^/(article|product|page)/ {
    try_files /runtime/html/$uri/index.html /runtime/html/$uri.html /index.php?$query_string;
}

四、新增文件清单

  • app/admin/controller/SeoManage.php — SEO 管理
  • app/admin/controller/CacheManage.php — 缓存管理
  • app/admin/controller/HtmlCache.php — 静态化管理
  • app/service/SeoService.php — SEO 服务
  • app/service/SitemapService.php — Sitemap 生成
  • app/service/HtmlCacheService.php — 静态化核心服务
  • 对应视图、CSS、JS 文件

v2.0.0 平台级能力全面升级

发布信息

发布日期2026-06-06
更新类型重大版本升级(Major Release)

更新概述

v2.0.0 是 PuranCMS 发展历程中最重要的里程碑版本。本版本标志着系统从"内容管理系统(CMS)"正式跨越为"综合性应用平台",引入了 RESTful API 接口体系通知消息系统图片管理完善化,并整合了此前 v1.6.0 ~ v1.9.0 的全部平台能力。

版本号语义 — 从 v1.x 跳升至 v2.0.0 的理由:

  1. API 体系的引入 — 新增完整的 RESTful API 模块,支持外部系统集成
  2. 通知系统的建立 — 站内消息/系统通知的统一管理能力
  3. 架构层面的扩展 — 新增 api 独立模块、中间件体系扩展
  4. 功能数量翻倍 — 从约 15 个功能模块增长到 30+ 个功能模块

一、RESTful API 接口体系(核心新增)

1.1 目录结构

app/api/
├── controller/
│   ├── BaseController.php        # API 基础控制器
│   ├── v1/                       # v1 版本接口
│   │   ├── Content.php           # 内容接口 v1
│   │   └── User.php              # 用户接口 v1
│   ├── v2/                       # v2 版本接口
│   │   ├── Content.php           # 内容接口 v2
│   │   └── User.php              # 用户接口 v2
│   ├── BranchController.php      # 门店 API
│   ├── ContentController.php     # 内容 API(通用)
│   └── MemberController.php      # 会员 API
├── middleware/
│   ├── ApiAuth.php               # API 身份认证中间件
│   └── ApiRateLimit.php          # API 频率限制中间件
└── route/
    └── app.php                   # API 路由配置

1.2 基础控制器(BaseController)

能力说明
Token 认证基于 Cache 的 Token 机制
Token 有效期默认 7 天(604800 秒)
Token 生成算法MD5(uniqid() . $userId . time())
统一响应格式{ code: 0/1, msg: '', data: {} }

1.3 API 中间件

ApiAuth — 身份认证中间件:从 Header "Authorization" 或参数 "token" 获取 Token → Cache 验证 → 注入 userId / 返回 401

ApiRateLimit — 频率限制中间件:以 IP 为 key 计数 → 默认 60次/60秒/IP → 超限返回 429

1.4 版本策略

版本路径前缀特点
v1/api/v1/基础版,核心字段
v2/api/v2/扩展版,含更多字段和关联数据

1.5 已实现接口清单

内容接口:GET list/detail/search(v1 + v2)

用户接口:POST register/login, GET info/points, PUT profile(v1 + v2)

门店接口:GET list/detail/nearby

会员接口:GET level/points/log/notification/list, PUT notification/read

1.6 认证流程

注册:POST /api/v2/user/register { nickname, email, password }
登录:POST /api/v2/user/login { email, password } → 返回 token + user
认证:GET /api/v2/user/info  Header: Authorization: Bearer xxx

二、通知消息系统

2.1 通知类型

类型常量说明
system系统通知
order订单通知
activity活动通知
message留言回复

2.2 核心方法

NotificationService::send($userId, $type, $title, $content, $extra);       // 单人发送
NotificationService::sendBatch($userIds, $type, $title, $content);         // 批量发送
NotificationService::broadcast($type, $title, $content);                   // 全员广播
NotificationService::markAsRead($notificationId, $userId);                 // 标记已读
NotificationService::markAllRead($userId);                                 // 全部已读
NotificationService::getUserNotifications($userId, $page, $limit, $type);  // 列表
NotificationService::getUnreadCount($userId);                              // 未读数

2.3 数据表结构(pr_notification)

字段类型说明
user_idint接收用户ID(0=全员广播)
typevarchar(20)通知类型
titlevarchar(200)标题
contenttext内容
is_readtinyint已读状态
related_id / related_typeint / varchar关联业务
extra_datatext扩展数据JSON

三、图片管理完善化

3.1 新增服务类

服务类说明
ThumbnailService缩略图自动生成(thumb_s/m/l 三尺寸)
WatermarkService文字/图片水印处理
FileStorageService文件上传/删除/URL获取/云存储迁移
ImageCategory图片按分类组织管理

四、新增文件清单

API 模块(12 文件)

  • app/api/controller/BaseController.php — API 基础控制器
  • app/api/controller/v1/Content.php, User.php — v1 接口
  • app/api/controller/v2/Content.php, User.php — v2 接口
  • app/api/controller/BranchController.php — 门店 API
  • app/api/controller/ContentController.php — 通用内容 API
  • app/api/controller/MemberController.php — 会员 API
  • app/api/middleware/ApiAuth.php — 认证中间件
  • app/api/middleware/ApiRateLimit.php — 限流中间件
  • app/api/route/app.php — API 路由

通知系统(3 文件)

  • app/admin/controller/Notification.php — 后台管理
  • app/service/NotificationService.php — 发送服务
  • app/model/Notification.php — 数据模型

图片增强(3+ 文件)

  • app/service/ThumbnailService.php, WatermarkService.php, FileStorageService.php
  • app/admin/controller/ImageCategory.php

服务层补充(5 文件)

  • AddonLoader.php, HookService.php, ContentManageService.php, MessageService.php, Ip2RegionAdapter.php

五、完整功能矩阵(v2.0.0)

领域模块数核心功能
内容管理8产品/新闻/单页/门店/招聘/案例/下载/留言
文档管理2文档分类树 + 文档内容
表单系统3自定义表单/字段/数据
自定义模型3模型/字段/动态内容
用户权限5管理员/会员/等级/RBAC/菜单
安全防护88维度检测/黑名单/登录日志/多层过滤
SEO 优化2SEO配置/Sitemap生成
性能优化3HTML静态化/缓存管理/缩略图
主题系统2多主题切换/资源管理
API 接口6v1/v2双版本/认证/限流/内容/用户/门店/会员
通知消息1站内通知(4种类型)
图片管理4上传/分类/缩略图/水印

总计:30+ 功能模块,60+ 控制器/服务/模型文件

v2.1.0 安全中心全面升级

更新概述

v2.1.0 聚焦安全中心的全面升级与体验优化。本次更新完善了安全告警体系、通知系统隔离、操作日志追踪,并对安全中心 UI 进行了全面优化,使安全中心成为真正实用、易用的安全管理平台。

新增功能

1. 安全告警独立模块

功能概述

将安全告警从通用通知系统中独立出来,专属安全中心管理。安全告警(XSS 拦截、SQL 注入、暴力破解等)不再混入普通通知列表,而是集中在安全中心的安全告警模块中统一管理。

模块组成

组件文件路径说明
控制器方法app/admin/controller/Security.php安全告警 CRUD 接口
视图页面app/admin/view/security/alerts.html告警列表弹窗页面
JS 逻辑public/static/admin/js/security.js弹窗交互逻辑
样式public/static/admin/css/security.css弹窗样式

新增接口

方法路由说明
alerts()GET /admin/security/alerts告警弹窗页面
getAlerts()GET /admin/security/getAlerts获取告警列表(含未读数)
markAlertRead()POST /admin/security/markAlertRead标记单条已读
deleteAlert()POST /admin/security/deleteAlert删除单条告警
clearAlerts()POST /admin/security/clearAlerts清空所有告警
getUnreadAlertCount()GET /admin/security/getUnreadAlertCount获取未读数量

顶部导航角标

在后台顶部导航新增盾牌图标,实时显示未读安全告警数量:

  • 有未读告警时显示红色数字角标(超过 99 显示 99+

  • 无未读告警时自动隐藏

  • 点击跳转到安全中心页面

  • 每次页面切换自动刷新角标数量

2. 通知系统用户类型隔离

问题背景

之前安全告警通过 notification 表发送,但 user_id 字段同时被管理员和前台用户共用,导致安全告警可能被前台用户看到。

解决方案

新增 user_type 字段区分通知接收者类型:

字段类型说明
user_typevarchar(20)user-前台用户 / admin-后台管理员

代码变更

文件变更
app/model/Notification.php新增 TYPE_SECURITYUSER_TYPE_* 常量
app/service/SecurityService.phpsendSecurityAlert() 设置 user_type='admin'
app/service/NotificationService.php前台查询添加 where('user_type', 'user') 过滤
app/admin/controller/Notification.php后台列表显示所有通知(管理员视角)

3. 留言回复通知精准推送

留言回复通知逻辑正确,无需修改:每个用户只收到自己留言的回复通知,互不干扰。

4. 安全中心 UI 优化

安全告警弹窗

  • 采用 iframe 弹窗模式(type:2),与 IP 白名单/黑名单页面风格一致

  • 弹窗尺寸优化为 60% × 80%,适配不同屏幕

  • 工具栏布局:左侧按钮组 + 右侧搜索框

  • 空状态显示表情图标 + "暂无数据"文字

模块卡片渐变色

为安全中心 7 个模块卡片补充渐变色:

卡片渐变色
安全策略配置#667eea → #764ba2 (紫)
IP 黑名单#f093fb → #f5576c (粉)
IP 白名单#4facfe → #00f2fe (蓝)
目录权限检查#43e97b → #38f9d7 (绿)
登录日志#fa709a → #fee140 (粉橙)
操作日志#a18cd1 → #fbc2eb (紫粉)
安全告警#fccb90 → #d57eeb (橙紫)

修复问题

  1. 安全告警通知推送给前台用户:新增 user_type 字段隔离,安全告警只发送给管理员。

  2. 后台通知列表为空:后台通知管理显示所有通知(管理员视角),只有前台用户中心才过滤 user_type='user'

  3. 删除通知后列表不刷新:统一为 res.code === 0 判断成功。

  4. 安全告警弹窗一直加载中:在 route/app.php 补充 5 条安全告警路由。

  5. 安全告警弹窗样式不一致:在 security.css 新增 #pr-page-security-alerts 专属样式。

  6. 安全告警弹窗 jQuery 未定义:为 5 个方法全部补充 $ 声明。

文件变更清单

新增文件

文件路径说明
app/admin/view/security/alerts.html安全告警弹窗页面
database/migrations/notify_user_type.sql通知表 user_type 字段迁移脚本

修改文件

文件路径变更说明
app/admin/controller/Security.php新增 6 个安全告警接口方法
app/admin/controller/Notification.php移除 user_type 过滤(管理员查看全部)
app/service/SecurityService.phpsendSecurityAlert 设置 user_type='admin'
app/service/NotificationService.php前台查询添加 user_type='user' 过滤
app/model/Notification.php新增 TYPE_SECURITY 和 USER_TYPE_* 常量
app/admin/view/layout/main.html顶部导航新增安全告警盾牌图标
app/admin/view/security/index.html新增安全告警模块卡片,移除内联弹窗 HTML
public/static/admin/js/security.js新增安全告警弹窗逻辑
public/static/admin/js/admin.js新增安全告警角标刷新逻辑
public/static/admin/css/security.css新增 alerts 弹窗样式 + 卡片渐变色
route/app.php新增 6 条安全告警路由
database/install.sqlpr_notification 表新增 user_type 字段

数据库变更

ALTER TABLE `pr_notification`
ADD COLUMN `user_type` varchar(20) NOT NULL DEFAULT 'user'
COMMENT '用户类型:user-前台用户, admin-后台管理员'
AFTER `user_id`;

ALTER TABLE `pr_notification` ADD INDEX `idx_user_type` (`user_type`);

-- 更新 type 字段注释
ALTER TABLE `pr_notification`
MODIFY COLUMN `type` varchar(20) NOT NULL DEFAULT 'system'
COMMENT '通知类型:system-系统通知, order-订单通知, activity-活动通知, message-留言回复, security-安全告警';

安全告警触发场景

场景告警标题触发条件
XSS 攻击拦截[安全] XSS 攻击拦截请求参数包含 XSS 攻击特征
SQL 注入拦截[安全] SQL 注入拦截请求参数包含 SQL 注入特征
暴力破解[安全] 登录暴力破解同一 IP 短时间内多次登录失败
异常登录[安全] 异常登录尝试黑名单 IP 尝试访问后台
目录遍历[安全] 目录遍历尝试请求路径包含 ../ 等遍历特征

升级指南

  1. 数据库升级:执行 notify_user_type.sql 迁移脚本

  2. 清除缓存:后台访问 缓存管理 → 全部清理

  3. 验证安全告警:访问安全中心,点击安全告警卡片,确认弹窗正常显示