Browse Source

fix: 商城奖品不自动发货

super-yimizi 1 month ago
parent
commit
e015a8a371

+ 203 - 0
application/admin/controller/Platform.php

@@ -0,0 +1,203 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\controller\Backend;
+use app\common\Service\PlatformService;
+use think\Exception;
+use think\exception\PDOException;
+use think\exception\ValidateException;
+
+/**
+ * 平台配置管理
+ */
+class Platform extends Backend
+{
+    /**
+     * 支持的平台配置
+     * @var array
+     */
+    protected $platforms = [
+        'WechatMiniProgram' => '微信小程序',
+        'DouyinMiniProgram' => '抖音小程序',
+    ];
+    
+    public function _initialize()
+    {
+        parent::_initialize();
+    }
+    
+    /**
+     * 查看平台配置
+     */
+    public function index()
+    {
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
+        
+        if ($this->request->isAjax()) {
+            $list = [];
+            
+            // 获取所有平台配置
+            $configs = PlatformService::getAllPlatformConfigs();
+            
+            foreach ($configs as $platform => $config) {
+                $list[] = [
+                    'platform' => $platform,
+                    'name' => $config['title'],
+                    'status' => $config['status'] ? '启用' : '禁用',
+                    'count' => count($config['config']),
+                    'created_at' => date('Y-m-d H:i:s'),
+                    'updated_at' => date('Y-m-d H:i:s')
+                ];
+            }
+            
+            $result = array(
+                "total" => count($list),
+                "rows" => $list
+            );
+            
+            return json($result);
+        }
+        
+        return $this->view->fetch();
+    }
+    
+    /**
+     * 微信小程序配置
+     */
+    public function wechat_mini_program()
+    {
+        $group = 'shop.platform.WechatMiniProgram';
+        return $this->platformConfig($group, '微信小程序配置');
+    }
+
+    /**
+     * 抖音小程序配置
+     */
+    public function douyin_mini_program()
+    {
+        $group = 'shop.platform.DouyinMiniProgram';
+        return $this->platformConfig($group, '抖音小程序配置');
+    }
+
+    /**
+     * 平台配置通用方法
+     */
+    private function platformConfig($group, $title)
+    {
+        if ($this->request->isPost()) {
+            $params = $this->request->post();
+            
+            // 验证参数
+            if (!isset($params['config']) || !is_array($params['config'])) {
+                $this->error('参数错误');
+            }
+            
+            try {
+                $result = PlatformService::setConfigsByGroup($params['config'], $group);
+                
+                if ($result) {
+                    $this->success('配置保存成功');
+                } else {
+                    $this->error('配置保存失败');
+                }
+            } catch (Exception $e) {
+                $this->error($e->getMessage());
+            }
+        }
+        
+        // 获取当前平台配置
+        $configs = PlatformService::getConfigByGroup($group);
+        
+        $this->view->assign('configs', $configs);
+        $this->view->assign('group', $group);
+        $this->view->assign('title', $title);
+        
+        return $this->view->fetch('config');
+    }
+    
+    /**
+     * 初始化平台配置
+     */
+    public function init_config()
+    {
+        if ($this->request->isPost()) {
+            $platform = $this->request->post('platform');
+            
+            if (!$platform) {
+                $this->error('请选择平台');
+            }
+            
+            try {
+                $result = PlatformService::initPlatformConfig($platform);
+                
+                if ($result) {
+                    $this->success('平台配置初始化成功');
+                } else {
+                    $this->error('平台配置初始化失败');
+                }
+            } catch (Exception $e) {
+                $this->error($e->getMessage());
+            }
+        }
+        
+        return $this->view->fetch();
+    }
+    
+    /**
+     * 清除配置缓存
+     */
+    public function clear()
+    {
+        PlatformService::clearConfigCache();
+        $this->success('缓存清除成功');
+    }
+    
+    /**
+     * 获取配置信息
+     */
+    public function get_config()
+    {
+        $name = $this->request->param('name');
+        
+        if (!$name) {
+            $this->error('参数错误');
+        }
+        
+        $config = PlatformService::getConfigValue($name);
+        
+        return json([
+            'code' => 1,
+            'msg' => '获取成功',
+            'data' => $config
+        ]);
+    }
+    
+    /**
+     * 设置配置信息
+     */
+    public function set_config()
+    {
+        if ($this->request->isPost()) {
+            $name = $this->request->post('name');
+            $value = $this->request->post('value');
+            
+            if (!$name) {
+                $this->error('参数错误');
+            }
+            
+            try {
+                $result = PlatformService::setConfigValue($name, $value);
+                
+                if ($result) {
+                    $this->success('配置设置成功');
+                } else {
+                    $this->error('配置设置失败');
+                }
+            } catch (Exception $e) {
+                $this->error($e->getMessage());
+            }
+        }
+    }
+} 

+ 387 - 0
application/admin/view/platform/config.html

