返回首页

系统架构

DCSHOP 由「发卡商城主程序」和「授权中心/应用商店」两部分组成。主程序负责商品、订单、会员、分店、模板与插件运行;授权中心负责授权码、代理、应用上架、下载、升级和盗版监控。

目录结构

/
├── admin/ # 发卡系统管理后台:商品、订单、会员、分店、模板、插件等
├── user/ # 用户中心/分店后台/移动端用户页面
├── include/
│   ├── controller/ # 前台路由控制器
│   ├── model/ # 数据模型:goods/order/member/station/store 等
│   ├── service/ # 业务服务:Api、Notice、Media 等
│   └── lib/ # 核心库:数据库、缓存、Storage、TplOptions、授权守护
├── content/
│   ├── plugins/ # 插件目录
│   ├── templates/ # 前台/分店首页模板
│   ├── user_templates/ # 用户后台模板
│   ├── bottom_nav_templates/ # 移动端底部导航模板
│   └── blog_templates/ # 博客模板
└── license_server/ # 授权中心、应用商店、版本更新服务

核心模块边界

模块关键文件/模型职责
商品与库存Goods_ModelStock_ModelApi::getGoodsInfo()商品资料、SKU、会员价、库存、销量、卡密内容。
订单与发货Order_Model::deliver()user/shop.phpPay_Controller下单、支付、回调、余额支付、自动发货、库存扣减。
会员等级Member_ModelLevel_Pricelevel_service.php会员价、等级权益、升级订单、续费、自动升级条件。
分店体系Station_Modeluser/station.php分店开通、等级权限、分店商品、独立域名、分店收益和自动升级。
插件系统addAction()doAction()Storage业务钩子扩展、配置存储、支付方式注册、发货增强。
模板系统TplOptionsView、模板目录前台、用户后台、底部导航、博客模板的安装、切换、配置。
应用市场Store_Modellicense_server/store_api.php应用列表、详情、购买、月付、试用、下载、更新检查。
授权中心license_server/api.phpPluginLicense系统授权、插件授权、支付模板授权、版本更新、盗版上报。

请求生命周期

  1. 入口初始化:init.php 加载配置、数据库、缓存、用户登录态、插件。
  2. 路由分发:前台由控制器处理;用户 AJAX 走 user/shop.php/user/api.php;授权中心走 api.php/store_api.php
  3. 模型读取:通过 Database::getInstance()、各 Model、Option 和缓存读取数据。
  4. 钩子扩展:关键业务点触发 doAction(),插件可注册 addAction() 介入。
  5. 模板输出:前台按当前设备与分店上下文选择模板,最后输出 HTML 或 JSON。

订单与自动发货流程

用户选择商品/SKU/数量
    ↓
user/shop.php?action=xiadan
    ↓
Api::xiadan() 校验库存、价格、附加字段、优惠券
    ↓
写入 dc_order / dc_order_list / dc_order_required
    ↓
跳转支付:Pay_Controller::index()
    ↓
支付成功:同步/异步回调验签,更新 pay_status/status/pay_time
    ↓
Order_Model::deliver()
    ↓
触发 order_paid、deliver、deliver_after、deliver_complete 等钩子
    ↓
扣减库存、增加销量、写入发货内容、检查分店自动升级
金额单位:主程序订单、SKU、商品价格多数以「分」存储;授权中心余额、应用价格以「元」计价。对接时必须确认当前字段单位。

数据库命名与前缀

不要硬编码表名。发卡主程序与授权中心均使用统一前缀和模型层访问数据,插件如需建表应使用安装 / 升级 SQL,并通过系统提供的前缀常量或模型能力获取真实表名。

开发安全约定

  • 后台写操作必须校验登录态和 Token,演示站会拦截大部分 POST 写操作。
  • SQL 必须过滤或使用预处理;主程序旧模型中可使用 $db->escape_string()
  • 插件输出前应检查 defined('DC_ROOT') || exit('access denied!');
  • 付费应用需在插件主文件调用 PluginLicense::verify('slug'),不要自行绕过授权守护。
  • 模板和插件资源必须本地化,避免依赖外部 CDN。