Files
YwxAppThink/addon/docs/install.sql
T
yangwx 18101cf11a feat: 上线前安全加固与发布工程化;appmall 由插件迁移为独立应用
安全(P0)
- 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、
  ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签
  (ywxapp.framework_package_verify,默认开启)
- JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret()
  校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET
- /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验
- 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流
- TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive
- 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php)
- 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis
- paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG

工程化 / 交付
- 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本
- 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过
- 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障
- .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess

结构
- appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
2026-10-22 00:53:39 +08:00

130 lines
9.2 KiB
SQL
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.
-- ============================================================
-- addon/docs/install.sql 文档中心插件数据表
-- 框架约定:插件安装时由 ywxapp\service\AddonService 执行本文件
-- (仅允许 CREATE TABLE / INSERT,见 importsql 白名单)。
-- 表名须为 __PREFIX__docs_*,与 __PREFIX__addon 等核心表命名一致。
-- 说明:owner_uid / uid / audit_status 为多用户预留字段,
-- 当前版本仅站长后台管理,全部保持默认值即可。
-- ============================================================
-- 注意:不要写 SET NAMES / SET FOREIGN_KEY_CHECKS 等会话语句,
-- 框架 importsql 白名单会直接跳过并日志告警(且部分 MySQL
-- 驱动会让后续 INSERT 错乱),建表后 charset 已在表定义里。
-- ============================================================
CREATE TABLE IF NOT EXISTS `__PREFIX__docs_project` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '英文标识,用于URL',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '项目名称',
`intro` varchar(255) NOT NULL DEFAULT '' COMMENT '项目简介',
`logo` varchar(255) NOT NULL DEFAULT '' COMMENT '项目图标',
`addon` varchar(50) NOT NULL DEFAULT '' COMMENT '归属插件标识,空表示框架自身',
`owner_uid` int unsigned NOT NULL DEFAULT '0' COMMENT '归属用户,0表示官方',
`default_version` varchar(20) NOT NULL DEFAULT '' COMMENT '默认版本标识',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序,越小越前',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1启用 0禁用',
`create_at` int DEFAULT NULL COMMENT '创建时间',
`update_at` int DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`name`),
KEY `idx_addon` (`addon`),
KEY `idx_owner_uid` (`owner_uid`),
KEY `idx_status_sort` (`status`,`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文档项目表';
CREATE TABLE IF NOT EXISTS `__PREFIX__docs_version` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`project_id` int unsigned NOT NULL DEFAULT '0' COMMENT '所属项目ID',
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '版本标识,用于URL',
`title` varchar(50) NOT NULL DEFAULT '' COMMENT '版本显示名',
`intro` varchar(255) NOT NULL DEFAULT '' COMMENT '版本说明',
`is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认版本',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序,越小越前',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1启用 0禁用',
`create_at` int DEFAULT NULL COMMENT '创建时间',
`update_at` int DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_project_name` (`project_id`,`name`),
KEY `idx_project_status` (`project_id`,`status`,`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文档版本表';
CREATE TABLE IF NOT EXISTS `__PREFIX__docs_doc` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`project_id` int unsigned NOT NULL DEFAULT '0' COMMENT '所属项目ID',
`version_id` int unsigned NOT NULL DEFAULT '0' COMMENT '所属版本ID',
`pid` int unsigned NOT NULL DEFAULT '0' COMMENT '父级文档ID,0为顶级',
`name` varchar(100) NOT NULL DEFAULT '' COMMENT 'URL标识',
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '文档标题',
`content` longtext COMMENT '正文HTML,UEditor产出',
`content_md` longtext COMMENT 'Markdown源码,导入导出用',
`editor_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '编辑器:1富文本 2Markdown',
`is_dir` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否纯目录节点,1表示无正文仅分组',
`seo_title` varchar(200) NOT NULL DEFAULT '' COMMENT 'SEO标题',
`seo_keywords` varchar(255) NOT NULL DEFAULT '' COMMENT 'SEO关键词',
`seo_desc` varchar(500) NOT NULL DEFAULT '' COMMENT 'SEO描述',
`views` int unsigned NOT NULL DEFAULT '0' COMMENT '阅读量',
`uid` int unsigned NOT NULL DEFAULT '0' COMMENT '创建者,0表示站长后台',
`editor_uid` int unsigned NOT NULL DEFAULT '0' COMMENT '最后编辑者',
`audit_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '审核状态:0待审 1通过 2驳回',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序,越小越前',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1显示 0隐藏',
`create_at` int DEFAULT NULL COMMENT '创建时间',
`update_at` int DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_scope_name` (`project_id`,`version_id`,`name`),
KEY `idx_tree` (`project_id`,`version_id`,`pid`,`sort`),
KEY `idx_status` (`status`),
KEY `idx_uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文档正文表';
CREATE TABLE IF NOT EXISTS `__PREFIX__docs_search` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`doc_id` int unsigned NOT NULL DEFAULT '0' COMMENT '文档ID',
`project_id` int unsigned NOT NULL DEFAULT '0' COMMENT '项目ID',
`version_id` int unsigned NOT NULL DEFAULT '0' COMMENT '版本ID',
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '文档标题副本',
`keywords` varchar(255) NOT NULL DEFAULT '' COMMENT '关键词',
`plain_text` longtext COMMENT '正文纯文本,供全文检索',
`update_at` int DEFAULT NULL COMMENT '索引更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_doc` (`doc_id`),
KEY `idx_project_version` (`project_id`,`version_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文档搜索索引表';
-- ============================================================
-- 种子数据:按 name 唯一性判重,不写死 id
-- 之前版本硬编码 id=1/2/3,脏库重装(外键/触发器/视图占 id)时 INSERT IGNORE
-- 会静默失败,导致后续版本/文档引用错乱。改为按 name 条件,id 由 AUTO_INCREMENT 自增。
-- ============================================================
INSERT INTO `__PREFIX__docs_project` (`name`, `title`, `intro`, `addon`, `owner_uid`, `default_version`, `sort`, `status`, `create_at`, `update_at`)
SELECT 'framework', 'YwxApp 框架文档', '框架安装、目录结构、插件机制与命令行工具的完整说明', '', 0, 'v1', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `__PREFIX__docs_project` WHERE `name` = 'framework');
INSERT INTO `__PREFIX__docs_version` (`project_id`, `name`, `title`, `intro`, `is_default`, `sort`, `status`, `create_at`, `update_at`)
SELECT (SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1), 'v1', '1.0 版本', '当前稳定版本', 1, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `__PREFIX__docs_version` WHERE `name` = 'v1' AND `project_id` = (SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1));
INSERT INTO `__PREFIX__docs_doc` (`project_id`, `version_id`, `pid`, `name`, `title`, `content`, `editor_type`, `is_dir`, `sort`, `status`, `create_at`, `update_at`)
SELECT
(SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1),
(SELECT `id` FROM `__PREFIX__docs_version` WHERE `name` = 'v1' AND `project_id` = (SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1) LIMIT 1),
0, 'guide', '入门指南', '', 1, 1, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `__PREFIX__docs_doc` WHERE `name` = 'guide');
INSERT INTO `__PREFIX__docs_doc` (`project_id`, `version_id`, `pid`, `name`, `title`, `content`, `editor_type`, `is_dir`, `sort`, `status`, `create_at`, `update_at`)
SELECT
(SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1),
(SELECT `id` FROM `__PREFIX__docs_version` WHERE `name` = 'v1' AND `project_id` = (SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1) LIMIT 1),
(SELECT `id` FROM `__PREFIX__docs_doc` WHERE `name` = 'guide' LIMIT 1),
'introduction', '框架介绍', '<h2>YwxApp 是什么</h2><p>YwxApp 是一套基于 ThinkPHP 的事件驱动插件化开发框架,内置插件市场、会员体系、支付与模板机制。</p><h2>核心特性</h2><p>多应用架构、插件热插拔、事件钩子、可视化后台。</p>',
1, 0, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `__PREFIX__docs_doc` WHERE `name` = 'introduction');
INSERT INTO `__PREFIX__docs_doc` (`project_id`, `version_id`, `pid`, `name`, `title`, `content`, `editor_type`, `is_dir`, `sort`, `status`, `create_at`, `update_at`)
SELECT
(SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1),
(SELECT `id` FROM `__PREFIX__docs_version` WHERE `name` = 'v1' AND `project_id` = (SELECT `id` FROM `__PREFIX__docs_project` WHERE `name` = 'framework' LIMIT 1) LIMIT 1),
(SELECT `id` FROM `__PREFIX__docs_doc` WHERE `name` = 'guide' LIMIT 1),
'installation', '安装部署', '<h2>环境要求</h2><p>PHP 8.0 以上,MySQL 5.7 以上,开启 pdo_mysql 与 fileinfo 扩展。</p><h2>安装步骤</h2><p>上传源码后访问安装向导,按提示填写数据库信息即可完成部署。</p>',
1, 0, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `__PREFIX__docs_doc` WHERE `name` = 'installation');