@@ -0,0 +1,387 @@
+{extend name="layout/default" /}
+
+{block name="content"}
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#one" data-toggle="tab">{$title}</a></li>
+        </ul>
+    </div>
+    <div class="panel-body">
+        <div class="tab-content">
+            <div class="tab-pane fade in active" id="one">
+                <form role="form" method="post" action="" class="form-horizontal">
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2"></label>
+                        <div class="col-xs-12 col-sm-8">
+                            <div class="alert alert-info-light">
+                                <i class="fa fa-info-circle"></i>
+                                请根据实际情况填写平台配置信息,配置完成后系统会自动缓存配置数据。
+                            </div>
+                        </div>
+                    </div>
+                    
+                    {if condition="strpos($group, 'WechatMiniProgram') !== false"}
+                    <!-- 微信小程序配置 -->
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2">基本信息</label>
+                        <div class="col-xs-12 col-sm-8">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">
+                                    <h3 class="panel-title">
+                                        <i class="fa fa-wechat text-success"></i>
+                                        微信小程序开发信息
+                                    </h3>
+                                </div>
+                                <div class="panel-body">
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">
+                                            <span class="text-danger">*</span>小程序AppID
+                                        </label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <input type="text" name="config[app_id]" class="form-control" 
+                                                   value="{:isset($configs['app_id']) ? $configs['app_id']['value'] : ''}" 
+                                                   placeholder="请输入小程序AppID">
+                                            <span class="help-block">AppID是小程序开发标识码,配合AppSecret可调用小程序的接口能力</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">
+                                            <span class="text-danger">*</span>小程序密钥
+                                        </label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <input type="text" name="config[secret]" class="form-control" 
+                                                   value="{:isset($configs['secret']) ? $configs['secret']['value'] : ''}" 
+                                                   placeholder="请输入小程序密钥">
+                                            <span class="help-block">AppSecret是校验小程序开发者身份的密钥,具有极高的安全性</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">开启状态</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[status]" value="1" 
+                                                           {if condition="isset($configs['status']) && $configs['status']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[status]" value="0" 
+                                                           {if condition="!isset($configs['status']) || $configs['status']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2">登录配置</label>
+                        <div class="col-xs-12 col-sm-8">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">
+                                    <h3 class="panel-title">
+                                        <i class="fa fa-user text-primary"></i>
+                                        登录方式设置
+                                    </h3>
+                                </div>
+                                <div class="panel-body">
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">微信自动登录</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[auto_login]" value="1" 
+                                                           {if condition="!isset($configs['auto_login']) || $configs['auto_login']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[auto_login]" value="0" 
+                                                           {if condition="isset($configs['auto_login']) && $configs['auto_login']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                            <span class="help-block">进入应用后,用户将会自动授权登录,未注册用户将会自动注册</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">绑定手机号</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[bind_mobile]" value="1" 
+                                                           {if condition="!isset($configs['bind_mobile']) || $configs['bind_mobile']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[bind_mobile]" value="0" 
+                                                           {if condition="isset($configs['bind_mobile']) && $configs['bind_mobile']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                            <span class="help-block">授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号</span>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    {/if}
+                    
+                    {if condition="strpos($group, 'DouyinMiniProgram') !== false"}
+                    <!-- 抖音小程序配置 -->
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2">基本信息</label>
+                        <div class="col-xs-12 col-sm-8">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">
+                                    <h3 class="panel-title">
+                                        <i class="fa fa-music text-info"></i>
+                                        抖音小程序开发信息
+                                    </h3>
+                                </div>
+                                <div class="panel-body">
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">
+                                            <span class="text-danger">*</span>小程序AppID
+                                        </label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <input type="text" name="config[app_id]" class="form-control" 
+                                                   value="{:isset($configs['app_id']) ? $configs['app_id']['value'] : ''}" 
+                                                   placeholder="请输入抖音小程序AppID">
+                                            <span class="help-block">抖音小程序应用ID</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">
+                                            <span class="text-danger">*</span>小程序密钥
+                                        </label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <input type="text" name="config[secret]" class="form-control" 
+                                                   value="{:isset($configs['secret']) ? $configs['secret']['value'] : ''}" 
+                                                   placeholder="请输入抖音小程序密钥">
+                                            <span class="help-block">抖音小程序应用密钥</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">开启状态</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[status]" value="1" 
+                                                           {if condition="isset($configs['status']) && $configs['status']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[status]" value="0" 
+                                                           {if condition="!isset($configs['status']) || $configs['status']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2">登录配置</label>
+                        <div class="col-xs-12 col-sm-8">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">
+                                    <h3 class="panel-title">
+                                        <i class="fa fa-user text-primary"></i>
+                                        登录方式设置
+                                    </h3>
+                                </div>
+                                <div class="panel-body">
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">自动登录</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[auto_login]" value="1" 
+                                                           {if condition="!isset($configs['auto_login']) || $configs['auto_login']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[auto_login]" value="0" 
+                                                           {if condition="isset($configs['auto_login']) && $configs['auto_login']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                            <span class="help-block">进入应用后,用户将会自动授权登录,未注册用户将会自动注册</span>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="control-label col-xs-12 col-sm-3">绑定手机号</label>
+                                        <div class="col-xs-12 col-sm-9">
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[bind_mobile]" value="1" 
+                                                           {if condition="!isset($configs['bind_mobile']) || $configs['bind_mobile']['value'] == '1'"}checked{/if}>
+                                                    开启
+                                                </label>
+                                            </div>
+                                            <div class="radio">
+                                                <label>
+                                                    <input type="radio" name="config[bind_mobile]" value="0" 
+                                                           {if condition="isset($configs['bind_mobile']) && $configs['bind_mobile']['value'] == '0'"}checked{/if}>
+                                                    关闭
+                                                </label>
+                                            </div>
+                                            <span class="help-block">授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号</span>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    {/if}
+                    
+                    <!-- 动态配置项 -->
+                    {foreach name="configs" item="config" key="key"}
+                    {if condition="!in_array($key, ['app_id', 'secret', 'status', 'auto_login', 'bind_mobile'])"}
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2">
+                            {if condition="strpos($config.rule, 'required') !== false"}
+                            <span class="text-danger">*</span>
+                            {/if}
+                            {$config.title}
+                        </label>
+                        <div class="col-xs-12 col-sm-8">
+                            {switch name="config.type"}
+                                {case value="string"}
+                                    <input type="text" name="config[{$key}]" class="form-control" 
+                                           value="{$config.value}" placeholder="请输入{$config.title}">
+                                {/case}
+                                {case value="boolean"}
+                                    <div class="radio">
+                                        <label>
+                                            <input type="radio" name="config[{$key}]" value="1" 
+                                                   {if condition="$config.value == '1'"}checked{/if}>
+                                            是
+                                        </label>
+                                    </div>
+                                    <div class="radio">
+                                        <label>
+                                            <input type="radio" name="config[{$key}]" value="0" 
+                                                   {if condition="$config.value == '0'"}checked{/if}>
+                                            否
+                                        </label>
+                                    </div>
+                                {/case}
+                                {case value="int"}
+                                    <input type="number" name="config[{$key}]" class="form-control" 
+                                           value="{$config.value}" placeholder="请输入{$config.title}">
+                                {/case}
+                                {case value="text"}
+                                    <textarea name="config[{$key}]" class="form-control" rows="3" 
+                                              placeholder="请输入{$config.title}">{$config.value}</textarea>
+                                {/case}
+                                {case value="array"}
+                                    <textarea name="config[{$key}]" class="form-control" rows="3" 
+                                              placeholder="请输入JSON格式数据">{:is_array($config.value) ? json_encode($config.value, JSON_UNESCAPED_UNICODE) : $config.value}</textarea>
+                                {/case}
+                                {default /}
+                                    <input type="text" name="config[{$key}]" class="form-control" 
+                                           value="{$config.value}" placeholder="请输入{$config.title}">
+                            {/switch}
+                            {if condition="$config.tip"}
+                            <span class="help-block">{$config.tip}</span>
+                            {/if}
+                        </div>
+                    </div>
+                    {/if}
+                    {/foreach}
+                    
+                    <div class="form-group">
+                        <label class="control-label col-xs-12 col-sm-2"></label>
+                        <div class="col-xs-12 col-sm-8">
+                            <button type="submit" class="btn btn-success btn-embossed">
+                                <i class="fa fa-save"></i> 保存配置
+                            </button>
+                            <a href="{:url('platform/index')}" class="btn btn-default btn-embossed">
+                                <i class="fa fa-arrow-left"></i> 返回
+                            </a>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+$(document).ready(function() {
+    // 表单验证
+    $('form').validate({
+        rules: {
+            'config[app_id]': {
+                required: true,
+                minlength: 10
+            },
+            'config[secret]': {
+                required: true,
+                minlength: 10
+            }
+        },
+        messages: {
+            'config[app_id]': {
+                required: "请输入AppID",
+                minlength: "AppID长度不能少于10位"
+            },
+            'config[secret]': {
+                required: "请输入密钥",
+                minlength: "密钥长度不能少于10位"
+            }
+        },
+        submitHandler: function(form) {
+            var $form = $(form);
+            var $btn = $form.find('button[type="submit"]');
+            
+            $btn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> 保存中...');
+            
+            $.ajax({
+                url: $form.attr('action'),
+                type: 'POST',
+                data: $form.serialize(),
+                dataType: 'json',
+                success: function(data) {
+                    if (data.code === 1) {
+                        Toastr.success(data.msg || '保存成功');
+                        setTimeout(function() {
+                            window.location.reload();
+                        }, 1000);
+                    } else {
+                        Toastr.error(data.msg || '保存失败');
+                    }
+                },
+                error: function() {
+                    Toastr.error('网络错误,请重试');
+                },
+                complete: function() {
+                    $btn.prop('disabled', false).html('<i class="fa fa-save"></i> 保存配置');
+                }
+            });
+            
+            return false;
+        }
+    });
+});
+</script>
+{/block} 

+ 120 - 0
application/admin/view/platform/index.html

@@ -0,0 +1,120 @@
+{extend name="layout/default" /}
+
+{block name="content"}
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#one" data-toggle="tab">平台配置</a></li>
+        </ul>
+    </div>
+    <div class="panel-body">
+        <div class="tab-content">
+            <div class="tab-pane fade in active" id="one">
+                <div class="row">
+                    <div class="col-md-12">
+                        <div class="form-group">
+                            <label>选择平台配置</label>
+                            <div class="platform-list">
+                                <div class="row">
+                                    <div class="col-md-6">
+                                        <div class="panel panel-default">
+                                            <div class="panel-heading">
+                                                <h3 class="panel-title">
+                                                    <i class="fa fa-wechat text-success"></i>
+                                                    微信小程序
+                                                </h3>
+                                            </div>
+                                            <div class="panel-body">
+                                                <p class="text-muted">配置微信小程序平台信息,包括AppID、密钥、登录配置等</p>
+                                                <div class="row">
+                                                    <div class="col-md-6">
+                                                        <span class="label label-primary">接入流程</span>
+                                                        <ul class="list-unstyled" style="margin-top: 10px;">
+                                                            <li><i class="fa fa-check-circle text-success"></i> 微信小程序认证</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 微信小程序配置</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 上传小程序</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 提交审核</li>
+                                                        </ul>
+                                                    </div>
+                                                    <div class="col-md-6">
+                                                        <span class="label label-info">配置要素</span>
+                                                        <ul class="list-unstyled" style="margin-top: 10px;">
+                                                            <li><i class="fa fa-cog"></i> 小程序AppID</li>
+                                                            <li><i class="fa fa-cog"></i> 小程序密钥</li>
+                                                            <li><i class="fa fa-cog"></i> 登录配置</li>
+                                                            <li><i class="fa fa-cog"></i> 支付配置</li>
+                                                        </ul>
+                                                    </div>
+                                                </div>
+                                                <div class="text-center" style="margin-top: 15px;">
+                                                    <a href="{:url('platform/wechat_mini_program')}" class="btn btn-primary">
+                                                        <i class="fa fa-cog"></i> 配置微信小程序
+                                                    </a>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    
+                                    <div class="col-md-6">
+                                        <div class="panel panel-default">
+                                            <div class="panel-heading">
+                                                <h3 class="panel-title">
+                                                    <i class="fa fa-music text-info"></i>
+                                                    抖音小程序
+                                                </h3>
+                                            </div>
+                                            <div class="panel-body">
+                                                <p class="text-muted">配置抖音小程序平台信息,包括AppID、密钥、登录配置等</p>
+                                                <div class="row">
+                                                    <div class="col-md-6">
+                                                        <span class="label label-primary">接入流程</span>
+                                                        <ul class="list-unstyled" style="margin-top: 10px;">
+                                                            <li><i class="fa fa-check-circle text-success"></i> 抖音开发者认证</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 抖音小程序配置</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 上传小程序</li>
+                                                            <li><i class="fa fa-check-circle text-success"></i> 提交审核</li>
+                                                        </ul>
+                                                    </div>
+                                                    <div class="col-md-6">
+                                                        <span class="label label-info">配置要素</span>
+                                                        <ul class="list-unstyled" style="margin-top: 10px;">
+                                                            <li><i class="fa fa-cog"></i> 小程序AppID</li>
+                                                            <li><i class="fa fa-cog"></i> 小程序密钥</li>
+                                                            <li><i class="fa fa-cog"></i> 登录配置</li>
+                                                            <li><i class="fa fa-cog"></i> 支付配置</li>
+                                                        </ul>
+                                                    </div>
+                                                </div>
+                                                <div class="text-center" style="margin-top: 15px;">
+                                                    <a href="{:url('platform/douyin_mini_program')}" class="btn btn-info">
+                                                        <i class="fa fa-cog"></i> 配置抖音小程序
+                                                    </a>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                
+                                <div class="row">
+                                    <div class="col-md-12">
+                                        <div class="alert alert-info">
+                                            <i class="fa fa-info-circle"></i>
+                                            <strong>注意:</strong>
+                                            <ul style="margin-top: 10px;">
+                                                <li>配置平台信息前,请确保已在对应平台完成开发者认证</li>
+                                                <li>AppID和密钥信息请从对应平台的开发者后台获取</li>
+                                                <li>配置完成后,请测试接口调用是否正常</li>
+                                                <li>配置信息会自动缓存,修改后会自动清除缓存</li>
+                                            </ul>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+{/block} 

+ 103 - 121
application/api/controller/Comment.php

@@ -6,8 +6,12 @@ use app\common\model\Comment as CommentModel;
 use app\common\model\Order;
 use app\common\model\Order;
 use app\common\model\OrderAftersales;
 use app\common\model\OrderAftersales;
 use app\common\model\OrderAction;
 use app\common\model\OrderAction;
+use app\common\Service\Goods\CommentService;
+use app\api\validate\Comment as CommentValidate;
+use app\common\Enum\CommentEnum;
 use think\Db;
 use think\Db;
 use app\common\Enum\OrderEnum;
 use app\common\Enum\OrderEnum;
+
 /**
 /**
  * 评论
  * 评论
  */
  */
@@ -20,7 +24,15 @@ class Comment extends Base
      */
      */
     public function index()
     public function index()
     {
     {
-        $list = CommentModel::getCommentList($this->request->param());
+        $params = $this->request->param();
+        
+        // 验证参数
+        $validate = new CommentValidate();
+        if (!$validate->scene('index')->check($params)) {
+            $this->error($validate->getError());
+        }
+        
+        $list = CommentService::getCommentList($params);
         foreach ($list as $item) {
         foreach ($list as $item) {
             if ($item->user) {
             if ($item->user) {
                 $item->user->avatar = cdnurl($item->user->avatar, true);
                 $item->user->avatar = cdnurl($item->user->avatar, true);
@@ -32,140 +44,110 @@ class Comment extends Base
         $this->success('获取成功', $list);
         $this->success('获取成功', $list);
     }
     }
 
 
-
-    //添加评论
+    /**
+     * 添加评论
+     */
     public function add()
     public function add()
     {
     {
-        $pid = $this->request->post('pid/d', 0);
-        $order_id = $this->request->post('order_id/d');
-        $remark = $this->request->post('remark/a', '', 'trim,xss_clean');
-        if (empty($remark) || !is_array($remark)) {
-            $this->error('评论内容不能为空');
+        $params = $this->request->param();
+        
+        // 验证参数
+        $validate = new CommentValidate();
+        if (!$validate->scene('add')->check($params)) {
+            $this->error($validate->getError());
         }
         }
-        $order = Order::with(['OrderGoods'])
-            ->where('id', $order_id)
-            ->where('order_status', OrderEnum::STATUS_CONFIRM)
-            ->where('user_id', $this->auth->id)->find();
 
 
-        if (!$order) {
-            $this->error('未找到可评论的订单');
-        }
-        $row = CommentModel::where('user_id', $this->auth->id)->where('order_id', $order->id)->find();
-        if ($row) {
-            $this->error('订单已评论');
-        }
+        $pid = isset($params['pid']) ? (int)$params['pid'] : 0;
+        $order_id = (int)$params['order_id'];
+        $remark = $params['remark'];
 
 
-        $data = [];
-        $goods_ids = [];
-        //可以评价的商品
-        foreach ($order->order_goods as $item) {
-            if (in_array($item['sale_status'], [0, 6])) {
-                $goods_ids[] = $item['goods_id'];
-            }
+        try {
+            CommentService::addComment($this->auth->id, $order_id, $remark, $pid);
+            $this->success('添加评论成功,等待审核!');
+        } catch (\Exception $e) {
+            $this->error($e->getMessage());
         }
         }
-        foreach ($remark as $item) {
-            if (!isset($item['goods_id'])) {
-                $this->error('缺少参数goods_id');
-            }
-            if (!isset($item['star'])) {
-                $this->error('缺少评分参数');
-            }
-            if (!isset($item['images'])) {
-                $this->error('缺少参数images');
-            }
-            if (!in_array($item['goods_id'], $goods_ids)) {
-                $this->error('存在不可评价的商品');
-            }
-            if (empty($item['content'])) {
-                $this->error('评论内容不能为空');
-            }
-            $data[] = [
-                'pid'       => $pid,
-                'order_id'  => $order['id'],
-                'user_id'   => $this->auth->id,
-                'goods_id'  => $item['goods_id'],
-                'star'      => $item['star'],
-                'content'   => $item['content'],
-                'images'    => $item['images'],
-                'ip'        => request()->ip(),
-                'useragent' => substr(request()->server('HTTP_USER_AGENT'), 0, 255),
-                'status'    => 'hidden'
-            ];
-        }
-        Db::startTrans();
-        // try {
-            (new CommentModel())->saveAll($data);
-            $order->order_status = OrderEnum::STATUS_COMMENT;
-            $order->save();
-            foreach ($order->order_goods as $item) {
-                $item->save(['comment_status' => 1]);
-            }
-            // //是否有积分
-            // $config = get_addon_config('shop');
-            // if ($config['comment_score'] > 0) {
-            //     \app\common\model\User::score($config['comment_score'], $this->auth->id, '评论订单赠送' . $config['comment_score'] . '积分');
-            // }
-            // //结束,订单完成,给积分
-            // if (isset($config['money_score']) && $config['money_score'] > 0 && $order->shippingstate == 2 && $order->paystate == 1) {
-            //     //减去退款金额
-            //     $refund = OrderAftersales::where('order_id', $order->id)->where('type', '<>', 3)
-            //     ->where('status', 2)->sum('refund');
-            //     $money = bcsub($order['payamount'], $refund, 2);
-            //     if ($money > 0) {
-            //         $score = bcmul($money, $config['money_score']);
-            //         \app\common\model\User::score($score, $this->auth->id, '完成订单奖励' . $score . '积分');
-            //     }
-            // }
-            // 提交事务
-            Db::commit();
-        // } catch (\Exception $e) {
-        //     // 回滚事务
-        //     Db::rollback();
-        //     $this->error('添加评论失败');
-        // }
-        OrderAction::push($order->order_sn, '系统', '订单已完成');
-        $this->success('添加评论成功,等待审核!');
     }
     }
 
 
-
-    //我的评价
+    /**
+     * 我的评价
+     */
     public function myList()
     public function myList()
     {
     {
-        $list = CommentModel::with([
-            'Goods' => function ($query) {
-                $query->field('id,title,image');
-            }
-        ])->where('user_id', $this->auth->id)->where('pid', 0)->where('status', 'normal')->order('createtime desc')->paginate(10);
+        $params = $this->request->param();
+        
+        // 验证参数
+        $validate = new CommentValidate();
+        if (!$validate->scene('myList')->check($params)) {
+            $this->error($validate->getError());
+        }
+        
+        $page = isset($params['page']) ? (int)$params['page'] : 1;
+        $pagesize = isset($params['pagesize']) ? (int)$params['pagesize'] : 10;
+        
+        $list = CommentService::getUserCommentList($this->auth->id, $page, $pagesize);
+        
         foreach ($list as $item) {
         foreach ($list as $item) {
             $item->hidden(['ip', 'subscribe', 'useragent', 'comments']);
             $item->hidden(['ip', 'subscribe', 'useragent', 'comments']);
         }
         }
+        
         $this->success('获取成功', $list);
         $this->success('获取成功', $list);
     }
     }
 
 
-    //回复评论
-    // public function reply()
-    // {
-    //     $pid = $this->request->post('pid');
-    //     $content = $this->request->post('content');
-    //     if (!$content) {
-    //         $this->error('回复内容不能为空');
-    //     }
-    //     $row = CommentModel::where('id', $pid)->where('status', 'normal')->find();
-    //     if (!$row) {
-    //         $this->error('未找到记录');
-    //     }
-    //     $row->setInc('comments');
-    //     CommentModel::create([
-    //         'pid' => $pid,
-    //         'order_id' => $row->order_id,
-    //         'user_id' => $this->auth->id,
-    //         'goods_id' => $row->goods_id,
-    //         'star' => 0,
-    //         'content' => $content,
-    //         'ip' => request()->ip(),
-    //         'useragent' => substr(request()->server('HTTP_USER_AGENT'), 0, 255),
-    //         'status' => 'hidden'
-    //     ]);
-    //     $this->success('提交回复成功');
-    // }
+    /**
+     * 获取商品评论统计
+     */
+    public function stats()
+    {
+        $params = $this->request->param();
+        
+        // 验证参数
+        $validate = new CommentValidate();
+        if (!$validate->scene('stats')->check($params)) {
+            $this->error($validate->getError());
+        }
+        
+        $goods_id = (int)$params['goods_id'];
+        $stats = CommentService::getCommentStats($goods_id);
+        
+        $this->success('获取成功', $stats);
+    }
+
+    /**
+     * 审核评论 (管理员功能)
+     */
+    public function audit()
+    {
+        $params = $this->request->param();
+        
+        // 验证参数
+        $validate = new CommentValidate();
+        if (!$validate->scene('audit')->check($params)) {
+            $this->error($validate->getError());
+        }
+        
+        $comment_id = (int)$params['comment_id'];
+        $evaluate_status = (int)$params['evaluate_status'];
+        
+        try {
+            CommentService::auditComment($comment_id, $evaluate_status);
+            $this->success('审核成功');
+        } catch (\Exception $e) {
+            $this->error($e->getMessage());
+        }
+    }
+
+    /**
+     * 获取评论状态列表
+     */
+    public function getStatusList()
+    {
+        $data = [
+            'evaluate_status' => CommentEnum::getEvaluateStatusList(),
+            'status' => CommentEnum::getStatusList(),
+            'has_picture' => CommentEnum::getHasPictureList(),
+        ];
+        
+        $this->success('获取成功', $data);
+    }
 }
 }

+ 89 - 0
application/api/validate/Comment.php

@@ -0,0 +1,89 @@
+<?php
+
+namespace app\api\validate;
+
+use think\Validate;
+use app\common\Enum\CommentEnum;
+
+class Comment extends Validate
+{
+    protected $rule = [
+        'goods_id' => 'integer|>=:0',
+        'pid' => 'integer|>=:0',
+        'page' => 'integer|>:0',
+        'page_size' => 'integer|between:1,50',
+        'order_by' => 'in:pid,id,createtime,updatetime,rand',
+        'order_way' => 'in:asc,desc',
+        'has_picture' => 'integer|in:0,1',
+        'order_id' => 'require|integer|>:0',
+        'remark' => 'require|array',
+        'remark.*.goods_id' => 'require|integer|>:0',
+        'remark.*.star' => 'require|integer|between:1,5',
+        'remark.*.content' => 'require|max:500',
+        'remark.*.images' => 'array',
+        'evaluate_status' => 'integer|in:1,2,3',
+        'comment_id' => 'require|integer|>:0',
+    ];
+
+    protected $message = [
+        'goods_id.integer' => '商品ID必须为整数',
+        'pid.integer' => '父评论ID必须为整数',
+        'page.integer' => '页码必须为正整数',
+        'page_size.between' => '每页显示条数必须在1-50之间',
+        'order_by.in' => '排序字段不正确',
+        'order_way.in' => '排序方式不正确',
+        'has_picture.in' => '是否有图片参数错误',
+        'order_id.require' => '订单ID不能为空',
+        'order_id.integer' => '订单ID必须为整数',
+        'remark.require' => '评论内容不能为空',
+        'remark.array' => '评论内容格式不正确',
+        'remark.*.goods_id.require' => '商品ID不能为空',
+        'remark.*.goods_id.integer' => '商品ID必须为整数',
+        'remark.*.star.require' => '评分不能为空',
+        'remark.*.star.between' => '评分必须在1-5之间',
+        'remark.*.content.require' => '评论内容不能为空',
+        'remark.*.content.max' => '评论内容不能超过500字',
+        'remark.*.images.array' => '图片格式不正确',
+        'evaluate_status.in' => '评价状态参数错误',
+        'comment_id.require' => '评论ID不能为空',
+        'comment_id.integer' => '评论ID必须为整数',
+    ];
+
+    protected $scene = [
+        'index' => ['goods_id', 'pid', 'page', 'page_size', 'order_by', 'order_way', 'has_picture'],
+        'add' => ['order_id', 'remark', 'pid'],
+        'myList' => ['page', 'page_size'],
+        'stats' => ['goods_id'],
+        'audit' => ['comment_id', 'evaluate_status'],
+    ];
+
+    /**
+     * 验证评价状态
+     * @param $value
+     * @param $rule
+     * @param $data
+     * @return bool|string
+     */
+    public function checkEvaluateStatus($value, $rule, $data)
+    {
+        if (!CommentEnum::isValidEvaluateStatus($value)) {
+            return '评价状态参数错误';
+        }
+        return true;
+    }
+
+    /**
+     * 验证有图片状态
+     * @param $value
+     * @param $rule
+     * @param $data
+     * @return bool|string
+     */
+    public function checkHasPicture($value, $rule, $data)
+    {
+        if (!CommentEnum::isValidHasPicture($value)) {
+            return '有图片状态参数错误';
+        }
+        return true;
+    }
+} 

+ 148 - 0
application/common/Enum/CommentEnum.php

@@ -0,0 +1,148 @@
+<?php
+
+namespace app\common\Enum;
+
+class CommentEnum
+{
+    /**
+     * 评价状态
+     */
+    const EVALUATE_STATUS_PENDING = 1;     // 审核中
+    const EVALUATE_STATUS_APPROVED = 2;    // 审核通过
+    const EVALUATE_STATUS_REJECTED = 3;    // 审核失败
+
+    /**
+     * 显示状态
+     */
+    const STATUS_NORMAL = 'normal';        // 正常显示
+    const STATUS_HIDDEN = 'hidden';        // 隐藏
+
+    /**
+     * 是否有图片
+     */
+    const HAS_PICTURE_NO = 0;              // 无图片
+    const HAS_PICTURE_YES = 1;             // 有图片
+
+    /**
+     * 获取评价状态文本
+     * @param int $status
+     * @return string
+     */
+    public static function getEvaluateStatusText($status)
+    {
+        $statusMap = [
+            self::EVALUATE_STATUS_PENDING => '审核中',
+            self::EVALUATE_STATUS_APPROVED => '审核通过',
+            self::EVALUATE_STATUS_REJECTED => '审核失败'
+        ];
+
+        return isset($statusMap[$status]) ? $statusMap[$status] : '未知状态';
+    }
+
+    /**
+     * 获取显示状态文本
+     * @param string $status
+     * @return string
+     */
+    public static function getStatusText($status)
+    {
+        $statusMap = [
+            self::STATUS_NORMAL => '正常显示',
+            self::STATUS_HIDDEN => '隐藏'
+        ];
+
+        return isset($statusMap[$status]) ? $statusMap[$status] : '未知状态';
+    }
+
+    /**
+     * 获取有图片状态文本
+     * @param int $hasPicture
+     * @return string
+     */
+    public static function getHasPictureText($hasPicture)
+    {
+        $statusMap = [
+            self::HAS_PICTURE_NO => '无图片',
+            self::HAS_PICTURE_YES => '有图片'
+        ];
+
+        return isset($statusMap[$hasPicture]) ? $statusMap[$hasPicture] : '未知状态';
+    }
+
+    /**
+     * 获取所有评价状态
+     * @return array
+     */
+    public static function getEvaluateStatusList()
+    {
+        return [
+            self::EVALUATE_STATUS_PENDING => '审核中',
+            self::EVALUATE_STATUS_APPROVED => '审核通过',
+            self::EVALUATE_STATUS_REJECTED => '审核失败'
+        ];
+    }
+
+    /**
+     * 获取所有显示状态
+     * @return array
+     */
+    public static function getStatusList()
+    {
+        return [
+            self::STATUS_NORMAL => '正常显示',
+            self::STATUS_HIDDEN => '隐藏'
+        ];
+    }
+
+    /**
+     * 获取所有有图片状态
+     * @return array
+     */
+    public static function getHasPictureList()
+    {
+        return [
+            self::HAS_PICTURE_NO => '无图片',
+            self::HAS_PICTURE_YES => '有图片'
+        ];
+    }
+
+    /**
+     * 验证评价状态
+     * @param int $status
+     * @return bool
+     */
+    public static function isValidEvaluateStatus($status)
+    {
+        return in_array($status, [
+            self::EVALUATE_STATUS_PENDING,
+            self::EVALUATE_STATUS_APPROVED,
+            self::EVALUATE_STATUS_REJECTED
+        ]);
+    }
+
+    /**
+     * 验证显示状态
+     * @param string $status
+     * @return bool
+     */
+    public static function isValidStatus($status)
+    {
+        return in_array($status, [
+            self::STATUS_NORMAL,
+            self::STATUS_HIDDEN
+        ]);
+    }
+
+    /**
+     * 验证有图片状态
+     * @param int $hasPicture
+     * @return bool
+     */
+    public static function isValidHasPicture($hasPicture)
+    {
+        return in_array($hasPicture, [
+            self::HAS_PICTURE_NO,
+            self::HAS_PICTURE_YES
+        ]);
+    }
+} 

+ 285 - 0
application/common/Service/Goods/CommentService.php

@@ -0,0 +1,285 @@
+<?php
+
+namespace app\common\Service\Goods;
+
+use app\common\model\Comment;
+use app\common\model\Order;
+use app\common\model\OrderAction;
+use app\common\Enum\OrderEnum;
+use app\common\Enum\CommentEnum;
+use think\Db;
+use think\Exception;
+use app\common\exception\BusinessException;
+use app\common\Enum\StatusEnum;
+
+class CommentService
+{
+    /**
+     * 获取评论列表
+     * @param array $params 查询参数
+     * @return \think\Paginator
+     */
+    public static function getCommentList($params = [])
+    {
+        $goods_id = isset($params['goods_id']) ? (int)$params['goods_id'] : 0;
+        $pid = isset($params['pid']) ? (int)$params['pid'] : 0;
+        $has_picture = isset($params['has_picture']) ? (int)$params['has_picture'] : '';
+        
+        $orderBy = isset($params['order_by']) ? $params['order_by'] : 'id';
+        $orderWay = isset($params['order_way']) ? strtolower($params['order_way']) : 'desc';
+       
+        $page = isset($params['page']) ? (int)$params['page'] : 1;
+        $pageSize = isset($params['page_size']) ? $params['page_size'] : 10;
+
+        $orderWay = in_array($orderWay, ['asc', 'desc']) ? $orderWay : 'desc';
+
+        $where = [
+            'evaluate_status' => CommentEnum::EVALUATE_STATUS_APPROVED,
+            'status' => StatusEnum::ENABLED
+        ];
+        
+        if ($goods_id > 0) {
+            $where['goods_id'] = $goods_id;
+        }
+        
+        if ($pid !== '') {
+            $where['pid'] = $pid;
+        }
+        
+        // 添加有图评论过滤
+        if ($has_picture !== '') {
+            $where['has_picture'] = $has_picture;
+        }
+
+        $order = $orderBy == 'rand' ? 'rand()' : (in_array($orderBy, ['pid', 'id', 'createtime', 'updatetime']) ? "{$orderBy} {$orderWay}" : "id {$orderWay}");
+
+        $list = Comment::with(['user', 'reply' => function ($query) {
+            $query->with(['manage' => function ($user) {
+                $user->field('id,nickname');
+            }]);
+        }])
+            ->where($where)
+            ->order($order)
+            ->paginate($pageSize, false, ['page' => $page]);
+        return $list;
+    }
+
+    /**
+     * 获取商品好评度
+     * @param int $goods_id 商品ID
+     * @return float
+     */
+    public static function degree($goods_id)
+    {
+        $total = Comment::where('goods_id', $goods_id)
+            ->where('pid', 0)
+            ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+            ->where('status', CommentEnum::STATUS_NORMAL)
+            ->sum('star');
+            
+        $favorable = Comment::where('goods_id', $goods_id)
+            ->where('pid', 0)
+            ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+            ->where('status', CommentEnum::STATUS_NORMAL)
+            ->where('star', '>', 3)
+            ->sum('star');
+            
+        if (!$total || !$favorable) {
+            return 100;
+        }
+        
+        return bcmul(bcdiv($favorable, $total, 2), 100);
+    }
+
+    /**
+     * 获取用户评论列表
+     * @param int $user_id 用户ID
+     * @param int $page 页码
+     * @param int $pagesize 每页数量
+     * @return \think\Paginator
+     */
+    public static function getUserCommentList($user_id, $page = 1, $pagesize = 10)
+    {
+        $list = Comment::with([
+            'Goods' => function ($query) {
+                $query->field('id,title,image');
+            }
+        ])
+            ->where('user_id', $user_id)
+            ->where('pid', 0)
+            ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+            ->where('status', CommentEnum::STATUS_NORMAL)
+            ->order('createtime desc')
+            ->paginate($pagesize, false, ['page' => $page]);
+            
+        return $list;
+    }
+
+    /**
+     * 添加评论
+     * @param int $user_id 用户ID
+     * @param int $order_id 订单ID
+     * @param array $remark 评论内容
+     * @param int $pid 父评论ID
+     * @return bool
+     * @throws Exception
+     */
+    public static function addComment($user_id, $order_id, $remark, $pid = 0)
+    {
+        // 验证订单
+        $order = Order::with(['OrderGoods'])
+            ->where('id', $order_id)
+            ->where('order_status', OrderEnum::STATUS_CONFIRM)
+            ->where('user_id', $user_id)
+            ->find();
+
+        if (!$order) {
+            throw new BusinessException('未找到可评论的订单');
+        }
+        
+        // 检查是否已评论
+        $existComment = Comment::where('user_id', $user_id)
+            ->where('order_id', $order->id)
+            ->find();
+            
+        if ($existComment) {
+            throw new BusinessException('订单已评论');
+        }
+
+        // 获取可评价的商品
+        $goods_ids = [];
+        foreach ($order->order_goods as $item) {
+            $goods_ids[] = $item['goods_id'];
+        }
+
+        // 验证评论数据并组装
+        $data = [];
+        foreach ($remark as $item) {
+            if (!in_array($item['goods_id'], $goods_ids)) {
+                throw new BusinessException('存在不可评价的商品');
+            }
+            
+            // 处理图片
+            $images = isset($item['images']) ? $item['images'] : [];
+            $has_picture = !empty($images) ? CommentEnum::HAS_PICTURE_YES : CommentEnum::HAS_PICTURE_NO;
+            
+            $data[] = [
+                'pid'              => $pid,
+                'order_id'         => $order['id'],
+                'user_id'          => $user_id,
+                'goods_id'         => $item['goods_id'],
+                'star'             => $item['star'],
+                'content'          => $item['content'],
+                'images'           => is_array($images) ? implode(',', $images) : $images,
+                'has_picture'      => $has_picture,
+                'ip'               => request()->ip(),
+                'useragent'        => substr(request()->server('HTTP_USER_AGENT'), 0, 255),
+                'evaluate_status'  => CommentEnum::EVALUATE_STATUS_PENDING,
+            ];
+        }
+
+        // 事务处理
+        Db::startTrans();
+        try {
+            // 批量添加评论
+            $comment = new Comment();
+            $comment->saveAll($data);
+            
+            // 更新订单状态
+            $order->order_status = OrderEnum::STATUS_COMMENT;
+            $order->save();
+            
+            // 更新订单商品评论状态
+            foreach ($order->order_goods as $item) {
+                $item->save(['comment_status' => 1]);
+            }
+            
+            // 添加订单日志
+            OrderAction::push($order->order_sn, '系统', '订单已完成');
+            
+            Db::commit();
+            return true;
+            
+        } catch (\Exception $e) {
+            Db::rollback();
+            throw new BusinessException('添加评论失败:' . $e->getMessage());
+        }
+    }
+
+    /**
+     * 批量保存评论(原方法保留)
+     * @param array $data 评论数据
+     * @return bool
+     */
+    public static function saveComments($data)
+    {
+        $comment = new Comment();
+        return $comment->saveAll($data);
+    }
+
+    /**
+     * 审核评论
+     * @param int $comment_id 评论ID
+     * @param int $evaluate_status 评价状态
+     * @return bool
+     * @throws Exception
+     */
+    public static function auditComment($comment_id, $evaluate_status)
+    {
+        if (!CommentEnum::isValidEvaluateStatus($evaluate_status)) {
+            throw new BusinessException('评价状态参数错误');
+        }
+        
+        $comment = Comment::where('id', $comment_id)->find();
+        if (!$comment) {
+            throw new BusinessException('评论不存在');
+        }
+        
+        $status = $evaluate_status == CommentEnum::EVALUATE_STATUS_APPROVED ? 
+                  CommentEnum::STATUS_NORMAL : CommentEnum::STATUS_HIDDEN;
+        
+        return $comment->save([
+            'evaluate_status' => $evaluate_status,
+            'status' => $status
+        ]);
+    }
+
+    /**
+     * 获取商品评论统计
+     * @param int $goods_id 商品ID
+     * @return array
+     */
+    public static function getCommentStats($goods_id)
+    {
+        $total = Comment::where('goods_id', $goods_id)
+            ->where('pid', 0)
+            ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+            ->where('status', CommentEnum::STATUS_NORMAL)
+            ->count();
+            
+        $star_counts = [];
+        for ($i = 1; $i <= 5; $i++) {
+            $star_counts[$i] = Comment::where('goods_id', $goods_id)
+                ->where('pid', 0)
+                ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+                ->where('status', CommentEnum::STATUS_NORMAL)
+                ->where('star', $i)
+                ->count();
+        }
+        
+        // 有图评论统计
+        $picture_count = Comment::where('goods_id', $goods_id)
+            ->where('pid', 0)
+            ->where('evaluate_status', CommentEnum::EVALUATE_STATUS_APPROVED)
+            ->where('status', CommentEnum::STATUS_NORMAL)
+            ->where('has_picture', CommentEnum::HAS_PICTURE_YES)
+            ->count();
+        
+        return [
+            'total' => $total,
+            'star_counts' => $star_counts,
+            'picture_count' => $picture_count,
+            'degree' => self::degree($goods_id)
+        ];
+    }
+}

+ 0 - 3
application/common/Service/Lottery/LotteryService.php

@@ -795,9 +795,6 @@ class LotteryService
                 case LotteryEnum::PRIZE_TYPE_CODE:
                 case LotteryEnum::PRIZE_TYPE_CODE:
                     static::deliverExchangeCode($winRecord, $prize);
                     static::deliverExchangeCode($winRecord, $prize);
                     break;
                     break;
-                case LotteryEnum::PRIZE_TYPE_SHOP_GOODS:
-                    static::deliverGoods($winRecord, $prize);
-                    break;
             }
             }
         } catch (Exception $e) {
         } catch (Exception $e) {
             LotteryRecordService::markWinRecordAsFailed($winRecord, $e->getMessage());
             LotteryRecordService::markWinRecordAsFailed($winRecord, $e->getMessage());

+ 510 - 0
application/common/Service/PlatformService.php

@@ -0,0 +1,510 @@
+<?php
+
+namespace app\common\Service;
+
+use app\common\model\Config;
+use think\Cache;
+use think\Db;
+
+/**
+ * 平台配置服务类
+ */
+class PlatformService
+{
+    /**
+     * 根据配置名获取配置值
+     * @param string $name 配置名
+     * @return mixed
+     */
+    public static function getConfigValue($name)
+    {
+        $cacheKey = 'config_' . $name;
+        $value = Cache::get($cacheKey);
+        
+        if ($value === false) {
+            $config = Config::where('name', $name)->find();
+            if ($config) {
+                $value = $config['value'];
+                
+                // 处理数组类型
+                if ($config['type'] === 'array') {
+                    $value = json_decode($value, true) ?: [];
+                }
+                
+                // 处理布尔类型
+                if ($config['type'] === 'boolean') {
+                    $value = (bool)$value;
+                }
+                
+                // 缓存配置值
+                Cache::set($cacheKey, $value, 3600);
+            } else {
+                $value = null;
+            }
+        }
+        
+        return $value;
+    }
+    
+    /**
+     * 根据分组获取配置
+     * @param string $group 分组名
+     * @return array
+     */
+    public static function getConfigByGroup($group)
+    {
+        $cacheKey = 'config_group_' . $group;
+        $configs = Cache::get($cacheKey);
+        
+        if ($configs === false) {
+            $list = Config::where('group', $group)
+                ->where('type', '<>', 'group')
+                ->select();
+                
+            $configs = [];
+            foreach ($list as $config) {
+                $name = str_replace($group . '.', '', $config['name']);
+                $value = $config['value'];
+                
+                // 处理数组类型
+                if ($config['type'] === 'array') {
+                    $value = json_decode($value, true) ?: [];
+                }
+                
+                // 处理布尔类型
+                if ($config['type'] === 'boolean') {
+                    $value = (bool)$value;
+                }
+                
+                $configs[$name] = $value;
+            }
+            
+            // 缓存配置
+            Cache::set($cacheKey, $configs, 3600);
+        }
+        
+        return $configs;
+    }
+    
+    /**
+     * 设置配置值
+     * @param string $name 配置名
+     * @param mixed $value 配置值
+     * @return bool
+     */
+    public static function setConfigValue($name, $value)
+    {
+        $config = Config::where('name', $name)->find();
+        
+        if (!$config) {
+            return false;
+        }
+        
+        // 处理数组类型
+        if ($config['type'] === 'array') {
+            $value = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
+        }
+        
+        // 更新配置
+        $config->value = $value;
+        $result = $config->save();
+        
+        if ($result) {
+            // 清除相关缓存
+            Cache::rm('config_' . $name);
+            Cache::rm('config_group_' . $config['group']);
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 批量设置配置值
+     * @param array $configs 配置数组
+     * @param string $group 分组名
+     * @return bool
+     */
+    public static function setConfigsByGroup($configs, $group)
+    {
+        $result = true;
+        
+        foreach ($configs as $name => $value) {
+            $configName = $group . '.' . $name;
+            if (!self::setConfigValue($configName, $value)) {
+                $result = false;
+            }
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 获取所有平台配置
+     * @return array
+     */
+    public static function getAllPlatformConfigs()
+    {
+        $cacheKey = 'all_platform_configs';
+        $configs = Cache::get($cacheKey);
+        
+        if ($configs === false) {
+            $platforms = Config::where('name', 'like', 'shop.platform.%')
+                ->where('type', 'group')
+                ->where('group', 'shop.platform')
+                ->select();
+                
+            $configs = [];
+            foreach ($platforms as $platform) {
+                $platformName = str_replace('shop.platform.', '', $platform['name']);
+                $configs[$platformName] = [
+                    'name' => $platformName,
+                    'title' => $platform['title'],
+                    'tip' => $platform['tip'],
+                    'status' => self::getConfigValue($platform['name'] . '.status'),
+                    'config' => self::getConfigByGroup($platform['name'])
+                ];
+            }
+            
+            // 缓存配置
+            Cache::set($cacheKey, $configs, 3600);
+        }
+        
+        return $configs;
+    }
+    
+    /**
+     * 检查配置是否存在
+     * @param string $name 配置名
+     * @return bool
+     */
+    public static function hasConfig($name)
+    {
+        return Config::where('name', $name)->count() > 0;
+    }
+    
+    /**
+     * 创建配置项
+     * @param array $data 配置数据
+     * @return bool
+     */
+    public static function createConfig($data)
+    {
+        // 检查是否已存在
+        if (self::hasConfig($data['name'])) {
+            return false;
+        }
+        
+        $config = new Config();
+        $config->data($data);
+        $result = $config->save();
+        
+        if ($result) {
+            // 清除缓存
+            Cache::clear();
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 删除配置项
+     * @param string $name 配置名
+     * @return bool
+     */
+    public static function deleteConfig($name)
+    {
+        $config = Config::where('name', $name)->find();
+        
+        if (!$config) {
+            return false;
+        }
+        
+        $result = $config->delete();
+        
+        if ($result) {
+            // 清除缓存
+            Cache::clear();
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 清除所有配置缓存
+     */
+    public static function clearConfigCache()
+    {
+        Cache::clear();
+    }
+    
+    /**
+     * 获取配置项的显示值
+     * @param array $config 配置项数组
+     * @return string
+     */
+    public static function getDisplayValue($config)
+    {
+        $value = $config['value'];
+        
+        switch ($config['type']) {
+            case 'boolean':
+                return $value ? '是' : '否';
+            case 'array':
+                $arrayValue = json_decode($value, true);
+                return is_array($arrayValue) ? implode(', ', $arrayValue) : $value;
+            case 'password':
+                return str_repeat('*', strlen($value));
+            default:
+                return $value;
+        }
+    }
+    
+    /**
+     * 验证配置值
+     * @param string $type 配置类型
+     * @param mixed $value 配置值
+     * @return bool
+     */
+    public static function validateValue($type, $value)
+    {
+        switch ($type) {
+            case 'int':
+                return is_numeric($value);
+            case 'boolean':
+                return in_array($value, ['0', '1', 0, 1, true, false], true);
+            case 'array':
+                if (is_array($value)) {
+                    return true;
+                }
+                $decoded = json_decode($value, true);
+                return json_last_error() === JSON_ERROR_NONE;
+            case 'email':
+                return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
+            case 'url':
+                return filter_var($value, FILTER_VALIDATE_URL) !== false;
+            default:
+                return true;
+        }
+    }
+    
+    /**
+     * 获取平台状态
+     * @param string $platformName 平台名称
+     * @return bool
+     */
+    public static function getPlatformStatus($platformName)
+    {
+        $statusConfig = Config::where('name', $platformName . '.status')->find();
+        return $statusConfig ? (bool)$statusConfig['value'] : false;
+    }
+    
+    /**
+     * 获取平台配置项数量
+     * @param string $platformName 平台名称
+     * @return int
+     */
+    public static function getConfigCount($platformName)
+    {
+        return Config::where('group', $platformName)->count();
+    }
+    
+    /**
+     * 获取平台配置数据
+     * @param string $platform 平台类型
+     * @return array
+     */
+    public static function getPlatformConfigData($platform)
+    {
+        $configs = [];
+        
+        switch ($platform) {
+            case 'WechatMiniProgram':
+                $configs = [
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram',
+                        'group' => 'shop.platform',
+                        'title' => '微信小程序',
+                        'tip' => '微信小程序平台配置',
+                        'type' => 'group',
+                        'value' => '',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram.app_id',
+                        'group' => 'shop.platform.WechatMiniProgram',
+                        'title' => '小程序AppId',
+                        'tip' => 'AppID是小程序开发标识码,配合AppSecret可调用小程序的接口能力',
+                        'type' => 'string',
+                        'value' => '',
+                        'rule' => 'required',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram.secret',
+                        'group' => 'shop.platform.WechatMiniProgram',
+                        'title' => '小程序密钥',
+                        'tip' => 'AppSecret是校验小程序开发者身份的密钥,具有极高的安全性',
+                        'type' => 'string',
+                        'value' => '',
+                        'rule' => 'required',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram.status',
+                        'group' => 'shop.platform.WechatMiniProgram',
+                        'title' => '小程序开启状态',
+                        'tip' => '是否开启微信小程序功能',
+                        'type' => 'boolean',
+                        'value' => '0',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram.auto_login',
+                        'group' => 'shop.platform.WechatMiniProgram',
+                        'title' => '微信自动登录',
+                        'tip' => '进入应用后,用户将会自动授权登录,未注册用户将会自动注册',
+                        'type' => 'boolean',
+                        'value' => '1',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.WechatMiniProgram.bind_mobile',
+                        'group' => 'shop.platform.WechatMiniProgram',
+                        'title' => '绑定手机号',
+                        'tip' => '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号',
+                        'type' => 'boolean',
+                        'value' => '1',
+                        'rule' => '',
+                        'extend' => ''
+                    ]
+                ];
+                break;
+                
+            case 'DouyinMiniProgram':
+                $configs = [
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram',
+                        'group' => 'shop.platform',
+                        'title' => '抖音小程序',
+                        'tip' => '抖音小程序平台配置',
+                        'type' => 'group',
+                        'value' => '',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram.app_id',
+                        'group' => 'shop.platform.DouyinMiniProgram',
+                        'title' => '抖音小程序AppId',
+                        'tip' => '抖音小程序应用ID',
+                        'type' => 'string',
+                        'value' => '',
+                        'rule' => 'required',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram.secret',
+                        'group' => 'shop.platform.DouyinMiniProgram',
+                        'title' => '抖音小程序密钥',
+                        'tip' => '抖音小程序应用密钥',
+                        'type' => 'string',
+                        'value' => '',
+                        'rule' => 'required',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram.status',
+                        'group' => 'shop.platform.DouyinMiniProgram',
+                        'title' => '抖音小程序开启状态',
+                        'tip' => '是否开启抖音小程序功能',
+                        'type' => 'boolean',
+                        'value' => '0',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram.auto_login',
+                        'group' => 'shop.platform.DouyinMiniProgram',
+                        'title' => '自动登录',
+                        'tip' => '进入应用后,用户将会自动授权登录,未注册用户将会自动注册',
+                        'type' => 'boolean',
+                        'value' => '1',
+                        'rule' => '',
+                        'extend' => ''
+                    ],
+                    [
+                        'name' => 'shop.platform.DouyinMiniProgram.bind_mobile',
+                        'group' => 'shop.platform.DouyinMiniProgram',
+                        'title' => '绑定手机号',
+                        'tip' => '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号',
+                        'type' => 'boolean',
+                        'value' => '1',
+                        'rule' => '',
+                        'extend' => ''
+                    ]
+                ];
+                break;
+        }
+        
+        return $configs;
+    }
+    
+    /**
+     * 初始化平台配置数据
+     * @param string $platform 平台类型
+     * @return bool
+     * @throws \Exception
+     */
+    public static function initPlatformConfig($platform)
+    {
+        $configs = self::getPlatformConfigData($platform);
+        
+        Db::startTrans();
+        try {
+            foreach ($configs as $config) {
+                $exists = Config::where('name', $config['name'])->find();
+                if (!$exists) {
+                    Config::create($config);
+                }
+            }
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            throw $e;
+        }
+    }
+    
+    /**
+     * 根据渠道获取平台配置
+     * @param string $channel 渠道标识
+     * @return array
+     */
+    public static function getConfigByChannel($channel)
+    {
+        $platformMap = [
+            'wechat_mini_program' => 'shop.platform.WechatMiniProgram',
+            'douyin_mini_program' => 'shop.platform.DouyinMiniProgram',
+        ];
+        
+        if (!isset($platformMap[$channel])) {
+            return [];
+        }
+        
+        return self::getConfigByGroup($platformMap[$channel]);
+    }
+    
+    /**
+     * 检查平台是否启用
+     * @param string $channel 渠道标识
+     * @return bool
+     */
+    public static function isPlatformEnabled($channel)
+    {
+        $config = self::getConfigByChannel($channel);
+        return !empty($config['status']);
+    }
+} 

+ 2 - 60
application/common/model/Comment.php

@@ -2,13 +2,9 @@
 
 
 namespace app\common\model;
 namespace app\common\model;
 
 
-use app\common\library\Service;
-use app\common\exception\CommentException;
-use app\common\library\Auth;
-use fast\Tree;
-use think\Exception;
+
 use think\Model;
 use think\Model;
-use think\Validate;
+
 
 
 /**
 /**
  * 模型
  * 模型
@@ -55,60 +51,6 @@ class Comment extends Model
         return $this->belongsTo('Goods', 'goods_id', 'id', [], 'LEFT');
         return $this->belongsTo('Goods', 'goods_id', 'id', [], 'LEFT');
     }
     }
 
 
-    /**
-     * 获取评论列表
-     */
-    public static function getCommentList($params)
-    {
-        $goods_id = empty($params['goods_id']) ? 0 : $params['goods_id'];
-        $pid = empty($params['pid']) ? 0 : $params['pid'];
-        $condition = empty($params['condition']) ? '' : $params['condition'];
-        $fragment = empty($params['fragment']) ? 'comments' : $params['fragment'];
-        $row = empty($params['row']) ? 10 : (int)$params['row'];
-        $orderby = empty($params['orderby']) ? 'nums' : $params['orderby'];
-        $orderway = empty($params['orderway']) ? 'desc' : strtolower($params['orderway']);
-        $pagesize = empty($params['pagesize']) ? $row : $params['pagesize'];
-        $page = empty($params['page']) ? 1 : (int)$params['page'];
-        $orderway = in_array($orderway, ['asc', 'desc']) ? $orderway : 'desc';
-
-        $where = [
-            'status' => 'normal'
-        ];
-        if ($goods_id !== '') {
-            $where['goods_id'] = $goods_id;
-        }
-        if ($pid !== '') {
-            $where['pid'] = $pid;
-        }
-        $order = $orderby == 'rand' ? 'rand()' : (in_array($orderby, ['pid', 'id', 'createtime', 'updatetime']) ? "{$orderby} {$orderway}" : "id {$orderway}");
-        $config = [
-            'type'     => '\\addons\\shop\\library\\Bootstrap',
-            'var_page' => 'cp',
-            'fragment' => $fragment,
-            'page'     => $page
-        ];
-        $list = self::with(['user', 'reply' => function ($query) {
-            $query->with(['manage' => function ($user) {
-                $user->field('id,nickname');
-            }]);
-        }])
-            ->where($where)
-            ->where($condition)
-            ->order($order)
-            ->paginate($pagesize, false, $config);
-        return $list;
-    }
-
-    //好评度
-    public static function degree($goods_id)
-    {
-        $total = self::where('goods_id', $goods_id)->where('pid', 0)->where('status', 'normal')->sum('star');
-        $favorable = self::where('goods_id', $goods_id)->where('pid', 0)->where('status', 'normal')->where('star', '>', 3)->sum('star');
-        if (!$total || !$favorable) {
-            return 100;
-        }
-        return bcmul(bcdiv($favorable, $total, 2), 100);
-    }
 
 
     public function reply()
     public function reply()
     {
     {

+ 206 - 0
docs/README_platform_config.md

@@ -0,0 +1,206 @@
+# 平台配置系统实现说明
+
+## 系统概述
+
+本系统基于FastAdmin框架实现了微信小程序和抖音小程序的平台配置管理功能。系统支持配置项的层级管理、数据验证、缓存机制和权限控制。
+
+## 核心功能
+
+### 1. 平台配置管理
+- **微信小程序配置**:AppID、密钥、登录配置、支付配置
+- **抖音小程序配置**:AppID、密钥、登录配置、支付配置
+- **配置状态管理**:开启/关闭平台功能
+- **配置项验证**:必填项验证、数据格式验证
+
+### 2. 配置存储结构
+采用点号分隔的层级结构:
+```
+shop.platform                           # 平台配置根节点
+├── shop.platform.WechatMiniProgram      # 微信小程序配置组
+│   ├── shop.platform.WechatMiniProgram.app_id      # 小程序AppID
+│   ├── shop.platform.WechatMiniProgram.secret      # 小程序密钥
+│   ├── shop.platform.WechatMiniProgram.status      # 开启状态
+│   ├── shop.platform.WechatMiniProgram.auto_login  # 自动登录
+│   └── shop.platform.WechatMiniProgram.bind_mobile # 绑定手机号
+└── shop.platform.DouyinMiniProgram     # 抖音小程序配置组
+    ├── shop.platform.DouyinMiniProgram.app_id      # 小程序AppID
+    ├── shop.platform.DouyinMiniProgram.secret      # 小程序密钥
+    ├── shop.platform.DouyinMiniProgram.status      # 开启状态
+    ├── shop.platform.DouyinMiniProgram.auto_login  # 自动登录
+    └── shop.platform.DouyinMiniProgram.bind_mobile # 绑定手机号
+```
+
+### 3. 数据类型支持
+- **string**:字符串类型(AppID、密钥等)
+- **boolean**:布尔类型(开关状态)
+- **int**:整数类型(数值配置)
+- **array**:数组类型(多选配置)
+- **group**:分组类型(配置组织)
+
+## 文件结构
+
+```
+├── install_platform_config.sql                     # 配置数据初始化SQL
+├── application/
+│   ├── admin/
+│   │   ├── controller/
+│   │   │   └── Platform.php                        # 平台配置控制器
+│   │   └── view/
+│   │       └── platform/
+│   │           ├── index.html                      # 配置列表页面
+│   │           └── config.html                     # 配置表单页面
+│   └── common/
+│       └── model/
+│           └── Config.php                          # 配置数据模型
+├── docs/
+│   └── platform_menu.md                           # 菜单配置说明
+└── README_platform_config.md                      # 本文档
+```
+
+## 安装步骤
+
+### 1. 导入配置数据
+```bash
+mysql -u username -p database_name < install_platform_config.sql
+```
+
+### 2. 添加后台菜单
+参考 `docs/platform_menu.md` 中的说明添加后台菜单项。
+
+### 3. 配置权限
+为管理员分配平台配置相关权限。
+
+## 使用方法
+
+### 1. 后台配置
+1. 登录FastAdmin后台
+2. 访问"平台配置"菜单
+3. 选择要配置的平台(微信小程序或抖音小程序)
+4. 填写配置信息并保存
+
+### 2. 代码调用
+```php
+use app\common\model\Config;
+
+// 获取微信小程序配置
+$wechatConfig = Config::getConfigByGroup('shop.platform.WechatMiniProgram');
+
+// 获取单个配置值
+$appId = Config::getConfigValue('shop.platform.WechatMiniProgram.app_id');
+
+// 判断平台是否开启
+$isEnabled = Config::getConfigValue('shop.platform.WechatMiniProgram.status');
+```
+
+## 系统特性
+
+### 1. 缓存机制
+- 自动缓存配置数据,提高读取性能
+- 配置更新时自动清除相关缓存
+- 支持按分组和单个配置项缓存
+
+### 2. 数据验证
+- 前端表单验证(必填项、格式验证)
+- 后端数据验证(类型验证、业务逻辑验证)
+- 配置值格式化和解析
+
+### 3. 扩展性
+- 支持添加更多平台配置
+- 支持自定义配置项类型
+- 支持配置项的动态显示和隐藏
+
+### 4. 安全性
+- 权限控制:只有授权用户才能访问配置
+- 数据验证:防止非法数据写入
+- 敏感信息保护:密钥等敏感信息的安全存储
+
+## 配置项说明
+
+### 微信小程序配置项
+
+| 配置项 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| app_id | string | 是 | 小程序AppID |
+| secret | string | 是 | 小程序密钥 |
+| status | boolean | 否 | 是否开启小程序功能 |
+| auto_login | boolean | 否 | 是否启用自动登录 |
+| bind_mobile | boolean | 否 | 是否强制绑定手机号 |
+
+### 抖音小程序配置项
+
+| 配置项 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| app_id | string | 是 | 小程序AppID |
+| secret | string | 是 | 小程序密钥 |
+| status | boolean | 否 | 是否开启小程序功能 |
+| auto_login | boolean | 否 | 是否启用自动登录 |
+| bind_mobile | boolean | 否 | 是否强制绑定手机号 |
+
+## 扩展开发
+
+### 1. 添加新平台
+在控制器中添加新的平台配置方法:
+```php
+public function new_platform()
+{
+    $group = 'shop.platform.NewPlatform';
+    return $this->platformConfig($group, '新平台配置');
+}
+```
+
+### 2. 添加配置项
+在 `getPlatformConfigData` 方法中添加新的配置项:
+```php
+[
+    'name' => 'shop.platform.NewPlatform.new_config',
+    'group' => 'shop.platform.NewPlatform',
+    'title' => '新配置项',
+    'tip' => '配置项说明',
+    'type' => 'string',
+    'value' => '',
+    'rule' => '',
+    'extend' => ''
+]
+```
+
+### 3. 自定义配置类型
+在模型中扩展 `validateValue` 方法以支持新的数据类型。
+
+## 性能优化
+
+### 1. 缓存策略
+- 按分组缓存:缓存整个配置组的数据
+- 单项缓存:缓存单个配置项的值
+- 缓存时间:默认3600秒(1小时)
+
+### 2. 数据库优化
+- 使用索引:在 `name` 和 `group` 字段上建立索引
+- 查询优化:避免全表扫描,使用精确条件查询
+
+### 3. 前端优化
+- 表单验证:客户端验证减少服务器请求
+- 异步提交:AJAX提交表单,提升用户体验
+
+## 注意事项
+
+1. **敏感信息**:AppSecret等敏感信息需要妥善保管
+2. **权限控制**:严格控制配置修改权限
+3. **数据验证**:确保配置数据的完整性和正确性
+4. **缓存管理**:适当管理缓存,避免数据不一致
+5. **备份恢复**:定期备份配置数据,确保数据安全
+
+## 版本说明
+
+- **v1.0.0**:基础功能实现
+  - 微信小程序配置管理
+  - 抖音小程序配置管理
+  - 基础缓存机制
+  - 配置验证功能
+
+## 技术支持
+
+如需技术支持或功能扩展,请参考:
+- FastAdmin官方文档
+- ThinkPHP框架文档
+- 微信小程序开发文档
+- 抖音小程序开发文档 

+ 4 - 0
docs/channel/README.md

@@ -25,6 +25,10 @@
 - [QQ小程序](qq_mini_program.md) - QQ小程序平台
 - [QQ小程序](qq_mini_program.md) - QQ小程序平台
 - [支付宝小程序](alipay_mini_program.md) - 支付宝小程序平台
 - [支付宝小程序](alipay_mini_program.md) - 支付宝小程序平台
 
 
+## 快速参考
+
+- [配置清单](channel_config_checklist.md) - 所有渠道配置要点汇总
+
 ## 渠道分组
 ## 渠道分组
 
 
 ### 微信生态 (wechat)
 ### 微信生态 (wechat)

+ 288 - 0
docs/channel/alipay_mini_program.md

@@ -0,0 +1,288 @@
+# 支付宝小程序渠道配置
+
+## 概述
+
+支付宝小程序是蚂蚁金服生态中的重要应用形态,依托支付宝庞大的用户基础和完善的支付体系,为开发者提供了优质的开发平台。本文档描述了支付宝小程序渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `alipay_mini_program`
+- **渠道名称**: 支付宝小程序
+- **渠道类型**: 小程序
+- **所属分组**: 小程序 (mini_program)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'alipay_mini_program',
+'name' => '支付宝小程序',
+'status' => true, // 开启/关闭
+'description' => '支付宝小程序平台接入'
+```
+
+### 2. 支付宝平台配置
+
+#### 必填参数
+- **AppId**: 小程序应用ID
+- **私钥**: 应用私钥
+- **公钥**: 支付宝公钥
+
+#### 配置示例
+```php
+'alipay_config' => [
+    'app_id' => '2021001234567890',
+    'private_key' => '应用私钥内容',
+    'public_key' => '支付宝公钥内容',
+    'sign_type' => 'RSA2',
+    'charset' => 'UTF-8',
+    'gateway_url' => 'https://openapi.alipay.com/gateway.do'
+]
+```
+
+#### 获取方式
+1. 登录支付宝开放平台 (open.alipay.com)
+2. 创建小程序应用
+3. 在「开发设置」中获取AppID
+4. 配置应用公钥和获取支付宝公钥
+
+### 3. 支付配置
+
+支付宝小程序支持以下支付方式:
+
+#### 3.1 支付宝支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置小程序支付
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.2 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 10000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.3 不支持的支付方式 ❌
+- 微信支付
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => true,
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持支付宝支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到支付宝好友、朋友圈 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持模板消息推送 |
+
+## 配置流程
+
+### 1. 支付宝开放平台配置
+
+1. **注册开发者账号**
+   - 访问 https://open.alipay.com
+   - 注册开发者账号
+   - 完成实名认证
+
+2. **创建小程序**
+   - 在开放平台创建小程序
+   - 填写小程序基本信息
+   - 完成小程序认证
+
+3. **获取开发信息**
+   - 在「开发设置」中获取AppID
+   - 配置应用公钥
+   - 获取支付宝公钥
+
+4. **配置服务器域名**
+   - 在「开发设置」中配置
+   - HTTP请求域名:`https://your-domain.com`
+   - 上传文件域名:`https://your-domain.com`
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: 支付宝小程序
+   渠道描述: 支付宝小程序平台
+   ```
+
+2. **平台参数配置**
+   ```
+   AppId: 2021001234567890
+   私钥: 应用私钥内容
+   公钥: 支付宝公钥内容
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 关闭
+   支付宝支付: 开启
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 开启
+   绑定手机号: 开启
+   ```
+
+### 3. 开发配置
+
+1. **小程序代码配置**
+   ```javascript
+   // app.js
+   App({
+     globalData: {
+       apiUrl: 'https://your-domain.com/api',
+       appId: '2021001234567890'
+     }
+   })
+   ```
+
+2. **登录授权**
+   ```javascript
+   // 获取用户信息
+   my.getAuthCode({
+     scopes: 'auth_user',
+     success: (res) => {
+       if (res.authCode) {
+         // 发送 authCode 到服务器
+       }
+     }
+   })
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 支付宝支付
+   my.tradePay({
+     orderStr: orderStr, // 订单信息
+     success: function(res) {
+       // 支付成功
+     },
+     fail: function(res) {
+       // 支付失败
+     }
+   })
+   ```
+
+## 测试验证
+
+### 1. 开发者工具测试
+- 使用支付宝小程序开发者工具
+- 测试登录授权流程
+- 测试支付功能(需要真机)
+
+### 2. 真机测试
+- 在支付宝中打开测试小程序
+- 测试完整业务流程
+- 验证支付功能
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"支付宝登录code","channel":"alipay_mini_program"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"alipay_mini_program","payment_type":"alipay"}'
+```
+
+## 注意事项
+
+1. **域名配置**
+   - 必须使用HTTPS协议
+   - 域名需要备案
+   - 需要在支付宝开放平台配置合法域名
+
+2. **支付配置**
+   - 支付宝小程序原生支持支付宝支付
+   - 需要开通支付宝商户号
+   - 配置支付回调地址
+
+3. **用户授权**
+   - 获取用户信息需要用户主动授权
+   - 不能强制用户授权
+   - 需要做好授权失败的处理
+
+4. **版本发布**
+   - 开发完成后需要提交审核
+   - 审核通过后才能发布
+   - 建议先发布体验版测试
+
+## 常见问题
+
+### Q1: AppId和密钥在哪里获取?
+A: 在支付宝开放平台的「开发设置」中获取AppID,配置应用公钥后获取支付宝公钥。
+
+### Q2: 为什么不支持微信支付?
+A: 支付宝小程序不支持微信支付,推荐使用支付宝支付。
+
+### Q3: 如何测试支付功能?
+A: 支付功能需要在真机支付宝中测试,开发者工具无法测试支付。
+
+### Q4: 登录授权失败怎么办?
+A: 检查域名配置、AppId配置,确保小程序已发布或设置为体验版。
+
+## 相关链接
+
+- [支付宝小程序开发文档](https://opendocs.alipay.com/mini/)
+- [支付宝开放平台](https://open.alipay.com/)
+- [支付宝小程序开发者工具](https://opendocs.alipay.com/mini/ide/download) 

+ 346 - 0
docs/channel/android_app.md

@@ -0,0 +1,346 @@
+# Android APP渠道配置
+
+## 概述
+
+Android APP是谷歌安卓生态系统中的重要应用形态,具有庞大的用户基础和多样化的分发渠道。本文档描述了Android APP渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `android_app`
+- **渠道名称**: Android APP
+- **渠道类型**: 移动应用
+- **所属分组**: 移动应用 (mobile_app)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'android_app',
+'name' => 'Android APP',
+'status' => true, // 开启/关闭
+'description' => 'Android移动应用平台接入'
+```
+
+### 2. 应用平台配置
+
+#### 必填参数
+- **Package Name**: 应用包名
+- **App签名**: 应用签名信息
+- **推送配置**: 推送服务配置(可选)
+
+#### 配置示例
+```php
+'android_config' => [
+    'package_name' => 'com.yourcompany.yourapp',
+    'app_signature' => 'SHA1:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD',
+    'google_play_id' => 'com.yourcompany.yourapp',
+    'push_config' => [
+        'service' => 'fcm', // fcm/jpush/umeng等
+        'server_key' => 'your_server_key',
+        'sender_id' => 'your_sender_id'
+    ]
+]
+```
+
+#### 获取方式
+1. 在Android Studio中创建项目
+2. 生成应用签名
+3. 在Google Play Console中创建应用
+4. 配置推送服务(如需推送功能)
+
+### 3. 支付配置
+
+Android APP支持以下支付方式:
+
+#### 3.1 支付宝支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置移动应用支付
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.2 微信支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **配置要求**: 
+  - 需要开通微信支付商户号
+  - 配置移动应用支付
+  - 设置回调地址
+
+```php
+'payment_config' => [
+    'wechat' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'mch_id' => '商户号',
+        'key' => '商户密钥',
+        'cert_path' => '证书路径',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.3 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 3
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 50000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.4 不支持的支付方式 ❌
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => false, // Android通常不建议自动登录
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+#### 4.3 第三方登录
+- **Google登录**: 推荐使用
+- **微信登录**: 需要配置微信开放平台
+- **其他第三方登录**: 根据需要配置
+
+```php
+'login_config' => [
+    'google_login' => [
+        'enabled' => true,
+        'client_id' => 'your_google_client_id',
+        'server_client_id' => 'your_server_client_id'
+    ],
+    'wechat_login' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'app_secret' => '微信开放平台AppSecret'
+    ]
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持支付宝支付、微信支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到各种平台 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持FCM、极光推送等 |
+
+## 配置流程
+
+### 1. Google Play Console配置
+
+1. **注册开发者账号**
+   - 访问 https://play.google.com/console
+   - 注册开发者账号
+   - 缴纳注册费
+
+2. **创建应用**
+   - 在Google Play Console中创建新应用
+   - 填写应用基本信息
+   - 设置应用图标和截图
+
+3. **配置应用信息**
+   - 应用描述
+   - 分类设置
+   - 内容分级
+
+4. **版本管理**
+   - 创建版本
+   - 上传APK/AAB文件
+   - 提交审核
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: Android APP
+   渠道描述: Android移动应用平台
+   ```
+
+2. **平台参数配置**
+   ```
+   Package Name: com.yourcompany.yourapp
+   App签名: SHA1:AA:BB:CC:DD...
+   Google Play ID: com.yourcompany.yourapp
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 开启
+   支付宝支付: 开启
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 关闭
+   绑定手机号: 开启
+   Google登录: 开启
+   微信登录: 开启
+   ```
+
+### 3. 开发配置
+
+1. **应用代码配置**
+   ```java
+   // Application.java
+   public class MyApplication extends Application {
+       @Override
+       public void onCreate() {
+           super.onCreate();
+           
+           // 配置API基础URL
+           ApiManager.init("https://your-domain.com/api");
+           
+           // 配置第三方SDK
+           initThirdPartySDKs();
+       }
+   }
+   ```
+
+2. **登录授权**
+   ```java
+   // Google登录
+   private void signInWithGoogle() {
+       GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
+               .requestIdToken(getString(R.string.server_client_id))
+               .requestEmail()
+               .build();
+       
+       GoogleSignInClient client = GoogleSignIn.getClient(this, gso);
+       Intent signInIntent = client.getSignInIntent();
+       startActivityForResult(signInIntent, RC_SIGN_IN);
+   }
+   ```
+
+3. **支付调用**
+   ```java
+   // 支付宝支付
+   private void payWithAlipay(String orderInfo) {
+       Runnable payRunnable = () -> {
+           PayTask alipay = new PayTask(this);
+           Map<String, String> result = alipay.payV2(orderInfo, true);
+           
+           runOnUiThread(() -> {
+               handlePayResult(result);
+           });
+       };
+       
+       Thread payThread = new Thread(payRunnable);
+       payThread.start();
+   }
+   ```
+
+## 测试验证
+
+### 1. 开发环境测试
+- 使用Android Studio进行开发调试
+- 测试登录授权流程
+- 测试支付功能
+
+### 2. 内部测试
+- 创建内部测试版本
+- 邀请测试用户
+- 验证完整业务流程
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"token":"Google登录token","channel":"android_app"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"android_app","payment_type":"alipay"}'
+```
+
+## 注意事项
+
+1. **Google Play政策**
+   - 严格遵守Google Play政策
+   - 不能包含违规内容
+   - 支付功能需要合规
+
+2. **权限管理**
+   - 合理申请应用权限
+   - 适配Android权限模型
+   - 处理权限拒绝情况
+
+3. **第三方SDK**
+   - 确保SDK版本兼容
+   - 及时更新SDK版本
+   - 注意SDK隐私合规
+
+4. **多渠道发布**
+   - 适配不同应用商店
+   - 考虑渠道包区别
+   - 统计渠道来源
+
+## 常见问题
+
+### Q1: 如何配置Google登录?
+A: 在Google Cloud Console中配置OAuth 2.0客户端ID,获取客户端ID和密钥。
+
+### Q2: 为什么支付功能不工作?
+A: 检查商户号配置、签名配置,确保回调地址可访问。
+
+### Q3: 如何处理推送通知?
+A: 配置FCM服务,在应用中请求推送权限,处理推送消息。
+
+### Q4: 如何适配不同Android版本?
+A: 设置合适的targetSdkVersion,适配不同版本的API变化。
+
+## 相关链接
+
+- [Google Play Console](https://play.google.com/console)
+- [Android开发文档](https://developer.android.com/docs)
+- [Firebase Console](https://console.firebase.google.com/)
+- [Google Play政策](https://play.google.com/about/developer-content-policy/)
+- [Android设计指南](https://developer.android.com/design) 

+ 236 - 0
docs/channel/channel_config_checklist.md

@@ -0,0 +1,236 @@
+# 渠道配置清单
+
+## 概述
+
+本文档为系统支持的所有渠道提供快速配置清单,帮助开发者快速了解各渠道的配置要点和注意事项。
+
+## 渠道配置清单
+
+### 微信生态
+
+#### 微信公众号 (wechat_official_account)
+- **必填参数**: AppId, AppSecret, Token
+- **支付方式**: ✅微信支付, ✅余额支付
+- **登录方式**: 网页授权, 绑定手机号
+- **关键配置**: 
+  - 网页授权域名
+  - JS接口安全域名
+  - 支付授权目录
+- **注意事项**: 需要认证公众号, 配置服务器验证
+
+#### 微信小程序 (wechat_mini_program)
+- **必填参数**: AppId, AppSecret
+- **支付方式**: ✅微信支付, ✅余额支付
+- **登录方式**: 自动登录, 绑定手机号
+- **关键配置**: 
+  - 服务器域名配置
+  - 支付回调域名
+  - 业务域名配置
+- **注意事项**: 需要小程序认证, 支付需要真机测试
+
+### 移动应用
+
+#### iOS APP (ios_app)
+- **必填参数**: Bundle ID, App Store ID, Team ID
+- **支付方式**: ✅微信支付, ✅支付宝支付, ✅余额支付
+- **登录方式**: 苹果登录, 微信登录, 绑定手机号
+- **关键配置**: 
+  - 开发者证书
+  - Provisioning Profile
+  - 推送证书
+- **注意事项**: 需要Apple开发者账号, 严格遵守审核指南
+
+#### Android APP (android_app)
+- **必填参数**: Package Name, App签名
+- **支付方式**: ✅支付宝支付, ✅微信支付, ✅余额支付
+- **登录方式**: Google登录, 微信登录, 绑定手机号
+- **关键配置**: 
+  - 应用签名配置
+  - 推送服务配置
+  - 权限申请
+- **注意事项**: 需要Google开发者账号, 适配不同Android版本
+
+### 网页端
+
+#### H5 (h5)
+- **必填参数**: 域名, SSL证书
+- **支付方式**: ✅微信支付, ✅支付宝支付, ✅余额支付
+- **登录方式**: 微信登录, QQ登录, 绑定手机号
+- **关键配置**: 
+  - HTTPS配置
+  - CDN配置
+  - SEO优化
+- **注意事项**: 需要域名备案, 移动端适配
+
+#### PC (pc)
+- **必填参数**: 域名, SSL证书
+- **支付方式**: ✅支付宝支付, ✅线下支付, ✅余额支付
+- **登录方式**: QQ登录, 微信登录, 绑定手机号
+- **关键配置**: 
+  - 响应式设计
+  - 浏览器兼容性
+  - 统计分析配置
+- **注意事项**: 考虑IE兼容性, 大屏幕适配
+
+### 小程序平台
+
+#### 抖音小程序 (douyin_mini_program)
+- **必填参数**: AppId, AppSecret
+- **支付方式**: ✅支付宝支付, ✅余额支付
+- **登录方式**: 自动登录, 绑定手机号
+- **关键配置**: 
+  - 服务器域名配置
+  - 支付回调地址
+- **注意事项**: 不支持微信支付, 审核周期较长
+
+#### QQ小程序 (qq_mini_program)
+- **必填参数**: AppId, AppSecret
+- **支付方式**: ✅余额支付
+- **登录方式**: 自动登录, 绑定手机号
+- **关键配置**: 
+  - 服务器域名配置
+- **注意事项**: 仅支持余额支付, 需要引导用户充值
+
+#### 支付宝小程序 (alipay_mini_program)
+- **必填参数**: AppId, 私钥, 公钥
+- **支付方式**: ✅支付宝支付, ✅余额支付
+- **登录方式**: 自动登录, 绑定手机号
+- **关键配置**: 
+  - RSA密钥配置
+  - 服务器域名配置
+- **注意事项**: 原生支持支付宝支付, 密钥配置复杂
+
+## 配置优先级
+
+### 高优先级配置
+1. **基本信息**: 渠道状态、名称、描述
+2. **平台参数**: AppId、AppSecret、密钥等
+3. **域名配置**: HTTPS域名、备案状态
+4. **支付配置**: 商户号、回调地址
+
+### 中优先级配置
+1. **登录配置**: 第三方登录、自动登录
+2. **功能开关**: 各种功能的开启状态
+3. **安全配置**: SSL证书、加密设置
+
+### 低优先级配置
+1. **UI配置**: 主题色彩、图标设置
+2. **统计配置**: 埋点统计、数据分析
+3. **优化配置**: CDN、缓存设置
+
+## 通用配置要求
+
+### 域名要求
+- 必须使用HTTPS协议
+- 域名需要完成备案
+- 配置正确的DNS解析
+- 申请有效的SSL证书
+
+### 支付配置
+- 开通对应的商户号
+- 配置正确的回调地址
+- 设置支付证书和密钥
+- 测试支付功能完整性
+
+### 登录配置
+- 配置第三方登录平台
+- 设置用户授权流程
+- 处理登录失败情况
+- 绑定用户手机号验证
+
+### 安全配置
+- 使用HTTPS加密传输
+- 配置防火墙和安全策略
+- 定期更新SDK版本
+- 监控安全漏洞
+
+## 测试验证清单
+
+### 功能测试
+- [ ] 登录授权流程
+- [ ] 支付功能完整性
+- [ ] 分享功能测试
+- [ ] 基本业务流程
+
+### 兼容性测试
+- [ ] 不同设备适配
+- [ ] 不同系统版本
+- [ ] 不同浏览器支持
+- [ ] 网络环境测试
+
+### 性能测试
+- [ ] 页面加载速度
+- [ ] 接口响应时间
+- [ ] 资源使用情况
+- [ ] 内存泄漏检查
+
+### 安全测试
+- [ ] 数据传输加密
+- [ ] 用户信息保护
+- [ ] 支付安全验证
+- [ ] 接口安全防护
+
+## 常见问题汇总
+
+### 配置类问题
+1. **AppId获取失败**: 检查开发者平台账号状态
+2. **域名配置错误**: 确认域名备案和DNS解析
+3. **证书配置失败**: 检查证书有效期和格式
+
+### 支付类问题
+1. **支付失败**: 检查商户号配置和回调地址
+2. **支付回调异常**: 确认回调地址可访问性
+3. **支付金额限制**: 了解各平台支付限额
+
+### 登录类问题
+1. **授权失败**: 检查AppId和域名配置
+2. **用户信息获取失败**: 确认授权作用域设置
+3. **登录状态丢失**: 检查session和token管理
+
+### 发布类问题
+1. **审核被拒**: 仔细阅读审核指南和拒绝理由
+2. **版本发布失败**: 检查包体大小和资源配置
+3. **功能不可用**: 确认所有配置项正确设置
+
+## 配置维护
+
+### 定期检查
+- 证书过期时间
+- 域名续费状态
+- 开发者账号有效性
+- 第三方SDK版本
+
+### 安全更新
+- 及时更新SDK版本
+- 修复已知安全漏洞
+- 更新加密算法
+- 强化访问控制
+
+### 性能优化
+- 监控接口性能
+- 优化资源加载
+- 调整缓存策略
+- 升级服务器配置
+
+## 技术支持
+
+### 官方文档
+- [微信开发文档](https://developers.weixin.qq.com/)
+- [支付宝开放平台](https://open.alipay.com/)
+- [抖音开发者平台](https://developer.open-douyin.com/)
+- [QQ小程序文档](https://q.qq.com/wiki/)
+
+### 开发工具
+- [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
+- [支付宝小程序IDE](https://opendocs.alipay.com/mini/ide/download)
+- [抖音开发者工具](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/developer-tool/download)
+
+### 社区支持
+- 官方开发者社区
+- 技术交流群
+- 在线技术支持
+- 问题反馈渠道
+
+---
+
+**注意**: 本清单会根据各平台政策变化和技术更新进行调整,请定期查看最新版本。 

+ 280 - 0
docs/channel/douyin_mini_program.md

@@ -0,0 +1,280 @@
+# 抖音小程序渠道配置
+
+## 概述
+
+抖音小程序是字节跳动生态中的重要应用形态,依托抖音庞大的用户基础,为开发者提供了丰富的流量入口。本文档描述了抖音小程序渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `douyin_mini_program`
+- **渠道名称**: 抖音小程序
+- **渠道类型**: 小程序
+- **所属分组**: 小程序 (mini_program)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'douyin_mini_program',
+'name' => '抖音小程序',
+'status' => true, // 开启/关闭
+'description' => '抖音小程序平台接入'
+```
+
+### 2. 抖音平台配置
+
+#### 必填参数
+- **AppId**: 小程序应用ID
+- **AppSecret**: 小程序应用密钥
+
+#### 配置示例
+```php
+'douyin_config' => [
+    'appid' => 'tt1234567890abcdef',
+    'secret' => 'abcdef1234567890abcdef1234567890',
+    'token' => '', // 消息推送Token(可选)
+    'aes_key' => '', // 消息加解密Key(可选)
+]
+```
+
+#### 获取方式
+1. 登录抖音开发者平台 (developer.open-douyin.com)
+2. 创建小程序应用
+3. 在「开发管理」-「密钥管理」中获取
+4. 在「开发管理」-「服务器域名」中配置
+
+### 3. 支付配置
+
+抖音小程序支持以下支付方式:
+
+#### 3.1 支付宝支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置支付回调地址
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.2 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 10000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.3 不支持的支付方式 ❌
+- 微信支付
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => true,
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持支付宝支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到抖音、朋友圈 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持模板消息推送 |
+
+## 配置流程
+
+### 1. 抖音开发者平台配置
+
+1. **注册开发者账号**
+   - 访问 https://developer.open-douyin.com
+   - 注册开发者账号
+   - 完成实名认证
+
+2. **创建小程序**
+   - 在开发者平台创建小程序
+   - 填写小程序基本信息
+   - 完成小程序认证
+
+3. **获取开发信息**
+   - 在「开发管理」-「密钥管理」中获取AppID
+   - 生成AppSecret
+
+4. **配置服务器域名**
+   - 在「开发管理」-「服务器域名」中配置
+   - request合法域名:`https://your-domain.com`
+   - upload合法域名:`https://your-domain.com`
+   - download合法域名:`https://your-domain.com`
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: 抖音小程序
+   渠道描述: 抖音小程序平台
+   ```
+
+2. **平台参数配置**
+   ```
+   AppId: tt1234567890abcdef
+   AppSecret: abcdef1234567890abcdef1234567890
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 关闭
+   支付宝支付: 开启
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 开启
+   绑定手机号: 开启
+   ```
+
+### 3. 开发配置
+
+1. **小程序代码配置**
+   ```javascript
+   // app.js
+   App({
+     globalData: {
+       apiUrl: 'https://your-domain.com/api',
+       appId: 'tt1234567890abcdef'
+     }
+   })
+   ```
+
+2. **登录授权**
+   ```javascript
+   // 获取用户信息
+   tt.login({
+     success: (res) => {
+       if (res.code) {
+         // 发送 code 到服务器
+       }
+     }
+   })
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 支付宝支付
+   tt.pay({
+     orderInfo: orderInfo,
+     success: function(res) {
+       // 支付成功
+     }
+   })
+   ```
+
+## 测试验证
+
+### 1. 开发者工具测试
+- 使用抖音开发者工具
+- 测试登录授权流程
+- 测试支付功能(需要真机)
+
+### 2. 真机测试
+- 在抖音中打开测试小程序
+- 测试完整业务流程
+- 验证支付功能
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"抖音登录code","channel":"douyin_mini_program"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"douyin_mini_program","payment_type":"alipay"}'
+```
+
+## 注意事项
+
+1. **域名配置**
+   - 必须使用HTTPS协议
+   - 域名需要备案
+   - 需要在抖音开发者平台配置合法域名
+
+2. **支付配置**
+   - 抖音小程序不支持微信支付
+   - 需要开通支付宝商户号
+   - 配置支付回调地址
+
+3. **用户授权**
+   - 获取用户信息需要用户主动授权
+   - 不能强制用户授权
+   - 需要做好授权失败的处理
+
+4. **版本发布**
+   - 开发完成后需要提交审核
+   - 审核通过后才能发布
+   - 审核周期可能较长
+
+## 常见问题
+
+### Q1: AppId和AppSecret在哪里获取?
+A: 在抖音开发者平台的「开发管理」-「密钥管理」中获取。
+
+### Q2: 为什么不支持微信支付?
+A: 抖音小程序不支持微信支付,推荐使用支付宝支付。
+
+### Q3: 如何测试支付功能?
+A: 支付功能需要在真机抖音中测试,开发者工具无法测试支付。
+
+### Q4: 登录授权失败怎么办?
+A: 检查域名配置、AppId配置,确保小程序已发布或设置为体验版。
+
+## 相关链接
+
+- [抖音小程序开发文档](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/introduction)
+- [抖音开发者平台](https://developer.open-douyin.com/)
+- [抖音小程序开发者工具](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/developer-tool/download) 

+ 354 - 0
docs/channel/h5.md

@@ -0,0 +1,354 @@
+# H5渠道配置
+
+## 概述
+
+H5是移动网页应用的重要形态,具有跨平台、免安装、易传播的特点。本文档描述了H5渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `h5`
+- **渠道名称**: H5
+- **渠道类型**: 移动网页
+- **所属分组**: 网页端 (web)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'h5',
+'name' => 'H5',
+'status' => true, // 开启/关闭
+'description' => 'H5移动网页应用平台接入'
+```
+
+### 2. 网页平台配置
+
+#### 必填参数
+- **域名**: 应用访问域名
+- **CDN配置**: 静态资源CDN(可选)
+- **SSL证书**: HTTPS证书配置
+
+#### 配置示例
+```php
+'h5_config' => [
+    'domain' => 'https://h5.yourdomain.com',
+    'cdn_domain' => 'https://cdn.yourdomain.com',
+    'ssl_enabled' => true,
+    'cache_config' => [
+        'enable' => true,
+        'expire' => 3600, // 缓存过期时间
+    ],
+    'seo_config' => [
+        'title' => '应用标题',
+        'keywords' => '关键词',
+        'description' => '应用描述'
+    ]
+]
+```
+
+#### 获取方式
+1. 购买域名并完成备案
+2. 配置DNS解析
+3. 申请SSL证书
+4. 配置CDN加速(可选)
+
+### 3. 支付配置
+
+H5支持以下支付方式:
+
+#### 3.1 微信支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通微信支付商户号
+  - 配置H5支付
+  - 设置支付域名
+
+```php
+'payment_config' => [
+    'wechat' => [
+        'enabled' => true,
+        'app_id' => '微信公众号AppID',
+        'mch_id' => '商户号',
+        'key' => '商户密钥',
+        'cert_path' => '证书路径',
+        'notify_url' => '支付回调地址',
+        'scene_info' => [
+            'h5_info' => [
+                'type' => 'Wap',
+                'wap_url' => 'https://h5.yourdomain.com',
+                'wap_name' => 'H5应用'
+            ]
+        ]
+    ]
+]
+```
+
+#### 3.2 支付宝支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置手机网站支付
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址',
+        'return_url' => '支付返回地址'
+    ]
+]
+```
+
+#### 3.3 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 3
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 50000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.4 不支持的支付方式 ❌
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => false, // H5通常不建议自动登录
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+#### 4.3 第三方登录
+- **微信登录**: 推荐使用
+- **QQ登录**: 需要配置QQ互联
+- **其他第三方登录**: 根据需要配置
+
+```php
+'login_config' => [
+    'wechat_login' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'app_secret' => '微信开放平台AppSecret',
+        'scope' => 'snsapi_login'
+    ],
+    'qq_login' => [
+        'enabled' => true,
+        'app_id' => 'QQ互联AppID',
+        'app_key' => 'QQ互联AppKey'
+    ]
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持微信支付、支付宝支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到各种平台 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ❌ | 不支持推送通知 |
+
+## 配置流程
+
+### 1. 域名与服务器配置
+
+1. **域名配置**
+   - 购买域名并完成备案
+   - 配置DNS解析到服务器
+   - 申请SSL证书
+
+2. **服务器配置**
+   - 配置Web服务器(Nginx/Apache)
+   - 配置HTTPS
+   - 配置Gzip压缩
+
+3. **CDN配置**(可选)
+   - 配置静态资源CDN
+   - 配置缓存策略
+   - 配置缓存刷新
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: H5
+   渠道描述: H5移动网页应用平台
+   ```
+
+2. **平台参数配置**
+   ```
+   域名: https://h5.yourdomain.com
+   CDN域名: https://cdn.yourdomain.com
+   SSL状态: 开启
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 开启
+   支付宝支付: 开启
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 关闭
+   绑定手机号: 开启
+   微信登录: 开启
+   QQ登录: 开启
+   ```
+
+### 3. 开发配置
+
+1. **前端代码配置**
+   ```javascript
+   // config.js
+   const config = {
+     apiUrl: 'https://api.yourdomain.com',
+     cdnUrl: 'https://cdn.yourdomain.com',
+     channel: 'h5',
+     payment: {
+       wechat: true,
+       alipay: true,
+       balance: true
+     }
+   };
+   ```
+
+2. **登录授权**
+   ```javascript
+   // 微信登录
+   function loginWithWechat() {
+     const redirectUri = encodeURIComponent(window.location.href);
+     const authUrl = `https://open.weixin.qq.com/connect/qrconnect?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect`;
+     
+     window.location.href = authUrl;
+   }
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 微信支付
+   function payWithWechat(orderInfo) {
+     if (typeof WeixinJSBridge === 'undefined') {
+       alert('请在微信中打开');
+       return;
+     }
+     
+     WeixinJSBridge.invoke('getBrandWCPayRequest', {
+       appId: orderInfo.appId,
+       timeStamp: orderInfo.timeStamp,
+       nonceStr: orderInfo.nonceStr,
+       package: orderInfo.package,
+       signType: orderInfo.signType,
+       paySign: orderInfo.paySign
+     }, function(res) {
+       if (res.err_msg == 'get_brand_wcpay_request:ok') {
+         // 支付成功
+       }
+     });
+   }
+   ```
+
+## 测试验证
+
+### 1. 开发环境测试
+- 使用Chrome开发者工具
+- 测试移动设备适配
+- 测试支付功能
+
+### 2. 真机测试
+- 在各种移动设备上测试
+- 测试不同浏览器兼容性
+- 验证支付功能
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://api.yourdomain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"授权code","channel":"h5"}'
+
+# 测试支付接口
+curl -X POST "https://api.yourdomain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"h5","payment_type":"wechat"}'
+```
+
+## 注意事项
+
+1. **移动适配**
+   - 使用响应式设计
+   - 适配不同屏幕尺寸
+   - 优化触摸交互
+
+2. **性能优化**
+   - 压缩静态资源
+   - 使用CDN加速
+   - 优化图片加载
+
+3. **SEO优化**
+   - 设置合适的meta标签
+   - 优化页面标题和描述
+   - 使用语义化HTML
+
+4. **安全配置**
+   - 使用HTTPS
+   - 配置CSP策略
+   - 防止XSS攻击
+
+## 常见问题
+
+### Q1: 如何在微信中调用支付?
+A: 需要配置微信JSSDK,使用WeixinJSBridge调用支付接口。
+
+### Q2: 为什么支付宝支付跳转后没有返回?
+A: 检查return_url配置,确保返回地址可访问。
+
+### Q3: 如何优化H5页面加载速度?
+A: 使用CDN、压缩资源、优化图片、开启Gzip压缩。
+
+### Q4: 如何处理跨域问题?
+A: 配置CORS头部,或使用代理服务器。
+
+## 相关链接
+
+- [微信JS-SDK文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)
+- [支付宝手机网站支付文档](https://opendocs.alipay.com/open/203/105285)
+- [QQ互联文档](https://wiki.connect.qq.com/)
+- [HTML5规范](https://www.w3.org/TR/html52/)
+- [移动Web开发指南](https://developers.google.com/web/fundamentals) 

+ 357 - 0
docs/channel/ios_app.md

@@ -0,0 +1,357 @@
+# iOS APP渠道配置
+
+## 概述
+
+iOS APP是苹果生态系统中的重要应用形态,具有高用户粘性和付费意愿。本文档描述了iOS APP渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `ios_app`
+- **渠道名称**: iOS APP
+- **渠道类型**: 移动应用
+- **所属分组**: 移动应用 (mobile_app)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'ios_app',
+'name' => 'iOS APP',
+'status' => true, // 开启/关闭
+'description' => 'iOS移动应用平台接入'
+```
+
+### 2. 应用平台配置
+
+#### 必填参数
+- **Bundle ID**: 应用包标识符
+- **App Store ID**: 应用商店ID
+- **推送证书**: APNs推送证书(可选)
+
+#### 配置示例
+```php
+'ios_config' => [
+    'bundle_id' => 'com.yourcompany.yourapp',
+    'app_store_id' => '1234567890',
+    'team_id' => 'ABCDEFGHIJ',
+    'push_cert_path' => '/path/to/push_cert.pem',
+    'push_cert_password' => 'cert_password',
+    'environment' => 'production', // production/development
+]
+```
+
+#### 获取方式
+1. 登录Apple Developer Console
+2. 创建App ID和证书
+3. 在App Store Connect中创建应用
+4. 配置推送证书(如需推送功能)
+
+### 3. 支付配置
+
+iOS APP支持以下支付方式:
+
+#### 3.1 微信支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通微信支付商户号
+  - 配置移动应用支付
+  - 设置回调地址
+
+```php
+'payment_config' => [
+    'wechat' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'mch_id' => '商户号',
+        'key' => '商户密钥',
+        'cert_path' => '证书路径',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.2 支付宝支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置移动应用支付
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.3 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 3
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 50000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.4 不支持的支付方式 ❌
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => false, // iOS通常不建议自动登录
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+#### 4.3 第三方登录
+- **苹果登录**: 推荐使用
+- **微信登录**: 需要配置微信开放平台
+- **其他第三方登录**: 根据需要配置
+
+```php
+'login_config' => [
+    'apple_login' => [
+        'enabled' => true,
+        'client_id' => 'com.yourcompany.yourapp',
+        'team_id' => 'ABCDEFGHIJ',
+        'key_id' => 'KLMNOPQRST',
+        'private_key_path' => '/path/to/private_key.p8'
+    ],
+    'wechat_login' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'app_secret' => '微信开放平台AppSecret'
+    ]
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持微信支付、支付宝支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到各种平台 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持APNs推送 |
+
+## 配置流程
+
+### 1. Apple Developer配置
+
+1. **注册开发者账号**
+   - 访问 https://developer.apple.com
+   - 注册开发者账号
+   - 缴纳年费
+
+2. **创建App ID**
+   - 在Certificates, Identifiers & Profiles中创建
+   - 设置Bundle ID
+   - 配置所需的Capabilities
+
+3. **创建证书**
+   - 开发证书(Development)
+   - 生产证书(Production)
+   - 推送证书(Push Notifications)
+
+4. **创建Provisioning Profile**
+   - 开发环境Profile
+   - 生产环境Profile
+
+### 2. App Store Connect配置
+
+1. **创建应用**
+   - 在App Store Connect中创建新应用
+   - 填写应用基本信息
+   - 设置应用图标和截图
+
+2. **配置应用信息**
+   - 应用描述
+   - 关键词
+   - 分类设置
+
+3. **版本管理**
+   - 创建版本
+   - 上传构建版本
+   - 提交审核
+
+### 3. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: iOS APP
+   渠道描述: iOS移动应用平台
+   ```
+
+2. **平台参数配置**
+   ```
+   Bundle ID: com.yourcompany.yourapp
+   App Store ID: 1234567890
+   Team ID: ABCDEFGHIJ
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 开启
+   支付宝支付: 开启
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 关闭
+   绑定手机号: 开启
+   苹果登录: 开启
+   微信登录: 开启
+   ```
+
+### 4. 开发配置
+
+1. **应用代码配置**
+   ```swift
+   // AppDelegate.swift
+   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+       // 配置API基础URL
+       APIManager.shared.baseURL = "https://your-domain.com/api"
+       
+       // 配置第三方SDK
+       configureThirdPartySDKs()
+       
+       return true
+   }
+   ```
+
+2. **登录授权**
+   ```swift
+   // 苹果登录
+   @available(iOS 13.0, *)
+   func handleAppleLogin() {
+       let request = ASAuthorizationAppleIDProvider().createRequest()
+       request.requestedScopes = [.fullName, .email]
+       
+       let controller = ASAuthorizationController(authorizationRequests: [request])
+       controller.delegate = self
+       controller.presentationContextProvider = self
+       controller.performRequests()
+   }
+   ```
+
+3. **支付调用**
+   ```swift
+   // 微信支付
+   func payWithWechat(orderInfo: WechatPayOrder) {
+       let request = PayReq()
+       request.partnerId = orderInfo.partnerId
+       request.prepayId = orderInfo.prepayId
+       request.package = orderInfo.package
+       request.nonceStr = orderInfo.nonceStr
+       request.timeStamp = orderInfo.timeStamp
+       request.sign = orderInfo.sign
+       
+       WXApi.send(request, completion: nil)
+   }
+   ```
+
+## 测试验证
+
+### 1. 开发环境测试
+- 使用Xcode进行开发调试
+- 测试登录授权流程
+- 测试支付功能
+
+### 2. TestFlight测试
+- 上传到TestFlight进行内部测试
+- 邀请测试用户
+- 验证完整业务流程
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"token":"苹果登录token","channel":"ios_app"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"ios_app","payment_type":"wechat"}'
+```
+
+## 注意事项
+
+1. **苹果审核**
+   - 严格遵守App Store审核指南
+   - 不能包含违规内容
+   - 支付功能需要合规
+
+2. **隐私政策**
+   - 必须提供隐私政策
+   - 明确说明数据收集和使用
+   - 获取用户同意
+
+3. **第三方SDK**
+   - 确保SDK版本兼容
+   - 及时更新SDK版本
+   - 注意SDK隐私合规
+
+4. **版本更新**
+   - 定期发布更新版本
+   - 及时修复bug
+   - 适配新系统版本
+
+## 常见问题
+
+### Q1: 如何配置苹果登录?
+A: 在Apple Developer中启用Sign in with Apple,配置相关证书和Bundle ID。
+
+### Q2: 为什么支付功能不工作?
+A: 检查商户号配置、证书配置,确保回调地址可访问。
+
+### Q3: 如何处理推送通知?
+A: 配置APNs证书,在应用中请求推送权限,处理推送消息。
+
+### Q4: 审核被拒怎么办?
+A: 仔细阅读拒绝理由,修改相关问题后重新提交审核。
+
+## 相关链接
+
+- [Apple Developer](https://developer.apple.com/)
+- [App Store Connect](https://appstoreconnect.apple.com/)
+- [iOS开发文档](https://developer.apple.com/documentation/ios)
+- [App Store审核指南](https://developer.apple.com/app-store/review/guidelines/)
+- [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/) 

+ 364 - 0
docs/channel/pc.md

@@ -0,0 +1,364 @@
+# PC渠道配置
+
+## 概述
+
+PC是桌面网页应用的重要平台,具有大屏幕、高分辨率、丰富交互的特点。本文档描述了PC渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `pc`
+- **渠道名称**: PC
+- **渠道类型**: 桌面网页
+- **所属分组**: 网页端 (web)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'pc',
+'name' => 'PC',
+'status' => true, // 开启/关闭
+'description' => 'PC桌面网页应用平台接入'
+```
+
+### 2. 网页平台配置
+
+#### 必填参数
+- **域名**: 应用访问域名
+- **CDN配置**: 静态资源CDN(可选)
+- **SSL证书**: HTTPS证书配置
+
+#### 配置示例
+```php
+'pc_config' => [
+    'domain' => 'https://www.yourdomain.com',
+    'cdn_domain' => 'https://cdn.yourdomain.com',
+    'ssl_enabled' => true,
+    'cache_config' => [
+        'enable' => true,
+        'expire' => 3600, // 缓存过期时间
+    ],
+    'seo_config' => [
+        'title' => '应用标题',
+        'keywords' => '关键词',
+        'description' => '应用描述'
+    ],
+    'analytics' => [
+        'google_analytics' => 'UA-XXXXXXXX-X',
+        'baidu_analytics' => 'your_baidu_id'
+    ]
+]
+```
+
+#### 获取方式
+1. 购买域名并完成备案
+2. 配置DNS解析
+3. 申请SSL证书
+4. 配置CDN加速(可选)
+
+### 3. 支付配置
+
+PC支持以下支付方式:
+
+#### 3.1 支付宝支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通支付宝商户号
+  - 配置即时到账
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'alipay' => [
+        'enabled' => true,
+        'app_id' => '支付宝应用ID',
+        'private_key' => '应用私钥',
+        'public_key' => '支付宝公钥',
+        'notify_url' => '支付回调地址',
+        'return_url' => '支付返回地址'
+    ]
+]
+```
+
+#### 3.2 线下支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **说明**: 用户选择线下支付方式,如银行转账、现金等
+
+```php
+'payment_config' => [
+    'offline' => [
+        'enabled' => true,
+        'methods' => [
+            'bank_transfer' => '银行转账',
+            'cash' => '现金支付',
+            'pos' => 'POS机刷卡'
+        ]
+    ]
+]
+```
+
+#### 3.3 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 3
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 100000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.4 不支持的支付方式 ❌
+- 微信支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => false, // PC通常不建议自动登录
+    'auto_register' => true,
+    'remember_login' => true, // 记住登录状态
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+#### 4.3 第三方登录
+- **QQ登录**: 推荐使用
+- **微信登录**: 需要配置微信开放平台
+- **其他第三方登录**: 根据需要配置
+
+```php
+'login_config' => [
+    'qq_login' => [
+        'enabled' => true,
+        'app_id' => 'QQ互联AppID',
+        'app_key' => 'QQ互联AppKey'
+    ],
+    'wechat_login' => [
+        'enabled' => true,
+        'app_id' => '微信开放平台AppID',
+        'app_secret' => '微信开放平台AppSecret',
+        'scope' => 'snsapi_login'
+    ]
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持支付宝支付、线下支付、余额支付 |
+| 分享功能 | ❌ | 不支持原生分享功能 |
+| 定位功能 | ❌ | 不支持获取用户地理位置 |
+| 拍照功能 | ❌ | 不支持调用摄像头拍照 |
+| 推送功能 | ❌ | 不支持推送通知 |
+
+## 配置流程
+
+### 1. 域名与服务器配置
+
+1. **域名配置**
+   - 购买域名并完成备案
+   - 配置DNS解析到服务器
+   - 申请SSL证书
+
+2. **服务器配置**
+   - 配置Web服务器(Nginx/Apache)
+   - 配置HTTPS
+   - 配置Gzip压缩
+
+3. **CDN配置**(可选)
+   - 配置静态资源CDN
+   - 配置缓存策略
+   - 配置缓存刷新
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: PC
+   渠道描述: PC桌面网页应用平台
+   ```
+
+2. **平台参数配置**
+   ```
+   域名: https://www.yourdomain.com
+   CDN域名: https://cdn.yourdomain.com
+   SSL状态: 开启
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 关闭
+   支付宝支付: 开启
+   余额支付: 开启
+   线下支付: 开启
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 关闭
+   绑定手机号: 开启
+   QQ登录: 开启
+   微信登录: 开启
+   ```
+
+### 3. 开发配置
+
+1. **前端代码配置**
+   ```javascript
+   // config.js
+   const config = {
+     apiUrl: 'https://api.yourdomain.com',
+     cdnUrl: 'https://cdn.yourdomain.com',
+     channel: 'pc',
+     payment: {
+       wechat: false,
+       alipay: true,
+       balance: true,
+       offline: true
+     },
+     responsive: {
+       minWidth: 1024, // 最小宽度
+       maxWidth: 1920  // 最大宽度
+     }
+   };
+   ```
+
+2. **登录授权**
+   ```javascript
+   // QQ登录
+   function loginWithQQ() {
+     QC.Login.showPopup({
+       appId: 'your_app_id',
+       redirectURI: 'https://www.yourdomain.com/callback'
+     });
+   }
+   
+   // 微信登录
+   function loginWithWechat() {
+     const redirectUri = encodeURIComponent(window.location.href);
+     const authUrl = `https://open.weixin.qq.com/connect/qrconnect?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect`;
+     
+     window.open(authUrl, '_blank', 'width=400,height=600');
+   }
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 支付宝支付
+   function payWithAlipay(orderInfo) {
+     const form = document.createElement('form');
+     form.method = 'POST';
+     form.action = 'https://openapi.alipay.com/gateway.do';
+     
+     Object.keys(orderInfo).forEach(key => {
+       const input = document.createElement('input');
+       input.type = 'hidden';
+       input.name = key;
+       input.value = orderInfo[key];
+       form.appendChild(input);
+     });
+     
+     document.body.appendChild(form);
+     form.submit();
+   }
+   ```
+
+## 测试验证
+
+### 1. 开发环境测试
+- 使用Chrome开发者工具
+- 测试不同分辨率适配
+- 测试支付功能
+
+### 2. 浏览器兼容性测试
+- 测试Chrome、Firefox、Safari等浏览器
+- 测试IE11等旧版浏览器
+- 验证功能完整性
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://api.yourdomain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"授权code","channel":"pc"}'
+
+# 测试支付接口
+curl -X POST "https://api.yourdomain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"pc","payment_type":"alipay"}'
+```
+
+## 注意事项
+
+1. **响应式设计**
+   - 适配不同屏幕分辨率
+   - 考虑最小支持宽度
+   - 优化大屏幕显示效果
+
+2. **性能优化**
+   - 压缩静态资源
+   - 使用CDN加速
+   - 启用浏览器缓存
+
+3. **SEO优化**
+   - 设置合适的meta标签
+   - 优化页面标题和描述
+   - 使用语义化HTML
+
+4. **安全配置**
+   - 使用HTTPS
+   - 配置CSP策略
+   - 防止XSS攻击
+
+5. **浏览器兼容性**
+   - 考虑IE11等旧版浏览器
+   - 使用polyfill支持新特性
+   - 提供降级方案
+
+## 常见问题
+
+### Q1: 如何处理IE浏览器兼容性?
+A: 使用polyfill、避免使用ES6+语法、提供降级方案。
+
+### Q2: 为什么不支持微信支付?
+A: PC端微信支付需要扫码,用户体验不如支付宝,建议使用支付宝支付。
+
+### Q3: 如何优化PC端加载速度?
+A: 使用CDN、压缩资源、优化图片、启用Gzip压缩。
+
+### Q4: 如何实现响应式设计?
+A: 使用CSS媒体查询、弹性布局、相对单位等技术。
+
+## 相关链接
+
+- [支付宝即时到账文档](https://opendocs.alipay.com/open/62/104743)
+- [QQ互联文档](https://wiki.connect.qq.com/)
+- [微信开放平台文档](https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html)
+- [MDN Web文档](https://developer.mozilla.org/zh-CN/)
+- [Can I Use](https://caniuse.com/) 

+ 169 - 0
docs/channel/platform_menu.md

@@ -0,0 +1,169 @@
+# 平台配置菜单配置说明
+
+## 功能简介
+
+本功能提供了微信小程序和抖音小程序平台配置的管理界面,包括:
+- 平台基本信息配置(AppID、密钥等)
+- 登录方式配置(自动登录、绑定手机号)
+- 支付方式配置
+- 配置状态管理
+
+## 菜单配置
+
+### 1. 添加主菜单
+
+在FastAdmin后台菜单管理中添加以下菜单项:
+
+```sql
+-- 主菜单
+INSERT INTO `fa_auth_rule` (`name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+('platform', '平台配置', 'file', 'normal', '', '多平台配置管理', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 100);
+
+-- 平台配置列表
+INSERT INTO `fa_auth_rule` (`name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+('platform/index', '平台列表', 'file', 'normal', '', '查看平台配置列表', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 99);
+
+-- 微信小程序配置
+INSERT INTO `fa_auth_rule` (`name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+('platform/wechat_mini_program', '微信小程序', 'file', 'normal', '', '微信小程序配置', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 98);
+
+-- 抖音小程序配置
+INSERT INTO `fa_auth_rule` (`name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+('platform/douyin_mini_program', '抖音小程序', 'file', 'normal', '', '抖音小程序配置', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 97);
+```
+
+### 2. 设置菜单父子关系
+
+需要将子菜单的`pid`字段设置为主菜单的`id`值:
+
+```sql
+-- 获取主菜单ID
+SELECT id FROM `fa_auth_rule` WHERE name = 'platform';
+
+-- 假设主菜单ID为123,更新子菜单的pid
+UPDATE `fa_auth_rule` SET `pid` = 123 WHERE `name` IN ('platform/index', 'platform/wechat_mini_program', 'platform/douyin_mini_program');
+```
+
+### 3. 为管理员分配权限
+
+```sql
+-- 为超级管理员分配权限(假设管理员组ID为1)
+INSERT INTO `fa_auth_group_access` (`uid`, `group_id`) VALUES (1, 1);
+```
+
+## 配置数据初始化
+
+### 1. 执行SQL初始化配置项
+
+运行 `install_platform_config.sql` 文件来初始化配置数据:
+
+```bash
+mysql -u username -p database_name < install_platform_config.sql
+```
+
+### 2. 或者使用控制器初始化
+
+访问后台URL:`/admin/platform/init_config`,通过界面初始化配置数据。
+
+## 使用说明
+
+### 1. 访问平台配置
+
+登录FastAdmin后台,在左侧菜单找到"平台配置":
+- 点击"平台列表"查看所有平台配置
+- 点击"微信小程序"配置微信小程序
+- 点击"抖音小程序"配置抖音小程序
+
+### 2. 配置微信小程序
+
+1. 在微信公众平台注册小程序账号
+2. 获取小程序的AppID和AppSecret
+3. 在后台填写配置信息:
+   - 小程序AppID:必填
+   - 小程序密钥:必填
+   - 开启状态:是否启用小程序功能
+   - 微信自动登录:是否自动授权登录
+   - 绑定手机号:是否强制绑定手机号
+
+### 3. 配置抖音小程序
+
+1. 在抖音开发者平台注册小程序账号
+2. 获取小程序的AppID和AppSecret
+3. 在后台填写配置信息(同微信小程序)
+
+## 接口使用
+
+### 1. 获取平台配置
+
+```php
+use app\common\model\Config;
+
+// 获取微信小程序配置
+$wechatConfig = Config::getConfigByGroup('shop.platform.WechatMiniProgram');
+
+// 获取抖音小程序配置
+$douyinConfig = Config::getConfigByGroup('shop.platform.DouyinMiniProgram');
+```
+
+### 2. 判断平台状态
+
+```php
+use app\common\model\Config;
+
+// 判断微信小程序是否开启
+$wechatStatus = Config::getConfigValue('shop.platform.WechatMiniProgram.status');
+if ($wechatStatus) {
+    // 微信小程序已开启
+}
+
+// 判断抖音小程序是否开启
+$douyinStatus = Config::getConfigValue('shop.platform.DouyinMiniProgram.status');
+if ($douyinStatus) {
+    // 抖音小程序已开启
+}
+```
+
+### 3. 获取登录配置
+
+```php
+use app\common\model\Config;
+
+// 获取微信小程序登录配置
+$autoLogin = Config::getConfigValue('shop.platform.WechatMiniProgram.auto_login');
+$bindMobile = Config::getConfigValue('shop.platform.WechatMiniProgram.bind_mobile');
+
+if ($autoLogin) {
+    // 启用自动登录
+}
+
+if ($bindMobile) {
+    // 需要绑定手机号
+}
+```
+
+## 注意事项
+
+1. **安全性**:AppSecret等敏感信息应妥善保管,避免泄露
+2. **缓存**:配置修改后会自动清除缓存,确保配置及时生效
+3. **验证**:AppID和AppSecret必须从官方平台获取,确保准确性
+4. **测试**:配置完成后建议进行接口调用测试
+5. **权限**:只有具有相应权限的管理员才能访问配置页面
+
+## 扩展说明
+
+如需添加更多平台(如支付宝小程序、QQ小程序等),可以:
+
+1. 在控制器中添加对应的方法
+2. 在`getPlatformConfigData`方法中添加对应的配置数据
+3. 创建对应的视图模板
+4. 在菜单中添加对应的菜单项
+
+例如添加支付宝小程序:
+
+```php
+public function alipay_mini_program()
+{
+    $group = 'shop.platform.AlipayMiniProgram';
+    return $this->platformConfig($group, '支付宝小程序配置');
+}
+``` 

+ 258 - 0
docs/channel/qq_mini_program.md

@@ -0,0 +1,258 @@
+# QQ小程序渠道配置
+
+## 概述
+
+QQ小程序是腾讯QQ生态中的重要应用形态,依托QQ庞大的用户基础,为开发者提供了便捷的开发平台。本文档描述了QQ小程序渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `qq_mini_program`
+- **渠道名称**: QQ小程序
+- **渠道类型**: 小程序
+- **所属分组**: 小程序 (mini_program)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'qq_mini_program',
+'name' => 'QQ小程序',
+'status' => true, // 开启/关闭
+'description' => 'QQ小程序平台接入'
+```
+
+### 2. QQ平台配置
+
+#### 必填参数
+- **AppId**: 小程序应用ID
+- **AppSecret**: 小程序应用密钥
+
+#### 配置示例
+```php
+'qq_config' => [
+    'appid' => 'qqapp1234567890',
+    'secret' => 'abcdef1234567890abcdef1234567890',
+    'token' => '', // 消息推送Token(可选)
+    'aes_key' => '', // 消息加解密Key(可选)
+]
+```
+
+#### 获取方式
+1. 登录QQ小程序开发者平台 (q.qq.com)
+2. 创建小程序应用
+3. 在「开发管理」-「开发设置」中获取
+4. 在「开发管理」-「服务器域名」中配置
+
+### 3. 支付配置
+
+QQ小程序支持以下支付方式:
+
+#### 3.1 余额支付 ✅ (唯一支持)
+- **状态**: 开启
+- **优先级**: 1
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 10000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.2 不支持的支付方式 ❌
+- 微信支付
+- 支付宝支付
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => true,
+    'auto_register' => true,
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 仅支持余额支付 |
+| 分享功能 | ✅ | 支持分享到QQ好友、QQ空间 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ✅ | 支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持模板消息推送 |
+
+## 配置流程
+
+### 1. QQ小程序开发者平台配置
+
+1. **注册开发者账号**
+   - 访问 https://q.qq.com
+   - 注册开发者账号
+   - 完成实名认证
+
+2. **创建小程序**
+   - 在开发者平台创建小程序
+   - 填写小程序基本信息
+   - 完成小程序认证
+
+3. **获取开发信息**
+   - 在「开发管理」-「开发设置」中获取AppID
+   - 生成AppSecret
+
+4. **配置服务器域名**
+   - 在「开发管理」-「服务器域名」中配置
+   - request合法域名:`https://your-domain.com`
+   - upload合法域名:`https://your-domain.com`
+   - download合法域名:`https://your-domain.com`
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: QQ小程序
+   渠道描述: QQ小程序平台
+   ```
+
+2. **平台参数配置**
+   ```
+   AppId: qqapp1234567890
+   AppSecret: abcdef1234567890abcdef1234567890
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 关闭
+   支付宝支付: 关闭
+   余额支付: 开启
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 开启
+   绑定手机号: 开启
+   ```
+
+### 3. 开发配置
+
+1. **小程序代码配置**
+   ```javascript
+   // app.js
+   App({
+     globalData: {
+       apiUrl: 'https://your-domain.com/api',
+       appId: 'qqapp1234567890'
+     }
+   })
+   ```
+
+2. **登录授权**
+   ```javascript
+   // 获取用户信息
+   qq.login({
+     success: (res) => {
+       if (res.code) {
+         // 发送 code 到服务器
+       }
+     }
+   })
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 余额支付(需要跳转到H5页面)
+   qq.navigateTo({
+     url: '/pages/payment/payment?orderId=' + orderId
+   })
+   ```
+
+## 测试验证
+
+### 1. 开发者工具测试
+- 使用QQ小程序开发者工具
+- 测试登录授权流程
+- 测试基本功能
+
+### 2. 真机测试
+- 在QQ中打开测试小程序
+- 测试完整业务流程
+- 验证支付功能
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"QQ登录code","channel":"qq_mini_program"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"qq_mini_program","payment_type":"balance"}'
+```
+
+## 注意事项
+
+1. **域名配置**
+   - 必须使用HTTPS协议
+   - 域名需要备案
+   - 需要在QQ小程序平台配置合法域名
+
+2. **支付限制**
+   - QQ小程序不支持第三方支付
+   - 只能使用余额支付
+   - 需要引导用户先充值
+
+3. **用户授权**
+   - 获取用户信息需要用户主动授权
+   - 不能强制用户授权
+   - 需要做好授权失败的处理
+
+4. **版本发布**
+   - 开发完成后需要提交审核
+   - 审核通过后才能发布
+   - 建议先发布体验版测试
+
+## 常见问题
+
+### Q1: AppId和AppSecret在哪里获取?
+A: 在QQ小程序开发者平台的「开发管理」-「开发设置」中获取。
+
+### Q2: 为什么不支持微信支付和支付宝支付?
+A: QQ小程序平台限制,不支持第三方支付,只能使用余额支付。
+
+### Q3: 如何处理支付功能?
+A: 引导用户先充值到账户余额,然后使用余额支付。
+
+### Q4: 登录授权失败怎么办?
+A: 检查域名配置、AppId配置,确保小程序已发布或设置为体验版。
+
+## 相关链接
+
+- [QQ小程序开发文档](https://q.qq.com/wiki/)
+- [QQ小程序开发者平台](https://q.qq.com/)
+- [QQ小程序开发者工具](https://q.qq.com/wiki/develop/game/) 

+ 291 - 0
docs/channel/wechat_official_account.md

@@ -0,0 +1,291 @@
+# 微信公众号渠道配置
+
+## 概述
+
+微信公众号是微信生态中的重要营销工具,支持图文消息、自定义菜单、消息推送等功能。本文档描述了微信公众号渠道的完整配置流程。
+
+## 基本信息
+
+- **渠道标识**: `wechat_official_account`
+- **渠道名称**: 微信公众号
+- **渠道类型**: 公众号
+- **所属分组**: 微信生态 (wechat)
+
+## 配置要素
+
+### 1. 基本配置
+
+```php
+// 渠道基本信息
+'channel' => 'wechat_official_account',
+'name' => '微信公众号',
+'status' => true, // 开启/关闭
+'description' => '微信公众号平台接入'
+```
+
+### 2. 微信平台配置
+
+#### 必填参数
+- **AppId**: 公众号应用ID
+- **AppSecret**: 公众号应用密钥
+- **Token**: 消息推送Token
+- **EncodingAESKey**: 消息加解密密钥(可选)
+
+#### 配置示例
+```php
+'wechat_config' => [
+    'appid' => 'wxf8b4f85f3a794e54',
+    'secret' => 'b1d6e8f9a4c2d3e5f7g8h9i0j1k2l3m4',
+    'token' => 'your_token_here',
+    'aes_key' => 'your_aes_key_here', // 消息加解密Key(可选)
+]
+```
+
+#### 获取方式
+1. 登录微信公众平台 (mp.weixin.qq.com)
+2. 选择公众号类型
+3. 在「开发」-「基本配置」中获取
+4. 在「开发」-「基本配置」中设置服务器配置
+
+### 3. 支付配置
+
+微信公众号支持以下支付方式:
+
+#### 3.1 微信支付 ✅ (推荐)
+- **状态**: 开启
+- **优先级**: 1
+- **配置要求**: 
+  - 需要开通微信支付商户号
+  - 配置支付授权目录
+  - 设置支付证书
+
+```php
+'payment_config' => [
+    'wechat' => [
+        'enabled' => true,
+        'mch_id' => '商户号',
+        'key' => '商户密钥',
+        'cert_path' => '证书路径',
+        'key_path' => '密钥路径',
+        'notify_url' => '支付回调地址'
+    ]
+]
+```
+
+#### 3.2 余额支付 ✅
+- **状态**: 开启
+- **优先级**: 2
+- **说明**: 用户使用账户余额进行支付
+
+```php
+'payment_config' => [
+    'balance' => [
+        'enabled' => true,
+        'min_amount' => 0.01, // 最小支付金额
+        'max_amount' => 50000, // 最大支付金额
+    ]
+]
+```
+
+#### 3.3 不支持的支付方式 ❌
+- 支付宝支付
+- 线下支付
+- 货到付款
+
+### 4. 登录配置
+
+#### 4.1 自动登录
+- **状态**: 开启/关闭
+- **说明**: 进入应用后,用户将会自动授权登录,未注册用户将会自动注册
+
+```php
+'login_config' => [
+    'auto_login' => true,
+    'auto_register' => true,
+    'scope' => 'snsapi_userinfo', // 授权作用域
+]
+```
+
+#### 4.2 绑定手机号
+- **状态**: 开启/关闭
+- **说明**: 授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号
+
+```php
+'login_config' => [
+    'force_mobile' => true,
+    'mobile_verify' => true, // 手机号验证
+]
+```
+
+### 5. 功能特性
+
+| 功能 | 支持状态 | 说明 |
+|------|---------|------|
+| 支付功能 | ✅ | 支持微信支付、余额支付 |
+| 分享功能 | ✅ | 支持分享到微信好友、朋友圈 |
+| 定位功能 | ✅ | 支持获取用户地理位置 |
+| 拍照功能 | ❌ | 不支持调用摄像头拍照 |
+| 推送功能 | ✅ | 支持模板消息推送 |
+
+## 配置流程
+
+### 1. 微信公众平台配置
+
+1. **注册公众号**
+   - 访问 https://mp.weixin.qq.com
+   - 注册公众号账号
+   - 完成主体认证
+
+2. **获取开发信息**
+   - 在「开发」-「基本配置」中获取AppID
+   - 生成AppSecret
+
+3. **配置服务器**
+   - 在「开发」-「基本配置」中配置
+   - 服务器地址:`https://your-domain.com/api/wechat/serve`
+   - Token:自定义设置
+   - 消息加解密方式:推荐选择安全模式
+
+4. **配置网页授权域名**
+   - 在「设置」-「公众号设置」-「功能设置」中配置
+   - 网页授权域名:`your-domain.com`
+
+5. **配置JS接口安全域名**
+   - 在「设置」-「公众号设置」-「功能设置」中配置
+   - JS接口安全域名:`your-domain.com`
+
+### 2. 系统后台配置
+
+1. **基本信息配置**
+   ```
+   渠道状态: 开启
+   渠道名称: 微信公众号
+   渠道描述: 微信公众号平台
+   ```
+
+2. **平台参数配置**
+   ```
+   AppId: wxf8b4f85f3a794e54
+   AppSecret: b1d6e8f9a4c2d3e5f7g8h9i0j1k2l3m4
+   Token: your_token_here
+   ```
+
+3. **支付方式配置**
+   ```
+   微信支付: 开启
+   余额支付: 开启
+   支付宝支付: 关闭
+   货到付款: 关闭
+   ```
+
+4. **登录方式配置**
+   ```
+   自动登录: 开启
+   绑定手机号: 开启
+   ```
+
+### 3. 开发配置
+
+1. **网页授权登录**
+   ```javascript
+   // 获取授权链接
+   const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
+   
+   // 跳转授权
+   window.location.href = authUrl;
+   ```
+
+2. **JSSDK配置**
+   ```javascript
+   // 配置JSSDK
+   wx.config({
+     debug: false,
+     appId: 'wxf8b4f85f3a794e54',
+     timestamp: timestamp,
+     nonceStr: nonceStr,
+     signature: signature,
+     jsApiList: ['chooseWXPay', 'getLocation', 'chooseImage']
+   });
+   ```
+
+3. **支付调用**
+   ```javascript
+   // 微信支付
+   wx.chooseWXPay({
+     timestamp: timestamp,
+     nonceStr: nonceStr,
+     package: package,
+     signType: 'MD5',
+     paySign: paySign,
+     success: function(res) {
+       // 支付成功
+     }
+   });
+   ```
+
+## 测试验证
+
+### 1. 开发者工具测试
+- 使用微信开发者工具
+- 测试网页授权流程
+- 测试JSSDK功能
+
+### 2. 真机测试
+- 在微信中打开测试页面
+- 测试完整业务流程
+- 验证支付功能
+
+### 3. 接口测试
+```bash
+# 测试登录接口
+curl -X POST "https://your-domain.com/api/login" \
+  -H "Content-Type: application/json" \
+  -d '{"code":"微信授权code","channel":"wechat_official_account"}'
+
+# 测试支付接口
+curl -X POST "https://your-domain.com/api/payment/create" \
+  -H "Content-Type: application/json" \
+  -d '{"amount":100,"channel":"wechat_official_account","payment_type":"wechat"}'
+```
+
+## 注意事项
+
+1. **域名配置**
+   - 必须使用HTTPS协议
+   - 域名需要备案
+   - 需要在微信公众平台配置相关域名
+
+2. **支付配置**
+   - 需要开通微信支付
+   - 配置支付授权目录
+   - 测试环境和生产环境分别配置
+
+3. **用户授权**
+   - 网页授权需要用户同意
+   - 不同作用域获取的用户信息不同
+   - 需要做好授权失败的处理
+
+4. **服务器配置**
+   - 需要正确响应微信服务器的验证请求
+   - 需要处理微信推送的各种消息和事件
+
+## 常见问题
+
+### Q1: Token验证失败怎么办?
+A: 检查Token配置是否正确,确保服务器能正确响应微信的验证请求。
+
+### Q2: 网页授权失败怎么办?
+A: 检查网页授权域名配置,确保域名已正确配置且使用HTTPS。
+
+### Q3: 支付功能如何测试?
+A: 需要在真机微信中测试,确保支付授权目录配置正确。
+
+### Q4: 如何处理用户取消授权?
+A: 需要引导用户重新授权,或提供其他登录方式。
+
+## 相关链接
+
+- [微信公众平台开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)
+- [微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php)
+- [微信公众平台](https://mp.weixin.qq.com/)
+- [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html) 

+ 47 - 0
docs/install_platform_config.sql

@@ -0,0 +1,47 @@
+-- 微信小程序和抖音小程序配置数据插入语句
+
+-- 微信小程序平台配置组
+INSERT INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform', 'shop', '平台配置', '平台配置管理', 'group', '', '', '', '', '', ''),
+
+-- 微信小程序配置组
+('shop.platform.WechatMiniProgram', 'shop.platform', '微信小程序', '微信小程序平台配置', 'group', '', '', '', '', '', ''),
+
+-- 小程序基本信息
+('shop.platform.WechatMiniProgram.app_id', 'shop.platform.WechatMiniProgram', '小程序AppId', 'AppID是小程序开发标识码,配合AppSecret可调用小程序的接口能力', 'string', '', '', '', 'required', '', ''),
+('shop.platform.WechatMiniProgram.secret', 'shop.platform.WechatMiniProgram', '小程序密钥', 'AppSecret是校验小程序开发者身份的密钥,具有极高的安全性', 'string', '', '', '', 'required', '', ''),
+('shop.platform.WechatMiniProgram.status', 'shop.platform.WechatMiniProgram', '小程序开启状态', '是否开启微信小程序功能', 'boolean', '', '0', '', '', '', ''),
+
+-- 登录配置
+('shop.platform.WechatMiniProgram.auto_login', 'shop.platform.WechatMiniProgram', '微信自动登录', '进入应用后,用户将会自动授权登录,未注册用户将会自动注册', 'boolean', '', '1', '', '', '', ''),
+('shop.platform.WechatMiniProgram.bind_mobile', 'shop.platform.WechatMiniProgram', '绑定手机号', '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号', 'boolean', '', '1', '', '', '', ''),
+
+-- 支付配置组
+('shop.platform.WechatMiniProgram.payment', 'shop.platform.WechatMiniProgram', '支付配置', '小程序支付方式配置', 'group', '', '', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.wechat', 'shop.platform.WechatMiniProgram.payment', '微信支付配置', '微信支付相关配置', 'int', '', '1', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.alipay', 'shop.platform.WechatMiniProgram.payment', '支付宝支付配置', '支付宝支付相关配置', 'int', '', '0', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.methods', 'shop.platform.WechatMiniProgram.payment', '支付方式', '可用的支付方式列表', 'array', '', '["wechat","balance"]', '', '', '', ''),
+
+-- 分享配置
+('shop.platform.WechatMiniProgram.share', 'shop.platform.WechatMiniProgram', '分享信息', '小程序分享配置信息', 'array', '', '[]', '', '', '', ''),
+
+-- 抖音小程序配置组  
+('shop.platform.DouyinMiniProgram', 'shop.platform', '抖音小程序', '抖音小程序平台配置', 'group', '', '', '', '', '', ''),
+
+-- 抖音小程序基本信息
+('shop.platform.DouyinMiniProgram.app_id', 'shop.platform.DouyinMiniProgram', '抖音小程序AppId', '抖音小程序应用ID', 'string', '', '', '', 'required', '', ''),
+('shop.platform.DouyinMiniProgram.secret', 'shop.platform.DouyinMiniProgram', '抖音小程序密钥', '抖音小程序应用密钥', 'string', '', '', '', 'required', '', ''),
+('shop.platform.DouyinMiniProgram.status', 'shop.platform.DouyinMiniProgram', '抖音小程序开启状态', '是否开启抖音小程序功能', 'boolean', '', '0', '', '', '', ''),
+
+-- 登录配置
+('shop.platform.DouyinMiniProgram.auto_login', 'shop.platform.DouyinMiniProgram', '自动登录', '进入应用后,用户将会自动授权登录,未注册用户将会自动注册', 'boolean', '', '1', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.bind_mobile', 'shop.platform.DouyinMiniProgram', '绑定手机号', '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号', 'boolean', '', '1', '', '', '', ''),
+
+-- 支付配置组
+('shop.platform.DouyinMiniProgram.payment', 'shop.platform.DouyinMiniProgram', '支付配置', '抖音小程序支付方式配置', 'group', '', '', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.wechat', 'shop.platform.DouyinMiniProgram.payment', '微信支付配置', '微信支付相关配置', 'int', '', '0', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.alipay', 'shop.platform.DouyinMiniProgram.payment', '支付宝支付配置', '支付宝支付相关配置', 'int', '', '1', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.methods', 'shop.platform.DouyinMiniProgram.payment', '支付方式', '可用的支付方式列表', 'array', '', '["alipay","balance"]', '', '', '', ''),
+
+-- 分享配置
+('shop.platform.DouyinMiniProgram.share', 'shop.platform.DouyinMiniProgram', '分享信息', '抖音小程序分享配置信息', 'array', '', '[]', '', '', '', ''); 

+ 276 - 0
docs/platform_menu.md

@@ -0,0 +1,276 @@
+# 平台配置菜单配置说明
+
+## 功能概述
+
+平台配置功能提供了微信小程序和抖音小程序的统一配置管理界面,支持:
+- 平台基本信息配置(AppID、密钥等)
+- 登录方式配置(自动登录、绑定手机号)
+- 支付方式配置
+- 配置状态管理和缓存机制
+
+## 菜单配置
+
+### 1. 添加主菜单
+
+在FastAdmin后台的"权限管理"→"菜单规则"中添加以下菜单项:
+
+#### 主菜单
+```
+菜单名称:平台配置
+节点:platform
+图标:fa fa-cogs
+类型:目录
+状态:正常
+备注:多平台配置管理
+```
+
+#### 平台列表子菜单
+```
+菜单名称:平台列表
+节点:platform/index
+图标:fa fa-list
+类型:文件
+状态:正常
+备注:查看平台配置列表
+父级:platform
+```
+
+#### 微信小程序配置子菜单
+```
+菜单名称:微信小程序
+节点:platform/wechat_mini_program
+图标:fa fa-wechat
+类型:文件
+状态:正常
+备注:微信小程序配置
+父级:platform
+```
+
+#### 抖音小程序配置子菜单
+```
+菜单名称:抖音小程序
+节点:platform/douyin_mini_program
+图标:fa fa-music
+类型:文件
+状态:正常
+备注:抖音小程序配置
+父级:platform
+```
+
+### 2. SQL快速添加菜单
+
+也可以直接执行以下SQL语句快速添加菜单:
+
+```sql
+-- 添加主菜单
+INSERT INTO `fa_auth_rule` (`name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+('platform', '平台配置', 'file', 'normal', '', '多平台配置管理', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 100);
+
+-- 获取主菜单ID
+SET @parent_id = LAST_INSERT_ID();
+
+-- 添加子菜单
+INSERT INTO `fa_auth_rule` (`pid`, `name`, `title`, `type`, `status`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`) VALUES
+(@parent_id, 'platform/index', '平台列表', 'file', 'normal', '', '查看平台配置列表', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 99),
+(@parent_id, 'platform/wechat_mini_program', '微信小程序', 'file', 'normal', '', '微信小程序配置', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 98),
+(@parent_id, 'platform/douyin_mini_program', '抖音小程序', 'file', 'normal', '', '抖音小程序配置', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 97);
+
+-- 为超级管理员组添加权限(假设组ID为1)
+INSERT INTO `fa_auth_group_access` (`uid`, `group_id`) 
+SELECT 1, 1 FROM DUAL WHERE NOT EXISTS (
+    SELECT 1 FROM `fa_auth_group_access` WHERE `uid` = 1 AND `group_id` = 1
+);
+```
+
+## 权限配置
+
+### 1. 角色权限分配
+
+在"权限管理"→"角色组"中为需要的角色分配平台配置权限:
+
+1. 选择角色组(如管理员)
+2. 在权限树中勾选"平台配置"及其子菜单
+3. 保存权限设置
+
+### 2. 用户权限分配
+
+在"权限管理"→"管理员"中为具体用户分配权限:
+
+1. 编辑用户信息
+2. 选择对应的角色组
+3. 或直接分配特定权限节点
+
+## 配置数据初始化
+
+### 1. 执行SQL初始化
+
+运行项目根目录下的 `install_platform_config.sql` 文件:
+
+```bash
+# 方法一:命令行导入
+mysql -u 用户名 -p 数据库名 < install_platform_config.sql
+
+# 方法二:phpMyAdmin导入
+# 登录phpMyAdmin → 选择数据库 → 导入 → 选择文件 → 执行
+
+# 方法三:Navicat等工具
+# 连接数据库 → 运行SQL文件
+```
+
+### 2. 验证数据导入
+
+检查 `fa_config` 表中是否成功导入平台配置数据:
+
+```sql
+-- 检查配置项数量
+SELECT COUNT(*) FROM fa_config WHERE name LIKE 'shop.platform%';
+
+-- 查看微信小程序配置
+SELECT * FROM fa_config WHERE name LIKE 'shop.platform.WechatMiniProgram%';
+
+-- 查看抖音小程序配置
+SELECT * FROM fa_config WHERE name LIKE 'shop.platform.DouyinMiniProgram%';
+```
+
+## 使用流程
+
+### 1. 后台配置操作
+
+1. **登录后台**:使用管理员账号登录FastAdmin后台
+2. **访问菜单**:在左侧菜单找到"平台配置"
+3. **选择平台**:点击"微信小程序"或"抖音小程序"
+4. **填写配置**:
+   - 必填项:AppID、密钥
+   - 可选项:开启状态、登录配置
+5. **保存配置**:点击"保存配置"按钮
+
+### 2. 微信小程序配置步骤
+
+1. **获取AppID和密钥**:
+   - 登录微信公众平台小程序后台
+   - 进入"开发"→"开发设置"
+   - 复制AppID和AppSecret
+
+2. **填写配置信息**:
+   - 小程序AppID:粘贴从微信后台获取的AppID
+   - 小程序密钥:粘贴从微信后台获取的AppSecret
+   - 开启状态:选择"开启"
+   - 微信自动登录:根据需要选择
+   - 绑定手机号:根据需要选择
+
+### 3. 抖音小程序配置步骤
+
+1. **获取AppID和密钥**:
+   - 登录抖音小程序开发者平台
+   - 进入"开发管理"→"应用信息"
+   - 复制AppID和AppSecret
+
+2. **填写配置信息**:
+   - 小程序AppID:粘贴从抖音后台获取的AppID
+   - 小程序密钥:粘贴从抖音后台获取的AppSecret
+   - 开启状态:选择"开启"
+   - 自动登录:根据需要选择
+   - 绑定手机号:根据需要选择
+
+## 代码调用示例
+
+### 1. 获取配置信息
+
+```php
+use app\common\model\Config;
+
+// 获取微信小程序配置
+$wechatConfig = Config::getConfigByGroup('shop.platform.WechatMiniProgram');
+$wechatAppId = $wechatConfig['app_id'] ?? '';
+$wechatSecret = $wechatConfig['secret'] ?? '';
+
+// 获取抖音小程序配置
+$douyinConfig = Config::getConfigByGroup('shop.platform.DouyinMiniProgram');
+$douyinAppId = $douyinConfig['app_id'] ?? '';
+$douyinSecret = $douyinConfig['secret'] ?? '';
+
+// 判断平台是否开启
+$wechatEnabled = Config::getConfigValue('shop.platform.WechatMiniProgram.status');
+$douyinEnabled = Config::getConfigValue('shop.platform.DouyinMiniProgram.status');
+```
+
+### 2. 根据渠道获取配置
+
+```php
+/**
+ * 根据渠道获取平台配置
+ * @param string $channel 渠道标识
+ * @return array
+ */
+function getPlatformConfig($channel) {
+    $platformMap = [
+        'wechat_mini_program' => 'shop.platform.WechatMiniProgram',
+        'douyin_mini_program' => 'shop.platform.DouyinMiniProgram',
+    ];
+    
+    if (!isset($platformMap[$channel])) {
+        return [];
+    }
+    
+    return Config::getConfigByGroup($platformMap[$channel]);
+}
+
+// 使用示例
+$config = getPlatformConfig('wechat_mini_program');
+if ($config && $config['status']) {
+    // 微信小程序已开启,执行相关逻辑
+    $appId = $config['app_id'];
+    $secret = $config['secret'];
+}
+```
+
+## 注意事项
+
+### 1. 安全性
+- **密钥保护**:AppSecret等敏感信息需要严格保护,避免泄露
+- **权限控制**:严格控制平台配置的访问和修改权限
+- **HTTPS传输**:确保配置数据在传输过程中的安全
+
+### 2. 配置管理
+- **备份配置**:定期备份配置数据,防止数据丢失
+- **环境区分**:开发、测试、生产环境使用不同的配置
+- **版本控制**:配置变更时做好记录和版本管理
+
+### 3. 缓存处理
+- **自动清除**:配置修改后系统会自动清除相关缓存
+- **手动清除**:如需手动清除,可调用 `Config::clearConfigCache()`
+- **缓存时间**:默认缓存时间为1小时,可根据需要调整
+
+### 4. 故障排查
+- **配置检查**:确认配置项已正确导入数据库
+- **权限检查**:确认用户有访问配置的权限
+- **日志查看**:查看系统日志定位问题
+- **缓存清理**:尝试清除缓存解决配置不生效问题
+
+## 扩展开发
+
+### 1. 添加新平台
+
+如需添加其他平台(如支付宝小程序、QQ小程序等):
+
+1. **扩展控制器**:在Platform控制器中添加新方法
+2. **添加配置数据**:在SQL文件中添加新平台的配置项
+3. **创建菜单**:在后台添加新平台的菜单项
+4. **更新视图**:根据需要调整视图模板
+
+### 2. 自定义配置项
+
+在现有平台基础上添加新的配置项:
+
+1. **数据库添加**:在fa_config表中添加新的配置项
+2. **控制器处理**:在getPlatformConfigData方法中添加配置定义
+3. **视图展示**:在config.html模板中添加表单项
+4. **验证规则**:添加相应的验证规则
+
+## 技术支持
+
+如遇到问题,可以通过以下方式获取帮助:
+- 查看FastAdmin官方文档
+- 查看ThinkPHP框架文档
+- 查看微信小程序开发文档
+- 查看抖音小程序开发文档 

+ 57 - 0
install_platform_config.sql

@@ -0,0 +1,57 @@
+-- 微信小程序和抖音小程序配置数据插入语句
+
+-- 先检查是否存在平台配置根节点,不存在则插入
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform', 'shop', '平台配置', '平台配置管理', 'group', '', '', '', '', '', '');
+
+-- 微信小程序配置组
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.WechatMiniProgram', 'shop.platform', '微信小程序', '微信小程序平台配置', 'group', '', '', '', '', '', '');
+
+-- 微信小程序基本信息
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.WechatMiniProgram.app_id', 'shop.platform.WechatMiniProgram', '小程序AppId', 'AppID是小程序开发标识码,配合AppSecret可调用小程序的接口能力', 'string', '', '', '', 'required', '', ''),
+('shop.platform.WechatMiniProgram.secret', 'shop.platform.WechatMiniProgram', '小程序密钥', 'AppSecret是校验小程序开发者身份的密钥,具有极高的安全性', 'string', '', '', '', 'required', '', ''),
+('shop.platform.WechatMiniProgram.status', 'shop.platform.WechatMiniProgram', '小程序开启状态', '是否开启微信小程序功能', 'boolean', '', '0', '', '', '', '');
+
+-- 微信小程序登录配置
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.WechatMiniProgram.auto_login', 'shop.platform.WechatMiniProgram', '微信自动登录', '进入应用后,用户将会自动授权登录,未注册用户将会自动注册', 'boolean', '', '1', '', '', '', ''),
+('shop.platform.WechatMiniProgram.bind_mobile', 'shop.platform.WechatMiniProgram', '绑定手机号', '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号', 'boolean', '', '1', '', '', '', '');
+
+-- 微信小程序支付配置组
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.WechatMiniProgram.payment', 'shop.platform.WechatMiniProgram', '支付配置', '小程序支付方式配置', 'group', '', '', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.wechat', 'shop.platform.WechatMiniProgram.payment', '微信支付配置', '微信支付相关配置', 'int', '', '1', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.alipay', 'shop.platform.WechatMiniProgram.payment', '支付宝支付配置', '支付宝支付相关配置', 'int', '', '0', '', '', '', ''),
+('shop.platform.WechatMiniProgram.payment.methods', 'shop.platform.WechatMiniProgram.payment', '支付方式', '可用的支付方式列表', 'array', '', '[\"wechat\",\"balance\"]', '', '', '', '');
+
+-- 微信小程序分享配置
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.WechatMiniProgram.share', 'shop.platform.WechatMiniProgram', '分享信息', '小程序分享配置信息', 'array', '', '[]', '', '', '', '');
+
+-- 抖音小程序配置组  
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.DouyinMiniProgram', 'shop.platform', '抖音小程序', '抖音小程序平台配置', 'group', '', '', '', '', '', '');
+
+-- 抖音小程序基本信息
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.DouyinMiniProgram.app_id', 'shop.platform.DouyinMiniProgram', '抖音小程序AppId', '抖音小程序应用ID', 'string', '', '', '', 'required', '', ''),
+('shop.platform.DouyinMiniProgram.secret', 'shop.platform.DouyinMiniProgram', '抖音小程序密钥', '抖音小程序应用密钥', 'string', '', '', '', 'required', '', ''),
+('shop.platform.DouyinMiniProgram.status', 'shop.platform.DouyinMiniProgram', '抖音小程序开启状态', '是否开启抖音小程序功能', 'boolean', '', '0', '', '', '', '');
+
+-- 抖音小程序登录配置
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.DouyinMiniProgram.auto_login', 'shop.platform.DouyinMiniProgram', '自动登录', '进入应用后,用户将会自动授权登录,未注册用户将会自动注册', 'boolean', '', '1', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.bind_mobile', 'shop.platform.DouyinMiniProgram', '绑定手机号', '授权登录后,未绑定手机号的用户,将会立即提醒绑定手机号', 'boolean', '', '1', '', '', '', '');
+
+-- 抖音小程序支付配置组
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.DouyinMiniProgram.payment', 'shop.platform.DouyinMiniProgram', '支付配置', '抖音小程序支付方式配置', 'group', '', '', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.wechat', 'shop.platform.DouyinMiniProgram.payment', '微信支付配置', '微信支付相关配置', 'int', '', '0', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.alipay', 'shop.platform.DouyinMiniProgram.payment', '支付宝支付配置', '支付宝支付相关配置', 'int', '', '1', '', '', '', ''),
+('shop.platform.DouyinMiniProgram.payment.methods', 'shop.platform.DouyinMiniProgram.payment', '支付方式', '可用的支付方式列表', 'array', '', '[\"alipay\",\"balance\"]', '', '', '', '');
+
+-- 抖音小程序分享配置
+INSERT IGNORE INTO `fa_config` (`name`, `group`, `title`, `tip`, `type`, `visible`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
+('shop.platform.DouyinMiniProgram.share', 'shop.platform.DouyinMiniProgram', '分享信息', '抖音小程序分享配置信息', 'array', '', '[]', '', '', '', '');