应用名称(暂定):内容素材小程序(文章 / 头像 / 短句 / 图库 四合一) 应用目录名(暂定):
contentapp(可在确认时修改) 编写日期:2026-10-25 状态:已确认(2026-10-25 逐项批复,采用建议方案)—— 已进入 P1 开发
一、开发范围与目录约束
| 内容 | 位置 | 说明 |
|---|---|---|
| 应用后端(PHP) | plugins/contentapp/ | 遵循框架插件规范:config.php / install.php / controller/admin / controller/api / model / class / tpl |
| 小程序前端源码(未编译) | 应用开发代码/contentapp-miniprogram/ | 编译预览通过后,将编译产物/发布物接入 plugins 应用目录 |
| 后台管理前端源码(未编译) | 应用开发代码/contentapp-admin/ | 编译后的静态资源放入 plugins 应用目录 |
| 框架核心文件 | 不改动 | cscms/、根目录入口文件等一律不动 |
- 后台控制器访问:
/admin.php/contentapp.控制器/方法 - 前台 API 访问:
/index.php/contentapp/api控制器/方法(或应用路由) - 所有 PHP 文件头部加
if (!defined('FCPATH')) exit(...)防直接访问 - 控制器继承
Cscms,模型继承BaseModel,table_prefix = 'contentapp_'
二、整体架构
微信小程序前端 ──HTTPS──▶ contentapp API 接口层 ──▶ contentapp 模型层 ──▶ MySQL(contentapp_* 分站表)
│ │
│ ├─ 框架能力:站点(siteid)、WxApplet(code2session)、
│ │ Wxmp、签名验证、站点配置(setting)
│ └─ AI 调用:AI 大模型配置模块(支持国内大厂 + OpenAI 通用接口)
后台管理前端 ──HTTPS──▶ contentapp admin 控制器(管理员登录校验 + 签名)
三、功能需求明细
3.1 四大内容模块(文章 / 头像 / 短句 / 图库)
四个模块结构高度一致,统一抽象,字段差异如下:
| 维度 | 文章 | 短句 | 头像 | 图库 |
|---|---|---|---|---|
| 内容形态 | HTML 富文本 | 多行文本 | 图片 | 图片 |
| 解锁展示 | 未解锁展示前 50% 内容 | 未解锁展示前 50% 内容 | 列表可见、下载原图需解锁 | 列表可见、下载原图需解锁 |
| AI 生成 | 标题 + 富文本正文 | 标题 + 正文(修正原文"AI生成文章"笔误) | 不涉及 | 不涉及 |
3.1.1 模块配置(每模块独立)
- 模块总开关:是否开启该模块(关闭后小程序端不显示入口)
- 解锁方式配置:
- 开启"广告解锁":可配置解锁所需观看广告次数 N(默认 1 次)
- 开启"VIP 解锁"
- 两个都关闭 → 该模块内容全部免费
- 解锁有效期(新增建议项):广告解锁后生效时长可选:永久 / 当日 / 当周(默认永久)
- 说明:内容解锁方式由模块配置统一决定,单条内容不再单独设置解锁开关
3.1.2 解锁判定逻辑(已按确认修正:分类权限只管"进门",内容解锁统一跟模块配置)
层级一:模块配置(决定内容解锁方式,全局统一,无内容级单独开关)
- 广告、VIP 都关 → 该模块所有内容免费浏览/下载
- 只开广告 → 所有内容需看广告解锁(次数 N 取模块配置)
- 只开 VIP → 所有内容需 VIP 解锁
- 广告、VIP 都开 → VIP 用户直接解锁;非 VIP 用户看广告解锁(次数 N 取模块配置)
层级二:分类权限(仅作为"进入该分类"的门槛,与内容解锁相互独立)
- 分类设置 VIP 专属 → 需 VIP 身份才可进入该分类列表
- 分类设置看 N 次广告 → 累计看满 N 次广告后才可进入该分类列表(N 为分类单独配置)
- 两项都设置时:VIP 用户直接进入;非 VIP 用户需看满 N 次广告
判定顺序:先判模块总开关(关 → 内容免费)→ 再判分类进入权限(决定能否看到该分类下的内容列表)
→ 最后按模块配置决定单条内容的浏览/下载解锁方式
3.1.3 分类管理(四个模块相同,支持二级)
- 字段:分类标题、上级分类(0=一级)、排序(数字越小越前)、封面图、描述
- 分类权限:是否仅 VIP 可进入;是否需观看 N 次广告后才可进入
- 分类启用/禁用
- 删除分类时其下内容处理方式:禁止删除非空分类(需先移空内容),避免数据丢失
3.1.4 内容管理
文章
- 字段:标题、分类、封面图、内容(HTML 富文本)、排序、发布时间、是否上架、浏览次数(自动累计)
- 封面图规则:若未上传封面,保存时自动抓取正文内容中的第一张图片作为封面(前端与后台列表均按此规则显示);正文无图片且无封面时,显示模块默认占位图
- 编辑器:后台富文本编辑器,支持图片插入
短句
- 字段:标题、分类、内容(多行文本,纯文本)、排序、发布时间、是否上架、浏览次数
头像 / 图库(结构相同)
- 字段:所属分类、图片、排序、是否上架、浏览次数、下载次数(自动累计)
- 批量上传:选择分类 → 多选图片一次上传,自动生成缩略图;上传失败的单张不影响其他
- 建议(待确认):是否需要上传时自动压缩/加水印
3.1.5 AI 生成内容(文章 / 短句模块)
- 后台选择 AI 大模型(来自 AI 配置)→ 输入描述词(可附加:篇幅、风格、数量)→ 生成标题 + 正文
- 生成结果进入草稿态,可人工编辑后保存上架
- 调用记录:记录模型、消耗 token(接口返回时)、生成时间,便于后台查看
3.2 用户体系
3.2.1 静默登录(免注册)
- 用户打开小程序即静默创建账号,前端不展示任何用户信息
- 登录判定顺序:
- 取手机设备码(小程序端生成的设备指纹)→ 已存在则登录老账号
- 不存在 → 查微信唯一码(openid) → 已存在则登录老账号并回绑设备码
- 都不存在 → 创建新账号,绑定 openid + 设备码
- 账号字段:用户ID、openid、设备码、注册时间、最后活跃时间、所属站点(siteid)
3.2.2 用户行为
- 收藏:文章 / 短句 / 图库图片 / 头像,支持取消收藏、收藏列表
- 下载记录:头像 / 图库的下载历史
- 浏览记录(仅后台可见):文章/短句/头像/图库查看记录(用户、时间、内容)
3.2.3 VIP 体系
- 卡类型(后台可增删改、设置价格、可下架):
- 体验天卡:每个用户限领 1 次,解锁条件为观看 N 次广告(N 后台可配),有效期 1 天
- 月卡 / 季卡 / 年卡 / 终生卡:直接付费开通(微信虚拟支付)
- VIP 权益说明:HTML 富文本,后台可编辑,小程序端展示
- 全局 VIP(一条 VIP 通用于四个模块),不做模块独立 VIP(简化,待确认)
- 到期处理:到期后 VIP 权益失效,已解锁内容按"解锁有效期"规则保留
3.2.4 广告与解锁记录
- 广告观看记录:用户、时间、广告位、关联内容(如有)
- 解锁记录:用户、内容类型、内容ID、解锁方式(广告/VIP)、解锁时间、有效期
- 广告解锁去重:同一内容同一用户同一有效期周期内只计一次
3.3 数据统计
- 统计维度:日 / 周 / 月 / 年 / 累计
- 统计指标(按模块 + 用户):
| 对象 | 指标 |
|---|---|
| 文章 | 浏览次数、观看广告次数(各时间维度) |
| 短句 | 浏览次数、观看广告次数 |
| 头像 | 浏览次数、观看广告次数、下载次数 |
| 图库 | 浏览次数、观看广告次数、下载次数 |
| 用户 | 登录/访问次数、VIP 开通数量、看广告总次数 |
- 实现方式:行为发生时写明细表 + 每日定时汇总表(
contentapp_stats_daily),后台图表展示(折线/汇总卡片) - 后台支持按日期区间查询、导出 CSV
3.4 配置管理(后台)
- 系统配置:应用基础参数
- 小程序配置:
- 虚拟支付开关(关 → 全站无 VIP 功能,后台隐藏 VIP 管理,全部内容仅广告解锁)
- 广告功能开关(关 → 全站无广告解锁,全部内容仅 VIP 解锁)
- 两个都关 → 所有内容免费
- AppID / AppSecret(接入框架 WxApplet 类库)
- 广告配置:微信流量主广告位 ID(激励视频等)、各解锁场景所需观看次数默认值
- AI 大模型配置:
- 支持配置多个国内大厂模型(API 地址、Key、模型名)+ OpenAI 兼容通用接口
- 可设默认模型、启用/禁用
- 协议文本:用户协议、关于我们、隐私协议、版权协议、下载协议(均为富文本,小程序端"关于"页展示)
- 小程序管理(跳转列表):
- LOGO 图(1:1)、横图封面、目标小程序 AppID、跳转路径、排序、启用状态
- 前端以宫格/横滑形式展示,点击跳转其他微信小程序
- 注:跳转需目标小程序在微信后台配置"关联"或使用 navigateToMiniProgram 合规跳转
3.5 多站点(分站)支持
- 所有业务表使用框架
[-site-]占位符建表,自动按 siteid 隔离 - 主站内容共享给分站(机制建议,待确认):
- 共享模式:分站内容列表 = 分站自有内容 + 被授权共享的主站内容(引用式,主站更新实时生效)
- 共享开关:主站可按模块/按内容勾选"共享给分站"
- 分站可自主新增、编辑、删除自己的内容,不可编辑主站共享内容
- 分站的解锁配置、VIP、广告配置独立
- 站点配置使用框架
getSetting()/saveSetting(),按站点隔离
3.6 API 安全
在框架既有机制上强化:
- 签名验证(框架已提供):
sign = md5(apikey + timestamp),时间戳 5 分钟内有效 - AES 加密(新增):敏感参数(用户标识、设备码)与响应中的敏感字段使用 AES-128-ECB/CBC 加密传输,密钥由站点配置下发
- 防重放:timestamp + 随机 nonce,nonce 短期内去重
- HTTPS 强制、接口频率限制(单用户每分钟请求上限,可配置)
- 内容安全:AI 生成内容入库前调用微信
msgSecCheck内容安全检测(小程序审核硬性要求,新增建议项)
四、数据库表设计(草案)
全部使用
[-site-]占位符支持分站
| 表名 | 说明 | 主要字段 |
|---|---|---|
| contentapp_config[-site-] | 模块及全局配置 | key, value(JSON) |
| contentapp_class[-site-] | 分类(四模块共用,type 区分) | type, pid, title, sort, cover, desc, vip_only, ad_count, status |
| contentapp_article[-site-] | 文章 | class_id, title, cover, content, sort, views, status, addtime |
| contentapp_sentence[-site-] | 短句 | class_id, title, content, sort, views, status, addtime |
| contentapp_image[-site-] | 头像/图库图片(type 区分) | type, class_id, pic, thumb, sort, views, downloads, status |
| contentapp_user[-site-] | 用户 | openid, device_code, siteid, addtime, lasttime |
| contentapp_vip_card[-site-] | VIP 卡类型配置 | name, type(day/month/season/year/life/trial), price, ad_count, days, status |
| contentapp_user_vip[-site-] | 用户 VIP 记录 | uid, card_id, starttime, endtime, source(trial/pay), order_id |
| contentapp_unlock[-site-] | 解锁记录 | uid, obj_type, obj_id, mode(ad/vip), expire_time |
| contentapp_ad_log[-site-] | 广告观看记录 | uid, ad_type, obj_type, obj_id, addtime |
| contentapp_view_log[-site-] | 浏览记录(后台用) | uid, obj_type, obj_id, addtime |
| contentapp_download_log[-site-] | 下载记录 | uid, obj_type, obj_id, addtime |
| contentapp_collect[-site-] | 收藏 | uid, obj_type, obj_id, addtime |
| contentapp_ai_log[-site-] | AI 生成记录 | model, prompt, result, tokens, addtime |
| contentapp_stats_daily[-site-] | 每日统计汇总 | date, type, metric, value |
| contentapp_share[-site-] | 主站共享内容映射 | siteid, obj_type, obj_id, source_siteid, source_id |
| contentapp_applet[-site-] | 小程序跳转管理 | logo, cover, appid, path, sort, status |
(install.php 输出以上建表 SQL;卸载时按框架机制处理)
五、开发阶段划分(SOP)
| 阶段 | 内容 | 交付物 |
|---|---|---|
| P1 | 需求确认(本文档批复)+ 数据库设计定稿 + install.php | plugins 骨架可安装 |
| P2 | 后端:四大模块 CRUD、分类、解锁逻辑、用户体系、VIP、广告记录 | admin 控制器 + api 控制器 |
| P3 | 后台管理前端(未编译 → 编译接入) | 应用开发代码/contentapp-admin |
| P4 | 小程序前端(静默登录、四模块、解锁交互、收藏、VIP、广告) | 应用开发代码/contentapp-miniprogram |
| P5 | AI 生成、数据统计图表、多站点共享、协议与小程序跳转 | 功能补齐 |
| P6 | 联调 + 安全加固 + QA 回归验证 | 测试报告 |
每阶段完成后统一回归验证再进入下一阶段。
六、待确认问题清单(已于 2026-10-25 全部批复,采用建议方案)
| # | 问题 | 确认结果 |
|---|---|---|
| 1 | 应用目录名 / 应用名称 | contentapp / 内容素材小程序 |
| 2 | 解锁判定逻辑(3.1.2):分类权限仅作进入门槛,内容解锁统一按模块配置 | 已确认 |
| 3 | 广告解锁后的有效期 | 默认永久,后台可配(永久 / 当日 / 当周) |
| 4 | VIP 全局通用 | 是,一条 VIP 覆盖四模块 |
| 5 | 头像与图库合并为一张图片表(type 区分) | 合并 |
| 6 | 主站共享分站模式 | 引用式实时共享(主站更新实时生效) |
| 7 | 图片压缩/水印 | 自动压缩,不加水印 |
| 8 | 小程序前端技术栈(原建议项为空,按约束选定) | uni-app(Vue3),源码放 应用开发代码/contentapp-miniprogram/,编译产物接入 plugins(符合"编译后放入 plugins"流程,后续可扩展 H5/其他小程序) |
| 9 | 后台管理前端技术栈(原建议项为空,按约束选定) | Vue3 + Element Plus,源码放 应用开发代码/contentapp-admin/,编译产物放 plugins/contentapp/packs/admin/(与小程序端 Vue3 技术栈统一) |
| 10 | iOS 虚拟支付 | iOS 端隐藏 VIP 购买入口,仅保留体验卡(看广告)路径 |
| 11 | 体验卡看广告解锁次数 N 默认值 | 3 次 |
| 12 | 微信内容安全检测 msgSecCheck | 开启,作为上架合规项 |
| 13 | 统计导出格式 | CSV |
| 14 | 删除分类策略 | 禁止删除非空分类 |
批复以上问题后即按 P1 开始开发。