Ver código fonte

remove not use module

lushuncheng 4 anos atrás
pai
commit
aca30b68e6
100 arquivos alterados com 478 adições e 7631 exclusões
  1. 0 136
      app/wechat/command/Auto.php
  2. 0 149
      app/wechat/command/Fans.php
  3. 0 135
      app/wechat/controller/Auto.php
  4. 0 145
      app/wechat/controller/Config.php
  5. 0 133
      app/wechat/controller/Fans.php
  6. 0 185
      app/wechat/controller/Keys.php
  7. 0 157
      app/wechat/controller/Menu.php
  8. 0 151
      app/wechat/controller/News.php
  9. 0 91
      app/wechat/controller/api/Js.php
  10. 0 97
      app/wechat/controller/api/Login.php
  11. 0 324
      app/wechat/controller/api/Push.php
  12. 0 242
      app/wechat/controller/api/Test.php
  13. 0 96
      app/wechat/controller/api/View.php
  14. 0 2
      app/wechat/module/change/2020.08.03.00.md
  15. 0 1
      app/wechat/module/change/2020.08.28.01.md
  16. 0 6
      app/wechat/module/module.json
  17. 0 46
      app/wechat/service/AutoService.php
  18. 0 52
      app/wechat/service/FansService.php
  19. 0 83
      app/wechat/service/MediaService.php
  20. 0 279
      app/wechat/service/WechatService.php
  21. 0 18
      app/wechat/sys.php
  22. 0 36
      app/wechat/view/api/login/failed.html
  23. 0 53
      app/wechat/view/api/login/success.html
  24. 0 64
      app/wechat/view/api/test/jssdk.html
  25. 0 55
      app/wechat/view/api/test/oauth.html
  26. 0 28
      app/wechat/view/api/view/image.html
  27. 0 72
      app/wechat/view/api/view/item.html
  28. 0 20
      app/wechat/view/api/view/main.html
  29. 0 78
      app/wechat/view/api/view/music.html
  30. 0 147
      app/wechat/view/api/view/news.html
  31. 0 9
      app/wechat/view/api/view/text.html
  32. 0 44
      app/wechat/view/api/view/video.html
  33. 0 45
      app/wechat/view/api/view/voice.html
  34. 0 266
      app/wechat/view/auto/form.html
  35. 0 86
      app/wechat/view/auto/index.html
  36. 0 54
      app/wechat/view/auto/index_search.html
  37. 0 39
      app/wechat/view/config/options.html
  38. 0 66
      app/wechat/view/config/options_form_api.html
  39. 0 73
      app/wechat/view/config/options_form_thr.html
  40. 0 21
      app/wechat/view/config/options_test.html
  41. 0 102
      app/wechat/view/config/payment.html
  42. 0 40
      app/wechat/view/config/payment_test.html
  43. 0 90
      app/wechat/view/fans/index.html
  44. 0 80
      app/wechat/view/fans/index_search.html
  45. 0 268
      app/wechat/view/keys/form.html
  46. 0 91
      app/wechat/view/keys/index.html
  47. 0 49
      app/wechat/view/keys/index_search.html
  48. 0 204
      app/wechat/view/menu/index.html
  49. 0 209
      app/wechat/view/news/form.html
  50. 0 87
      app/wechat/view/news/formstyle.html
  51. 0 158
      app/wechat/view/news/index.html
  52. 0 146
      app/wechat/view/news/select.html
  53. 1 3
      composer.json
  54. 2 215
      composer.lock
  55. 326 447
      vendor/composer/InstalledVersions.php
  56. 0 505
      vendor/composer/autoload_classmap.php
  57. 0 7
      vendor/composer/autoload_psr4.php
  58. 0 552
      vendor/composer/autoload_static.php
  59. 0 222
      vendor/composer/installed.json
  60. 149 195
      vendor/composer/installed.php
  61. 0 5
      vendor/endroid/qr-code/.gitignore
  62. 0 21
      vendor/endroid/qr-code/.travis.yml
  63. 0 19
      vendor/endroid/qr-code/LICENSE
  64. 0 132
      vendor/endroid/qr-code/README.md
  65. BIN
      vendor/endroid/qr-code/assets/data/qrv10_0.dat
  66. BIN
      vendor/endroid/qr-code/assets/data/qrv10_1.dat
  67. BIN
      vendor/endroid/qr-code/assets/data/qrv10_2.dat
  68. BIN
      vendor/endroid/qr-code/assets/data/qrv10_3.dat
  69. BIN
      vendor/endroid/qr-code/assets/data/qrv11_0.dat
  70. BIN
      vendor/endroid/qr-code/assets/data/qrv11_1.dat
  71. BIN
      vendor/endroid/qr-code/assets/data/qrv11_2.dat
  72. BIN
      vendor/endroid/qr-code/assets/data/qrv11_3.dat
  73. BIN
      vendor/endroid/qr-code/assets/data/qrv12_0.dat
  74. BIN
      vendor/endroid/qr-code/assets/data/qrv12_1.dat
  75. BIN
      vendor/endroid/qr-code/assets/data/qrv12_2.dat
  76. BIN
      vendor/endroid/qr-code/assets/data/qrv12_3.dat
  77. BIN
      vendor/endroid/qr-code/assets/data/qrv13_0.dat
  78. BIN
      vendor/endroid/qr-code/assets/data/qrv13_1.dat
  79. BIN
      vendor/endroid/qr-code/assets/data/qrv13_2.dat
  80. BIN
      vendor/endroid/qr-code/assets/data/qrv13_3.dat
  81. BIN
      vendor/endroid/qr-code/assets/data/qrv14_0.dat
  82. BIN
      vendor/endroid/qr-code/assets/data/qrv14_1.dat
  83. BIN
      vendor/endroid/qr-code/assets/data/qrv14_2.dat
  84. BIN
      vendor/endroid/qr-code/assets/data/qrv14_3.dat
  85. BIN
      vendor/endroid/qr-code/assets/data/qrv15_0.dat
  86. BIN
      vendor/endroid/qr-code/assets/data/qrv15_1.dat
  87. BIN
      vendor/endroid/qr-code/assets/data/qrv15_2.dat
  88. BIN
      vendor/endroid/qr-code/assets/data/qrv15_3.dat
  89. BIN
      vendor/endroid/qr-code/assets/data/qrv16_0.dat
  90. BIN
      vendor/endroid/qr-code/assets/data/qrv16_1.dat
  91. BIN
      vendor/endroid/qr-code/assets/data/qrv16_2.dat
  92. BIN
      vendor/endroid/qr-code/assets/data/qrv16_3.dat
  93. BIN
      vendor/endroid/qr-code/assets/data/qrv17_0.dat
  94. BIN
      vendor/endroid/qr-code/assets/data/qrv17_1.dat
  95. BIN
      vendor/endroid/qr-code/assets/data/qrv17_2.dat
  96. BIN
      vendor/endroid/qr-code/assets/data/qrv17_3.dat
  97. BIN
      vendor/endroid/qr-code/assets/data/qrv18_0.dat
  98. BIN
      vendor/endroid/qr-code/assets/data/qrv18_1.dat
  99. BIN
      vendor/endroid/qr-code/assets/data/qrv18_2.dat
  100. BIN
      vendor/endroid/qr-code/assets/data/qrv18_3.dat

+ 0 - 136
app/wechat/command/Auto.php

@@ -1,136 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\command;
-
-use app\wechat\service\MediaService;
-use app\wechat\service\WechatService;
-use think\admin\Command;
-use think\console\Input;
-use think\console\input\Argument;
-use think\console\Output;
-
-/**
- * 向指定用户推送消息
- * Class Auto
- * @package app\wechat\command
- */
-class Auto extends Command
-{
-    /** @var string */
-    private $openid;
-
-    /**
-     * 配置消息指令
-     */
-    protected function configure()
-    {
-        $this->setName('xadmin:fansmsg');
-        $this->addArgument('openid', Argument::OPTIONAL, 'wechat user openid', '');
-        $this->addArgument('autocode', Argument::OPTIONAL, 'wechat auto message', '');
-        $this->setDescription('Wechat Users Push AutoMessage for ThinkAdmin');
-    }
-
-    /**
-     * @param Input $input
-     * @param Output $output
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    protected function execute(Input $input, Output $output)
-    {
-        $code = $input->getArgument('autocode');
-        $this->openid = $input->getArgument('openid');
-        if (empty($code)) $this->setQueueError("Message Code cannot be empty");
-        if (empty($this->openid)) $this->setQueueError("Wechat Openid cannot be empty");
-
-        // 查询微信消息对象
-        $map = ['code' => $code, 'status' => 1];
-        $data = $this->app->db->name('WechatAuto')->where($map)->find();
-        if (empty($data)) $this->setQueueError("Message Data Query failed");
-
-        // 发送微信客服消息
-        $this->buildMessage($data);
-    }
-
-    /**
-     * 关键字处理
-     * @param array $data
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    private function buildMessage(array $data)
-    {
-        $type = strtolower($data['type']);
-        $result = [0, '待发送的消息不符合规则'];
-        if ($type === 'text' && !empty($data['content'])) {
-            $result = $this->sendMessage('text', ['content' => $data['content']]);
-        }
-        if ($type === 'voice' && !empty($data['voice_url'])) {
-            if ($mediaId = MediaService::instance()->upload($data['voice_url'], 'voice')) {
-                $result = $this->sendMessage('voice', ['media_id' => $mediaId]);
-            }
-        }
-        if ($type === 'image' && !empty($data['image_url'])) {
-            if ($mediaId = MediaService::instance()->upload($data['image_url'], 'image')) {
-                $result = $this->sendMessage('image', ['media_id' => $mediaId]);
-            }
-        }
-        if ($type === 'news') {
-            [$item, $news] = [MediaService::instance()->news($data['news_id']), []];
-            if (isset($item['articles']) && is_array($item['articles'])) {
-                $host = sysconf('base.site_host') ?: true;
-                foreach ($item['articles'] as $vo) if (empty($news)) array_push($news, [
-                    'url'   => url("@wechat/api.view/item/id/{$vo['id']}", [], false, $host)->build(),
-                    'title' => $vo['title'], 'picurl' => $vo['local_url'], 'description' => $vo['digest'],
-                ]);
-                $result = $this->sendMessage('news', ['articles' => $news]);
-            }
-        }
-        if ($type === 'music' && !empty($data['music_url']) && !empty($data['music_title']) && !empty($data['music_desc'])) {
-            $mediaId = $data['music_image'] ? MediaService::instance()->upload($data['music_image'], 'image') : '';
-            $result = $this->sendMessage('music', [
-                'hqmusicurl'  => $data['music_url'], 'musicurl' => $data['music_url'],
-                'description' => $data['music_desc'], 'title' => $data['music_title'], 'thumb_media_id' => $mediaId,
-            ]);
-        }
-        if ($type === 'video' && !empty($data['video_url']) && !empty($data['video_desc']) && !empty($data['video_title'])) {
-            $video = ['title' => $data['video_title'], 'introduction' => $data['video_desc']];
-            if ($mediaId = MediaService::instance()->upload($data['video_url'], 'video', $video)) {
-                $result = $this->sendMessage('video', ['media_id' => $mediaId, 'title' => $data['video_title'], 'description' => $data['video_desc']]);
-            }
-        }
-        if (empty($result[0])) {
-            $this->setQueueError($result[1]);
-        } else {
-            $this->setQueueSuccess($result[1]);
-        }
-    }
-
-    /**
-     * 推送客服消息
-     * @param string $type 消息类型
-     * @param array $data 消息对象
-     * @return array
-     */
-    private function sendMessage(string $type, array $data): array
-    {
-        try {
-            WechatService::WeChatCustom()->send([
-                $type => $data, 'touser' => $this->openid, 'msgtype' => $type,
-            ]);
-            return [1, '向微信用户推送消息成功'];
-        } catch (\Exception $exception) {
-            return [0, $exception->getMessage()];
-        }
-    }
-}

+ 0 - 149
app/wechat/command/Fans.php

@@ -1,149 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\command;
-
-use app\wechat\service\FansService;
-use app\wechat\service\WechatService;
-use think\admin\Command;
-use think\console\Input;
-use think\console\Output;
-
-/**
- * 微信粉丝管理指令
- * Class Fans
- * @package app\wechat\command
- */
-class Fans extends Command
-{
-    /**
-     * 需要处理的模块
-     * @var array
-     */
-    protected $module = ['list', 'black', 'tags'];
-
-    /**
-     * 配置指令
-     */
-    protected function configure()
-    {
-        $this->setName('xadmin:fansall');
-        $this->setDescription('Wechat Users Data Synchronize for ThinkAdmin');
-    }
-
-    /**
-     * 执行指令
-     * @param Input $input
-     * @param Output $output
-     * @throws \think\admin\Exception
-     */
-    protected function execute(Input $input, Output $output)
-    {
-        $message = '';
-        foreach ($this->module as $m) {
-            if (method_exists($this, $method = "_{$m}")) {
-                $message .= $this->$method();
-            }
-        }
-        $this->setQueueSuccess($message);
-    }
-
-    /**
-     * 同步微信粉丝列表
-     * @param string $next
-     * @param integer $done
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    protected function _list(string $next = '', int $done = 0): string
-    {
-        $appid = WechatService::instance()->getAppid();
-        $this->output->comment('开始获取微信用户数据');
-        while (is_string($next)) {
-            $result = WechatService::WeChatUser()->getUserList($next);
-            if (is_array($result) && !empty($result['data']['openid'])) {
-                foreach (array_chunk($result['data']['openid'], 100) as $openids) {
-                    $info = WechatService::WeChatUser()->getBatchUserInfo($openids);
-                    if (is_array($info) && !empty($info['user_info_list'])) {
-                        foreach ($info['user_info_list'] as $user) if (isset($user['nickname'])) {
-                            $this->queue->message($result['total'], ++$done, "-> {$user['openid']} {$user['nickname']}");
-                            FansService::instance()->set($user, $appid);
-                        }
-                    }
-                }
-                $next = $result['total'] > $done ? $result['next_openid'] : null;
-            } else {
-                $next = null;
-            }
-        }
-        $this->output->comment($done > 0 ? '微信用户数据获取完成' : '未获取到微信用户数据');
-        $this->output->newLine();
-        return "共获取 {$done} 个用户数据";
-    }
-
-    /**
-     * 同步粉丝黑名单列表
-     * @param string $next
-     * @param integer $done
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\db\exception\DbException
-     */
-    public function _black(string $next = '', int $done = 0): string
-    {
-        $wechat = WechatService::WeChatUser();
-        $this->output->comment('开始更新黑名单的微信用户');
-        [$map, $data] = [['is_black' => 0], ['is_black' => 1]];
-        while (!is_null($next) && is_array($result = $wechat->getBlackList($next)) && !empty($result['data']['openid'])) {
-            $done += $result['count'];
-            foreach (array_chunk($result['data']['openid'], 100) as $chunk) {
-                $this->app->db->name('WechatFans')->where($map)->whereIn('openid', $chunk)->update($data);
-            }
-            $this->setQueueProgress("--> 共计同步微信黑名单{$result['total']}人");
-            $next = $result['total'] > $done ? $result['next_openid'] : null;
-        }
-        $this->output->comment($done > 0 ? '黑名单的微信用户更新成功' : '未获取到黑名单微信用户哦');
-        $this->output->newLine();
-        if (empty($result['total'])) {
-            return ', 其中黑名单 0 人';
-        } else {
-            return ", 其中黑名单 {$result['total']} 人";
-        }
-    }
-
-    /**
-     * 同步粉丝标签列表
-     * @param integer $done
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function _tags(int $done = 0): string
-    {
-        $appid = WechatService::instance()->getAppid();
-        $this->output->comment('开始获取微信用户标签数据');
-        if (is_array($list = WechatService::WeChatTags()->getTags()) && !empty($list['tags'])) {
-            $count = count($list['tags']);
-            foreach ($list['tags'] as &$tag) {
-                $tag['appid'] = $appid;
-                $this->queue->message($count, ++$done, "-> {$tag['name']}");
-            }
-            $this->app->db->name('WechatFansTags')->where(['appid' => $appid])->delete();
-            $this->app->db->name('WechatFansTags')->insertAll($list['tags']);
-        }
-        $this->output->comment($done > 0 ? '微信用户标签数据获取完成' : '未获取到微信用户标签数据');
-        $this->output->newLine();
-        return ", 获取到 {$done} 个标签";
-    }
-}

+ 0 - 135
app/wechat/controller/Auto.php

@@ -1,135 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use think\admin\Controller;
-use think\admin\extend\CodeExtend;
-
-/**
- * 关注自动回复
- * Class Auto
- * @package app\wechat\controller
- */
-class Auto extends Controller
-{
-    /**
-     * 绑定数据表
-     * @var string
-     */
-    private $table = 'WechatAuto';
-
-    /**
-     * 消息类型
-     * @var array
-     */
-    public $types = [
-        'text'  => '文字', 'news' => '图文',
-        'image' => '图片', 'music' => '音乐',
-        'video' => '视频', 'voice' => '语音',
-    ];
-
-    /**
-     * 关注自动回复
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index()
-    {
-        $this->title = '关注自动回复';
-        $query = $this->_query($this->table)->like('code,type');
-        $query->equal('status')->dateBetween('create_at')->order('time asc')->page();
-    }
-
-    /**
-     * 列表数据处理
-     * @param array $data
-     */
-    protected function _index_page_filter(array &$data)
-    {
-        foreach ($data as &$vo) {
-            $vo['type'] = $this->types[$vo['type']] ?? $vo['type'];
-        }
-    }
-
-    /**
-     * 添加自动回复
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function add()
-    {
-        $this->title = '添加自动回复';
-        $this->_form($this->table, 'form');
-    }
-
-    /**
-     * 编辑自动回复
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function edit()
-    {
-        $this->title = '编辑自动回复';
-        $this->_form($this->table, 'form');
-    }
-
-    /**
-     * 添加数据处理
-     * @param array $data
-     */
-    protected function _form_filter(array &$data)
-    {
-        if (empty($data['code'])) {
-            $data['code'] = CodeExtend::uniqidNumber(18, 'AM');
-        }
-        if ($this->request->isGet()) {
-            $public = dirname($this->request->basefile(true));
-            $this->defaultImage = "{$public}/static/theme/img/image.png";
-        }
-    }
-
-    /**
-     * 表单结果处理
-     * @param boolean $result
-     */
-    protected function _form_result(bool $result)
-    {
-        if ($result !== false) {
-            $this->success('恭喜, 关键字保存成功!', 'javascript:history.back()');
-        } else {
-            $this->error('关键字保存失败, 请稍候再试!');
-        }
-    }
-
-    /**
-     * 修改规则状态
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function state()
-    {
-        $this->_save($this->table, $this->_vali([
-            'status.in:0,1'  => '状态值范围异常!',
-            'status.require' => '状态值不能为空!',
-        ]));
-    }
-
-    /**
-     * 删除自动回复
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function remove()
-    {
-        $this->_delete($this->table);
-    }
-}

+ 0 - 145
app/wechat/controller/Config.php

@@ -1,145 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\admin\storage\LocalStorage;
-
-/**
- * 微信授权绑定
- * Class Config
- * @package app\wechat\controller
- */
-class Config extends Controller
-{
-    /**
-     * 微信授权配置
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function options()
-    {
-        $this->_applyFormToken();
-        $this->thrNotify = sysuri('wechat/api.push/index', [], false, true);
-        if ($this->request->isGet()) {
-            try {
-                $source = enbase64url(sysuri('admin/index/index', [], false, true) . '#' . $this->request->url());
-                $this->authurl = "https://open.cuci.cc/service/api.push/auth?source={$source}";
-                if (input('?appid') && input('?appkey')) {
-                    sysconf('wechat.type', 'thr');
-                    sysconf('wechat.thr_appid', input('appid'));
-                    sysconf('wechat.thr_appkey', input('appkey'));
-                    WechatService::ThinkServiceConfig()->setApiNotifyUri($this->thrNotify);
-                }
-                $this->wechat = WechatService::ThinkServiceConfig()->getConfig();
-            } catch (\Exception $exception) {
-                $this->wechat = [];
-                $this->message = $exception->getMessage();
-            }
-            $this->geoip = $this->app->cache->get('mygeoip', '');
-            if (empty($this->geoip)) {
-                $this->geoip = gethostbyname($this->request->host());
-                $this->app->cache->set('mygeoip', $this->geoip, 360);
-            }
-            $this->title = '微信授权配置';
-            $this->fetch();
-        } else {
-            foreach ($this->request->post() as $k => $v) sysconf($k, $v);
-            if ($this->request->post('wechat.type') === 'thr') {
-                try {
-                    WechatService::ThinkServiceConfig()->setApiNotifyUri($this->thrNotify);
-                } catch (\Exception $exception) {
-                    $this->error($exception->getMessage());
-                }
-            }
-            sysoplog('微信授权配置', '修改微信授权配置成功');
-            $location = url('wechat/config/options')->build() . '?uniqid=' . uniqid();
-            $this->success('微信授权修改成功!', sysuri('admin/index/index') . "#{$location}");
-        }
-    }
-
-    /**
-     * 微信授权测试
-     * @auth true
-     */
-    public function options_test()
-    {
-        $this->fetch();
-    }
-
-    /**
-     * 微信支付配置
-     * @auth true
-     * @menu true
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function payment()
-    {
-        if ($this->request->isGet()) {
-            $this->title = '微信支付配置';
-            $local = LocalStorage::instance();
-            $this->mch_ssl_cer = sysconf('wechat.mch_ssl_cer');
-            $this->mch_ssl_key = sysconf('wechat.mch_ssl_key');
-            $this->mch_ssl_p12 = sysconf('wechat.mch_ssl_p12');
-            if (!$local->has($this->mch_ssl_cer, true)) $this->mch_ssl_cer = '';
-            if (!$local->has($this->mch_ssl_key, true)) $this->mch_ssl_key = '';
-            if (!$local->has($this->mch_ssl_p12, true)) $this->mch_ssl_p12 = '';
-            $this->fetch();
-        } else {
-            $this->error('抱歉,数据提交地址错误!');
-        }
-    }
-
-    /**
-     * 微信支付测试
-     * @auth true
-     */
-    public function payment_test()
-    {
-        $this->fetch();
-    }
-
-    /**
-     * 微信支付修改
-     * @auth true
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function payment_save()
-    {
-        if ($this->request->isPost()) {
-            if ($this->request->post('wechat.mch_ssl_type') === 'p12') {
-                if (!LocalStorage::instance()->has(input('wechat.mch_ssl_p12', '-'), true)) {
-                    $this->error('商户证书 P12 证书不能为空!');
-                }
-                $content = LocalStorage::instance()->get(input('wechat.mch_ssl_p12', '-'), true);
-                if (!openssl_pkcs12_read($content, $certs, input('wechat.mch_id'))) {
-                    $this->error('商户账号与 P12 证书不匹配!');
-                }
-            } elseif ($this->request->post('wechat.mch_ssl_type') === 'pem') {
-                if (!LocalStorage::instance()->has(input('wechat.mch_ssl_key', '-'), true)) {
-                    $this->error('商户证书 KEY 不能为空!');
-                }
-                if (!LocalStorage::instance()->has(input('wechat.mch_ssl_cer', '-'), true)) {
-                    $this->error('商户证书 CERT 不能为空!');
-                }
-            }
-            foreach ($this->request->post() as $k => $v) sysconf($k, $v);
-            sysoplog('微信授权配置', '修改微信支付配置成功');
-            $this->success('微信支付配置成功!');
-        } else {
-            $this->error('抱歉,访问方式错误!');
-        }
-    }
-}

+ 0 - 133
app/wechat/controller/Fans.php

@@ -1,133 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\exception\HttpResponseException;
-
-/**
- * 微信用户管理
- * Class Fans
- * @package app\wechat\controller
- */
-class Fans extends Controller
-{
-    /**
-     * 绑定数据表
-     * @var string
-     */
-    private $table = 'WechatFans';
-
-    /**
-     * 微信用户管理
-     * @auth true
-     * @menu true
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index()
-    {
-        $this->title = '微信用户管理';
-        $this->where = ['appid' => WechatService::instance()->getAppid()];
-        $query = $this->_query($this->table)->like('nickname')->equal('subscribe,is_black');
-        $query->dateBetween('subscribe_at')->where($this->where)->order('subscribe_time desc')->page();
-    }
-
-    /**
-     * 列表数据处理
-     * @param array $data
-     */
-    protected function _index_page_filter(array &$data)
-    {
-        $tags = $this->app->db->name('WechatFansTags')->column('name', 'id');
-        foreach ($data as &$vo) {
-            $vo['tags'] = [];
-            foreach (explode(',', $vo['tagid_list']) as $tagid) {
-                if (isset($tags[$tagid])) $vo['tags'][] = $tags[$tagid];
-            }
-        }
-    }
-
-    /**
-     * 同步用户数据
-     * @auth true
-     */
-    public function sync()
-    {
-        sysoplog('微信授权配置', '创建粉丝用户同步任务');
-        $this->_queue('同步微信用户数据', "xadmin:fansall");
-    }
-
-    /**
-     * 清空用户数据
-     * @auth true
-     */
-    public function truncate()
-    {
-        try {
-            $this->_query('WechatFans')->empty();
-            $this->_query('WechatFansTags')->empty();
-            $this->success('清空用户数据成功!');
-        } catch (\think\exception\HttpResponseException $exception) {
-            throw  $exception;
-        } catch (\Exception $exception) {
-            $this->error("清空用户数据失败,{$exception->getMessage()}");
-        }
-    }
-
-    /**
-     * 删除用户信息
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function remove()
-    {
-        $this->_applyFormToken();
-        $this->_delete($this->table);
-    }
-
-    /**
-     * 用户拉入黑名单
-     * @auth true
-     */
-    public function blackAdd()
-    {
-        try {
-            $this->_applyFormToken();
-            foreach (array_chunk(explode(',', $this->request->post('openid')), 20) as $openids) {
-                WechatService::WeChatUser()->batchBlackList($openids);
-                $this->app->db->name('WechatFans')->whereIn('openid', $openids)->update(['is_black' => '1']);
-            }
-            $this->success('拉入黑名单成功!');
-        } catch (HttpResponseException $exception) {
-            throw  $exception;
-        } catch (\Exception $exception) {
-            $this->error("拉入黑名单失败,请稍候再试!<br>{$exception->getMessage()}");
-        }
-    }
-
-    /**
-     * 用户移出黑名单
-     * @auth true
-     */
-    public function blackDel()
-    {
-        try {
-            $this->_applyFormToken();
-            foreach (array_chunk(explode(',', $this->request->post('openid')), 20) as $openids) {
-                WechatService::WeChatUser()->batchUnblackList($openids);
-                $this->app->db->name('WechatFans')->whereIn('openid', $openids)->update(['is_black' => '0']);
-            }
-            $this->success('移出黑名单成功!');
-        } catch (HttpResponseException $exception) {
-            throw  $exception;
-        } catch (\Exception $exception) {
-            $this->error("移出黑名单失败,请稍候再试!<br>{$exception->getMessage()}");
-        }
-    }
-}

+ 0 - 185
app/wechat/controller/Keys.php

@@ -1,185 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\exception\HttpResponseException;
-
-/**
- * 回复规则管理
- * Class Keys
- * @package app\wechat\controller
- */
-class Keys extends Controller
-{
-    /**
-     * 绑定数据表
-     * @var string
-     */
-    private $table = 'WechatKeys';
-
-    /**
-     * 消息类型
-     * @var array
-     */
-    public $types = [
-        'text'  => '文字', 'news' => '图文', 'image' => '图片', 'music' => '音乐',
-        'video' => '视频', 'voice' => '语音', 'customservice' => '转客服',
-    ];
-
-    /**
-     * 回复规则管理
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index()
-    {
-        // 关键字二维码生成
-        if ($this->request->get('action') === 'qrc') try {
-            $wechat = WechatService::WeChatQrcode();
-            $result = $wechat->create($this->request->get('keys', ''));
-            $this->success('生成二维码成功!', "javascript:$.previewImage('{$wechat->url($result['ticket'])}')");
-        } catch (HttpResponseException $exception) {
-            throw $exception;
-        } catch (\Exception $exception) {
-            $this->error("生成二维码失败,请稍候再试!<br> {$exception->getMessage()}");
-        }
-        // 数据列表分页处理
-        $this->title = '回复规则管理';
-        $query = $this->_query($this->table)->whereNotIn('keys', ['subscribe', 'default']);
-        $query->equal('status')->like('keys,type')->dateBetween('create_at')->order('sort desc,id desc')->page();
-    }
-
-    /**
-     * 列表数据处理
-     * @param array $data
-     */
-    protected function _index_page_filter(array &$data)
-    {
-        foreach ($data as &$vo) {
-            $vo['type'] = $this->types[$vo['type']] ?? $vo['type'];
-            $vo['qrc'] = sysuri('wechat/keys/index') . "?action=qrc&keys={$vo['keys']}";
-        }
-    }
-
-    /**
-     * 添加回复规则
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function add()
-    {
-        $this->_applyFormToken();
-        $this->title = '添加回复规则';
-        $this->_form($this->table, 'form');
-    }
-
-    /**
-     * 编辑回复规则
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function edit()
-    {
-        $this->_applyFormToken();
-        $this->title = '编辑回复规则';
-        $this->_form($this->table, 'form');
-    }
-
-    /**
-     * 修改规则状态
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function state()
-    {
-        $this->_applyFormToken();
-        $this->_save($this->table, $this->_vali([
-            'status.in:0,1'  => '状态值范围异常!',
-            'status.require' => '状态值不能为空!',
-        ]));
-    }
-
-    /**
-     * 删除回复规则
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function remove()
-    {
-        $this->_applyFormToken();
-        $this->_delete($this->table);
-    }
-
-    /**
-     * 配置订阅回复
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function subscribe()
-    {
-        $this->_applyFormToken();
-        $this->title = '编辑订阅回复规则';
-        $this->_form($this->table, 'form', 'keys', [], ['keys' => 'subscribe']);
-    }
-
-    /**
-     * 配置默认回复
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function defaults()
-    {
-        $this->_applyFormToken();
-        $this->title = '编辑默认回复规则';
-        $this->_form($this->table, 'form', 'keys', [], ['keys' => 'default']);
-    }
-
-    /**
-     * 添加数据处理
-     * @param array $data
-     */
-    protected function _form_filter(array &$data)
-    {
-        if ($this->request->isPost()) {
-            $map = [['keys', '=', $data['keys']], ['id', '<>', $data['id'] ?? 0]];
-            if ($this->app->db->name($this->table)->where($map)->count() > 0) {
-                $this->error('该关键字已经存在!');
-            }
-        } elseif ($this->request->isGet()) {
-            $public = dirname($this->request->basefile(true));
-            $this->defaultImage = "{$public}/static/theme/img/image.png";
-        }
-    }
-
-    /**
-     * 表单结果处理
-     * @param boolean $result
-     */
-    protected function _form_result(bool $result)
-    {
-        if ($result !== false) {
-            $iskeys = in_array(input('keys'), ['subscribe', 'default']);
-            $location = $iskeys ? 'javascript:$.form.reload()' : 'javascript:history.back()';
-            $this->success('恭喜, 关键字保存成功!', $location);
-        } else {
-            $this->error('关键字保存失败, 请稍候再试!');
-        }
-    }
-}

+ 0 - 157
app/wechat/controller/Menu.php

@@ -1,157 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\exception\HttpResponseException;
-
-/**
- * 微信菜单管理
- * Class Menu
- * @package app\wechat\controller
- */
-class Menu extends Controller
-{
-    /**
-     * 存储数据名称
-     * @var string
-     */
-    protected $ckey = 'wechat_menu_data';
-
-    /**
-     * 微信菜单的类型
-     * @var array
-     */
-    protected $menuTypes = [
-        'click'              => '匹配规则',
-        'view'               => '跳转网页',
-        'miniprogram'        => '打开小程序',
-        'customservice'      => '转多客服',
-        'scancode_push'      => '扫码推事件',
-        'scancode_waitmsg'   => '扫码推事件且弹出“消息接收中”提示框',
-        'pic_sysphoto'       => '弹出系统拍照发图',
-        'pic_photo_or_album' => '弹出拍照或者相册发图',
-        'pic_weixin'         => '弹出微信相册发图器',
-        'location_select'    => '弹出地理位置选择器',
-    ];
-
-    /**
-     * 微信菜单管理
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index()
-    {
-        if ($this->request->get('output') === 'json') {
-            $map = [['keys', 'notin', ['subscribe', 'default']], ['status', '=', 1]];
-            $result = $this->app->db->name('WechatKeys')->where($map)->order('sort desc,id desc')->select();
-            $this->success('获取数据成功!', ['menudata' => sysdata($this->ckey), 'keysdata' => $result->toArray()]);
-        } else {
-            $this->title = '微信菜单定制';
-            $this->fetch();
-        }
-    }
-
-    /**
-     * 取消微信菜单
-     * @auth true
-     */
-    public function cancel()
-    {
-        try {
-            WechatService::WeChatMenu()->delete();
-            $this->success('菜单取消成功,重新订阅可立即生效!');
-        } catch (HttpResponseException $exception) {
-            sysoplog('微信管理', '取消微信菜单成功');
-            throw $exception;
-        } catch (\Exception $exception) {
-            $this->error("菜单取消失败,请稍候再试!<br> {$exception->getMessage()}");
-        }
-    }
-
-    /**
-     * 编辑微信菜单
-     * @auth true
-     */
-    public function push()
-    {
-        if ($this->request->isPost()) {
-            $data = $this->request->post('data');
-            if (empty($data)) try {
-                WechatService::WeChatMenu()->delete();
-                sysoplog('微信菜单管理', '删除微信菜单成功');
-                $this->success('删除微信菜单成功!', '');
-            } catch (HttpResponseException $exception) {
-                throw $exception;
-            } catch (\Exception $exception) {
-                sysoplog('微信菜单管理', "删除微信菜单失败:{$exception->getMessage()}");
-                $this->error("删除微信菜单失败,请稍候再试!<br>{$exception->getMessage()}");
-            }
-            else try {
-                sysdata($this->ckey, $this->_buildMenuData(json_decode($data, true)));
-                WechatService::WeChatMenu()->create(['button' => sysdata($this->ckey)]);
-                sysoplog('微信菜单管理', '发布微信菜单成功');
-                $this->success('保存发布菜单成功!', '');
-            } catch (HttpResponseException $exception) {
-                throw $exception;
-            } catch (\Exception $exception) {
-                sysoplog('微信菜单管理', "发布微信菜单失败:{$exception->getMessage()}");
-                $this->error("微信菜单发布失败,请稍候再试!<br> {$exception->getMessage()}");
-            }
-        }
-    }
-
-    /**
-     * 菜单数据处理
-     * @param array $list
-     * @return array
-     */
-    private function _buildMenuData(array $list): array
-    {
-        foreach ($list as $key => &$item) {
-            if (empty($item['sub_button'])) {
-                $item = $this->_buildMenuDataItem($item);
-            } else {
-                $button = ['name' => $item['name'], 'sub_button' => []];
-                foreach ($item['sub_button'] as &$sub) {
-                    $button['sub_button'][] = $this->_buildMenuDataItem($sub);
-                }
-                $item = $button;
-            }
-        }
-        return $list;
-    }
-
-    /**
-     * 单个微信菜单数据处理
-     * @param array $item
-     * @return array
-     */
-    private function _buildMenuDataItem(array $item): array
-    {
-        switch (strtolower($item['type'])) {
-            case 'pic_weixin':
-            case 'pic_sysphoto':
-            case 'scancode_push':
-            case 'location_select':
-            case 'scancode_waitmsg':
-            case 'pic_photo_or_album':
-                return ['name' => $item['name'], 'type' => $item['type'], 'key' => $item['key'] ?? $item['type']];
-            case 'click':
-                if (empty($item['key'])) $this->error('匹配规则存在空的选项');
-                return ['name' => $item['name'], 'type' => $item['type'], 'key' => $item['key']];
-            case 'view':
-                return ['name' => $item['name'], 'type' => $item['type'], 'url' => $item['url']];
-            case 'miniprogram':
-                return ['name' => $item['name'], 'type' => $item['type'], 'url' => $item['url'], 'appid' => $item['appid'], 'pagepath' => $item['pagepath']];
-            default:
-                return [];
-        }
-    }
-}

+ 0 - 151
app/wechat/controller/News.php

@@ -1,151 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller;
-
-use app\wechat\service\MediaService;
-use think\admin\Controller;
-use think\admin\service\AdminService;
-
-/**
- * 微信图文管理
- * Class News
- * @package app\wechat\controller
- */
-class News extends Controller
-{
-
-    /**
-     * 设置默认操作表
-     * @var string
-     */
-    private $table = 'WechatNews';
-
-    /**
-     * 微信图文管理
-     * @auth true
-     * @menu true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index()
-    {
-        $this->title = '微信图文列表';
-        $this->_query($this->table)->where(['is_deleted' => 0])->order('id desc')->page();
-    }
-
-    /**
-     * 图文列表数据处理
-     * @param array $data
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    protected function _page_filter(array &$data)
-    {
-        foreach ($data as &$vo) {
-            $vo = MediaService::instance()->news($vo['id']);
-        }
-    }
-
-    /**
-     * 图文选择器
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function select()
-    {
-        $this->index();
-    }
-
-    /**
-     * 添加微信图文
-     * @auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function add()
-    {
-        if ($this->request->isGet()) {
-            $this->title = '新建图文';
-            $this->fetch('form');
-        } else {
-            $update = [
-                'create_by'  => AdminService::instance()->getUserId(),
-                'article_id' => $this->_buildArticle($this->request->post('data', [])),
-            ];
-            if ($this->app->db->name($this->table)->insert($update) !== false) {
-                $this->success('图文添加成功!', 'javascript:history.back()');
-            } else {
-                $this->error('图文添加失败,请稍候再试!');
-            }
-        }
-    }
-
-    /**
-     * 编辑微信图文
-     * @auth true
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function edit()
-    {
-        $this->id = $this->request->get('id');
-        if (empty($this->id)) $this->error('参数错误,请稍候再试!');
-        if ($this->request->isGet()) {
-            if ($this->request->get('output') === 'json') {
-                $this->success('获取数据成功!', MediaService::instance()->news($this->id));
-            } else {
-                $this->title = '编辑图文';
-                $this->fetch('form');
-            }
-        } else {
-            $ids = $this->_buildArticle($this->request->post('data', []));
-            [$map, $data] = [['id' => $this->id], ['article_id' => $ids]];
-            if ($this->app->db->name($this->table)->where($map)->update($data) !== false) {
-                $this->success('更新成功!', 'javascript:history.back()');
-            } else {
-                $this->error('更新失败,请稍候再试!');
-            }
-        }
-    }
-
-    /**
-     * 删除微信图文
-     * auth true
-     * @throws \think\db\exception\DbException
-     */
-    public function remove()
-    {
-        $this->_delete($this->table);
-    }
-
-    /**
-     * 图文更新操作
-     * @param array $data
-     * @param array $ids
-     * @return string
-     * @throws \think\db\exception\DbException
-     */
-    private function _buildArticle(array $data, array $ids = []): string
-    {
-        foreach ($data as $vo) {
-            if (empty($vo['digest'])) {
-                $vo['digest'] = mb_substr(strip_tags(str_replace(["\s", ' '], '', $vo['content'])), 0, 120);
-            }
-            $vo['create_at'] = date('Y-m-d H:i:s');
-            if (empty($vo['id'])) {
-                $result = $id = $this->app->db->name('WechatNewsArticle')->insertGetId($vo);
-            } else {
-                $id = intval($vo['id']);
-                $result = $this->app->db->name('WechatNewsArticle')->where('id', $id)->update($vo);
-            }
-            if ($result !== false) array_push($ids, $id);
-        }
-        return join(',', $ids);
-    }
-}

+ 0 - 91
app/wechat/controller/api/Js.php

@@ -1,91 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller\api;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\Response;
-
-/**
- * 前端JS获取控制器
- * Class Js
- * @package app\wechat\controller\api
- */
-class Js extends Controller
-{
-    /** @var string */
-    protected $params;
-
-    /** @var string */
-    protected $openid;
-
-    /** @var string */
-    protected $fansinfo;
-
-    /**
-     * 生成网页授权的JS内容
-     * @return \think\Response
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function index(): Response
-    {
-        $mode = $this->request->get('mode', 1);
-        $source = $this->request->server('http_referer') ?: $this->request->url(true);
-        $userinfo = WechatService::instance()->getWebOauthInfo($source, $mode, false);
-        if (empty($userinfo['openid'])) {
-            $content = 'alert("Wechat webOauth failed.")';
-        } else {
-            $this->openid = $userinfo['openid'];
-            $this->params = json_encode(WechatService::instance()->getWebJssdkSign($source));
-            $this->fansinfo = json_encode($userinfo['fansinfo'] ?? [], JSON_UNESCAPED_UNICODE);
-            // 生成数据授权令牌
-            $this->token = uniqid('oauth') . rand(10000, 99999);
-            $this->app->cache->set($this->openid, $this->token, 3600);
-            // 生成前端JS变量代码
-            $content = $this->_buildContent();
-        }
-        return Response::create($content)->contentType('application/x-javascript');
-    }
-
-    /**
-     * 给指定地址创建签名参数
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function sdk()
-    {
-        $data = $this->_vali(['url.require' => '签名地址不能为空!']);
-        $this->success('获取签名参数', WechatService::instance()->getWebJssdkSign($data['url']));
-    }
-
-    /**
-     * 生成授权内容
-     * @return string
-     */
-    private function _buildContent(): string
-    {
-        return <<<EOF
-if(typeof wx === 'object'){
-    wx.token="{$this->token}";
-    wx.openid="{$this->openid}";
-    wx.fansinfo={$this->fansinfo};
-    wx.config({$this->params});
-    wx.ready(function(){
-        wx.hideOptionMenu();
-        wx.hideAllNonBaseMenuItem();
-    });
-}
-EOF;
-    }
-}

+ 0 - 97
app/wechat/controller/api/Login.php

@@ -1,97 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller\api;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-
-/**
- * 微信扫码授权登录
- * Class Login
- * @package app\wechat\controller\api
- */
-class Login extends Controller
-{
-    /**
-     * 数据缓存时间
-     * @var integer
-     */
-    protected $expire = 3600;
-
-    /**
-     * 授权码前缀
-     * @var string
-     */
-    protected $prefix = 'wxlogin';
-
-
-    /**
-     * 扫描显示二维码
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     * @throws \think\exception\HttpResponseException
-     */
-    public function qrc()
-    {
-        $mode = intval(input('mode', '0'));
-        $code = $this->prefix . md5(uniqid('t', true) . rand(10000, 99999));
-        $text = url('wechat/api.login/oauth', [], false, true) . "?code={$code}&mode={$mode}";
-        // 生成二维码并返回结果
-        $qrcode = new \Endroid\QrCode\QrCode();
-        $qrcode->setText($text)->setSize(300)->setPadding(20);
-        $content = base64_encode($qrcode->setImageType('png')->get());
-        $this->success('获取二维码成功', ['code' => $code, 'image' => "data:image/png;base64,{$content}"]);
-    }
-
-    /**
-     * 微信授权结果处理
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function oauth()
-    {
-        $this->code = input('code', '');
-        $this->mode = input('mode', '0');
-        if (stripos($this->code, $this->prefix) === 0) {
-            $this->url = $this->request->url(true);
-            $this->fans = WechatService::instance()->getWebOauthInfo($this->url, $this->mode);
-            if (is_array($this->fans) && isset($this->fans['openid'])) {
-                $this->fans['token'] = md5(uniqid('t', true) . rand(10000, 99999));
-                $this->app->cache->set("wxlogin{$this->code}", $this->fans, $this->expire);
-                $this->app->cache->set($this->fans['openid'], $this->fans['token'], $this->expire);
-                $this->message = '授权成功';
-                $this->fetch('success');
-            } else {
-                $this->message = '授权失败';
-                $this->fetch('failed');
-            }
-        } else {
-            $this->message = '授权失败';
-            $this->fetch('failed');
-        }
-    }
-
-    /**
-     * 获取授权信息
-     * 用定时器请求这个接口
-     * @throws \think\exception\HttpResponseException
-     */
-    public function query()
-    {
-        $this->code = input('code', '');
-        if (stripos($this->code, $this->prefix) === 0) {
-            $this->ckey = "wxlogin{$this->code}";
-            $this->fans = $this->app->cache->get($this->ckey, new \stdClass());
-            $this->success('获取授权信息', $this->fans);
-        } else {
-            $this->error("授权CODE不能为空!");
-        }
-    }
-}

+ 0 - 324
app/wechat/controller/api/Push.php

@@ -1,324 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller\api;
-
-use app\wechat\service\FansService;
-use app\wechat\service\MediaService;
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-
-/**
- * 微信消息推送处理
- * Class Push
- * @package app\wechat\controller\api
- */
-class Push extends Controller
-{
-
-    /**
-     * 公众号 APPID
-     * @var string
-     */
-    protected $appid;
-
-    /**
-     * 微信用户 OPENID
-     * @var string
-     */
-    protected $openid;
-
-    /**
-     * 消息是否加密码
-     * @var boolean
-     */
-    protected $encrypt;
-
-
-    /**
-     * 请求微信 OPENID
-     * @var string
-     */
-    protected $fromOpenid;
-
-    /**
-     * 微信消息对象
-     * @var array
-     */
-    protected $receive;
-
-    /**
-     * 微信实例对象
-     * @var \WeChat\Receive
-     */
-    protected $wechat;
-
-    /**
-     * 强制返回JSON消息
-     * @var boolean
-     */
-    protected $forceJson = false;
-
-    /**
-     * 强制客服消息回复
-     * @var boolean
-     */
-    protected $forceCustom = false;
-
-    /**
-     * 获取网络出口IP
-     * @return mixed
-     */
-    public function geoip()
-    {
-        return $this->request->ip();
-    }
-
-    /**
-     * 消息推送处理接口
-     * @return string
-     */
-    public function index()
-    {
-        try {
-            if (WechatService::instance()->getType() === 'thr') {
-                $this->forceJson = true; // 直接返回JSON数据到SERVICE
-                $this->forceCustom = false; // 直接使用客服消息模式推送
-                $this->appid = $this->request->post('appid', '', null);
-                $this->openid = $this->request->post('openid', '', null);
-                $this->encrypt = boolval($this->request->post('encrypt', 0));
-                $this->receive = $this->_arrayChangeKeyCase(json_decode(input('params', '[]'), true));
-                if (empty($this->appid) || empty($this->openid) || empty($this->receive)) {
-                    throw new \think\admin\Exception('微信API实例缺失必要参数[appid,openid,receive]');
-                }
-            } else {
-                $this->forceJson = false; // 直接返回JSON对象数据
-                $this->forceCustom = false; // 直接使用客服消息推送
-                $this->appid = WechatService::instance()->getAppid();
-                $this->wechat = WechatService::WeChatReceive();
-                $this->openid = $this->wechat->getOpenid();
-                $this->encrypt = $this->wechat->isEncrypt();
-                $this->receive = $this->_arrayChangeKeyCase($this->wechat->getReceive());
-            }
-            $this->fromOpenid = $this->receive['tousername'];
-            // 消息类型:text, event, image, voice, shortvideo, location, link
-            if (method_exists($this, ($method = $this->receive['msgtype']))) {
-                if (is_string($result = $this->$method())) return $result;
-            } else {
-                $this->app->log->notice("The {$method} event pushed by wechat was not handled. from {$this->openid}");
-            }
-        } catch (\Exception $exception) {
-            $this->app->log->error("{$exception->getFile()}:{$exception->getLine()} [{$exception->getCode()}] {$exception->getMessage()}");
-        }
-        return 'success';
-    }
-
-    /**
-     * 文件消息处理
-     * @return boolean|string
-     * @throws \WeChat\Exceptions\InvalidDecryptException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    protected function text()
-    {
-        return $this->_keys("WechatKeys#keys#{$this->receive['content']}", false, $this->forceCustom);
-    }
-
-    /**
-     * 事件消息处理
-     * @return boolean|string
-     * @throws \WeChat\Exceptions\InvalidDecryptException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    protected function event()
-    {
-        switch (strtolower($this->receive['event'])) {
-            case 'unsubscribe':
-                $this->app->event->trigger('WechatFansUnSubscribe', $this->openid);
-                return $this->_setUserInfo(false);
-            case 'subscribe':
-                [$this->app->event->trigger('WechatFansSubscribe', $this->openid), $this->_setUserInfo(true)];
-                if (isset($this->receive['eventkey']) && is_string($this->receive['eventkey'])) {
-                    if (($key = preg_replace('/^qrscene_/i', '', $this->receive['eventkey']))) {
-                        return $this->_keys("WechatKeys#keys#{$key}", false, true);
-                    }
-                }
-                return $this->_keys('WechatKeys#keys#subscribe', true, $this->forceCustom);
-            case 'scan':
-            case 'click':
-                if (empty($this->receive['eventkey'])) return false;
-                return $this->_keys("WechatKeys#keys#{$this->receive['eventkey']}", false, $this->forceCustom);
-            case 'scancode_push':
-            case 'scancode_waitmsg':
-                if (empty($this->receive['scancodeinfo']['scanresult'])) return false;
-                return $this->_keys("WechatKeys#keys#{$this->receive['scancodeinfo']['scanresult']}", false, $this->forceCustom);
-            case 'view':
-            case 'location':
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * 关键字处理
-     * @param string $rule 关键字规则
-     * @param boolean $last 重复回复消息处理
-     * @param boolean $custom 是否使用客服消息发送
-     * @return boolean|string
-     * @throws \WeChat\Exceptions\InvalidDecryptException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    private function _keys(string $rule, bool $last = false, bool $custom = false)
-    {
-        if (is_numeric(stripos($rule, '#reply#text:'))) {
-            [, $content] = explode('#reply#text:', $rule);
-            return $this->_buildMessage('text', ['Content' => $content]);
-        }
-        [$table, $field, $value] = explode('#', $rule . '##');
-        $data = $this->app->db->name($table)->where([$field => $value])->find();
-        if (empty($data['type']) || (array_key_exists('status', $data) && empty($data['status']))) {
-            return $last ? false : $this->_keys('WechatKeys#keys#default', true, $custom);
-        }
-        switch (strtolower($data['type'])) {
-            case 'keys':
-                $content = empty($data['content']) ? $data['name'] : $data['content'];
-                return $this->_keys("WechatKeys#keys#{$content}", $last, $custom);
-            case 'text':
-                return $this->_sendMessage('text', ['content' => $data['content']], $custom);
-            case 'customservice':
-                return $this->_sendMessage('customservice', ['content' => $data['content']], false);
-            case 'voice':
-                if (empty($data['voice_url']) || !($mediaId = MediaService::instance()->upload($data['voice_url'], 'voice'))) return false;
-                return $this->_sendMessage('voice', ['media_id' => $mediaId], $custom);
-            case 'image':
-                if (empty($data['image_url']) || !($mediaId = MediaService::instance()->upload($data['image_url'], 'image'))) return false;
-                return $this->_sendMessage('image', ['media_id' => $mediaId], $custom);
-            case 'news':
-                [$news, $articles] = [MediaService::instance()->news($data['news_id']), []];
-                if (empty($news['articles'])) return false;
-                foreach ($news['articles'] as $vo) array_push($articles, [
-                    'url'   => url("@wechat/api.view/item/id/{$vo['id']}", [], false, true)->build(),
-                    'title' => $vo['title'], 'picurl' => $vo['local_url'], 'description' => $vo['digest'],
-                ]);
-                return $this->_sendMessage('news', ['articles' => $articles], $custom);
-            case 'music':
-                if (empty($data['music_url']) || empty($data['music_title']) || empty($data['music_desc'])) return false;
-                $mediaId = $data['music_image'] ? MediaService::instance()->upload($data['music_image'], 'image') : '';
-                return $this->_sendMessage('music', [
-                    'hqmusicurl'  => $data['music_url'], 'musicurl' => $data['music_url'],
-                    'description' => $data['music_desc'], 'title' => $data['music_title'], 'thumb_media_id' => $mediaId,
-                ], $custom);
-            case 'video':
-                if (empty($data['video_url']) || empty($data['video_desc']) || empty($data['video_title'])) return false;
-                $video = ['title' => $data['video_title'], 'introduction' => $data['video_desc']];
-                if (!($mediaId = MediaService::instance()->upload($data['video_url'], 'video', $video))) return false;
-                return $this->_sendMessage('video', ['media_id' => $mediaId, 'title' => $data['video_title'], 'description' => $data['video_desc']], $custom);
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * 发送消息到微信
-     * @param string $type 消息类型(text|image|voice|video|music|news|mpnews|wxcard)
-     * @param array $data 消息内容数据对象
-     * @param boolean $custom 是否使用客服消息发送
-     * @return string|void
-     * @throws \WeChat\Exceptions\InvalidDecryptException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     */
-    private function _sendMessage(string $type, array $data, bool $custom = false)
-    {
-        if ($custom) {
-            WechatService::WeChatCustom()->send(['touser' => $this->openid, 'msgtype' => $type, $type => $data]);
-        } else switch (strtolower($type)) {
-            case 'text': // 发送文本消息
-                return $this->_buildMessage($type, ['Content' => $data['content']]);
-            case 'news': // 发送图文消息
-                foreach ($data['articles'] as &$v) {
-                    $v = ['PicUrl' => $v['picurl'], 'Title' => $v['title'], 'Description' => $v['description'], 'Url' => $v['url']];
-                }
-                return $this->_buildMessage($type, ['Articles' => $data['articles'], 'ArticleCount' => count($data['articles'])]);
-            case 'image': // 发送图片消息
-                return $this->_buildMessage($type, ['Image' => ['MediaId' => $data['media_id']]]);
-            case 'voice': // 发送语言消息
-                return $this->_buildMessage($type, ['Voice' => ['MediaId' => $data['media_id']]]);
-            case 'video': // 发送视频消息
-                return $this->_buildMessage($type, ['Video' => ['Title' => $data['title'], 'Description' => $data['description'], 'MediaId' => $data['media_id']]]);
-            case 'music': // 发送音乐消息
-                return $this->_buildMessage($type, ['Music' => ['Title' => $data['title'], 'Description' => $data['description'], 'MusicUrl' => $data['musicurl'], 'HQMusicUrl' => $data['musicurl'], 'ThumbMediaId' => $data['thumb_media_id']]]);
-            case 'customservice': // 转交客服消息
-                if ($data['content']) $this->_sendMessage('text', $data, true);
-                return $this->_buildMessage('transfer_customer_service', []);
-            default:
-                return 'success';
-        }
-    }
-
-    /**
-     * 消息数据生成
-     * @param mixed $type 消息类型
-     * @param array $data 消息内容
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidDecryptException
-     */
-    private function _buildMessage(string $type, array $data = []): string
-    {
-        $data = array_merge($data, ['ToUserName' => $this->openid, 'FromUserName' => $this->fromOpenid, 'CreateTime' => time(), 'MsgType' => $type]);
-        return $this->forceJson ? json_encode($data, JSON_UNESCAPED_UNICODE) : WechatService::WeChatReceive()->reply($data, true, $this->encrypt);
-    }
-
-    /**
-     * 同步粉丝状态
-     * @param boolean $state 订阅状态
-     * @return boolean
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    private function _setUserInfo(bool $state): bool
-    {
-        if ($state) {
-            try {
-                $user = WechatService::WeChatUser()->getUserInfo($this->openid);
-                return FansService::instance()->set(array_merge($user, ['subscribe' => 1, 'appid' => $this->appid]));
-            } catch (\Exception $exception) {
-                $this->app->log->error(__METHOD__ . " {$this->openid} get userinfo faild. {$exception->getMessage()}");
-                return false;
-            }
-        } else {
-            return FansService::instance()->set(['subscribe' => 0, 'openid' => $this->openid, 'appid' => $this->appid]);
-        }
-    }
-
-    /**
-     * 数组健值全部转小写
-     * @param array $data
-     * @return array
-     */
-    private function _arrayChangeKeyCase(array $data): array
-    {
-        $data = array_change_key_case($data, CASE_LOWER);
-        foreach ($data as $key => $vo) if (is_array($vo)) {
-            $data[$key] = $this->_arrayChangeKeyCase($vo);
-        }
-        return $data;
-    }
-}

+ 0 - 242
app/wechat/controller/api/Test.php

@@ -1,242 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller\api;
-
-use app\wechat\service\WechatService;
-use think\admin\Controller;
-use think\admin\extend\CodeExtend;
-use think\Response;
-use WeChat\Contracts\Tools;
-
-/**
- * 微信测试工具
- * Class Test
- * @package app\wechat\controller\api
- */
-class Test extends Controller
-{
-    /**
-     * 微信JSAPI支付二维码
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     */
-    public function jsapiQrc(): Response
-    {
-        $this->url = sysuri('wechat/api.test/jsapi', [], false, true);
-        return $this->_buildQrcResponse($this->url);
-    }
-
-    /**
-     * 显示网页授权二维码
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     */
-    public function oauthQrc(): Response
-    {
-        $this->url = sysuri('wechat/api.test/oauth', [], false, true);
-        return $this->_buildQrcResponse($this->url);
-    }
-
-    /**
-     * 显示网页授权二维码
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     */
-    public function jssdkQrc(): Response
-    {
-        $this->url = sysuri('wechat/api.test/jssdk', [], false, true);
-        return $this->_buildQrcResponse($this->url);
-    }
-
-    /**
-     * 微信扫码支付模式一二维码显示
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     */
-    public function scanOneQrc(): Response
-    {
-        $pay = WechatService::WePayOrder();
-        return $this->_buildQrcResponse($pay->qrcParams('8888888'));
-    }
-
-    /**
-     * 扫码支付模式二测试二维码
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     */
-    public function scanTwoQrc(): Response
-    {
-        $result = WechatService::WePayOrder()->create([
-            'body'             => '测试商品',
-            'total_fee'        => '1',
-            'trade_type'       => 'NATIVE',
-            'notify_url'       => sysuri('wechat/api.test/notify', [], false, true),
-            'out_trade_no'     => CodeExtend::uniqidNumber(18),
-            'spbill_create_ip' => $this->request->ip(),
-        ]);
-        return $this->_buildQrcResponse($result['code_url']);
-    }
-
-    /**
-     * 网页授权测试
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function oauth()
-    {
-        $this->url = $this->request->url(true);
-        $this->fans = WechatService::instance()->getWebOauthInfo($this->url, 1);
-        $this->fetch();
-    }
-
-    /**
-     * JSSDK测试
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function jssdk()
-    {
-        $this->options = WechatService::instance()->getWebJssdkSign();
-        $this->fetch();
-    }
-
-    /**
-     * 微信扫码支付模式一通知处理
-     * -- 注意,需要在微信商户配置支付通知地址
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     */
-    public function scanOneNotify(): string
-    {
-        $pay = WechatService::WePayOrder();
-        $notify = $pay->getNotify();
-        p('======= 来自扫码支付1的数据 ======');
-        p($notify);
-        // 微信统一下单处理
-        $options = [
-            'body'             => "测试商品,产品ID:{$notify['product_id']}",
-            'total_fee'        => '1',
-            'trade_type'       => 'NATIVE',
-            'notify_url'       => sysuri('wechat/api.test/notify', [], false, true),
-            'out_trade_no'     => CodeExtend::uniqidDate(18),
-            'spbill_create_ip' => $this->request->ip(),
-        ];
-        p('======= 来自扫码支付1统一下单结果 ======');
-        p($order = $pay->create($options));
-        // 回复XML文本
-        $result = [
-            'return_code' => 'SUCCESS',
-            'return_msg'  => '处理成功',
-            'appid'       => $notify['appid'],
-            'mch_id'      => $notify['mch_id'],
-            'nonce_str'   => Tools::createNoncestr(),
-            'prepay_id'   => $order['prepay_id'],
-            'result_code' => 'SUCCESS',
-        ];
-        $result['sign'] = $pay->getPaySign($result);
-        p('======= 来自扫码支付1返回的结果 ======');
-        p($result);
-        return Tools::arr2xml($result);
-    }
-
-    /**
-     * 微信JSAPI支付测试
-     * @return string
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     */
-    public function jsapi(): string
-    {
-        $this->url = $this->request->url(true);
-        $this->pay = WechatService::WePayOrder();
-        $user = WechatService::instance()->getWebOauthInfo($this->url);
-        if (empty($user['openid'])) return '<h3>网页授权获取OPENID失败!</h3>';
-        // 生成预支付码
-        $result = $this->pay->create([
-            'body'             => '测试商品',
-            'openid'           => $user['openid'],
-            'total_fee'        => '1',
-            'trade_type'       => 'JSAPI',
-            'notify_url'       => sysuri('wechat/api.test/notify', [], false, true),
-            'out_trade_no'     => CodeExtend::uniqidDate(18),
-            'spbill_create_ip' => $this->request->ip(),
-        ]);
-        // 数据参数格式化
-        $resultJson = var_export($result, true);
-        $optionJson = json_encode($this->pay->jsapiParams($result['prepay_id']), JSON_UNESCAPED_UNICODE);
-        $configJson = json_encode(WechatService::instance()->getWebJssdkSign(), JSON_UNESCAPED_UNICODE);
-        return <<<HTML
-<pre>
-    当前用户OPENID: {$user['openid']}
-    \n\n--- 创建微信预支付码结果 ---\n {$resultJson}
-    \n\n--- JSAPI 及 H5 支付参数 ---\n {$optionJson}
-</pre>
-<button id='paytest' type='button'>JSAPI支付测试</button>
-<script src='//res.wx.qq.com/open/js/jweixin-1.6.0.js'></script>
-<script>
-    wx.config({$configJson});
-    document.getElementById('paytest').onclick = function(){
-        var options = {$optionJson};
-        options.success = function(){
-            alert('支付成功');
-        }
-        wx.chooseWXPay(options);
-    }
-</script>
-HTML;
-    }
-
-    /**
-     * 支付通知接收处理
-     * @return string
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     */
-    public function notify(): string
-    {
-        $wechat = WechatService::WePayOrder();
-        p($wechat->getNotify());
-        return 'SUCCESS';
-    }
-
-    /**
-     * 创建二维码响应对应
-     * @param string $url 二维码内容
-     * @return Response
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException
-     * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException
-     * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException
-     */
-    private function _buildQrcResponse(string $url): Response
-    {
-        $qrCode = new \Endroid\QrCode\QrCode();
-        $qrCode->setText($url)->setSize(300)->setPadding(20)->setImageType('png');
-        return response($qrCode->get(), 200, ['Content-Type' => 'image/png']);
-    }
-}

+ 0 - 96
app/wechat/controller/api/View.php

@@ -1,96 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\controller\api;
-
-use app\wechat\service\MediaService;
-use think\admin\Controller;
-
-/**
- * 微信图文显示
- * Class View
- * @package app\wechat\controller\api
- */
-class View extends Controller
-{
-
-    /**
-     * 图文列表展示
-     * @param string|integer $id 图文ID编号
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function news($id = 0)
-    {
-        $this->id = $id ?: input('id', 0);
-        $this->news = MediaService::instance()->news($this->id);
-        $this->fetch();
-    }
-
-    /**
-     * 文章内容展示
-     * @param string|integer $id 文章ID编号
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function item($id = 0)
-    {
-        $map = ['id' => $id ?: input('id', 0)];
-        $this->app->db->name('WechatNewsArticle')->where($map)->update([
-            'read_num' => $this->app->db->raw('read_num+1'),
-        ]);
-        $this->info = $this->app->db->name('WechatNewsArticle')->where($map)->find();
-        $this->fetch();
-    }
-
-    /**
-     * 文本展示
-     */
-    public function text()
-    {
-        $this->content = strip_tags(input('content', ''), '<a><img>');
-        $this->fetch();
-    }
-
-    /**
-     * 图片展示
-     */
-    public function image()
-    {
-        $this->content = strip_tags(input('content', ''), '<a><img>');
-        $this->fetch();
-    }
-
-    /**
-     * 视频展示
-     */
-    public function video()
-    {
-        $this->url = strip_tags(input('url', ''), '<a><img>');
-        $this->title = strip_tags(input('title', ''), '<a><img>');
-        $this->fetch();
-    }
-
-    /**
-     * 语音展示
-     */
-    public function voice()
-    {
-        $this->url = strip_tags(input('url', ''), '<a><img>');
-        $this->fetch();
-    }
-
-    /**
-     * 音乐展示
-     */
-    public function music()
-    {
-        $this->url = strip_tags(input('url', ''), '<a><img>');
-        $this->desc = strip_tags(input('desc', ''), '<a><img>');
-        $this->title = strip_tags(input('title', ''), '<a><img>');
-        $this->fetch();
-    }
-}

+ 0 - 2
app/wechat/module/change/2020.08.03.00.md

@@ -1,2 +0,0 @@
-* 微信模块初始化成功
-* 这次更新了许多内容哦

+ 0 - 1
app/wechat/module/change/2020.08.28.01.md

@@ -1 +0,0 @@
-代码优化调整

+ 0 - 6
app/wechat/module/module.json

@@ -1,6 +0,0 @@
-{
-  "name": "wechat",
-  "author": "Anyon",
-  "version": "2020.08.28.01",
-  "content": "ThinkAdmin 微信基础模块"
-}

+ 0 - 46
app/wechat/service/AutoService.php

@@ -1,46 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\service;
-
-use think\admin\Service;
-use think\admin\service\QueueService;
-
-/**
- * 关注自动回复服务
- * Class AutoService
- * @package app\wechat\service
- */
-class AutoService extends Service
-{
-    /**
-     * 注册微信用户推送任务
-     * @param string $openid
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function register(string $openid)
-    {
-        foreach ($this->app->db->name('WechatAuto')->where(['status' => 1])->order('time asc')->cursor() as $vo) {
-            [$name, $time] = ["推送客服消息 {$vo['code']}#{$openid}", $this->parseTimeString($vo['time'])];
-            QueueService::instance()->register($name, "xadmin:fansmsg {$openid} {$vo['code']}", $time, []);
-        }
-    }
-
-    /**
-     * 解析配置时间格式
-     * @param string $time
-     * @return int
-     */
-    private function parseTimeString(string $time): int
-    {
-        if (preg_match('|^.*?(\d{2}).*?(\d{2}).*?(\d{2}).*?$|', $time, $vars)) {
-            return intval($vars[1]) * 3600 * intval($vars[2]) * 60 + intval($vars[3]);
-        } else {
-            return 0;
-        }
-    }
-}

+ 0 - 52
app/wechat/service/FansService.php

@@ -1,52 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\service;
-
-use think\admin\Service;
-
-/**
- * 微信粉丝信息
- * Class FansService
- * @package app\wechat\service
- */
-class FansService extends Service
-{
-
-    /**
-     * 增加或更新粉丝信息
-     * @param array $user 粉丝信息
-     * @param string $appid 微信APPID
-     * @return boolean
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function set(array $user, string $appid = ''): bool
-    {
-        if (isset($user['subscribe_time'])) {
-            $user['subscribe_at'] = date('Y-m-d H:i:s', $user['subscribe_time']);
-        }
-        if (isset($user['tagid_list']) && is_array($user['tagid_list'])) {
-            $user['tagid_list'] = arr2str($user['tagid_list'] ?? []);
-        }
-        if ($appid !== '') $user['appid'] = $appid;
-        unset($user['privilege'], $user['groupid']);
-        $this->app->event->trigger('WechatFansUpdate', $user);
-        return !!data_save('WechatFans', $user, 'openid');
-    }
-
-    /**
-     * 获取粉丝信息
-     * @param string $openid
-     * @return array
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function get(string $openid): array
-    {
-        return $this->app->db->name('WechatFans')->where(['openid' => $openid])->find() ?: [];
-    }
-}

+ 0 - 83
app/wechat/service/MediaService.php

@@ -1,83 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\service;
-
-use think\admin\Service;
-use think\admin\Storage;
-use WeChat\Contracts\MyCurlFile;
-
-/**
- * 微信素材管理
- * Class MediaService
- * @package app\wechat\service
- */
-class MediaService extends Service
-{
-    /**
-     * 通过图文ID读取图文信息
-     * @param mixed $id 本地图文ID
-     * @param array $map 额外的查询条件
-     * @return array
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function news($id, array $map = []): array
-    {
-        // 文章主体数据
-        $where = ['id' => $id, 'is_deleted' => 0];
-        $data = $this->app->db->name('WechatNews')->where($where)->where($map)->find();
-        if (empty($data)) return [];
-        // 文章内容编号
-        $data['articles'] = [];
-        $data['articleids'] = str2arr($data['article_id']);
-        if (empty($data['articleids'])) return $data;
-        // 文章内容集合
-        $query = $this->app->db->name('WechatNewsArticle');
-        $query->whereIn('id', $data['articleids'])->orderField('id', $data['articleids']);
-        $data['articles'] = $query->withoutField('create_by,create_at')->select()->toArray();
-        return $data;
-    }
-
-    /**
-     * 上传图片永久素材
-     * @param string $url 文件地址
-     * @param string $type 文件类型
-     * @param array $video 视频信息
-     * @return string media_id
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function upload(string $url, string $type = 'image', array $video = []): string
-    {
-        $map = ['md5' => md5($url), 'appid' => WechatService::instance()->getAppid()];
-        if (($mediaId = $this->app->db->name('WechatMedia')->where($map)->value('media_id'))) return $mediaId;
-        $result = WechatService::WeChatMedia()->addMaterial(self::_buildCurlFile($url), $type, $video);
-        data_save('WechatMedia', [
-            'local_url' => $url, 'md5' => $map['md5'], 'type' => $type, 'appid' => $map['appid'],
-            'media_url' => $result['url'] ?? '', 'media_id' => $result['media_id'],
-        ], 'type', $map);
-        return $result['media_id'];
-    }
-
-    /**
-     * 创建 CURL 文件对象
-     * @param string $local 文件路径或网络地址
-     * @return MyCurlFile
-     * @throws \WeChat\Exceptions\LocalCacheException
-     */
-    private function _buildCurlFile(string $local): MyCurlFile
-    {
-        if (file_exists($local)) {
-            return new MyCurlFile($local);
-        } else {
-            return new MyCurlFile(Storage::down($local)['file']);
-        }
-    }
-}

+ 0 - 279
app/wechat/service/WechatService.php

@@ -1,279 +0,0 @@
-<?php
-
-
-
-namespace app\wechat\service;
-
-use think\admin\extend\JsonRpcClient;
-use think\admin\Service;
-use think\admin\storage\LocalStorage;
-use think\exception\HttpResponseException;
-
-/**
- * Class WechatService
- * @package app\wechat\serivce
- *
- * @method \WeChat\Card WeChatCard() static 微信卡券管理
- * @method \WeChat\Custom WeChatCustom() static 微信客服消息
- * @method \WeChat\Limit WeChatLimit() static 接口调用频次限制
- * @method \WeChat\Media WeChatMedia() static 微信素材管理
- * @method \WeChat\Menu WeChatMenu() static 微信菜单管理
- * @method \WeChat\Oauth WeChatOauth() static 微信网页授权
- * @method \WeChat\Pay WeChatPay() static 微信支付商户
- * @method \WeChat\Product WeChatProduct() static 微信商店管理
- * @method \WeChat\Qrcode WeChatQrcode() static 微信二维码管理
- * @method \WeChat\Receive WeChatReceive() static 微信推送管理
- * @method \WeChat\Scan WeChatScan() static 微信扫一扫接入管理
- * @method \WeChat\Script WeChatScript() static 微信前端支持
- * @method \WeChat\Shake WeChatShake() static 微信揺一揺周边
- * @method \WeChat\Tags WeChatTags() static 微信用户标签管理
- * @method \WeChat\Template WeChatTemplate() static 微信模板消息
- * @method \WeChat\User WeChatUser() static 微信粉丝管理
- * @method \WeChat\Wifi WeChatWifi() static 微信门店WIFI管理
- *
- * ----- WeMini -----
- * @method \WeMini\Account WeMiniAccount() static 小程序账号管理
- * @method \WeMini\Basic WeMiniBasic() static 小程序基础信息设置
- * @method \WeMini\Code WeMiniCode() static 小程序代码管理
- * @method \WeMini\Domain WeMiniDomain() static 小程序域名管理
- * @method \WeMini\Tester WeMinitester() static 小程序成员管理
- * @method \WeMini\User WeMiniUser() static 小程序帐号管理
- * --------------------
- * @method \WeMini\Crypt WeMiniCrypt() static 小程序数据加密处理
- * @method \WeMini\Delivery WeMiniDelivery() static 小程序即时配送
- * @method \WeMini\Image WeMiniImage() static 小程序图像处理
- * @method \WeMini\Logistics WeMiniLogistics() static 小程序物流助手
- * @method \WeMini\Message WeMiniMessage() static 小程序动态消息
- * @method \WeMini\Ocr WeMiniOcr() static 小程序ORC服务
- * @method \WeMini\Plugs WeMiniPlugs() static 小程序插件管理
- * @method \WeMini\Poi WeMiniPoi() static 小程序地址管理
- * @method \WeMini\Qrcode WeMiniQrcode() static 小程序二维码管理
- * @method \WeMini\Security WeMiniSecurity() static 小程序内容安全
- * @method \WeMini\Soter WeMiniSoter() static 小程序生物认证
- * @method \WeMini\Template WeMiniTemplate() static 小程序模板消息支持
- * @method \WeMini\Total WeMiniTotal() static 小程序数据接口
- * @method \WeMini\Newtmpl WeMiniNewtmpl() static 小程序订阅消息支持
- *
- * ----- WePay -----
- * @method \WePay\Bill WePayBill() static 微信商户账单及评论
- * @method \WePay\Order WePayOrder() static 微信商户订单
- * @method \WePay\Refund WePayRefund() static 微信商户退款
- * @method \WePay\Coupon WePayCoupon() static 微信商户代金券
- * @method \WePay\Redpack WePayRedpack() static 微信红包支持
- * @method \WePay\Transfers WePayTransfers() static 微信商户打款到零钱
- * @method \WePay\TransfersBank WePayTransfersBank() static 微信商户打款到银行卡
- *
- * ----- WeOpen -----
- * @method \WeOpen\Login WeOpenLogin() static 第三方微信登录
- * @method \WeOpen\Service WeOpenService() static 第三方服务
- *
- * ----- ThinkService -----
- * @method mixed ThinkServiceConfig() static 平台服务配置
- */
-class WechatService extends Service
-{
-
-    /**
-     * 静态初始化对象
-     * @param string $name
-     * @param array $arguments
-     * @return mixed
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public static function __callStatic(string $name, array $arguments)
-    {
-        [$type, $class, $classname] = static::parseName($name);
-        if ("{$type}{$class}" !== $name) {
-            throw new \think\admin\Exception("抱歉,实例 {$name} 不在符合规则!");
-        }
-        if (sysconf('wechat.type') === 'api' || $type === 'WePay') {
-            if ($type === 'ThinkService') {
-                throw new \think\admin\Exception("抱歉,接口模式不能实例 {$classname} 对象!");
-            }
-            return new $classname(static::instance()->getConfig());
-        } else {
-            [$appid, $appkey] = [sysconf('wechat.thr_appid'), sysconf('wechat.thr_appkey')];
-            $data = ['class' => $name, 'appid' => $appid, 'time' => time(), 'nostr' => uniqid()];
-            $data['sign'] = md5("{$data['class']}#{$appid}#{$appkey}#{$data['time']}#{$data['nostr']}");
-            // 创建远程连接,默认使用 JSON RPC 方式
-            $token = enbase64url(json_encode($data, JSON_UNESCAPED_UNICODE));
-            $client = new JsonRpcClient("https://open.cuci.cc/service/api.client/jsonrpc?not_init_session=1&token={$token}");
-            if (is_numeric(stripos($client->__call('_get_class_name_', []), 'Exception'))) {
-                throw new \think\admin\Exception($client->getMessage(), $client->getCode());
-            }
-            return $client;
-        }
-    }
-
-    /**
-     * 解析调用对象名称
-     * @param string $name
-     * @return array
-     */
-    private static function parseName(string $name): array
-    {
-        foreach (['WeChat', 'WeMini', 'WeOpen', 'WePay', 'ThinkService'] as $type) {
-            if (strpos($name, $type) === 0) {
-                [, $class] = explode($type, $name);
-                return [$type, $class, "\\{$type}\\{$class}"];
-            }
-        }
-        return ['-', '-', $name];
-    }
-
-    /**
-     * 获取当前微信APPID
-     * @return string
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function getAppid(): string
-    {
-        if ($this->getType() === 'api') {
-            return sysconf('wechat.appid');
-        } else {
-            return sysconf('wechat.thr_appid');
-        }
-    }
-
-    /**
-     * 获取接口授权模式
-     * @return string
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function getType(): string
-    {
-        $type = strtolower(sysconf('wechat.type'));
-        if (in_array($type, ['api', 'thr'])) return $type;
-        throw new \think\admin\Exception('请在后台配置微信对接授权模式');
-    }
-
-    /**
-     * 获取公众号配置参数
-     * @return array
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function getConfig(): array
-    {
-        $options = [
-            'appid'          => $this->getAppid(),
-            'token'          => sysconf('wechat.token'),
-            'appsecret'      => sysconf('wechat.appsecret'),
-            'encodingaeskey' => sysconf('wechat.encodingaeskey'),
-            'mch_id'         => sysconf('wechat.mch_id'),
-            'mch_key'        => sysconf('wechat.mch_key'),
-            'cache_path'     => $this->app->getRuntimePath() . 'wechat',
-        ];
-        $local = LocalStorage::instance();
-        switch (strtolower(sysconf('wechat.mch_ssl_type'))) {
-            case 'p12':
-                $options['ssl_p12'] = $local->path(sysconf('wechat.mch_ssl_p12'), true);
-                break;
-            case 'pem':
-                $options['ssl_key'] = $local->path(sysconf('wechat.mch_ssl_key'), true);
-                $options['ssl_cer'] = $local->path(sysconf('wechat.mch_ssl_cer'), true);
-                break;
-        }
-        return $options;
-    }
-
-    /**
-     * 通过网页授权获取粉丝信息
-     * @param string $source 回跳URL地址
-     * @param integer $isfull 获取资料模式
-     * @param boolean $redirect 是否直接跳转
-     * @return array
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function getWebOauthInfo(string $source, $isfull = 0, $redirect = true): array
-    {
-        $appid = $this->getAppid();
-        $openid = $this->app->session->get("{$appid}_openid");
-        $userinfo = $this->app->session->get("{$appid}_fansinfo");
-        if ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) {
-            empty($userinfo) || FansService::instance()->set($userinfo, $appid);
-            return ['openid' => $openid, 'fansinfo' => $userinfo];
-        }
-        if ($this->getType() === 'api') {
-            // 解析 GET 参数
-            parse_str(parse_url($source, PHP_URL_QUERY), $params);
-            $getVars = [
-                'code'  => $params['code'] ?? input('code', ''),
-                'rcode' => $params['rcode'] ?? input('rcode', ''),
-                'state' => $params['state'] ?? input('state', ''),
-            ];
-            $wechat = static::WeChatOauth();
-            if ($getVars['state'] !== $appid || empty($getVars['code'])) {
-                $params['rcode'] = enbase64url($source);
-                $location = strstr("{$source}?", '?', true) . '?' . http_build_query($params);
-                $oauthurl = $wechat->getOauthRedirect($location, $appid, $isfull ? 'snsapi_userinfo' : 'snsapi_base');
-                throw new HttpResponseException($redirect ? redirect($oauthurl, 301) : response("location.href='{$oauthurl}'"));
-            } elseif (($token = $wechat->getOauthAccessToken($getVars['code'])) && isset($token['openid'])) {
-                $this->app->session->set("{$appid}_openid", $openid = $token['openid']);
-                if ($isfull && isset($token['access_token'])) {
-                    $userinfo = $wechat->getUserInfo($token['access_token'], $openid);
-                    $this->app->session->set("{$appid}_fansinfo", $userinfo);
-                    empty($userinfo) || FansService::instance()->set($userinfo, $appid);
-                }
-            }
-            if ($getVars['rcode']) {
-                $location = debase64url($getVars['rcode']);
-                throw new HttpResponseException($redirect ? redirect($location, 301) : response("location.href='{$location}'"));
-            } elseif ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) {
-                return ['openid' => $openid, 'fansinfo' => $userinfo];
-            } else {
-                throw new \think\admin\Exception('Query params [rcode] not find.');
-            }
-        } else {
-            $result = static::ThinkServiceConfig()->oauth($this->app->session->getId(), $source, $isfull);
-            $this->app->session->set("{$appid}_openid", $openid = $result['openid']);
-            $this->app->session->set("{$appid}_fansinfo", $userinfo = $result['fans']);
-            if ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) {
-                empty($userinfo) || FansService::instance()->set($userinfo, $appid);
-                return ['openid' => $openid, 'fansinfo' => $userinfo];
-            }
-            if ($redirect) {
-                throw new HttpResponseException(redirect($result['url'], 301));
-            } else {
-                throw new HttpResponseException(response("location.href='{$result['url']}'"));
-            }
-        }
-    }
-
-    /**
-     * 获取微信网页JSSDK签名参数
-     * @param null|string $location 签名地址
-     * @return array
-     * @throws \WeChat\Exceptions\InvalidResponseException
-     * @throws \WeChat\Exceptions\LocalCacheException
-     * @throws \think\admin\Exception
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\DbException
-     * @throws \think\db\exception\ModelNotFoundException
-     */
-    public function getWebJssdkSign(?string $location = null): array
-    {
-        $location = $location ?: $this->app->request->url(true);
-        if ($this->getType() === 'api') {
-            return static::WeChatScript()->getJsSign($location);
-        } else {
-            return static::ThinkServiceConfig()->jsSign($location);
-        }
-    }
-}

+ 0 - 18
app/wechat/sys.php

@@ -1,18 +0,0 @@
-<?php
-
-
-
-use app\wechat\command\Auto;
-use app\wechat\command\Fans;
-use app\wechat\service\AutoService;
-use think\Console;
-
-if (app()->request->isCli()) {
-    Console::starting(function (Console $console) {
-        $console->addCommands([Fans::class, Auto::class]);
-    });
-} else {
-    app()->event->listen('WechatFansSubscribe', function ($openid) {
-        AutoService::instance()->register($openid);
-    });
-}

+ 0 - 36
app/wechat/view/api/login/failed.html

@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-<head>
-    <title>扫码登录失败</title>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
-    <link rel="stylesheet" href="__ROOT__/static/theme/css/mobile.css">
-    <style>
-        header {
-            padding: 16vh 0;
-            text-align: center;
-        }
-
-        header img {
-            width: 40vw;
-        }
-
-        header div {
-            color: rgb(240, 91, 41);
-            font-size: 7vw;
-            margin-top: 8vh;
-            font-weight: bold;
-            letter-spacing: 2px;
-        }
-    </style>
-</head>
-<body>
-<div>
-    <header>
-        <img alt="img" src="__ROOT__/static/theme/img/wechat/m-icon-error.png">
-        <div>{$message|default='授权失败'}</div>
-    </header>
-</div>
-</body>
-</html>

+ 0 - 53
app/wechat/view/api/login/success.html

@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-<head>
-    <title>扫码登录成功</title>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
-    <link rel="stylesheet" href="__ROOT__/static/theme/css/mobile.css">
-    <style>
-        header {
-            padding: 16vh 0;
-            text-align: center;
-        }
-
-        header img {
-            width: 40vw;
-        }
-
-        header div {
-            font-size: 7vw;
-            margin-top: 8vh;
-            color: rgb(49, 131, 238);
-            font-weight: bold;
-            letter-spacing: 2px;
-        }
-
-        .container {
-            font-size: 4vw;
-            margin-top: 10vh;
-        }
-
-        .container p {
-            text-indent: 10vw;
-            line-height: 2em;
-        }
-
-        .container p span {
-            color: #888
-        }
-    </style>
-</head>
-<body>
-<div>
-    <header>
-        <img alt="img" src="__ROOT__/static/theme/img/wechat/m-icon-success.png">
-        <div>{$message|default='授权成功'}</div>
-    </header>
-    <div class="container">
-        <p>授权时间:<span>{:date('Y年m月d日H:i')}</span></p>
-    </div>
-</div>
-</body>
-</html>

+ 0 - 64
app/wechat/view/api/test/jssdk.html

@@ -1,64 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-<head>
-    <meta charset="utf-8">
-    <title>JSSDK 功能测试</title>
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
-    <link rel="stylesheet" href="__ROOT__/static/theme/css/mobile.css">
-</head>
-
-<body>
-
-<header>
-    <h1>JSSDK 功能测试</h1>
-</header>
-
-<div class="content">
-    <button type="button" id='show-alert'>调起摄像头扫码</button>
-</div>
-
-<style>
-    header {
-        padding: 35px 0
-    }
-
-    header h1 {
-        color: #3cc51f;
-        font-size: 34px;
-        text-align: center;
-        font-weight: 400;
-    }
-
-    .content {
-        padding: 15px;
-        text-align: center;
-    }
-
-    .content button {
-        padding: 5px
-    }
-</style>
-
-<script src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
-<script>
-    wx.error(function (err) {
-        alert(err.errMsg || '配置出错');
-    });
-    wx.config(JSON.parse('{$options|json_encode|raw}'));
-    wx.ready(function () {
-        alert('- 初始化成功 -');
-        document.getElementById('show-alert').onclick = function () {
-            wx.scanQRCode({
-                needResult: 1,
-                scanType: ["qrCode", "barCode"],
-                success: function (res) {
-                    alert(res.resultStr);
-                }
-            });
-        }
-    });
-</script>
-</body>
-
-</html>

+ 0 - 55
app/wechat/view/api/test/oauth.html

@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-
-<head>
-    <meta charset="UTF-8">
-    <title>微信网页授权测试</title>
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
-    <link rel="stylesheet" href="__ROOT__/static/theme/css/mobile.css">
-    <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
-</head>
-
-<body>
-{if empty($fans.fansinfo)}
-<fieldset style="width:80%;margin:1rem auto">
-    <legend style="padding:0.2rem 0.3rem;font-size:0.9rem;color:#666">操作失败</legend>
-    <div style="padding-top:0.4rem">
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">通过网页授权获取用户资料失败,请检查权限再试!</p>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">
-            <a href="javascript:void(0);" onclick="location.reload()">重新获取(刷新)</a>
-        </p>
-    </div>
-</fieldset>
-{else}
-<div class="header" style="padding:1rem 0 0.6rem 0;text-align:center">
-    <img alt="img" style='width:132px;height:132px;border-radius:50%;border:0.6rem solid rgba(150,40,40,0.6)' src="{$fans.fansinfo.headimgurl}">
-    <h1>{$fans.fansinfo.nickname}</h1>
-</div>
-<fieldset style="width:80%;margin:0.6rem auto">
-    <legend style="padding:0.2rem 0.3rem;font-size:0.9rem;color:#666">用户标识</legend>
-    <div style="padding-top:0.4rem">
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">OPENID</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{$fans.fansinfo.openid}</p>
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">UNIONID</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{$fans.fansinfo.unionid|default='未获取到'}</p>
-    </div>
-</fieldset>
-<fieldset style="width:80%;margin:0.6rem auto">
-    <legend style="padding:0.2rem 0.3rem;font-size:0.9rem;color:#666">详细资料</legend>
-    <div style="padding-top:0.4rem">
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">性别</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{:[1=>'男',2=>'女'][$fans.fansinfo.sex]??'未知'}</p>
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">系统语言</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{$fans.fansinfo.language}</p>
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">所在区域</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{$fans.fansinfo.country} - {$fans.fansinfo.province} - {$fans.fansinfo.city}</p>
-        {if isset($fans.fansinfo.privilege.0)}
-        <div style="font-size:0.8rem;margin-bottom:0.3rem;color:#999">设备网络</div>
-        <p style="font-size:0.6rem;margin-bottom:0.8rem">{$fans.fansinfo.privilege.0|default='未获取到网络信息'}</p>
-        {/if}
-    </div>
-</fieldset>
-{/if}
-</body>
-</html>

+ 0 - 28
app/wechat/view/api/view/image.html

@@ -1,28 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    <div class="logo">Ta</div>
-    <div class="content"><img src="{$content|default=''}" alt="img"></div>
-</div>
-{/block}
-
-{block name='style'}
-<style>
-    .container .content {
-        border: none !important;
-        display: inline-block;
-        padding: 0 !important;
-        position: relative;
-        border-radius: 5px;
-        background: none;
-    }
-
-    .container .content img {
-        max-width: 100%;
-        border-radius: 5px;
-        box-shadow: 0 0 3px #666;
-    }
-</style>
-{/block}

+ 0 - 72
app/wechat/view/api/view/item.html

@@ -1,72 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='title'}{/block}
-
-{block name='content'}
-<div class="container">
-    {notempty name='info'}
-    <h2>{$info.title|default=''}</h2>
-    <h3>
-        <span style="color:#666">{$info.author}</span>
-        <span style="margin-left:0.4rem">{:date('Y年m月d日',strtotime($info.create_at))}</span>
-    </h3>
-    {if $info.show_cover_pic and $info.local_url}<img src="{$info.local_url}" style="width:100%" alt="img">{/if}
-    <div class='content-text'>{$info.content|raw}</div>
-    <div class="content-read">阅读 {$info.read_num}</div>
-    {else}
-    <div class="info"><h3>404</h3> 访问资源不存在哦!</div>
-    {/notempty}
-</div>
-{/block}
-
-{block name='style'}
-<style>
-    html {
-        width: 100%;
-        height: 100%;
-        display: block;
-        background: white;
-    }
-
-    .container {
-        width: 90%;
-        color: #333;
-        display: block;
-        margin: .2rem auto;
-        position: relative
-    }
-
-    .container h2 {
-        font-size: .8rem;
-        font-weight: 400;
-        line-height: 1.5rem
-    }
-
-    .container h3 {
-        color: #999;
-        font-size: .6rem;
-        font-weight: 400;
-        line-height: 1.5rem;
-        margin-bottom: .3rem
-    }
-
-    .container .content-read {
-        color: #999;
-        font-size: 0.6rem;
-        text-align: right;
-        margin-top: 0.5rem;
-        line-height: 2rem;
-        padding-bottom: 1rem;
-    }
-
-    .container .content-text {
-        font-size: .7rem;
-        line-height: 1.3rem
-    }
-
-    .container .content-text img {
-        max-width: 100%;
-        height: auto !important
-    }
-</style>
-{/block}

+ 0 - 20
app/wechat/view/api/view/main.html

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="utf-8">
-    {block name='title'}{/block}
-    <meta name="renderer" content="webkit">
-    <meta name="format-detection" content="telephone=no">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="apple-mobile-web-app-status-bar-style" content="black">
-    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
-    <link rel="shortcut icon" href="{:sysconf('site_icon')}">
-    <link rel="stylesheet" href="__ROOT__/static/plugs/layui/css/layui.css">
-    <link rel="stylesheet" href="__ROOT__/static/theme/css/mobile.css">
-    {block name='style'}{/block}
-    <script src="__ROOT__/static/plugs/jquery/pace.min.js"></script>
-</head>
-<body>{block name='content'}{/block}</body>
-</html>

+ 0 - 78
app/wechat/view/api/view/music.html

@@ -1,78 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    <div class="logo">Ta</div>
-    <div class="content arrow" style="white-space:nowrap">
-        <div style="display:inline-block;overflow:hidden;text-overflow: ellipsis">
-            <div class="content-title">{$title|default=''}</div>
-            <div class="content-content">{$desc|default=''}</div>
-        </div>
-        <a href="javascript:void(0)" id="AudioBtn" class="content-button icon icon-play"></a>
-    </div>
-</div>
-<audio style="display:none" id="AudioSrc">
-    <source src="{$url|default=''}">
-</audio>
-<script>
-    (function (audio, button) {
-        audio.onerror = function () {
-            button.className = 'icon icon-play';
-        };
-        button.onclick = function () {
-            audio.paused ? audio.play() : audio.pause()
-        };
-        button.onapply = function () {
-            button.className = audio.paused ? 'icon icon-play' : 'icon icon-pause';
-        };
-        setInterval(button.onapply, 500), button.onapply();
-    })(document.getElementById('AudioSrc'), document.getElementById('AudioBtn'));
-</script>
-{/block}
-
-{block name='style'}
-<style>
-    .content {
-        color: #fff;
-        width: 58vw !important;
-        border: none !important;
-        background: #080 !important;
-        white-space: nowrap !important
-    }
-
-    .content-title {
-        width: 7.5rem;
-        overflow: hidden;
-        font-size: .6rem;
-        text-overflow: ellipsis
-    }
-
-    .content-button {
-        top: 1.4rem;
-        float: right;
-        right: 0.8rem;
-        position: absolute;
-    }
-
-    .content-content {
-        color: #ccc;
-        width: 7.5rem;
-        overflow: hidden;
-        font-size: .5rem;
-        text-overflow: ellipsis;
-    }
-
-    .content .icon {
-        color: #fff;
-        top: -.5rem;
-        font-size: 1.5rem;
-        position: relative;
-    }
-
-    .container .content:after,
-    .container .content:before {
-        border-color: transparent #080 transparent transparent !important
-    }
-</style>
-{/block}

+ 0 - 147
app/wechat/view/api/view/news.html

@@ -1,147 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    {notempty name='news.articles'} {foreach $news.articles as $k => $v} {if $k < 1}
-    <a href="{:url('wechat/api.view/item')}?id={$v.id}" data-lazy-src="{$v.local_url}" class="item">
-        {if $v.title}<span>{$v.title}</span>{/if}
-    </a>
-    {else}
-    <div class="hr-line-dashed"></div>
-    <a href="{:url('wechat/api.view/item')}?id={$v.id}" class='other'>
-        <span>{$v.title}</span><span data-lazy-src="{$v.local_url}"></span>
-    </a>
-    {/if} {/foreach} {else}
-    <div class="info"><h3>404</h3> 访问资源不存在哦!</div>
-    {/notempty}
-</div>
-<script>
-    document.querySelectorAll('[data-lazy-src]').forEach(function (elem) {
-        elem.style.backgroundImage = 'url(' + elem.dataset.lazySrc + ')';
-    });
-</script>
-{/block}
-
-{block name='style'}
-<style>
-    html {
-        width: 100%;
-        height: 100%;
-        display: block;
-        background: #f0f0f0;
-    }
-
-    .header {
-        margin-top: 15px;
-        text-align: center
-    }
-
-    .header span {
-        padding: 1px 5px;
-        font-size: 12px;
-        line-height: 12px;
-        background: #aaa;
-        box-shadow: 0 0 1px #666
-    }
-
-    .container {
-        width: 90%;
-        display: block;
-        margin: 5vw auto;
-        position: relative;
-        border-radius: 5px;
-        background: white;
-        box-shadow: 0 0 2px rgba(0, 0, 0, .5);
-    }
-
-    .container a.item {
-        height: 50vw;
-        display: block;
-        position: relative;
-        background: no-repeat center center;
-        background-size: cover;
-    }
-
-    .container a.item:first-child {
-        border-top-left-radius: 5px;
-        border-top-right-radius: 5px;
-    }
-
-    .container a.item:last-child, .container a.item:last-child span {
-        border-bottom-left-radius: 5px;
-        border-bottom-right-radius: 5px;
-    }
-
-    .container a span {
-        left: -1px;
-        right: -1px;
-        bottom: 0;
-        color: #fff;
-        padding: 2vw;
-        font-size: 2vw;
-        max-height: 5em;
-        overflow: hidden;
-        position: absolute;
-        line-height: 2em;
-        white-space: nowrap;
-        text-overflow: ellipsis;
-        background: rgba(0, 0, 0, .7);
-    }
-
-    .container a.other {
-        height: 15vw;
-        display: block;
-        padding: 1vw 2vw;
-        position: relative
-    }
-
-    .container a.other span:first-child {
-        color: #333;
-        float: left;
-        width: 60vw;
-        height: 10vw;
-        overflow: hidden;
-        max-height: none;
-        position: relative;
-        background: 0 0;
-        text-overflow: ellipsis
-    }
-
-    .container a.other span:last-child {
-        width: 16vw;
-        height: 10vw;
-        float: right;
-        max-height: none;
-        position: relative;
-        background-size: cover;
-        background-position: center center
-    }
-
-    .info {
-        color: #666;
-        padding: 2rem;
-        font-size: .5rem;
-        text-align: center;
-        letter-spacing: 1px
-    }
-
-    .info h3 {
-        color: #333;
-        font-size: 5vw;
-        margin-bottom: 1rem
-    }
-
-    .hr-line-dashed {
-        color: #fff;
-        height: 1px;
-        margin: 3px 0;
-        border-top: 1px dashed #e7eaec
-    }
-
-    .hr-line-dashed:last-child {
-        display: none
-    }
-</style>
-
-{/block}

+ 0 - 9
app/wechat/view/api/view/text.html

@@ -1,9 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    <div class="logo">Ta</div>
-    <div class="content arrow">{$content|default=''}</div>
-</div>
-{/block}

+ 0 - 44
app/wechat/view/api/view/video.html

@@ -1,44 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    <div class="content">
-        <div>{$title|default=''}</div>
-        <div class="date">{:date('m月d日')}</div>
-        <video src="{$url|default=''}" width="100%" controls preload></video>
-    </div>
-</div>
-{/block}
-
-{block name='style'}
-<style>
-    .container .content {
-        left: 0 !important;
-        border: 1px solid #ccc;
-        padding: 13px;
-        position: relative;
-        max-width: initial !important;
-        background: #fff;
-        line-height: 1.5em;
-        border-radius: 5px
-    }
-
-    .container .content div {
-        width: 100%;
-        overflow: hidden;
-        font-size: .8rem;
-        line-height: 1.5em;
-        display: inline-block;
-        text-overflow: ellipsis
-    }
-
-    .container .content .date {
-        color: #999;
-        margin: 10px 0;
-        font-size: 12px;
-        line-height: 1em
-    }
-</style>
-
-{/block}

+ 0 - 45
app/wechat/view/api/view/voice.html

@@ -1,45 +0,0 @@
-{extend name='api/view/main'}
-
-{block name='content'}
-<div class="header"><span>{:date('H:i')}</span></div>
-<div class="container">
-    <div class="logo">A</div>
-    <div class="content arrow">
-        <a class="icon icon-volume left-text"></a>
-        <a href="javascript:void(0)" id="AudioBtn" class="icon icon-pause"></a>
-        <audio id="AudioSrc">
-            <source src="{$url|default=''}">
-        </audio>
-    </div>
-</div>
-<script>
-    (function (audio, button) {
-        audio.onerror = function () {
-            button.className = 'icon icon-play';
-        };
-        button.onclick = function () {
-            audio.paused ? audio.play() : audio.pause()
-        };
-        button.onapply = function () {
-            button.className = audio.paused ? 'icon icon-play' : 'icon icon-pause';
-        };
-        setInterval(button.onapply, 500), button.onapply();
-    })(document.getElementById('AudioSrc'), document.getElementById('AudioBtn'));
-</script>
-{/block}
-
-{block name='style'}
-<style>
-    .left-text {
-        margin: 0 !important;
-        color: #ccc !important
-    }
-
-    .icon {
-        color: #666;
-        font-size: 1.5rem;
-        margin-left: 2.5rem;
-        line-height: 1.5rem
-    }
-</style>
-{/block}

+ 0 - 266
app/wechat/view/auto/form.html

@@ -1,266 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="style"}
-<style>
-    .keys-container .layui-card {
-        width: 580px;
-        height: 578px;
-        position: absolute;
-        border: 1px solid #ccc
-    }
-
-    .keys-container .layui-card .layui-card-body {
-        height: 495px;
-        padding-right: 50px
-    }
-
-    .keys-container .layui-card .layui-card-body [data-tips-image] {
-        width: 112px;
-        height: auto
-    }
-
-    .keys-container .layui-card .layui-card-body .layui-form-label {
-        width: 60px;
-        color: #6c6c6c;
-        font-weight: 700;
-    }
-
-    .keys-container .layui-card .layui-card-body .layui-form-label + .layui-input-block {
-        margin-left: 100px;
-    }
-</style>
-{/block}
-
-{block name="content"}
-<div class="nowrap think-box-shadow" style="width:910px">
-    <div class='mobile-preview inline-block'>
-        <div class='mobile-header'>公众号</div>
-        <div class='mobile-body' data-iframe-box></div>
-    </div>
-    <div class="keys-container inline-block absolute margin-left-10 margin-right-15">
-        <form class="layui-form" onsubmit="return false" autocomplete="off" data-auto="true" action="{:request()->url()}" method="post">
-            <div class="layui-card relative">
-                <div class="layui-card-header layui-bg-gray text-center">编辑关键字</div>
-                <div class="layui-card-body">
-                    <div class="layui-form-item margin-top-10">
-                        <label class="layui-form-label">延迟时间</label>
-                        <div class="layui-input-block">
-                            <input required readonly placeholder='请输入延迟时间' maxlength='20' id="timeInput" name='time' class="layui-input" value='{$vo.time|default="00小时00分00秒"}'>
-                            <script>layui.laydate.render({elem: '#timeInput', type: "time", format: 'HH小时mm分ss秒', btns: ['confirm']});</script>
-                        </div>
-                    </div>
-                    <div class="layui-form-item">
-                        <label class="layui-form-label label-required">规则状态</label>
-                        <div class="layui-input-block">
-                            {foreach ['1'=>'启用','0'=>'禁用'] as $k=>$v}
-                            <label class="think-radio">
-                                <!--{if (!isset($vo.status) and $k eq '1') or (isset($vo.status) and $vo.status eq $k)}-->
-                                <input type="radio" checked name="status" value="{$k}"> {$v}
-                                <!--{else}-->
-                                <input type="radio" name="status" value="{$k}"> {$v}
-                                <!--{/if}-->
-                            </label>
-                            {/foreach}
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item">
-                        <label class="layui-form-label label-required">消息类型</label>
-                        <div class="layui-input-block">
-                            {foreach $types as $k=>$v}
-                            <label class="think-radio">
-                                <!--{if (!isset($vo.type) and $k eq 'text') or (isset($vo.type) and$vo.type eq $k)}-->
-                                <input name="type" checked type="radio" value="{$k}"> {$v}
-                                <!--{else}-->
-                                <input name="type" type="radio" value="{$k}"> {$v}
-                                <!--{/if}-->
-                            </label>
-                            {/foreach}
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='text'>
-                        <label class="layui-form-label">回复文字</label>
-                        <div class="layui-input-block">
-                            <textarea name="content" required placeholder="请输入回复文字" maxlength="10000" class="layui-textarea">{$vo.content|raw|default='说点什么吧'}</textarea>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='news'>
-                        <label class="layui-form-label label-required">选取图文</label>
-                        <div class="layui-input-block">
-                            <input type="hidden" name="news_id" value="{$vo.news_id|default=0}">
-                            <a class="layui-btn layui-btn-sm layui-btn-primary" data-title="选择图文" data-iframe="{:url('wechat/news/select')}?field={:encode('news_id')}">选择图文</a>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='image'>
-                        <label class="layui-form-label label-required">图片地址</label>
-                        <div class="layui-input-block">
-                            <input class="layui-input padding-right-30" onchange="$(this).nextAll('img').attr('src', this.value)" value="{$vo.image_url|default=$defaultImage}" name="image_url" required placeholder="请上传图片或输入图片URL地址  ">
-                            <a data-file="btn" data-type="bmp,png,jpeg,jpg,gif" data-field="image_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大2Mb,支持bmp/png/jpeg/jpg/gif格式</p>
-                            <img data-tips-image src='{$vo.image_url|default=$defaultImage}' alt="img">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='voice'>
-                        <label class="layui-form-label">上传语音</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.voice_url|default=''}" name="voice_url" required title="请上传语音文件或输入语音URL地址  ">
-                            <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="voice_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大2Mb,播放长度不超过60s,mp3/wma/wav/amr格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐标题</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input' value="{$vo.music_title|default='音乐标题'}" name="music_title" required title="请输入音乐标题">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label label-required">上传音乐</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.music_url|default=''}" name="music_url" required title="请上传音乐文件或输入音乐URL地址  ">
-                            <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="music_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐描述</label>
-                        <div class="layui-input-block">
-                            <input name="music_desc" class="layui-input" value="{$vo.music_desc|default='音乐描述'|raw}">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐图片</label>
-                        <div class="layui-input-block">
-                            <input class="layui-input padding-right-30" value="{$vo.music_image|default=$defaultImage}" name="music_image" required title="请上传音乐图片或输入音乐图片URL地址  ">
-                            <a data-file="btn" data-type="jpg,png" data-field="music_image" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大64KB,只支持JPG格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">视频标题</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input' value="{$vo.video_title|default='视频标题'}" name="video_title" required placeholder="请输入视频标题">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">上传视频</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.video_url|default=''}" name="video_url" required title="请上传视频或输入音乐视频URL地址  ">
-                            <a data-file="btn" data-type="mp4" data-field="video_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大10MB,只支持MP4格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">视频描述</label>
-                        <div class="layui-input-block">
-                            <input value="{$vo.video_desc|default='视频描述'}" name="video_desc" maxlength="50" class="layui-input">
-                        </div>
-                    </div>
-
-                    <div class="text-center padding-bottom-10 absolute full-width" style="bottom:0;margin-left:-15px">
-
-                        <div class="hr-line-dashed margin-top-10 margin-bottom-10"></div>
-                        {if isset($vo['id'])}<input type='hidden' value='{$vo.id}' name='id'>{/if}
-                        {if isset($vo['code'])}<input type='hidden' value='{$vo.code}' name='code'>{/if}
-
-                        <button class="layui-btn menu-submit">保存数据</button>
-                        <button data-history-back class="layui-btn layui-btn-danger" type='button'>取消编辑</button>
-                    </div>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-{/block}
-
-{block name="script"}
-<script>
-    (function ($body) {
-
-        /*! 刷新预览显示 */
-        function showReview(params, location) {
-            if (params['type'] === 'news') {
-                location = '{:url("@wechat/api.view/news")}?id=_id_'.replace('_id_', params.content);
-            } else {
-                location = '{:url("@wechat/api.view/_type_")}?'.replace('_type_', params.type) + $.param(params || {});
-            }
-            var iframe = '<iframe id="phone-preview" frameborder="0" marginheight="0" marginwidth="0"></iframe>';
-            $('[data-iframe-box]').empty().append($(iframe).attr('src', location));
-        }
-
-        $body.off('change', '[name="news_id"]').on('change', '[name="news_id"]', function () {
-            /*! 图文显示预览 */
-            showReview({type: 'news', content: this.value});
-        }).off('change', '[name="content"]').on('change', '[name="content"]', function () {
-            /*! 文字显示预览 */
-            showReview({type: 'text', content: this.value});
-        }).off('change', '[name="image_url"]').on('change', '[name="image_url"]', function () {
-            /*! 图片显示预览 */
-            showReview({type: 'image', content: this.value});
-        }).off('change', '[name="voice_url"]').on('change', '[name="voice_url"]', function () {
-            /*! 语音显示预览 */
-            showReview({type: 'voice', content: this.value});
-        });
-
-        /*! 音乐显示预览 */
-        var musicSelector = '[name="music_url"],[name="music_title"],[name="music_desc"],[name="music_image"]';
-        $body.off('change', musicSelector).on('change', musicSelector, function () {
-            var params = {type: 'music'}, $parent = $(this).parents('form');
-            params.url = $parent.find('[name="music_url"]').val();
-            params.desc = $parent.find('[name="music_desc"]').val();
-            params.title = $parent.find('[name="music_title"]').val();
-            params.image = $parent.find('[name="music_image"]').val();
-            showReview(params);
-        });
-
-        /*! 视频显示预览 */
-        var videoSelector = '[name="video_title"],[name="video_url"],[name="video_desc"]';
-        $body.off('change', videoSelector).on('change', videoSelector, function () {
-            var params = {type: 'video'}, $parent = $(this).parents('form');
-            params.url = $parent.find('[name="video_url"]').val();
-            params.desc = $parent.find('[name="video_desc"]').val();
-            params.title = $parent.find('[name="video_title"]').val();
-            showReview(params);
-        });
-
-        /*! 默认类型事件 */
-        $body.off('click', 'input[name=type]').on('click', 'input[name=type]', function () {
-            var value = $(this).val(), $form = $(this).parents('form');
-            if (value === 'customservice') value = 'text';
-            var $current = $form.find('[data-keys-type="' + value + '"]').removeClass('layui-hide');
-            $form.find('[data-keys-type]').not($current).addClass('layui-hide');
-            switch (value) {
-                case 'news':
-                    return $('[name="news_id"]').trigger('change');
-                case 'text':
-                case 'customservice':
-                    return $('[name="content"]').trigger('change');
-                case 'image':
-                    return $('[name="image_url"]').trigger('change');
-                case 'video':
-                    return $('[name="video_url"]').trigger('change');
-                case 'music':
-                    return $('[name="music_url"]').trigger('change');
-                case 'voice':
-                    return $('[name="voice_url"]').trigger('change');
-            }
-        });
-
-        /*! 默认事件触发 */
-        $('input[name=type]:checked').map(function () {
-            $(this).trigger('click');
-        });
-
-    })($('body'));
-</script>
-{/block}

+ 0 - 86
app/wechat/view/auto/index.html

@@ -1,86 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-<!--{if auth("add")}-->
-<button data-open="{:url('add')}" class='layui-btn layui-btn-sm layui-btn-primary'>添加规则</button>
-<!--{/if}-->
-
-<!--{if auth("remove")}-->
-<button data-action='{:url("remove")}' data-rule="id#{key}" data-csrf="{:systoken('remove')}" data-confirm="确定要删除这些规则吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除规则</button>
-<!--{/if}-->
-{/block}
-
-{block name='content'}
-<div class="layui-badge think-bg-violet text-left notselect block shadow margin-0 padding-10 padding-left-20 border-radius-5 font-s15">
-    特别注意:关注自动回复使用微信客服消息接口发送,因此多图文只能发送每组图文的第一篇文章,另外还需要开启系统任务功能。
-</div>
-
-<div class="think-box-shadow margin-top-10">
-    {include file='auto/index_search'}
-    <table class="layui-table margin-top-10" lay-skin="line">
-        {notempty name='list'}
-        <thead>
-        <tr>
-            <th class='list-table-check-td think-checkbox'>
-                <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
-            </th>
-            <th class="text-left nowrap">消息编号</th>
-            <th class="text-left nowrap">延迟时间</th>
-            <th class="text-center nowrap">消息类型</th>
-            <th class="text-center nowrap">预览</th>
-            <th class="text-left nowrap">添加时间</th>
-            <th class="text-left nowrap">状态</th>
-            <th></th>
-        </tr>
-        </thead>
-        {/notempty}
-        <tbody>
-        {foreach $list as $key=>$vo}
-        <tr>
-            <td class='list-table-check-td think-checkbox'>
-                <label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label>
-            </td>
-            <td class="text-left nowrap">{$vo.code}</td>
-            <td class="text-left nowrap">{$vo.time}</td>
-            <td class="text-center nowrap">{$vo.type}</td>
-            <td class="text-center nowrap notselect">
-                {if $vo.type eq '音乐'}
-                <a data-phone-view='{:url("@wechat/api.view/music")}?title={$vo.music_title|urlencode}&desc={$vo.music_desc|urlencode}'>预览</a>
-                {elseif in_array($vo.type,['文字','转客服'])}
-                <a data-phone-view='{:url("@wechat/api.view/text")}?content={$vo.content|urlencode}'>预览</a>
-                {elseif $vo.type eq '图片'}
-                <a data-phone-view='{:url("@wechat/api.view/image")}?content={$vo.image_url|urlencode}'>预览</a>
-                {elseif $vo.type eq '图文'}
-                <a data-phone-view='{:url("@wechat/api.view/news")}?id={$vo.news_id}'>预览</a>
-                {elseif $vo.type eq '视频'}
-                <a data-phone-view='{:url("@wechat/api.view/video")}?title={$vo.video_title|urlencode}&desc={$vo.video_desc|urlencode}&url={$vo.video_url|urlencode}'>预览</a>
-                {elseif $vo.type eq '语音'}
-                <a data-phone-view='{:url("@wechat/api.view/voice")}?content={$vo.voice_url|urlencode}'>预览</a>
-                {else} {$vo.content} {/if}
-            </td>
-            <td class="text-left nowrap">{$vo.create_at|format_datetime}</td>
-            <td class='text-left nowrap'>{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">已激活</span>{/if}</td>
-            <td class='text-left nowrap'>
-
-                <!--{if auth("edit")}-->
-                <a class="layui-btn layui-btn-sm" data-open='{:url("edit")}?id={$vo.id}'>编 辑</a>
-                <!--{/if}-->
-
-                <!--{if auth("state") and $vo.status eq 1}-->
-                <a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0" data-csrf="{:systoken('state')}">禁 用</a>
-                <!--{elseif auth("state") and $vo.status eq 0}-->
-                <a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">激 活</a>
-                <!--{/if}-->
-
-                <!--{if auth("remove")}-->
-                <a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除该规则吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删 除</a>
-                <!--{/if}-->
-
-            </td>
-        </tr>
-        {/foreach}
-        </tbody>
-    </table>
-    {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
-</div>
-{/block}

+ 0 - 54
app/wechat/view/auto/index_search.html

@@ -1,54 +0,0 @@
-<fieldset>
-    <legend>条件搜索</legend>
-    <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">消息编号</label>
-            <div class="layui-input-inline">
-                <input name="code" value="{:input('code','')}" placeholder="请输入消息编号" class="layui-input">
-            </div>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">消息类型</label>
-            <div class="layui-input-inline">
-                <select class="layui-select" name="type">
-                    <option value="">-- 全部 --</option>
-                    {foreach $types as $k => $v}{if $k.'' eq input('type')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </div>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">使用状态</label>
-            <div class="layui-input-inline">
-                <select class="layui-select" name="status">
-                    <option value="">-- 全部 --</option>
-                    {foreach ['显示已禁止的消息','显示已激活的消息'] as $k=>$v}
-                    {if $k.'' eq input('status')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </div>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">添加时间</label>
-            <div class="layui-input-inline">
-                <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择添加时间" class="layui-input">
-            </div>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
-        </div>
-    </form>
-    <script>window.form.render()</script>
-</fieldset>
-

+ 0 - 39
app/wechat/view/config/options.html

@@ -1,39 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-<!--{if auth("options_test")}-->
-<button data-modal="{:url('options_test')}" data-width="500px" data-title="微信授权测试( 扫码 )" class='layui-btn layui-btn-sm layui-btn-primary'>微信授权测试</button>
-<!--{/if}-->
-{/block}
-
-{block name="content"}
-<div class="think-box-shadow layui-form">
-    <div class="nowrap" style="margin-left:99px">
-        {foreach ['api'=>'微信公众平台直接模式','thr'=>'微信开放平台授权模式'] as $k=>$v}
-        <input type="radio" data-wechat-type="{$k}" name="wechat.type" value="{$k}" title="{$v}" lay-filter="wechat_type">
-        {/foreach}
-        <p class="help-block">请选择微信对接方式,其中微信开放平台授权模式是需要微信开放平台支持,还需要搭建微信授权服务!</p>
-    </div>
-</div>
-<div class="think-box-shadow margin-top-15">
-    <div class="padding-top-20">
-        <div class="layui-anim layui-anim-fadein" data-type="api">{include file='config/options_form_api'}</div>
-        <div class="layui-anim layui-anim-fadein" data-type="thr">{include file='config/options_form_thr'}</div>
-    </div>
-</div>
-{/block}
-
-{block name='script'}
-<script>
-    $(function () {
-        apply({value: '{:sysconf("wechat.type")}' || 'api'});
-        window.form.render(), window.form.on('radio(wechat_type)', apply);
-
-        function apply(data) {
-            this.$active = $("[data-wechat-type='" + data.value + "']").trigger('click');
-            if (this.$active.size() < 1) $("[data-wechat-type]:first").trigger('click');
-            $('[data-type="' + data.value + '"]').show().siblings('[data-type]').hide();
-        }
-    });
-</script>
-{/block}

+ 0 - 66
app/wechat/view/config/options_form_api.html

@@ -1,66 +0,0 @@
-<form onsubmit="return false;" data-auto="true" method="post" class='layui-form layui-card shadow-none' autocomplete="off">
-
-    <div class="layui-card-header border-0">
-        <div class="layui-bg-gray padding-col-20 border-radius-5 layui-elip">
-            使用微信公众平台直接模式时,需要在微信公众号平台配置授权IP及网页授权域名,将公众号平台获取到的参数填写到下面。
-        </div>
-    </div>
-
-    <div class="layui-card-body">
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>Token</b><br><span class="nowrap color-desc">接口认证令牌</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.token" required placeholder="请输入消息推送对接认证Token(必填)" value="{:sysconf('wechat.token')}" class="layui-input">
-                <p class="help-block">公众号平台与系统对接认证Token,请优先填写此参数并保存,然后再在微信公众号平台操作对接。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>AppId</b><br><span class="nowrap color-desc">公众号 APPID</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.appid" placeholder="请输入以wx开头的18位公众号APPID(必填)" pattern="^wx[0-9a-z]{16}$" maxlength="18" required="required" value="{:sysconf('wechat.appid')}" class="layui-input">
-                <p class="help-block">公众号APPID是所有接口必要参数,可以在公众号平台 [ 开发 > 基本配置 ] 页面获取。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>AppSecret</b><br><span class="nowrap color-desc">公众号 Secret</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.appsecret" required placeholder="请输入32位公众号接口密钥AppSecret(必填)" value="{:sysconf('wechat.appsecret')}" maxlength="32" pattern="^[0-9a-z]{32}$" class="layui-input">
-                <p class="help-block">公众号应用密钥是所有接口必要参数,可以在公众号平台 [ 开发 > 基本配置 ] 页面授权后获取。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>AesKey</b><br><span class="nowrap color-desc">消息加密密钥</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.encodingaeskey" placeholder="请输入43位公众号消息推送加密密钥(可选)" value="{:sysconf('wechat.encodingaeskey')}" maxlength="43" pattern="^.{43}$" class="layui-input">
-                <p class="help-block">若开启了消息加密时必需填写,消息加密密钥必需填写并保持与公众号平台一致。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>PushApi</b><br><span class="nowrap color-desc">消息推送接收</span></label>
-            <div class="layui-input-block">
-                <div class="relative">
-                    <input value="服务器授权IP:{$geoip}" disabled class="layui-input layui-bg-gray">
-                    <a data-copy="{$geoip}" class="input-right-icon"><i class="iconfont icon-copy"></i></a>
-                </div>
-                <div class="relative margin-top-5">
-                    <input value="消息推送地址:{$thrNotify}" disabled class="layui-input layui-bg-gray">
-                    <a data-copy="{$thrNotify}" class="input-right-icon"><i class="iconfont icon-copy"></i></a>
-                </div>
-                <p class="help-block">公众号服务平台消息推送接口及服务器授权IP地址,需在公众号接口开发处配置。</p>
-            </div>
-        </div>
-
-        <div class="hr-line-dashed margin-top-30"></div>
-        <input type="hidden" name="wechat.type" value="api">
-
-        <div class="layui-form-item text-center">
-            <button class="layui-btn" type="submit">保存配置</button>
-        </div>
-
-    </div>
-</form>

+ 0 - 73
app/wechat/view/config/options_form_thr.html

@@ -1,73 +0,0 @@
-<form onsubmit="return false;" data-auto="true" method="post" class='layui-form layui-card shadow-none' autocomplete="off">
-
-    <div class="layui-card-header border-0">
-        <div class="layui-bg-gray padding-col-20 border-radius-5 layui-elip">
-            使用微信开放平台授权模式时,需要使用楚才开放平台的 <span>微信授权</span> 服务,接口需要使用 <span>Yar</span> 或 <span>JsonRpc</span> 通信。
-        </div>
-    </div>
-
-    <div class="layui-card-body">
-
-        <!--{if !empty($wechat)}-->
-        <div class="layui-form-item margin-bottom-20">
-            <label class="layui-form-label"><b>QRCode</b><br><span class="nowrap color-desc">公众号二维码</span></label>
-            <div class="layui-input-block">
-                <div class="pull-left notselect">
-                    <div class="shadow" data-tips-image data-lazy-src="{$wechat.qrcode_url|down_file}" style="width:95px;height:95px"></div>
-                </div>
-                <div class="pull-left padding-left-10">
-                    <p class="nowrap">微信昵称:{$wechat.user_nickname|default='-'}</p>
-                    <p class="nowrap">微信类型:{$wechat.service_type|default='-'} / {$wechat.service_verify == '未认证' ? '未认证' : '<span class="color-green">已认证</span>'}</p>
-                    <p class="nowrap">注册公司:{$wechat.user_company|default='-'}</p>
-                    <p class="nowrap">授权绑定:{$wechat.create_at|format_datetime}</p>
-                </div>
-            </div>
-        </div>
-        <div class="hr-line-dashed"></div>
-        <!--{/if}-->
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>Authorize</b><br><span class="nowrap color-desc">绑定微信授权</span></label>
-            <div class="layui-input-block">
-                <button type="button" data-href="{$authurl|default=''}" class="layui-btn layui-btn-sm layui-btn-primary">重新绑定公众号</button>
-                <p class="help-block">点击链接将跳转到微信第三方平台进行公众号授权。</p>
-                {if !empty($message)}<p class="color-red">{$message|default=''}</p>{/if}
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>AppId</b><br><span class="nowrap color-desc">公众号 AppId</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.thr_appid" placeholder="请输入以wx开头的18位公众号AppId(必填)" pattern="^wx[0-9a-z]{16}$" maxlength="18" required value="{:sysconf('wechat.thr_appid')}" class="layui-input">
-                <p class="help-block">众号 appid 通过微信第三方授权自动获取. 若没有值请进行微信第三方授权。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>AppKey</b><br><span class="nowrap color-desc">服务接口密钥</span></label>
-            <div class="layui-input-block">
-                <input name="wechat.thr_appkey" required placeholder="请输入32位第三方平台接口密钥AppKey(必填)" value="{:sysconf('wechat.thr_appkey')}" maxlength="32" pattern="^[0-9a-z]{32}$" class="layui-input">
-                <p class="help-block">公众号服务平台接口密钥, 通过微信第三方授权自动获取, 若没有值请进行微信第三方授权。</p>
-            </div>
-        </div>
-
-        <div class="layui-form-item">
-            <label class="layui-form-label"><b>PushApi</b><br><span class="nowrap color-desc">服务推送接口</span></label>
-            <div class="layui-input-block">
-                <div class="relative margin-top-5">
-                    <input value="{$thrNotify}" disabled class="layui-input layui-bg-gray">
-                    <a data-copy="{$thrNotify}" class="input-right-icon"><i class="iconfont icon-copy"></i></a>
-                </div>
-                <p class="help-block">公众号绑定服务平台接口通知 URL, 公众号消息接收与回复等。</p>
-            </div>
-        </div>
-
-        <div class="hr-line-dashed margin-top-30"></div>
-        <input type="hidden" name="wechat.type" value="thr">
-
-        <div class="layui-form-item text-center">
-            <button class="layui-btn" type="submit">保存配置</button>
-        </div>
-
-    </div>
-</form>

+ 0 - 21
app/wechat/view/config/options_test.html

@@ -1,21 +0,0 @@
-<div class='layui-card shadow-none margin-0'>
-    <div class="layui-card-body padding-40">
-        <div class="text-center test-qrcode-box">
-            <div class="inline-block padding-right-40 notselect">
-                <img alt="img" class="notselect" data-tips-image src="{:url('wechat/api.test/oauthQrc')}">
-                <p class="text-center">OAUTH 网页授权</p>
-            </div>
-            <div class="inline-block padding-left-40">
-                <img alt="img" class="notselect" data-tips-image src="{:url('wechat/api.test/jssdkQrc')}">
-                <p class="text-center">JSSDK 接口签名</p>
-            </div>
-        </div>
-    </div>
-</div>
-
-<style>
-    .test-qrcode-box img {
-        width: 130px;
-        height: 130px
-    }
-</style>

+ 0 - 102
app/wechat/view/config/payment.html

@@ -1,102 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-<!--{if auth("payment_test")}-->
-<button data-modal="{:url('payment_test')}" class='layui-btn layui-btn-sm layui-btn-primary'>微信支付测试</button>
-<!--{/if}-->
-{/block}
-
-{block name="content"}
-<div class="think-box-shadow">
-    <div class="layui-anim layui-anim-fadein padding-top-20" style="width:850px">
-        <form onsubmit="return false;" action="{:url('payment_save')}" data-auto="true" method="post" class='layui-form layui-card shadow-none' autocomplete="off" lay-filter="payment">
-
-            <div class="layui-card-header border-0">
-                <div class="layui-bg-gray padding-col-20 border-radius-5">
-                    微信商户参数配置,此处交易的商户号需要与微信公众号对接的公众号 APPID 匹配。
-                </div>
-            </div>
-
-            <div class="layui-card-body">
-                <div class="layui-form-item margin-top-15">
-                    <label class="layui-form-label"><b>MCH_ID</b><br><span class="nowrap color-desc">微信商户账号</span></label>
-                    <div class="layui-input-block">
-                        <input name="wechat.mch_id" required placeholder="请输入微信商户账号(必填)" value="{:sysconf('wechat.mch_id')}" class="layui-input">
-                        <p class="help-block">微信商户账号,需要在微信商户平台获取,MCH_ID 与 APPID 匹配</p>
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label"><b>MCH_KEY</b><br><span class="nowrap color-desc">微信商户密钥</span></label>
-                    <div class="layui-input-block">
-                        <input name="wechat.mch_key" placeholder="请输入微信商户密钥(必填)" maxlength="32" pattern=".{32}" required value="{:sysconf('wechat.mch_key')}" class="layui-input">
-                        <p class="help-block">微信商户密钥,需要在微信商户平台操作设置操作密码并获取商户接口密钥</p>
-                    </div>
-                </div>
-
-                <div class="hr-line-dashed"></div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label"><b>MCH_CERT</b><br><span class="nowrap color-desc">微信商户证书</span></label>
-                    <div class="layui-input-block">
-                        {foreach ['none'=>'暂不使用证书', 'pem'=>'上传 PEM 证书', 'p12'=>'上传 P12 证书'] as $k=>$v}
-                        <input type="radio" data-pem-type="{$k}" name="wechat.mch_ssl_type" value="{$k}" title="{$v}" lay-filter="data-mch-type">
-                        {/foreach}
-                        <div data-mch-type="none"></div>
-                        <p class="help-block">请选择需要上传证书类型,P12 或 PEM 二选一,证书需要从微信商户平台获取</p>
-                        <div data-mch-type="p12" class="layui-tab-item padding-top-15 padding-bottom-15">
-                            <input name="wechat.mch_ssl_p12" value="{$mch_ssl_p12|default=''}" type="hidden">
-                            <button data-file="btn" data-uptype="local" data-safe="true" data-type="p12" data-field="wechat.mch_ssl_p12" type="button" class="layui-btn layui-btn-primary">
-                                <i class="layui-icon layui-icon-vercode"></i> 上传 P12 证书
-                            </button>
-                            <p class="help-block margin-top-10">微信商户支付 P12 证书,实现订单退款、打款、发红包等支出功能都使用证书</p>
-                        </div>
-                        <div data-mch-type="pem" class="layui-tab-item padding-top-15 padding-bottom-15">
-                            <input name="wechat.mch_ssl_key" value="{$mch_ssl_key|default=''}" type="hidden">
-                            <button data-file="btn" data-uptype="local" data-safe="true" data-type="pem" data-field="wechat.mch_ssl_key" type="button" class="layui-btn layui-btn-primary margin-right-5">
-                                <i class="layui-icon layui-icon-vercode"></i> 上传 KEY 证书
-                            </button>
-                            <input name="wechat.mch_ssl_cer" value="{$mch_ssl_cer|default=''}" type="hidden">
-                            <button data-file="btn" data-uptype="local" data-safe="true" data-type="pem" data-field="wechat.mch_ssl_cer" type="button" class="layui-btn layui-btn-primary">
-                                <i class="layui-icon layui-icon-vercode"></i> 上传 CERT 证书
-                            </button>
-                            <p class="help-block margin-top-10">微信商户支付 PEM 双向证书,实现订单退款、打款、发红包等支出功能都使用证书</p>
-                        </div>
-                    </div>
-                </div>
-                <!--{if auth('paymentsave')}-->
-                <div class="hr-line-dashed margin-top-30"></div>
-                <div class="layui-form-item text-center">
-                    <button class="layui-btn" type="submit">保存配置</button>
-                </div>
-                <!--{/if}-->
-            </div>
-        </form>
-    </div>
-</div>
-{/block}
-
-{block name="script"}
-<script>
-    (new function (type) {
-        type = "{:sysconf('wechat.mch_ssl_type')}" || 'none';
-        layui.form.render(), layui.form.val('payment', {'wechat.mch_ssl_type': type});
-        layui.form.on('radio(data-mch-type)', apply), apply.call(this, {value: type});
-        ['wechat.mch_ssl_p12', 'wechat.mch_ssl_key', 'wechat.mch_ssl_cer'].forEach(function (type) {
-            $('input[name="' + type + '"]').on('change', function (that) {
-                that = this, that.$button = $(this).next('button'), setTimeout(function () {
-                    if (typeof that.value === 'string' && that.value.length > 5) {
-                        that.$button.find('i').addClass('color-green layui-icon-vercode').removeClass('layui-icon-upload-drag');
-                    } else {
-                        that.$button.find('i').removeClass('color-green layui-icon-vercode').addClass('layui-icon-upload-drag');
-                    }
-                }, 100);
-            }).trigger('change');
-        });
-
-        function apply(data) {
-            $('[data-mch-type="' + data.value + '"]').show().siblings('[data-mch-type]').hide();
-        }
-    });
-</script>
-{/block}

+ 0 - 40
app/wechat/view/config/payment_test.html

@@ -1,40 +0,0 @@
-<div class='layui-card shadow-none margin-0'>
-    <div class="layui-card-body padding-40">
-        <div class="layui-bg-gray padding-20 border-radius-5">
-            <div class="margin-bottom-15">
-                <p class="font-w7 color-green">微信开放平台授权</p>
-                <p>JSSDK 签名测试需要在开放平台配置当前的授权域名:<a data-copy="{:request()->host()}">{:request()->host()}</a></p>
-            </div>
-            <div class="margin-bottom-15">
-                <p class="font-w7 color-green">公众号平台域名授权</p>
-                <p>网页授权及 JSSDK 签名都需要在公众号平台授权域名:<a data-copy="{:request()->host()}">{:request()->host()}</a></p>
-            </div>
-            <div class="margin-bottom-0">
-                <p class="font-w7 color-green">微信商户支付测试配置</p>
-                <p>JSAPI 支付测试需要在微信商户平台配置支付目录:<a data-copy="{:url('wechat/api.test/',[],'',true)}">{:sysuri('wechat/api.test/index',[],'',true)}</a></p>
-                <p>扫码支付①需要在微信商户平台配置支付通知地址:<a data-copy="{:url('wechat/api.test/scanOneNotify',[],'',true)}">{:url('wechat/api.test/scanOneNotify',[],'',true)}</a></p>
-            </div>
-        </div>
-        <div class="text-center margin-top-20 test-qrcode-box">
-            <div class="inline-block">
-                <img alt="img" onerror="this.src='__ROOT__/static/theme/img/wechat/qrc_pay_error.jpg'" class="notselect" data-tips-image src="{:url('wechat/api.test/jsapiQrc')}">
-                <p class="text-center">微信 JSAPI 支付</p>
-            </div>
-            <div class="inline-block margin-left-40 margin-right-40">
-                <img alt="img" onerror="this.src='__ROOT__/static/theme/img/wechat/qrc_pay_error.jpg'" class="notselect" data-tips-image src="{:url('wechat/api.test/scanOneQrc')}">
-                <p class="text-center">微信扫码支付①</p>
-            </div>
-            <div class="inline-block">
-                <img alt="img" onerror="this.src='__ROOT__/static/theme/img/wechat/qrc_pay_error.jpg'" class="notselect" data-tips-image src="{:url('wechat/api.test/scanTwoQrc')}">
-                <p class="text-center">微信扫码支付②</p>
-            </div>
-        </div>
-    </div>
-</div>
-
-<style>
-    .test-qrcode-box img {
-        width: 200px;
-        height: 200px
-    }
-</style>

+ 0 - 90
app/wechat/view/fans/index.html

@@ -1,90 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-<!--{if auth("blackAdd")}-->
-<button data-action='{:url("blackAdd")}' data-rule="openid#{key}" data-csrf="{:systoken('blackAdd')}" class='layui-btn layui-btn-sm layui-btn-primary'>拉入黑名单</button>
-<!--{/if}-->
-
-<!--{if auth("blackDel")}-->
-<button data-action='{:url("blackDel")}' data-rule="openid#{key}" data-csrf="{:systoken('blackDel')}" class='layui-btn layui-btn-sm layui-btn-primary'>移出黑名单</button>
-<!--{/if}-->
-
-<!--{if auth("truncate")}-->
-<button data-load='{:url("truncate")}' data-confirm="确定要清空所有用户数据吗?" class='layui-btn layui-btn-sm layui-btn-primary'>清空用户数据</button>
-<!--{/if}-->
-
-<!--{if auth("sync")}-->
-<button data-queue='{:url("sync")}' data-confirm="确定要创建同步用户数据的后台任务?" class='layui-btn layui-btn-sm layui-btn-primary'>同步用户数据</button>
-<!--{/if}-->
-{/block}
-
-{block name="content"}
-<div class="think-box-shadow">
-    {include file='fans/index_search'}
-    <table class="layui-table margin-top-10" lay-skin="line">
-        {notempty name='list'}
-        <thead>
-        <tr>
-            <th class='list-table-check-td think-checkbox'>
-                <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
-            </th>
-            <th width="180px" class='text-left nowrap'>微信昵称</th>
-            <th width="180px"></th>
-            <th width="150px" class='text-left nowrap'>性别语言</th>
-            <th width="180px" class='text-left nowrap'>订阅时间</th>
-            <th width="80px"></th>
-            <th></th>
-        </tr>
-        </thead>
-        {/notempty}
-        <tbody>
-        {foreach $list as $key=>$vo}
-        <tr>
-            <td class='list-table-check-td think-checkbox'>
-                <label><input class="list-check-box" value='{$vo.openid}' type='checkbox'></label>
-            </td>
-            <td class='text-left nowrap'>
-                <div class="headimg" data-tips-image data-lazy-src="{$vo.headimgurl|default=''}"></div>
-                <div class="inline-block">
-                    <p>昵称:{$vo.nickname|default='--'}</p>
-                    <p>区域:{$vo.country|default='--'} {$vo.province|default=''} {$vo.city|default=''}</p>
-                </div>
-            </td>
-            <td class="text-left padding-0">
-                <div style="max-height:60px;overflow:auto">{foreach $vo.tags as $t}<p><span class="layui-badge layui-bg-cyan margin-right-5">{$t|default='--'}</span></p>{/foreach}</div>
-            </td>
-            <td class='text-left nowrap'>
-                性别:{switch name='vo.sex'}{case value='1'}男{/case}{case value='2'}女{/case}{default}未知{/switch}<br>
-                语言:{$vo.language|raw}
-            </td>
-            <td class='text-left nowrap'>
-                日期:{$vo.subscribe_at|format_datetime|str_replace=' ','<br>时间:',###|raw}
-            </td>
-            <td class='text-center nowrap'>
-                <div class="notselect">
-                    {eq name='vo.subscribe' value='0'}<span class="layui-badge">未订阅</span>{else}<span class="layui-badge layui-bg-green">已订阅</span>{/eq}
-                    {eq name='vo.is_black' value='0'}<span class="layui-badge layui-bg-green">未拉黑</span>{else}<span class="layui-badge">已拉黑</span>{/eq}
-                </div>
-            </td>
-            <td class="nowrap">
-
-                <!--{if auth('blackAdd') and $vo.is_black eq 0}-->
-                <a class="layui-btn layui-btn-sm" data-action="{:url('blackAdd')}" data-value="openid#{$vo.openid}" data-csrf="{:systoken('blackAdd')}">加入黑名单</a>
-                <!--{elseif auth('blackDel') and $vo.is_black eq 1}-->
-                <a class="layui-btn layui-btn-sm" data-action="{:url('blackDel')}" data-value="openid#{$vo.openid}" data-csrf="{:systoken('blackDel')}">移出黑名单</a>
-                <!--{/if}-->
-
-                <!--{if auth("remove")}-->
-                <a class="layui-btn layui-btn-sm layui-btn-danger" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}" data-confirm="确定要删除该用户吗?">删 除</a>
-                <!--{/if}-->
-
-            </td>
-        </tr>
-        {/foreach}
-        </tbody>
-    </table>
-
-    {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
-
-</div>
-{/block}

+ 0 - 80
app/wechat/view/fans/index_search.html

@@ -1,80 +0,0 @@
-<fieldset>
-    <legend>条件搜索</legend>
-    <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">微信昵称</label>
-            <label class="layui-input-inline">
-                <input name="nickname" value="{:input('nickname')}" placeholder="请输入微信昵称" class="layui-input">
-            </label>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">订阅状态</label>
-            <label class="layui-input-inline">
-                <select class="layui-select" name="subscribe">
-                    <option value=''>-- 全部 --</option>
-                    {foreach ['显示未订阅的粉丝','显示已订阅的粉丝'] as $k=>$v}
-                    {if $k.'' eq input('subscribe')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </label>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">拉黑状态</label>
-            <label class="layui-input-inline">
-                <select class="layui-select" name="is_black">
-                    <option value=''>-- 全部 --</option>
-                    {foreach ['显示未拉黑的粉丝','显示已拉黑的粉丝'] as $k=>$v}
-                    {if $k.'' eq input('is_black')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </label>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">订阅时间</label>
-            <label class="layui-input-inline">
-                <input data-date-range name="subscribe_at" value="{:input('subscribe_at')}" placeholder="请选择订阅时间" class="layui-input">
-            </label>
-        </div>
-
-        <div class="layui-form-item layui-inline">
-            <button type="submit" class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
-            <button type="button" data-form-export="{:url('index')}?type={$type|default=''}" class="layui-btn layui-btn-primary">
-                <i class="layui-icon layui-icon-export"></i> 导 出
-            </button>
-        </div>
-    </form>
-</fieldset>
-
-<script>
-    window.form.render();
-    require(['excel'], function (excel) {
-        excel.bind(function (data, sexs) {
-            sexs = {1: '男', 2: '女'};
-            data.forEach(function (item, index) {
-                data[index] = [
-                    item.openid || '',
-                    item.nickname || '',
-                    item.country || '',
-                    item.province || '',
-                    item.city || '',
-                    sexs[item.sex] || '未知',
-                    item.subscribe ? '已订阅' : '未订阅',
-                    item.subscribe_at || '',
-                    item.is_black ? '已拉黑' : '未拉黑',
-                ];
-            });
-            data.unshift(['OPENID', '微信昵称', '所在国家', '所在省份', '所在城市', '性别', '订阅状态', '订阅时间', '是否拉黑']);
-            return data;
-        }, '微信粉丝数据');
-    });
-</script>

+ 0 - 268
app/wechat/view/keys/form.html

@@ -1,268 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="style"}
-<style>
-    .keys-container .layui-card {
-        width: 580px;
-        height: 578px;
-        position: absolute;
-        border: 1px solid #ccc
-    }
-
-    .keys-container .layui-card .layui-card-body {
-        height: 495px;
-        padding-right: 50px
-    }
-
-    .keys-container .layui-card .layui-card-body [data-tips-image] {
-        width: 112px;
-        height: auto
-    }
-
-    .keys-container .layui-card .layui-card-body .layui-form-label {
-        width: 60px;
-        color: #6c6c6c;
-        font-weight: 700;
-    }
-
-    .keys-container .layui-card .layui-card-body .layui-form-label + .layui-input-block {
-        margin-left: 100px;
-    }
-</style>
-{/block}
-
-{block name="content"}
-<div class="nowrap think-box-shadow" style="width:910px">
-    <div class='mobile-preview inline-block'>
-        <div class='mobile-header'>公众号</div>
-        <div class='mobile-body' data-iframe-box></div>
-    </div>
-    <div class="keys-container inline-block absolute margin-left-10 margin-right-15">
-        <form class="layui-form" onsubmit="return false" autocomplete="off" data-auto="true" action="{:request()->url()}" method="post">
-            <div class="layui-card relative">
-                <div class="layui-card-header layui-bg-gray text-center">编辑关键字</div>
-                <div class="layui-card-body">
-                    <!--{if !isset($vo.keys) or ($vo.keys neq 'default' and $vo.keys neq 'subscribe')}-->
-                    <div class="layui-form-item margin-top-10">
-                        <label class="layui-form-label">关 键 字</label>
-                        <div class="layui-input-block">
-                            <input required placeholder='请输入关键字' maxlength='20' name='keys' class="layui-input" value='{$vo.keys|default=""}'>
-                        </div>
-                    </div>
-                    <!--{else}-->
-                    <input type="hidden" name="keys" value="{$vo.keys|default=''}">
-                    <!--{/if}-->
-                    <div class="layui-form-item">
-                        <label class="layui-form-label label-required">规则状态</label>
-                        <div class="layui-input-block">
-                            {foreach ['1'=>'启用','0'=>'禁用'] as $k=>$v}
-                            <label class="think-radio">
-                                <!--{if (!isset($vo.status) and $k eq '1') or (isset($vo.status) and $vo.status eq $k)}-->
-                                <input type="radio" checked name="status" value="{$k}"> {$v}
-                                <!--{else}-->
-                                <input type="radio" name="status" value="{$k}"> {$v}
-                                <!--{/if}-->
-                            </label>
-                            {/foreach}
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item">
-                        <label class="layui-form-label label-required">消息类型</label>
-                        <div class="layui-input-block">
-                            {foreach $types as $k=>$v}
-                            <label class="think-radio">
-                                <!--{if (!isset($vo.type) and $k eq 'text') or (isset($vo.type) and$vo.type eq $k)}-->
-                                <input name="type" checked type="radio" value="{$k}"> {$v}
-                                <!--{else}-->
-                                <input name="type" type="radio" value="{$k}"> {$v}
-                                <!--{/if}-->
-                            </label>
-                            {/foreach}
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='text'>
-                        <label class="layui-form-label">回复文字</label>
-                        <div class="layui-input-block">
-                            <textarea name="content" required placeholder="请输入回复文字" maxlength="10000" class="layui-textarea">{$vo.content|raw|default='说点什么吧'}</textarea>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='news'>
-                        <label class="layui-form-label label-required">选取图文</label>
-                        <div class="layui-input-block">
-                            <input type="hidden" name="news_id" value="{$vo.news_id|default=0}">
-                            <a class="layui-btn layui-btn-sm layui-btn-primary" data-title="选择图文" data-iframe="{:url('wechat/news/select')}?field={:encode('news_id')}">选择图文</a>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='image'>
-                        <label class="layui-form-label label-required">图片地址</label>
-                        <div class="layui-input-block">
-                            <input class="layui-input padding-right-30" onchange="$(this).nextAll('img').attr('src', this.value)" value="{$vo.image_url|default=$defaultImage}" name="image_url" required placeholder="请上传图片或输入图片URL地址  ">
-                            <a data-file="btn" data-type="bmp,png,jpeg,jpg,gif" data-field="image_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大2Mb,支持bmp/png/jpeg/jpg/gif格式</p>
-                            <img data-tips-image src='{$vo.image_url|default=$defaultImage}' alt="img">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='voice'>
-                        <label class="layui-form-label">上传语音</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.voice_url|default=''}" name="voice_url" required title="请上传语音文件或输入语音URL地址  ">
-                            <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="voice_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大2Mb,播放长度不超过60s,mp3/wma/wav/amr格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐标题</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input' value="{$vo.music_title|default='音乐标题'}" name="music_title" required title="请输入音乐标题">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label label-required">上传音乐</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.music_url|default=''}" name="music_url" required title="请上传音乐文件或输入音乐URL地址  ">
-                            <a data-file="btn" data-type="mp3,wma,wav,amr" data-field="music_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐描述</label>
-                        <div class="layui-input-block">
-                            <input name="music_desc" class="layui-input" value="{$vo.music_desc|default='音乐描述'|raw}">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='music'>
-                        <label class="layui-form-label">音乐图片</label>
-                        <div class="layui-input-block">
-                            <input class="layui-input padding-right-30" value="{$vo.music_image|default=$defaultImage}" name="music_image" required title="请上传音乐图片或输入音乐图片URL地址  ">
-                            <a data-file="btn" data-type="jpg,png" data-field="music_image" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大64KB,只支持JPG格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">视频标题</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input' value="{$vo.video_title|default='视频标题'}" name="video_title" required placeholder="请输入视频标题">
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">上传视频</label>
-                        <div class="layui-input-block">
-                            <input class='layui-input padding-right-30' value="{$vo.video_url|default=''}" name="video_url" required title="请上传视频或输入音乐视频URL地址  ">
-                            <a data-file="btn" data-type="mp4" data-field="video_url" class="input-right-icon"><i class="layui-icon layui-icon-upload"></i></a>
-                            <p class="help-block">文件最大10MB,只支持MP4格式</p>
-                        </div>
-                    </div>
-
-                    <div class="layui-form-item" data-keys-type='video'>
-                        <label class="layui-form-label">视频描述</label>
-                        <div class="layui-input-block">
-                            <input value="{$vo.video_desc|default='视频描述'}" name="video_desc" maxlength="50" class="layui-input">
-                        </div>
-                    </div>
-
-                    <div class="text-center padding-bottom-10 absolute full-width" style="bottom:0;margin-left:-15px">
-                        <div class="hr-line-dashed margin-top-10 margin-bottom-10"></div>
-                        <button class="layui-btn menu-submit">保存数据</button>
-                        <!--{if !isset($vo.keys) || !in_array($vo.keys,['default','subscribe'])}-->
-                        <button data-history-back class="layui-btn layui-btn-danger" type='button'>取消编辑</button>
-                        <!--{/if}-->
-                        {if isset($vo['id'])}<input type='hidden' value='{$vo.id}' name='id'>{/if}
-                    </div>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-{/block}
-
-{block name="script"}
-<script>
-    (function ($body) {
-
-        /*! 刷新预览显示 */
-        function showReview(params, location) {
-            if (params['type'] === 'news') {
-                location = '{:url("@wechat/api.view/news")}?id=_id_'.replace('_id_', params.content);
-            } else {
-                location = '{:url("@wechat/api.view/_type_")}?'.replace('_type_', params.type) + $.param(params || {});
-            }
-            var iframe = '<iframe id="phone-preview" frameborder="0" marginheight="0" marginwidth="0"></iframe>';
-            $('[data-iframe-box]').empty().append($(iframe).attr('src', location));
-        }
-
-        $body.off('change', '[name="news_id"]').on('change', '[name="news_id"]', function () {
-            /*! 图文显示预览 */
-            showReview({type: 'news', content: this.value});
-        }).off('change', '[name="content"]').on('change', '[name="content"]', function () {
-            /*! 文字显示预览 */
-            showReview({type: 'text', content: this.value});
-        }).off('change', '[name="image_url"]').on('change', '[name="image_url"]', function () {
-            /*! 图片显示预览 */
-            showReview({type: 'image', content: this.value});
-        }).off('change', '[name="voice_url"]').on('change', '[name="voice_url"]', function () {
-            /*! 语音显示预览 */
-            showReview({type: 'voice', content: this.value});
-        });
-
-        /*! 音乐显示预览 */
-        var musicSelector = '[name="music_url"],[name="music_title"],[name="music_desc"],[name="music_image"]';
-        $body.off('change', musicSelector).on('change', musicSelector, function () {
-            var params = {type: 'music'}, $parent = $(this).parents('form');
-            params.url = $parent.find('[name="music_url"]').val();
-            params.desc = $parent.find('[name="music_desc"]').val();
-            params.title = $parent.find('[name="music_title"]').val();
-            params.image = $parent.find('[name="music_image"]').val();
-            showReview(params);
-        });
-
-        /*! 视频显示预览 */
-        var videoSelector = '[name="video_title"],[name="video_url"],[name="video_desc"]';
-        $body.off('change', videoSelector).on('change', videoSelector, function () {
-            var params = {type: 'video'}, $parent = $(this).parents('form');
-            params.url = $parent.find('[name="video_url"]').val();
-            params.desc = $parent.find('[name="video_desc"]').val();
-            params.title = $parent.find('[name="video_title"]').val();
-            showReview(params);
-        });
-
-        /*! 默认类型事件 */
-        $body.off('click', 'input[name=type]').on('click', 'input[name=type]', function () {
-            var value = $(this).val(), $form = $(this).parents('form');
-            if (value === 'customservice') value = 'text';
-            var $current = $form.find('[data-keys-type="' + value + '"]').removeClass('layui-hide');
-            $form.find('[data-keys-type]').not($current).addClass('layui-hide');
-            switch (value) {
-                case 'news':
-                    return $('[name="news_id"]').trigger('change');
-                case 'text':
-                case 'customservice':
-                    return $('[name="content"]').trigger('change');
-                case 'image':
-                    return $('[name="image_url"]').trigger('change');
-                case 'video':
-                    return $('[name="video_url"]').trigger('change');
-                case 'music':
-                    return $('[name="music_url"]').trigger('change');
-                case 'voice':
-                    return $('[name="voice_url"]').trigger('change');
-            }
-        });
-
-        /*! 默认事件触发 */
-        $('input[name=type]:checked').map(function () {
-            $(this).trigger('click');
-        });
-
-    })($('body'));
-</script>
-{/block}

+ 0 - 91
app/wechat/view/keys/index.html

@@ -1,91 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-<!--{if auth("add")}-->
-<button data-open="{:url('add')}" class='layui-btn layui-btn-sm layui-btn-primary'>添加规则</button>
-<!--{/if}-->
-
-<!--{if auth("remove")}-->
-<button data-action='{:url("remove")}' data-rule="id#{key}" data-csrf="{:systoken('remove')}" data-confirm="确定要删除这些规则吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除规则</button>
-<!--{/if}-->
-{/block}
-
-{block name='content'}
-<div class="think-box-shadow">
-    {include file='keys/index_search'}
-    <table class="layui-table margin-top-10" lay-skin="line">
-        {notempty name='list'}
-        <thead>
-        <tr>
-            <th class='list-table-check-td think-checkbox'>
-                <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
-            </th>
-            <th class='list-table-sort-td'>
-                <button type="button" data-reload class="layui-btn layui-btn-xs">刷 新</button>
-            </th>
-            <th class="text-left nowrap">关键字</th>
-            <th class="text-center nowrap">类型</th>
-            <th class="text-center nowrap">预览</th>
-            <th class="text-left nowrap">添加时间</th>
-            <th class="text-left nowrap">状态</th>
-            <th></th>
-        </tr>
-        </thead>
-        {/notempty}
-        <tbody>
-        {foreach $list as $key=>$vo}
-        <tr>
-            <td class='list-table-check-td think-checkbox'>
-                <label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label>
-            </td>
-            <td class='list-table-sort-td'>
-                <label><input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input"></label>
-            </td>
-            <td class="text-left nowrap">
-                {notempty name='vo.qrc'}
-                <i class="iconfont icon-qrcode font-s12 pointer margin-right-5" data-load="{$vo.qrc}" data-time="false" data-tips-text="生成关键字二维码"></i>
-                {/notempty}
-                {$vo.keys}
-            </td>
-            <td class="text-center nowrap">{$vo.type}</td>
-            <td class="text-center nowrap notselect">
-                {if $vo.type eq '音乐'}
-                <a data-phone-view='{:url("@wechat/api.view/music")}?title={$vo.music_title|urlencode}&desc={$vo.music_desc|urlencode}'>预览</i></a>
-                {elseif in_array($vo.type,['文字','转客服'])}
-                <a data-phone-view='{:url("@wechat/api.view/text")}?content={$vo.content|urlencode}'>预览</i></a>
-                {elseif $vo.type eq '图片'}
-                <a data-phone-view='{:url("@wechat/api.view/image")}?content={$vo.image_url|urlencode}'>预览</i></a>
-                {elseif $vo.type eq '图文'}
-                <a data-phone-view='{:url("@wechat/api.view/news")}?id={$vo.news_id}'>预览</i></a>
-                {elseif $vo.type eq '视频'}
-                <a data-phone-view='{:url("@wechat/api.view/video")}?title={$vo.video_title|urlencode}&desc={$vo.video_desc|urlencode}&url={$vo.video_url|urlencode}'>预览</i></a>
-                {elseif $vo.type eq '语音'}
-                <a data-phone-view='{:url("@wechat/api.view/voice")}?content={$vo.voice_url|urlencode}'>预览</i></a>
-                {else} {$vo.content} {/if}
-            </td>
-            <td class="text-left nowrap">{$vo.create_at|format_datetime}</td>
-            <td class='text-left nowrap'>{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">已激活</span>{/if}</td>
-            <td class='text-left nowrap'>
-
-                <!--{if auth("edit")}-->
-                <a class="layui-btn layui-btn-sm" data-open='{:url("edit")}?id={$vo.id}'>编 辑</a>
-                <!--{/if}-->
-
-                <!--{if auth("state") and $vo.status eq 1}-->
-                <a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0" data-csrf="{:systoken('state')}">禁 用</a>
-                <!--{elseif auth("state") and $vo.status eq 0}-->
-                <a class="layui-btn layui-btn-sm layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">激 活</a>
-                <!--{/if}-->
-
-                <!--{if auth("remove")}-->
-                <a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除该规则吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删 除</a>
-                <!--{/if}-->
-
-            </td>
-        </tr>
-        {/foreach}
-        </tbody>
-    </table>
-    {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
-</div>
-{/block}

+ 0 - 49
app/wechat/view/keys/index_search.html

@@ -1,49 +0,0 @@
-<fieldset>
-    <legend>条件搜索</legend>
-    <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">匹配规则</label>
-            <div class="layui-input-inline">
-                <input name="keys" value="{:input('keys','')}" placeholder="请输入匹配规则" class="layui-input">
-            </div>
-        </div>
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">规则类型</label>
-            <div class="layui-input-inline">
-                <select class="layui-select" name="type">
-                    <option value="">-- 全部 --</option>
-                    {foreach $types as $k => $v}{if $k.'' eq input('type')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </div>
-        </div>
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">使用状态</label>
-            <div class="layui-input-inline">
-                <select class="layui-select" name="status">
-                    <option value="">-- 全部 --</option>
-                    {foreach ['显示已禁止的规则','显示已激活的规则'] as $k=>$v}
-                    {if $k.'' eq input('status')}
-                    <option selected value="{$k}">{$v}</option>
-                    {else}
-                    <option value="{$k}">{$v}</option>
-                    {/if}{/foreach}
-                </select>
-            </div>
-        </div>
-        <div class="layui-form-item layui-inline">
-            <label class="layui-form-label">创建时间</label>
-            <div class="layui-input-inline">
-                <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择创建时间" class="layui-input">
-            </div>
-        </div>
-        <div class="layui-form-item layui-inline">
-            <button class="layui-btn layui-btn-primary"><i class="layui-icon">&#xe615;</i> 搜 索</button>
-        </div>
-    </form>
-    <script>window.form.render()</script>
-</fieldset>
-

+ 0 - 204
app/wechat/view/menu/index.html

@@ -1,204 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name='content'}
-<div id="MenuEditor" class="layui-hide think-box-shadow" style="width:900px">
-    <div class='mobile-preview inline-block'>
-        <div class='mobile-header'>公众号</div>
-        <div class='mobile-body'></div>
-        <ul class='mobile-footer notselect'>
-            <li class="parent-menu" style="{{getItemStyle(list)}}" ng-repeat="one in list">
-                <a ng-click="setActiveItem(one)" ng-class="{true:'active'}[one.active]">
-                    <i class="icon-sub" ng-if="one.sub_button.length>0"></i> <span ng-bind="one.name"></span>
-                </a>
-                <i class="close layui-bg-gray layui-icon" ng-click="delItem(one)">&#x1006;</i>
-                <div class="sub-menu text-center" ng-if="one.active||one.show">
-                    <ul>
-                        <li ng-repeat="two in one.sub_button">
-                            <a class="bottom-border" ng-click="setActiveItem(one,two)" ng-class="{true:'active'}[two.active]"><span ng-bind="two.name"></span></a>
-                            <i class="close layui-bg-gray layui-icon" ng-click="delItem(one,two)">&#x1006;</i>
-                        </li>
-                        <li class="menu-add" ng-if="one.sub_button.length<5"><a ng-click="addItem(one.sub_button)"><i class="icon-add"></i></a></li>
-                    </ul>
-                    <i class="arrow arrow_out"></i>
-                    <i class="arrow arrow_in"></i>
-                </div>
-            </li>
-            <li class="parent-menu menu-add" style="{{getItemStyle(list)}}" ng-if="list.length<3">
-                <a ng-click="addItem(list)"><i class="icon-add"></i></a>
-            </li>
-        </ul>
-    </div>
-
-    <div class="absolute inline-block layui-card margin-left-10" style="border:1px solid #ccc;height:578px;width:570px">
-        <div class="layui-card-header layui-bg-gray text-center">菜单编辑</div>
-        <div class="layui-card-body" ng-if="list.length<1">
-            <blockquote class="layui-elem-quote border-0 text-center">请在左侧创建菜单...</blockquote>
-        </div>
-        <div class="layui-card-body" ng-if="list.length>0">
-            <form class="layui-form menu-form" autocomplete="off" style="padding-right:80px;">
-                <div class="layui-form-item margin-top-20">
-                    <label class="layui-form-label">菜单名称</label>
-                    <div class="layui-input-block">
-                        <input required name="menu-name" ng-model="item.name" class="layui-input" placeholder="请输入菜单名称">
-                        <span class="help-block">字数不超过13个汉字或40个字母</span>
-                    </div>
-                </div>
-                <div class="layui-form-item margin-top-20" ng-if="!item.sub_button||item.sub_button.length<1">
-                    <label class="layui-form-label label-required">菜单类型</label>
-                    <div class="layui-input-block">
-                        {foreach $menuTypes as $key => $type}
-                        <label class="think-radio layui-elip"><input lay-ignore type="radio" ng-model="item.type" name="menu-type" value="{$key}"> {$type}</label>
-                        {/foreach}
-                    </div>
-                </div>
-                <div class="layui-form-item margin-top-20" ng-if="item.type==='customservice'">
-                    <label class="layui-form-label">提示文字</label>
-                    <div class="layui-input-block">
-                        <textarea required class="layui-textarea" ng-model="item.content"></textarea>
-                    </div>
-                </div>
-                <div class="layui-form-item margin-top-20" ng-if="(!item.sub_button||item.sub_button.length<1)&&item.type==='click'">
-                    <label class="layui-form-label">匹配规则</label>
-                    <div class="layui-input-block">
-                        <select required class="layui-select" lay-filter="key" lay-search>
-                            <option value="{{x.keys}}" ng-selected="x.keys===item.key" ng-repeat="x in keys" ng-bind="x.keys"></option>
-                        </select>
-                    </div>
-                </div>
-                <div class="layui-form-item margin-top-20" ng-if="item.type==='view'">
-                    <label class="layui-form-label">跳转链接</label>
-                    <div class="layui-input-block">
-                        <textarea required class="layui-textarea" ng-model="item.url" placeholder="请输入跳转链接"></textarea>
-                    </div>
-                </div>
-                <div ng-if="item.type==='miniprogram'">
-                    <div class="layui-form-item margin-top-20">
-                        <label class="layui-form-label">小程序链接</label>
-                        <div class="layui-input-block">
-                            <input type="text" required class="layui-input" ng-model="item.url" placeholder="请输入小程序链接">
-                        </div>
-                    </div>
-                    <div class="layui-form-item margin-top-20">
-                        <label class="layui-form-label">小程序APPID</label>
-                        <div class="layui-input-block">
-                            <input type="text" required class="layui-input" ng-model="item.appid" placeholder="请输入小程序APPID">
-                        </div>
-                    </div>
-                    <div class="layui-form-item margin-top-20">
-                        <label class="layui-form-label">小程序页面</label>
-                        <div class="layui-input-block">
-                            <input type="text" required class="layui-input" ng-model="item.pagepath" placeholder="请输入小程序页面">
-                        </div>
-                    </div>
-                </div>
-            </form>
-        </div>
-    </div>
-
-    <div class="text-center margin-top-20">
-        {if auth("push")}
-        <button class="layui-btn menu-submit" ng-click="submit()">保存发布</button>
-        {/if}
-        {if auth("cancel")}
-        <button data-load='{:url("cancel")}' class="layui-btn layui-btn-danger">取消发布</button>
-        {/if}
-    </div>
-
-</div>
-
-<script>
-    require(['angular'], function () {
-
-        var $form = $('.menu-form').vali();
-        var $vali = $form.vali().data('validate');
-        $('#MenuEditor.layui-hide').removeClass('layui-hide');
-
-        var app = angular.module("MenuEditor", []).run(callback);
-        angular.bootstrap(document.getElementById(app.name), [app.name]);
-
-        function callback($rootScope) {
-            $rootScope.item = {};
-            $rootScope.list = [];
-            $rootScope.keys = [];
-            $.form.load('{:url("index")}', {output: 'json'}, 'get', function (ret) {
-                return $rootScope.$apply(function () {
-                    $rootScope.keys = ret.data.keysdata || [];
-                    $rootScope.list = ret.data.menudata || [];
-                    if ($rootScope.list.length < 1) $rootScope.list = [{name: '请输入名称', type: 'click', sub_button: []}];
-                    for (var i in $rootScope.list) $rootScope.list[i].sub_button = $rootScope.list[i].sub_button || [];
-                    $rootScope.list[0].show = true;
-                    $rootScope.list[0].active = true;
-                    $rootScope.item = $rootScope.list[0];
-                }), false;
-            });
-
-            // 动态计算宽度
-            $rootScope.getItemStyle = function (list) {
-                return 'width:' + (100 / (list.length >= 3 ? 3 : (list.length + 1))) + '%';
-            };
-
-            // 增加菜单选项
-            $rootScope.addItem = function (list) {
-                $vali.checkAllInput();
-                if ($form.find('.validate-error').size() > 0) {
-                    return $.msg.tips('表单验证不成功,请输入需要的内容!');
-                }
-                list.push({name: '请输入名称', type: 'click', sub_button: []});
-            };
-
-            // 移除菜单
-            $rootScope.delItem = function (one, two) {
-                var tmp = [], _two = null;
-                if (two) {
-                    for (var i in one.sub_button) if (one.sub_button[i] !== two) {
-                        tmp.push(one.sub_button[i]);
-                        if (one.sub_button[i].active) _two = one.sub_button[i];
-                    }
-                    one.sub_button = tmp;
-                    return $rootScope.setActiveItem(one, _two);
-                }
-                for (var i in $rootScope.list) if (one !== $rootScope.list[i]) tmp.push($rootScope.list[i]);
-                $rootScope.list = tmp;
-                if ($rootScope.list.length > 1) $rootScope.setActiveItem($rootScope.list[0])
-            };
-
-            // 切换选择菜单
-            $rootScope.setActiveItem = function (one, two) {
-                for (var i in $rootScope.list) {
-                    $rootScope.list[i].show = ($rootScope.list[i] === one);
-                    $rootScope.list[i].active = two ? false : ($rootScope.list[i] === one);
-                }
-                for (var i in $rootScope.list) for (var j in $rootScope.list[i].sub_button) {
-                    $rootScope.list[i].sub_button[j].active = ($rootScope.list[i].sub_button[j] === two)
-                }
-                $rootScope.item = two || one || {};
-                $rootScope.item.type = $rootScope.item.type || 'click';
-                if ($rootScope.item.type === 'click') setTimeout(function () {
-                    form.render('select');
-                    $rootScope.item.key = $('[lay-filter="key"]').val();
-                }, 50);
-            };
-
-            // 下拉列表处理
-            $rootScope.$watch('item', function () {
-                if ($rootScope.item.type === 'click') setTimeout(function () {
-                    form.render('select');
-                    $rootScope.item.key = $('[lay-filter="key"]').val();
-                }, 50)
-            }, true);
-
-            form.on('select(key)', function (data) {
-                $rootScope.item.key = data.value;
-            });
-
-            // 提交数据
-            $rootScope.submit = function () {
-                $vali.checkAllInput();
-                if ($form.find('.validate-error').size() > 0) return false;
-                $.form.load('{:url("push")}', {data: angular.toJson($rootScope.list)}, 'post');
-            }
-        }
-    })
-</script>
-
-{/block}

+ 0 - 209
app/wechat/view/news/form.html

@@ -1,209 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="style"}{include file='news/formstyle'}{/block}
-
-{block name='content'}
-<div id="NewsEditor" class="layui-clear nowrap padding-bottom-30">
-    <div class="layui-card news-left">
-        <div class="layui-card-body layui-hide">
-            <div ng-if="list.length > 0" ng-repeat="x in list">
-                <div class="news-item transition" ng-click="setItem($index,$event)" style="{{x.style}}" ng-class="x.active?'active':''">
-                    <a ng-click="delItem($index, $event)" class="transition layui-icon layui-hide">&#x1006;</a>
-                    <a ng-click="dnItem($index, $event)" class="transition layui-icon layui-hide">&#xe61a;</a>
-                    <a ng-click="upItem($index, $event)" class="transition layui-icon layui-hide">&#xe619;</a>
-                    <span class="news-title" ng-bind="x.title"></span>
-                </div>
-                <hr>
-            </div>
-            <div ng-if="list.length<1" class="news-item transition active">
-                <a ng-click="delItem($index, $event)" class="transition layui-icon layui-hide">&#x1006;</a>
-                <a ng-click="dnItem($index, $event)" class="transition layui-icon layui-hide">&#xe61a;</a>
-                <a ng-click="upItem($index, $event)" class="transition layui-icon layui-hide">&#xe619;</a>
-                <span class="news-title"></span>
-                <hr>
-            </div>
-            <a class='article-add transition' ng-click="addItem()" data-text-tip="添加图文"><i class="layui-icon layui-icon-add-1"></i></a>
-        </div>
-    </div>
-    <div class="layui-card news-right">
-        <div class="layui-card-body">
-            <form class="layui-form padding-20" role="form" name="news" onsubmit="return false">
-                <label class="layui-form-item relative block">
-                    <span class="color-green">文章标题</span>
-                    <input maxlength="64" ng-model="item.title" required placeholder="请在这里输入标题" name='title' class="layui-input">
-                </label>
-                <label class="layui-form-item relative block">
-                    <span class="color-green">文章作者</span>
-                    <input maxlength="64" ng-model="item.author" required placeholder="请输入文章作者" name='author' class="layui-input">
-                </label>
-                <div class="layui-form-item label-required-prev">
-                    <span class="color-green">图文封面大图片</span>
-                    <div class="layui-clear">
-                        <div class="upload-image-box pull-left transition" data-tips-image="{{item.local_url}}" style="{{item.style}}">
-                            <input ng-model="item.local_url" data-auto-none value="{{item.local_url}}" type="hidden" name="local_url">
-                        </div>
-                        <div class="pull-left padding-top-15 padding-left-15">
-                            <button type="button" data-title="上传图片" data-file="btn" data-type="jpg,png,jpeg" data-field="local_url" class="layui-btn layui-btn-sm layui-btn-primary">上传图片</button>
-                            <br>
-                            <label class="think-checkbox notselect margin-top-15">
-                                <input ng-model="item.show_cover_pic" ng-checked="!!item.show_cover_pic" data-auto-none type="checkbox" value="1" name="show_cover_pic"> 在正文顶部显示此图片
-                            </label>
-                        </div>
-                    </div>
-                    <p class="color-desc">封面大图片建议尺寸 900像素 * 500像素</p>
-                </div>
-                <div class="layui-form-item label-required-prev">
-                    <span class="color-green">图文文章内容</span>
-                    <textarea ng-model="item.content" name='content'></textarea>
-                </div>
-                <label class="layui-form-item relative block">
-                    <span class="help-block">摘要选填,如果不填写会默认抓取正文前54个字</span>
-                    <textarea ng-model="item.digest" name="digest" class="layui-textarea" style="height:80px;line-height:18px"></textarea>
-                </label>
-                <label class="layui-form-item relative block">
-                    <span class="help-block">原文链接 <span class="color-blue">选填</span>,填写之后在图文左下方会出现此链接</span>
-                    <input pattern="^(http:\/\/|^https:\/\/|^\/\/)((\w|=|\?|\.|\/|&|-)+)" placeholder="请输入跳转链接地址" ng-model="item.content_source_url" maxlength="200" name='content_source_url' class="layui-input">
-                </label>
-                <div class="layui-form-item text-center padding-top-30">
-                    <input ng-model="x.read_num" type="hidden">
-                    <button ng-click="submit()" type="button" class="layui-btn">保存图文</button>
-                </div>
-            </form>
-        </div>
-    </div>
-</div>
-
-{/block}
-
-
-{block name='script'}
-<script>
-    require(['angular', 'ckeditor'], function () {
-
-        var editor;
-        var $form = $('form[name="news"]');
-        var $vali = $form.vali().data('validate');
-
-        var app = angular.module("NewsEditor", []).run(callback);
-        angular.bootstrap(document.getElementById(app.name), [app.name]);
-
-        function callback($rootScope) {
-            $rootScope.list = [];
-            $rootScope.item = {};
-
-            $.form.load('{:request()->url()}', {output: 'json'}, 'get', function (ret) {
-                return $rootScope.$apply(function () {
-                    apply((ret.data || {articles: []}).articles || []);
-                }), false;
-            });
-
-            function apply(list) {
-                if (list.length < 1) list.push({
-                    title: '新建图文', author: '管理员', content: '文章内容',
-                    read_num: 0, local_url: '__FULL__/static/theme/img/image.png',
-                });
-                for (var i in list) {
-                    list[i].active = false;
-                    list[i].style = "background-image:url('" + list[i].local_url + "')";
-                }
-                $rootScope.list = list;
-                $rootScope.item = $rootScope.list[0];
-                $rootScope.setItemValue('active', true);
-                $('.layui-card-body.layui-hide').removeClass('layui-hide');
-                setTimeout(function () {
-                    if (editor) editor.destroy();
-                    editor = window.createEditor('[name="content"]');
-                    editor.setData($rootScope.item.content);
-                    $vali.checkAllInput();
-                }, 100);
-            }
-
-            $rootScope.upItem = function (index, $event) {
-                $event.stopPropagation();
-                var tmp = [], cur = $rootScope.list[index];
-                if (index < 1) return false;
-                for (var i in $rootScope.list) {
-                    (parseInt(i) === parseInt(index) - 1) && tmp.push(cur);
-                    (parseInt(i) !== parseInt(index)) && tmp.push($rootScope.list[i]);
-                }
-                apply(tmp);
-            };
-            $rootScope.dnItem = function (index, $event) {
-                $event.stopPropagation();
-                var tmp = [], cur = $rootScope.list[index];
-                if (index > $rootScope.list.length - 2) return false;
-                for (var i in $rootScope.list) {
-                    (parseInt(i) !== parseInt(index)) && tmp.push($rootScope.list[i]);
-                    (parseInt(i) === parseInt(index) + 1) && tmp.push(cur);
-                }
-                apply(tmp);
-            };
-            $rootScope.delItem = function (index, $event) {
-                $event.stopPropagation();
-                var list = $rootScope.list, temp = [];
-                for (var i in list) (parseInt(i) !== parseInt(index)) && temp.push(list[i]);
-                apply(temp);
-            };
-            $rootScope.setItem = function (index, $event) {
-                $event.stopPropagation();
-                $vali.checkAllInput();
-                if ($form.find('.validate-error').size() > 0) return 0;
-                if (editor.getData().length < 1) {
-                    return $.msg.tips('文章内容不能为空,请输入文章内容!');
-                }
-                for (var i in $rootScope.list) if (parseInt(i) !== parseInt(index)) {
-                    $rootScope.list[i].active = false;
-                } else {
-                    $rootScope.item.content = editor.getData();
-                    $rootScope.item = $rootScope.list[i];
-                    editor.setData($rootScope.item.content);
-                    $rootScope.setItemValue('active', true);
-                }
-            };
-            $rootScope.setItemValue = function (name, value) {
-                $rootScope.item[name] = value;
-                $rootScope.item.style = "background-image:url('" + $rootScope.item.local_url + "')";
-            };
-            $rootScope.addItem = function () {
-                if ($rootScope.list.length > 7) {
-                    return $.msg.tips('最多允许增加7篇文章哦!');
-                }
-                $rootScope.list.push({
-                    title: '新建图文',
-                    author: '管理员',
-                    content: '文章内容',
-                    read_num: 0,
-                    local_url: '__FULL__/static/theme/img/image.png',
-                    style: "background-image:url('__FULL__/static/theme/img/image.png')"
-                });
-            };
-            $rootScope.submit = function () {
-                $vali.checkAllInput();
-                if ($form.find('.validate-error').size() > 0) {
-                    return $.msg.tips('表单验证不成功,请输入需要的内容!');
-                }
-                $rootScope.item.content = editor.getData();
-                var data = [];
-                for (var i in $rootScope.list) data.push({
-                    id: $rootScope.list[i].id,
-                    title: $rootScope.list[i].title,
-                    author: $rootScope.list[i].author,
-                    digest: $rootScope.list[i].digest,
-                    content: $rootScope.list[i].content,
-                    read_num: $rootScope.list[i].read_num,
-                    local_url: $rootScope.list[i].local_url,
-                    show_cover_pic: $rootScope.list[i].show_cover_pic ? 1 : 0,
-                    content_source_url: $rootScope.list[i].content_source_url,
-                });
-                $.form.load('{:request()->url()}', {data: data}, "post");
-            };
-            $('[name="local_url"]').on('change', function (value) {
-                value = this.value;
-                $rootScope.$apply(function () {
-                    $rootScope.setItemValue('local_url', value);
-                });
-            });
-        }
-    });
-</script>
-{/block}

+ 0 - 87
app/wechat/view/news/formstyle.html

@@ -1,87 +0,0 @@
-<style>
-    .news-left {
-        width: 300px;
-        float: left;
-        margin-right: 15px;
-    }
-
-    .news-right {
-        overflow: hidden;
-        width: 980px;
-        position: relative;
-        display: inline-block;
-    }
-
-    .news-left .news-item {
-        height: 150px;
-        cursor: pointer;
-        max-width: 270px;
-        overflow: hidden;
-        position: relative;
-        border-radius: 5px;
-        border: 1px solid #ccc;
-        background-size: cover;
-        background-position: center center
-    }
-
-    .news-left .news-item.active {
-        border: 1px solid #44b549 !important;
-        box-shadow: 0 0 5px 0 #44b549;
-    }
-
-    .news-left .article-add {
-        color: #999;
-        display: block;
-        font-size: 22px;
-        text-align: center
-    }
-
-    .news-left .article-add:hover {
-        color: #666
-    }
-
-    .news-left .news-title {
-        bottom: 0;
-        color: #fff;
-        width: 272px;
-        display: block;
-        padding: 0 5px;
-        max-height: 6em;
-        overflow: hidden;
-        margin-left: -1px;
-        position: absolute;
-        text-overflow: ellipsis;
-        background: rgba(0, 0, 0, .7)
-    }
-
-    .news-left .news-item a {
-        color: #fff;
-        width: 30px;
-        height: 30px;
-        float: right;
-        font-size: 12px;
-        margin-top: -1px;
-        line-height: 34px;
-        text-align: center;
-        margin-right: -1px;
-        background-color: rgba(0, 0, 0, .5)
-    }
-
-    .news-left .news-item:hover a {
-        display: inline-block !important
-    }
-
-    .news-left .news-item a:hover {
-        text-decoration: none;
-        background-color: #0C0C0C
-    }
-
-    .news-right .upload-image-box {
-        width: 130px;
-        height: 90px;
-        border-radius: 5px;
-        box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2);
-        background: url("__ROOT__/static/theme/img/image.png") no-repeat center center;
-        background-size: cover;
-    }
-</style>

+ 0 - 158
app/wechat/view/news/index.html

@@ -1,158 +0,0 @@
-{extend name="../../admin/view/main"}
-
-{block name="button"}
-
-{if auth('add')}
-<button data-open="{:url('add')}" class='layui-btn layui-btn-sm layui-btn-primary'>添加图文</button>
-{/if}
-
-{/block}
-
-{block name='content'}
-<div class="think-box-shadow">
-    <div id="news-box" class="layui-clear layui-hide">
-        {foreach $list as $vo}
-        <div class="news-item">
-            <div class='news-tools layui-hide'>
-                <a data-phone-view="{:url('wechat/api.view/news')}?id={$vo.id}" href='javascript:void(0)'>预览</a>
-                <a data-open='{:url("edit")}?id={$vo.id}' href='javascript:void(0)'>编辑</a>
-                <a data-news-del="{$vo.id}" href='javascript:void(0)'>删除</a>
-            </div>
-            {foreach $vo.articles as $k => $v}
-            {if $k < 1}
-            <div data-tips-image='{$v.local_url}' data-lazy-src="{$v.local_url}" class='news-articel-item'>
-                {if $v.title}<p>{$v.title}</p>{/if}
-            </div>
-            <div class="hr-line-dashed"></div>
-            {else}
-            <div class='news-articel-item other'>
-                <span>{$v.title}</span>
-                <div data-tips-image='{$v.local_url}' data-lazy-src="{$v.local_url}"></div>
-            </div>
-            <div class="hr-line-dashed"></div>
-            {/if}{/foreach}
-        </div>
-        {/foreach}
-    </div>
-    {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
-</div>
-{/block}
-
-{block name='script'}
-<script>
-    $('body').off('mouseenter', '.news-item').on('mouseenter', '.news-item', function () {
-        $(this).find('.news-tools').removeClass('layui-hide');
-    }).off('mouseleave', '.news-item').on('mouseleave', '.news-item', function () {
-        $(this).find('.news-tools').addClass('layui-hide');
-    });
-    $.msg.loading();
-    require(['jquery.masonry'], function (Masonry) {
-        layui.layer.closeAll();
-        $('#news-box').removeClass('layui-hide');
-        var newsbox = document.querySelector('#news-box');
-        var msnry = new Masonry(newsbox, {itemSelector: '.news-item', columnWidth: 0});
-        msnry.layout(), $('body').on('click', '[data-news-del]', function (event) {
-            $.msg.confirm('确定要删除图文吗?', function (index) {
-                $.msg.close(index), $.form.load('{:url("remove")}', {value: 0, field: 'delete', id: $(event.target).data('news-del')}, 'post', function (ret) {
-                    if (ret.code) {
-                        $(event.target).parents('.news-item').remove();
-                        msnry = new Masonry(newsbox, {itemSelector: '.news-item', columnWidth: 0});
-                        return msnry.layout(), (msnry.items.length < 1 && $.form.open('{:url("index")}')), $.msg.success(ret.info), false;
-                    } else {
-                        return $.msg.error(ret.info), false;
-                    }
-                });
-            });
-        });
-    });
-</script>
-{/block}
-
-{block name="style"}
-<style>
-    #news-box {
-        position: relative
-    }
-
-    #news-box .news-item {
-        top: 0;
-        left: 0;
-        padding: 5px;
-        margin: 10px;
-        width: 300px;
-        overflow: hidden;
-        position: relative;
-        border-radius: 5px;
-        border: 1px solid #ccc;
-        box-sizing: content-box;
-        box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2);
-    }
-
-    #news-box .news-item .news-articel-item {
-        height: 150px;
-    }
-
-    #news-box .news-item .news-articel-item p {
-        bottom: 0;
-        width: 100%;
-        color: #fff;
-        padding: 5px;
-        max-height: 5em;
-        font-size: 12px;
-        overflow: hidden;
-        position: absolute;
-        text-overflow: ellipsis;
-        background: rgba(0, 0, 0, .7)
-    }
-
-    #news-box .news-item .news-articel-item.other {
-        height: 50px;
-        padding: 5px 0
-    }
-
-    #news-box .news-item .news-articel-item span {
-        width: 225px;
-        overflow: hidden;
-        line-height: 50px;
-        white-space: nowrap;
-        display: inline-block;
-        text-overflow: ellipsis
-    }
-
-    #news-box .news-item .news-articel-item div {
-        width: 70px;
-        height: 50px;
-        float: right;
-        overflow: hidden;
-        position: relative;
-        background-position: center center;
-        background-size: cover;
-    }
-
-    #news-box .hr-line-dashed {
-        margin: 6px 0 1px 0
-    }
-
-    #news-box .news-item .hr-line-dashed:last-child {
-        display: none
-    }
-
-    #news-box .news-tools {
-        top: 0;
-        z-index: 80;
-        color: #fff;
-        width: 302px;
-        padding: 0 5px;
-        margin-left: -6px;
-        line-height: 38px;
-        text-align: right;
-        position: absolute;
-        background: rgba(0, 0, 0, .7)
-    }
-
-    #news-box .news-tools a {
-        color: #fff;
-        margin-left: 10px
-    }
-</style>
-{/block}

+ 0 - 146
app/wechat/view/news/select.html

@@ -1,146 +0,0 @@
-{extend name="../../admin/view/index/index"}
-
-{block name='style'}
-<style>
-    .news-container {
-        overflow: auto;
-        position: relative;
-        max-height: 480px;
-    }
-
-    .news-container .news-item {
-        top: 0;
-        left: 0;
-        width: 228px;
-        margin: 0 0 20px 20px;
-        padding: 5px;
-        cursor: pointer;
-        position: relative;
-        border: 1px solid #ccc;
-        border-radius: 5px;
-        box-sizing: content-box
-    }
-
-    .news-container .news-item.active,
-    .news-container .news-item:hover {
-        border-color: #09c;
-        box-shadow: 1px 0 10px #09c
-    }
-
-    .news-container .news-item .news-articel-item {
-        width: 100%;
-        height: 150px;
-        overflow: hidden;
-        position: relative;
-        background-size: cover;
-        background-position: center center
-    }
-
-    .news-container .news-item .news-articel-item p {
-        bottom: 0;
-        color: #fff;
-        width: 100%;
-        padding: 5px;
-        overflow: hidden;
-        font-size: 12px;
-        max-height: 5em;
-        position: absolute;
-        text-overflow: ellipsis;
-        background: rgba(0, 0, 0, .7)
-    }
-
-    .news-container .news-item .news-articel-item.other {
-        height: 50px;
-        padding: 5px 0
-    }
-
-    .news-container .news-item .news-articel-item .left-image {
-        width: 50px;
-        height: 50px;
-        float: left;
-        overflow: hidden;
-        position: relative;
-        background-size: cover;
-        background-position: center center
-    }
-
-    .news-container .news-item .news-articel-item .right-text {
-        float: left;
-        width: 165px;
-        overflow: hidden;
-        padding-right: 10px;
-        text-overflow: ellipsis
-    }
-
-    .news-container .news-item .hr-line-dashed:last-child {
-        display: none
-    }
-
-    .news-container .hr-line-dashed {
-        margin: 6px 0 1px 0
-    }
-
-    .pagination-container {
-        left: 0;
-        right: 0;
-        bottom: 0;
-        padding: 5px 20px;
-        position: fixed;
-        background: #fff;
-        border-top: 1px solid #dedede;
-    }
-</style>
-{/block}
-
-{block name="body"}
-<div class="layui-clear news-container layui-hide padding-top-20">
-    {foreach $list as $vo}
-    <div class="news-item shadow-mini" data-news-id="{$vo.id}">
-        {foreach $vo.articles as $k => $v}{if $k < 1}
-        <div class='news-articel-item' data-lazy-src="{$v.local_url}">
-            {if $v.title}<p>{$v.title}</p>{/if}
-        </div>
-        <div class="hr-line-dashed"></div>
-        {else}
-        <div class='news-articel-item other'>
-            <div class='right-text'>{$v.title}</div>
-            <div class='left-image' data-lazy-src="{$v.local_url}"></div>
-        </div>
-        <div class="hr-line-dashed"></div>
-        {/if}{/foreach}
-    </div>
-    {/foreach}
-</div>
-{empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
-{/block}
-
-{block name="script"}
-<script>
-    require(['jquery.masonry'], function (Masonry) {
-        $('.news-container.layui-hide').removeClass('layui-hide');
-        var msnry = new Masonry($('.news-container').get(0), {
-            itemSelector: '.news-item', columnWidth: 0
-        });
-        msnry.layout();
-        /*! 事件处理 */
-        $('.news-item').on('mouseenter', '.news-container', function () {
-            $(this).addClass('active');
-        }).on('mouseleave', '.news-container', function () {
-            $(this).removeClass('active');
-        });
-        /*! 外部选择器 */
-        var seletor = '[name="{:decode(input("get.field","0"))}"]';
-        $('[data-news-id]').on('click', function () {
-            window.top.$(seletor).val($(this).attr('data-news-id')).trigger('change');
-            parent.layer.close(parent.layer.getFrameIndex(window.name))
-        });
-        /*! 分页事件处理 */
-        $('body').off('change', '.pagination-trigger select').on('change', '.pagination-trigger select', function () {
-            var urls = this.options[this.selectedIndex].getAttribute('data-url').split('#');
-            urls.shift(), window.location.href = urls.join('#');
-        }).off('click', '[data-open]').on('click', '[data-open]', function () {
-            window.location.href = this.getAttribute('data-open');
-        });
-    });
-</script>
-{/block}

+ 1 - 3
composer.json

@@ -24,12 +24,10 @@
     "ext-openssl": "*",
     "ext-mbstring": "*",
     "ext-simplexml": "*",
-    "endroid/qr-code": "^1.9",
     "topthink/framework": "^6.0",
     "topthink/think-view": "^1.0",
     "zoujingli/ip2region": "^1.0",
-    "zoujingli/think-library": "6.0.x-dev",
-    "zoujingli/wechat-developer": "^1.2"
+    "zoujingli/think-library": "6.0.x-dev"
   },
   "autoload": {
     "psr-0": {

+ 2 - 215
composer.lock

@@ -4,78 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "5d91677e6746f44f3a452d90610de329",
+    "content-hash": "affc3981d836904853fd39f8869911e0",
     "packages": [
-        {
-            "name": "endroid/qr-code",
-            "version": "1.9.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/endroid/qr-code.git",
-                "reference": "c9644bec2a9cc9318e98d1437de3c628dcd1ef93"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/endroid/qr-code/zipball/c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
-                "reference": "c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "ext-gd": "*",
-                "php": ">=5.4",
-                "symfony/options-resolver": "^2.3|^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.0|^5.0",
-                "sensio/framework-extra-bundle": "^3.0",
-                "symfony/browser-kit": "^2.3|^3.0",
-                "symfony/framework-bundle": "^2.3|^3.0",
-                "symfony/http-kernel": "^2.3|^3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Endroid\\QrCode\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jeroen van den Enden",
-                    "email": "info@endroid.nl",
-                    "homepage": "http://endroid.nl/"
-                }
-            ],
-            "description": "Endroid QR Code",
-            "homepage": "https://github.com/endroid/QrCode",
-            "keywords": [
-                "bundle",
-                "code",
-                "endroid",
-                "qr",
-                "qrcode",
-                "symfony"
-            ],
-            "support": {
-                "issues": "https://github.com/endroid/qr-code/issues",
-                "source": "https://github.com/endroid/qr-code/tree/1.9.3"
-            },
-            "time": "2017-04-08T09:13:59+00:00"
-        },
         {
             "name": "league/flysystem",
             "version": "1.1.4",
@@ -517,78 +447,6 @@
             },
             "time": "2017-10-23T01:57:42+00:00"
         },
-        {
-            "name": "symfony/options-resolver",
-            "version": "v3.4.47",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744",
-                "reference": "c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "php": "^5.5.9|>=7.0.8"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\OptionsResolver\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony OptionsResolver Component",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "config",
-                "configuration",
-                "options"
-            ],
-            "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v3.4.47"
-            },
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-10-24T10:57:07+00:00"
-        },
         {
             "name": "topthink/framework",
             "version": "v6.0.9",
@@ -980,77 +838,6 @@
                 "wiki": "https://thinkadmin.top"
             },
             "time": "2021-08-04T09:13:02+00:00"
-        },
-        {
-            "name": "zoujingli/wechat-developer",
-            "version": "v1.2.31",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zoujingli/WeChatDeveloper.git",
-                "reference": "0cf699c725f69d66657a50e60d22f71c9e5a5e16"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zoujingli/WeChatDeveloper/zipball/0cf699c725f69d66657a50e60d22f71c9e5a5e16",
-                "reference": "0cf699c725f69d66657a50e60d22f71c9e5a5e16",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "ext-bcmath": "*",
-                "ext-curl": "*",
-                "ext-json": "*",
-                "ext-libxml": "*",
-                "ext-mbstring": "*",
-                "ext-openssl": "*",
-                "ext-simplexml": "*",
-                "ext-xml": "*",
-                "php": ">=5.4"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "We.php"
-                ],
-                "psr-4": {
-                    "WePay\\": "WePay",
-                    "WeChat\\": "WeChat",
-                    "WeMini\\": "WeMini",
-                    "AliPay\\": "AliPay",
-                    "WePayV3\\": "WePayV3"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Anyon",
-                    "email": "zoujingli@qq.com",
-                    "homepage": "https://thinkadmin.top"
-                }
-            ],
-            "description": "WeChat platform and WeChat payment development tools",
-            "homepage": "https://github.com/kentwangit/WeChatDeveloper",
-            "keywords": [
-                "WeChatDeveloper",
-                "WeMini",
-                "alipay",
-                "wechat",
-                "wechatpay",
-                "wepay"
-            ],
-            "support": {
-                "issues": "https://github.com/zoujingli/WeChatDeveloper/issues",
-                "source": "https://github.com/zoujingli/WeChatDeveloper/tree/v1.2.31"
-            },
-            "time": "2021-05-19T06:25:20+00:00"
         }
     ],
     "packages-dev": [],
@@ -1073,5 +860,5 @@
         "ext-simplexml": "*"
     },
     "platform-dev": [],
-    "plugin-api-version": "2.0.0"
+    "plugin-api-version": "2.1.0"
 }

+ 326 - 447
vendor/composer/InstalledVersions.php

@@ -1,458 +1,337 @@
 <?php
 
-
-
-
-
-
-
-
-
-
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
 namespace Composer;
 
 use Composer\Autoload\ClassLoader;
 use Composer\Semver\VersionParser;
 
-
-
-
-
-
-
-
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require it's presence, you can require `composer-runtime-api ^2.0`
+ */
 class InstalledVersions
 {
-private static $installed = array (
-  'root' => 
-  array (
-    'pretty_version' => 'dev-master',
-    'version' => 'dev-master',
-    'aliases' => 
-    array (
-    ),
-    'reference' => 'dea0d88a83dbe63381a4034a0904ca604a897359',
-    'name' => 'zoujingli/thinkadmin',
-    'dev' => true,
-  ),
-  'versions' => 
-  array (
-    'endroid/qr-code' => 
-    array (
-      'pretty_version' => '1.9.3',
-      'version' => '1.9.3.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'c9644bec2a9cc9318e98d1437de3c628dcd1ef93',
-      'dev-requirement' => false,
-    ),
-    'league/flysystem' => 
-    array (
-      'pretty_version' => '1.1.4',
-      'version' => '1.1.4.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'f3ad69181b8afed2c9edf7be5a2918144ff4ea32',
-      'dev-requirement' => false,
-    ),
-    'league/flysystem-cached-adapter' => 
-    array (
-      'pretty_version' => '1.1.0',
-      'version' => '1.1.0.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff',
-      'dev-requirement' => false,
-    ),
-    'league/mime-type-detection' => 
-    array (
-      'pretty_version' => '1.7.0',
-      'version' => '1.7.0.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3',
-      'dev-requirement' => false,
-    ),
-    'psr/cache' => 
-    array (
-      'pretty_version' => '1.0.1',
-      'version' => '1.0.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
-      'dev-requirement' => false,
-    ),
-    'psr/container' => 
-    array (
-      'pretty_version' => '1.1.1',
-      'version' => '1.1.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
-      'dev-requirement' => false,
-    ),
-    'psr/log' => 
-    array (
-      'pretty_version' => '1.1.4',
-      'version' => '1.1.4.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
-      'dev-requirement' => false,
-    ),
-    'psr/simple-cache' => 
-    array (
-      'pretty_version' => '1.0.1',
-      'version' => '1.0.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
-      'dev-requirement' => false,
-    ),
-    'symfony/options-resolver' => 
-    array (
-      'pretty_version' => 'v3.4.47',
-      'version' => '3.4.47.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744',
-      'dev-requirement' => false,
-    ),
-    'topthink/framework' => 
-    array (
-      'pretty_version' => 'v6.0.9',
-      'version' => '6.0.9.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '0b5fb453f0e533de3af3a1ab6a202510b61be617',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-helper' => 
-    array (
-      'pretty_version' => 'v3.1.5',
-      'version' => '3.1.5.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-orm' => 
-    array (
-      'pretty_version' => 'v2.0.44',
-      'version' => '2.0.44.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '5d3d5c1ebf8bfccf34bacd90edb42989b16ea409',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-template' => 
-    array (
-      'pretty_version' => 'v2.0.8',
-      'version' => '2.0.8.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'abfc293f74f9ef5127b5c416310a01fe42e59368',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-view' => 
-    array (
-      'pretty_version' => 'v1.0.14',
-      'version' => '1.0.14.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/ip2region' => 
-    array (
-      'pretty_version' => 'v1.0.10',
-      'version' => '1.0.10.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '453480d0ab5b6fdbdf4aa400b7598a10ff2dc5c0',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/think-library' => 
-    array (
-      'pretty_version' => 'v6.0.x-dev',
-      'version' => '6.0.9999999.9999999-dev',
-      'aliases' => 
-      array (
-        0 => '9999999-dev',
-      ),
-      'reference' => '00a0080e4b0e72bd94a2facd426eb0cc585c1b6d',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/thinkadmin' => 
-    array (
-      'pretty_version' => 'dev-master',
-      'version' => 'dev-master',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'dea0d88a83dbe63381a4034a0904ca604a897359',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/wechat-developer' => 
-    array (
-      'pretty_version' => 'v1.2.31',
-      'version' => '1.2.31.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '0cf699c725f69d66657a50e60d22f71c9e5a5e16',
-      'dev-requirement' => false,
-    ),
-  ),
-);
-private static $canGetVendors;
-private static $installedByVendor = array();
-
-
-
-
-
-
-
-public static function getInstalledPackages()
-{
-$packages = array();
-foreach (self::getInstalled() as $installed) {
-$packages[] = array_keys($installed['versions']);
-}
-
-if (1 === \count($packages)) {
-return $packages[0];
-}
-
-return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
-}
-
-
-
-
-
-
-
-
-
-
-public static function isInstalled($packageName, $includeDevRequirements = true)
-{
-foreach (self::getInstalled() as $installed) {
-if (isset($installed['versions'][$packageName])) {
-return $includeDevRequirements || empty($installed['versions'][$packageName]['dev-requirement']);
-}
-}
-
-return false;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-public static function satisfies(VersionParser $parser, $packageName, $constraint)
-{
-$constraint = $parser->parseConstraints($constraint);
-$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
-
-return $provided->matches($constraint);
-}
-
-
-
-
-
-
-
-
-
-
-public static function getVersionRanges($packageName)
-{
-foreach (self::getInstalled() as $installed) {
-if (!isset($installed['versions'][$packageName])) {
-continue;
-}
-
-$ranges = array();
-if (isset($installed['versions'][$packageName]['pretty_version'])) {
-$ranges[] = $installed['versions'][$packageName]['pretty_version'];
-}
-if (array_key_exists('aliases', $installed['versions'][$packageName])) {
-$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
-}
-if (array_key_exists('replaced', $installed['versions'][$packageName])) {
-$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
-}
-if (array_key_exists('provided', $installed['versions'][$packageName])) {
-$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
-}
-
-return implode(' || ', $ranges);
-}
-
-throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
-}
-
-
-
-
-
-public static function getVersion($packageName)
-{
-foreach (self::getInstalled() as $installed) {
-if (!isset($installed['versions'][$packageName])) {
-continue;
-}
-
-if (!isset($installed['versions'][$packageName]['version'])) {
-return null;
-}
-
-return $installed['versions'][$packageName]['version'];
-}
-
-throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
-}
-
-
-
-
-
-public static function getPrettyVersion($packageName)
-{
-foreach (self::getInstalled() as $installed) {
-if (!isset($installed['versions'][$packageName])) {
-continue;
-}
-
-if (!isset($installed['versions'][$packageName]['pretty_version'])) {
-return null;
-}
-
-return $installed['versions'][$packageName]['pretty_version'];
-}
-
-throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
-}
-
-
-
-
-
-public static function getReference($packageName)
-{
-foreach (self::getInstalled() as $installed) {
-if (!isset($installed['versions'][$packageName])) {
-continue;
-}
-
-if (!isset($installed['versions'][$packageName]['reference'])) {
-return null;
-}
-
-return $installed['versions'][$packageName]['reference'];
-}
-
-throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
-}
-
-
-
-
-
-public static function getRootPackage()
-{
-$installed = self::getInstalled();
-
-return $installed[0]['root'];
-}
-
-
-
-
-
-
-
-public static function getRawData()
-{
-return self::$installed;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-public static function reload($data)
-{
-self::$installed = $data;
-self::$installedByVendor = array();
-}
-
-
-
-
-
-private static function getInstalled()
-{
-if (null === self::$canGetVendors) {
-self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
-}
-
-$installed = array();
-
-if (self::$canGetVendors) {
-foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
-if (isset(self::$installedByVendor[$vendorDir])) {
-$installed[] = self::$installedByVendor[$vendorDir];
-} elseif (is_file($vendorDir.'/composer/installed.php')) {
-$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
-}
-}
-}
-
-$installed[] = self::$installed;
-
-return $installed;
-}
+    private static $installed;
+    private static $canGetVendors;
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints($constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+
+        if (self::$canGetVendors) {
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+                        self::$installed = $installed[count($installed) - 1];
+                    }
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = require __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+        $installed[] = self::$installed;
+
+        return $installed;
+    }
 }

+ 0 - 505
vendor/composer/autoload_classmap.php

@@ -6,511 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
-    'AliPay\\App' => $vendorDir . '/zoujingli/wechat-developer/AliPay/App.php',
-    'AliPay\\Bill' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Bill.php',
-    'AliPay\\Pos' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Pos.php',
-    'AliPay\\Scan' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Scan.php',
-    'AliPay\\Trade' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Trade.php',
-    'AliPay\\Transfer' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Transfer.php',
-    'AliPay\\Wap' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Wap.php',
-    'AliPay\\Web' => $vendorDir . '/zoujingli/wechat-developer/AliPay/Web.php',
     'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
-    'Endroid\\QrCode\\Bundle\\Controller\\QrCodeController' => $vendorDir . '/endroid/qr-code/src/Bundle/Controller/QrCodeController.php',
-    'Endroid\\QrCode\\Bundle\\DependencyInjection\\Configuration' => $vendorDir . '/endroid/qr-code/src/Bundle/DependencyInjection/Configuration.php',
-    'Endroid\\QrCode\\Bundle\\DependencyInjection\\EndroidQrCodeExtension' => $vendorDir . '/endroid/qr-code/src/Bundle/DependencyInjection/EndroidQrCodeExtension.php',
-    'Endroid\\QrCode\\Bundle\\EndroidQrCodeBundle' => $vendorDir . '/endroid/qr-code/src/Bundle/EndroidQrCodeBundle.php',
-    'Endroid\\QrCode\\Bundle\\Twig\\Extension\\QrCodeExtension' => $vendorDir . '/endroid/qr-code/src/Bundle/Twig/Extension/QrCodeExtension.php',
-    'Endroid\\QrCode\\Exceptions\\DataDoesntExistsException' => $vendorDir . '/endroid/qr-code/src/Exceptions/DataDoesntExistsException.php',
-    'Endroid\\QrCode\\Exceptions\\FreeTypeLibraryMissingException' => $vendorDir . '/endroid/qr-code/src/Exceptions/FreeTypeLibraryMissingException.php',
-    'Endroid\\QrCode\\Exceptions\\ImageFunctionFailedException' => $vendorDir . '/endroid/qr-code/src/Exceptions/ImageFunctionFailedException.php',
-    'Endroid\\QrCode\\Exceptions\\ImageFunctionUnknownException' => $vendorDir . '/endroid/qr-code/src/Exceptions/ImageFunctionUnknownException.php',
-    'Endroid\\QrCode\\Exceptions\\ImageSizeTooLargeException' => $vendorDir . '/endroid/qr-code/src/Exceptions/ImageSizeTooLargeException.php',
-    'Endroid\\QrCode\\Exceptions\\ImageTypeInvalidException' => $vendorDir . '/endroid/qr-code/src/Exceptions/ImageTypeInvalidException.php',
-    'Endroid\\QrCode\\Exceptions\\VersionTooLargeException' => $vendorDir . '/endroid/qr-code/src/Exceptions/VersionTooLargeException.php',
-    'Endroid\\QrCode\\Factory\\QrCodeFactory' => $vendorDir . '/endroid/qr-code/src/Factory/QrCodeFactory.php',
-    'Endroid\\QrCode\\QrCode' => $vendorDir . '/endroid/qr-code/src/QrCode.php',
     'Ip2Region' => $vendorDir . '/zoujingli/ip2region/Ip2Region.php',
-    'League\\Flysystem\\AdapterInterface' => $vendorDir . '/league/flysystem/src/AdapterInterface.php',
-    'League\\Flysystem\\Adapter\\AbstractAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractAdapter.php',
-    'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php',
-    'League\\Flysystem\\Adapter\\CanOverwriteFiles' => $vendorDir . '/league/flysystem/src/Adapter/CanOverwriteFiles.php',
-    'League\\Flysystem\\Adapter\\Ftp' => $vendorDir . '/league/flysystem/src/Adapter/Ftp.php',
-    'League\\Flysystem\\Adapter\\Ftpd' => $vendorDir . '/league/flysystem/src/Adapter/Ftpd.php',
-    'League\\Flysystem\\Adapter\\Local' => $vendorDir . '/league/flysystem/src/Adapter/Local.php',
-    'League\\Flysystem\\Adapter\\NullAdapter' => $vendorDir . '/league/flysystem/src/Adapter/NullAdapter.php',
-    'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php',
-    'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php',
-    'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php',
-    'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php',
-    'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php',
-    'League\\Flysystem\\Adapter\\SynologyFtp' => $vendorDir . '/league/flysystem/src/Adapter/SynologyFtp.php',
-    'League\\Flysystem\\Cached\\CacheInterface' => $vendorDir . '/league/flysystem-cached-adapter/src/CacheInterface.php',
-    'League\\Flysystem\\Cached\\CachedAdapter' => $vendorDir . '/league/flysystem-cached-adapter/src/CachedAdapter.php',
-    'League\\Flysystem\\Cached\\Storage\\AbstractCache' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/AbstractCache.php',
-    'League\\Flysystem\\Cached\\Storage\\Adapter' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Adapter.php',
-    'League\\Flysystem\\Cached\\Storage\\Memcached' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Memcached.php',
-    'League\\Flysystem\\Cached\\Storage\\Memory' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Memory.php',
-    'League\\Flysystem\\Cached\\Storage\\Noop' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Noop.php',
-    'League\\Flysystem\\Cached\\Storage\\PhpRedis' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/PhpRedis.php',
-    'League\\Flysystem\\Cached\\Storage\\Predis' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Predis.php',
-    'League\\Flysystem\\Cached\\Storage\\Psr6Cache' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php',
-    'League\\Flysystem\\Cached\\Storage\\Stash' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Stash.php',
-    'League\\Flysystem\\Config' => $vendorDir . '/league/flysystem/src/Config.php',
-    'League\\Flysystem\\ConfigAwareTrait' => $vendorDir . '/league/flysystem/src/ConfigAwareTrait.php',
-    'League\\Flysystem\\ConnectionErrorException' => $vendorDir . '/league/flysystem/src/ConnectionErrorException.php',
-    'League\\Flysystem\\ConnectionRuntimeException' => $vendorDir . '/league/flysystem/src/ConnectionRuntimeException.php',
-    'League\\Flysystem\\CorruptedPathDetected' => $vendorDir . '/league/flysystem/src/CorruptedPathDetected.php',
-    'League\\Flysystem\\Directory' => $vendorDir . '/league/flysystem/src/Directory.php',
-    'League\\Flysystem\\Exception' => $vendorDir . '/league/flysystem/src/Exception.php',
-    'League\\Flysystem\\File' => $vendorDir . '/league/flysystem/src/File.php',
-    'League\\Flysystem\\FileExistsException' => $vendorDir . '/league/flysystem/src/FileExistsException.php',
-    'League\\Flysystem\\FileNotFoundException' => $vendorDir . '/league/flysystem/src/FileNotFoundException.php',
-    'League\\Flysystem\\Filesystem' => $vendorDir . '/league/flysystem/src/Filesystem.php',
-    'League\\Flysystem\\FilesystemException' => $vendorDir . '/league/flysystem/src/FilesystemException.php',
-    'League\\Flysystem\\FilesystemInterface' => $vendorDir . '/league/flysystem/src/FilesystemInterface.php',
-    'League\\Flysystem\\FilesystemNotFoundException' => $vendorDir . '/league/flysystem/src/FilesystemNotFoundException.php',
-    'League\\Flysystem\\Handler' => $vendorDir . '/league/flysystem/src/Handler.php',
-    'League\\Flysystem\\InvalidRootException' => $vendorDir . '/league/flysystem/src/InvalidRootException.php',
-    'League\\Flysystem\\MountManager' => $vendorDir . '/league/flysystem/src/MountManager.php',
-    'League\\Flysystem\\NotSupportedException' => $vendorDir . '/league/flysystem/src/NotSupportedException.php',
-    'League\\Flysystem\\PluginInterface' => $vendorDir . '/league/flysystem/src/PluginInterface.php',
-    'League\\Flysystem\\Plugin\\AbstractPlugin' => $vendorDir . '/league/flysystem/src/Plugin/AbstractPlugin.php',
-    'League\\Flysystem\\Plugin\\EmptyDir' => $vendorDir . '/league/flysystem/src/Plugin/EmptyDir.php',
-    'League\\Flysystem\\Plugin\\ForcedCopy' => $vendorDir . '/league/flysystem/src/Plugin/ForcedCopy.php',
-    'League\\Flysystem\\Plugin\\ForcedRename' => $vendorDir . '/league/flysystem/src/Plugin/ForcedRename.php',
-    'League\\Flysystem\\Plugin\\GetWithMetadata' => $vendorDir . '/league/flysystem/src/Plugin/GetWithMetadata.php',
-    'League\\Flysystem\\Plugin\\ListFiles' => $vendorDir . '/league/flysystem/src/Plugin/ListFiles.php',
-    'League\\Flysystem\\Plugin\\ListPaths' => $vendorDir . '/league/flysystem/src/Plugin/ListPaths.php',
-    'League\\Flysystem\\Plugin\\ListWith' => $vendorDir . '/league/flysystem/src/Plugin/ListWith.php',
-    'League\\Flysystem\\Plugin\\PluggableTrait' => $vendorDir . '/league/flysystem/src/Plugin/PluggableTrait.php',
-    'League\\Flysystem\\Plugin\\PluginNotFoundException' => $vendorDir . '/league/flysystem/src/Plugin/PluginNotFoundException.php',
-    'League\\Flysystem\\ReadInterface' => $vendorDir . '/league/flysystem/src/ReadInterface.php',
-    'League\\Flysystem\\RootViolationException' => $vendorDir . '/league/flysystem/src/RootViolationException.php',
-    'League\\Flysystem\\SafeStorage' => $vendorDir . '/league/flysystem/src/SafeStorage.php',
-    'League\\Flysystem\\UnreadableFileException' => $vendorDir . '/league/flysystem/src/UnreadableFileException.php',
-    'League\\Flysystem\\Util' => $vendorDir . '/league/flysystem/src/Util.php',
-    'League\\Flysystem\\Util\\ContentListingFormatter' => $vendorDir . '/league/flysystem/src/Util/ContentListingFormatter.php',
-    'League\\Flysystem\\Util\\MimeType' => $vendorDir . '/league/flysystem/src/Util/MimeType.php',
-    'League\\Flysystem\\Util\\StreamHasher' => $vendorDir . '/league/flysystem/src/Util/StreamHasher.php',
-    'League\\MimeTypeDetection\\EmptyExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php',
-    'League\\MimeTypeDetection\\ExtensionMimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/ExtensionMimeTypeDetector.php',
-    'League\\MimeTypeDetection\\ExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/ExtensionToMimeTypeMap.php',
-    'League\\MimeTypeDetection\\FinfoMimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/FinfoMimeTypeDetector.php',
-    'League\\MimeTypeDetection\\GeneratedExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php',
-    'League\\MimeTypeDetection\\MimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/MimeTypeDetector.php',
-    'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php',
-    'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php',
-    'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php',
-    'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php',
-    'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
-    'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
-    'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
-    'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
-    'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
-    'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
-    'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
-    'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
-    'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
-    'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
-    'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
-    'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php',
-    'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
-    'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
-    'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php',
-    'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php',
-    'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php',
-    'Symfony\\Component\\OptionsResolver\\Debug\\OptionsResolverIntrospector' => $vendorDir . '/symfony/options-resolver/Debug/OptionsResolverIntrospector.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\AccessException' => $vendorDir . '/symfony/options-resolver/Exception/AccessException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/options-resolver/Exception/ExceptionInterface.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/options-resolver/Exception/InvalidArgumentException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\InvalidOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/InvalidOptionsException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\MissingOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/MissingOptionsException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\NoConfigurationException' => $vendorDir . '/symfony/options-resolver/Exception/NoConfigurationException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\NoSuchOptionException' => $vendorDir . '/symfony/options-resolver/Exception/NoSuchOptionException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\OptionDefinitionException' => $vendorDir . '/symfony/options-resolver/Exception/OptionDefinitionException.php',
-    'Symfony\\Component\\OptionsResolver\\Exception\\UndefinedOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/UndefinedOptionsException.php',
-    'Symfony\\Component\\OptionsResolver\\Options' => $vendorDir . '/symfony/options-resolver/Options.php',
-    'Symfony\\Component\\OptionsResolver\\OptionsResolver' => $vendorDir . '/symfony/options-resolver/OptionsResolver.php',
-    'We' => $vendorDir . '/zoujingli/wechat-developer/We.php',
-    'WeChat\\Card' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Card.php',
-    'WeChat\\Contracts\\BasicAliPay' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/BasicAliPay.php',
-    'WeChat\\Contracts\\BasicPushEvent' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/BasicPushEvent.php',
-    'WeChat\\Contracts\\BasicWeChat' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWeChat.php',
-    'WeChat\\Contracts\\BasicWePay' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWePay.php',
-    'WeChat\\Contracts\\BasicWeWork' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWeWork.php',
-    'WeChat\\Contracts\\DataArray' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/DataArray.php',
-    'WeChat\\Contracts\\DataError' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/DataError.php',
-    'WeChat\\Contracts\\MyCurlFile' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/MyCurlFile.php',
-    'WeChat\\Contracts\\Tools' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Contracts/Tools.php',
-    'WeChat\\Custom' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Custom.php',
-    'WeChat\\Exceptions\\InvalidArgumentException' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidArgumentException.php',
-    'WeChat\\Exceptions\\InvalidDecryptException' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidDecryptException.php',
-    'WeChat\\Exceptions\\InvalidInstanceException' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidInstanceException.php',
-    'WeChat\\Exceptions\\InvalidResponseException' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidResponseException.php',
-    'WeChat\\Exceptions\\LocalCacheException' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Exceptions/LocalCacheException.php',
-    'WeChat\\Limit' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Limit.php',
-    'WeChat\\Media' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Media.php',
-    'WeChat\\Menu' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Menu.php',
-    'WeChat\\Oauth' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Oauth.php',
-    'WeChat\\Pay' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Pay.php',
-    'WeChat\\Product' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Product.php',
-    'WeChat\\Qrcode' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Qrcode.php',
-    'WeChat\\Receive' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Receive.php',
-    'WeChat\\Scan' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Scan.php',
-    'WeChat\\Script' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Script.php',
-    'WeChat\\Shake' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Shake.php',
-    'WeChat\\Tags' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Tags.php',
-    'WeChat\\Template' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Template.php',
-    'WeChat\\User' => $vendorDir . '/zoujingli/wechat-developer/WeChat/User.php',
-    'WeChat\\Wifi' => $vendorDir . '/zoujingli/wechat-developer/WeChat/Wifi.php',
-    'WeMini\\Crypt' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Crypt.php',
-    'WeMini\\Delivery' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Delivery.php',
-    'WeMini\\Guide' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Guide.php',
-    'WeMini\\Image' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Image.php',
-    'WeMini\\Live' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Live.php',
-    'WeMini\\Logistics' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Logistics.php',
-    'WeMini\\Message' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Message.php',
-    'WeMini\\Newtmpl' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Newtmpl.php',
-    'WeMini\\Ocr' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Ocr.php',
-    'WeMini\\Operation' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Operation.php',
-    'WeMini\\Plugs' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Plugs.php',
-    'WeMini\\Poi' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Poi.php',
-    'WeMini\\Qrcode' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Qrcode.php',
-    'WeMini\\Search' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Search.php',
-    'WeMini\\Security' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Security.php',
-    'WeMini\\Soter' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Soter.php',
-    'WeMini\\Template' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Template.php',
-    'WeMini\\Total' => $vendorDir . '/zoujingli/wechat-developer/WeMini/Total.php',
-    'WePayV3\\Cert' => $vendorDir . '/zoujingli/wechat-developer/WePayV3/Cert.php',
-    'WePayV3\\Contracts\\BasicWePay' => $vendorDir . '/zoujingli/wechat-developer/WePayV3/Contracts/BasicWePay.php',
-    'WePayV3\\Contracts\\DecryptAes' => $vendorDir . '/zoujingli/wechat-developer/WePayV3/Contracts/DecryptAes.php',
-    'WePayV3\\Order' => $vendorDir . '/zoujingli/wechat-developer/WePayV3/Order.php',
-    'WePayV3\\Refund' => $vendorDir . '/zoujingli/wechat-developer/WePayV3/Refund.php',
-    'WePay\\Bill' => $vendorDir . '/zoujingli/wechat-developer/WePay/Bill.php',
-    'WePay\\Coupon' => $vendorDir . '/zoujingli/wechat-developer/WePay/Coupon.php',
-    'WePay\\Custom' => $vendorDir . '/zoujingli/wechat-developer/WePay/Custom.php',
-    'WePay\\Order' => $vendorDir . '/zoujingli/wechat-developer/WePay/Order.php',
-    'WePay\\Redpack' => $vendorDir . '/zoujingli/wechat-developer/WePay/Redpack.php',
-    'WePay\\Refund' => $vendorDir . '/zoujingli/wechat-developer/WePay/Refund.php',
-    'WePay\\Transfers' => $vendorDir . '/zoujingli/wechat-developer/WePay/Transfers.php',
-    'WePay\\TransfersBank' => $vendorDir . '/zoujingli/wechat-developer/WePay/TransfersBank.php',
-    'app\\AppService' => $baseDir . '/app/AppService.php',
-    'app\\BaseController' => $baseDir . '/app/BaseController.php',
-    'app\\ExceptionHandle' => $baseDir . '/app/ExceptionHandle.php',
-    'app\\Request' => $baseDir . '/app/Request.php',
-    'app\\admin\\controller\\Auth' => $baseDir . '/app/admin/controller/Auth.php',
-    'app\\admin\\controller\\Base' => $baseDir . '/app/admin/controller/Base.php',
-    'app\\admin\\controller\\Config' => $baseDir . '/app/admin/controller/Config.php',
-    'app\\admin\\controller\\Index' => $baseDir . '/app/admin/controller/Index.php',
-    'app\\admin\\controller\\Login' => $baseDir . '/app/admin/controller/Login.php',
-    'app\\admin\\controller\\Menu' => $baseDir . '/app/admin/controller/Menu.php',
-    'app\\admin\\controller\\Module' => $baseDir . '/app/admin/controller/Module.php',
-    'app\\admin\\controller\\Oplog' => $baseDir . '/app/admin/controller/Oplog.php',
-    'app\\admin\\controller\\Queue' => $baseDir . '/app/admin/controller/Queue.php',
-    'app\\admin\\controller\\User' => $baseDir . '/app/admin/controller/User.php',
-    'app\\admin\\controller\\api\\Plugs' => $baseDir . '/app/admin/controller/api/Plugs.php',
-    'app\\admin\\controller\\api\\Queue' => $baseDir . '/app/admin/controller/api/Queue.php',
-    'app\\admin\\controller\\api\\Runtime' => $baseDir . '/app/admin/controller/api/Runtime.php',
-    'app\\admin\\controller\\api\\Update' => $baseDir . '/app/admin/controller/api/Update.php',
-    'app\\admin\\controller\\api\\Upload' => $baseDir . '/app/admin/controller/api/Upload.php',
-    'app\\admin\\model\\SystemAuth' => $baseDir . '/app/admin/model/SystemAuth.php',
-    'app\\admin\\model\\SystemBase' => $baseDir . '/app/admin/model/SystemBase.php',
-    'app\\admin\\model\\SystemQueue' => $baseDir . '/app/admin/model/SystemQueue.php',
-    'app\\admin\\model\\SystemUser' => $baseDir . '/app/admin/model/SystemUser.php',
-    'app\\controller\\Index' => $baseDir . '/app/controller/Index.php',
-    'app\\index\\controller\\Index' => $baseDir . '/app/index/controller/Index.php',
-    'app\\wechat\\command\\Auto' => $baseDir . '/app/wechat/command/Auto.php',
-    'app\\wechat\\command\\Fans' => $baseDir . '/app/wechat/command/Fans.php',
-    'app\\wechat\\controller\\Auto' => $baseDir . '/app/wechat/controller/Auto.php',
-    'app\\wechat\\controller\\Config' => $baseDir . '/app/wechat/controller/Config.php',
-    'app\\wechat\\controller\\Fans' => $baseDir . '/app/wechat/controller/Fans.php',
-    'app\\wechat\\controller\\Keys' => $baseDir . '/app/wechat/controller/Keys.php',
-    'app\\wechat\\controller\\Menu' => $baseDir . '/app/wechat/controller/Menu.php',
-    'app\\wechat\\controller\\News' => $baseDir . '/app/wechat/controller/News.php',
-    'app\\wechat\\controller\\api\\Js' => $baseDir . '/app/wechat/controller/api/Js.php',
-    'app\\wechat\\controller\\api\\Login' => $baseDir . '/app/wechat/controller/api/Login.php',
-    'app\\wechat\\controller\\api\\Push' => $baseDir . '/app/wechat/controller/api/Push.php',
-    'app\\wechat\\controller\\api\\Test' => $baseDir . '/app/wechat/controller/api/Test.php',
-    'app\\wechat\\controller\\api\\View' => $baseDir . '/app/wechat/controller/api/View.php',
-    'app\\wechat\\service\\AutoService' => $baseDir . '/app/wechat/service/AutoService.php',
-    'app\\wechat\\service\\FansService' => $baseDir . '/app/wechat/service/FansService.php',
-    'app\\wechat\\service\\MediaService' => $baseDir . '/app/wechat/service/MediaService.php',
-    'app\\wechat\\service\\WechatService' => $baseDir . '/app/wechat/service/WechatService.php',
-    'think\\App' => $vendorDir . '/topthink/framework/src/think/App.php',
-    'think\\Cache' => $vendorDir . '/topthink/framework/src/think/Cache.php',
-    'think\\Collection' => $vendorDir . '/topthink/think-helper/src/Collection.php',
-    'think\\Config' => $vendorDir . '/topthink/framework/src/think/Config.php',
-    'think\\Console' => $vendorDir . '/topthink/framework/src/think/Console.php',
-    'think\\Container' => $vendorDir . '/topthink/framework/src/think/Container.php',
-    'think\\Cookie' => $vendorDir . '/topthink/framework/src/think/Cookie.php',
-    'think\\Db' => $vendorDir . '/topthink/framework/src/think/Db.php',
-    'think\\DbManager' => $vendorDir . '/topthink/think-orm/src/DbManager.php',
-    'think\\Env' => $vendorDir . '/topthink/framework/src/think/Env.php',
-    'think\\Event' => $vendorDir . '/topthink/framework/src/think/Event.php',
-    'think\\Exception' => $vendorDir . '/topthink/framework/src/think/Exception.php',
-    'think\\Facade' => $vendorDir . '/topthink/framework/src/think/Facade.php',
-    'think\\File' => $vendorDir . '/topthink/framework/src/think/File.php',
-    'think\\Filesystem' => $vendorDir . '/topthink/framework/src/think/Filesystem.php',
-    'think\\Http' => $vendorDir . '/topthink/framework/src/think/Http.php',
-    'think\\Lang' => $vendorDir . '/topthink/framework/src/think/Lang.php',
-    'think\\Log' => $vendorDir . '/topthink/framework/src/think/Log.php',
-    'think\\Manager' => $vendorDir . '/topthink/framework/src/think/Manager.php',
-    'think\\Middleware' => $vendorDir . '/topthink/framework/src/think/Middleware.php',
-    'think\\Model' => $vendorDir . '/topthink/think-orm/src/Model.php',
-    'think\\Paginator' => $vendorDir . '/topthink/think-orm/src/Paginator.php',
-    'think\\Pipeline' => $vendorDir . '/topthink/framework/src/think/Pipeline.php',
-    'think\\Request' => $vendorDir . '/topthink/framework/src/think/Request.php',
-    'think\\Response' => $vendorDir . '/topthink/framework/src/think/Response.php',
-    'think\\Route' => $vendorDir . '/topthink/framework/src/think/Route.php',
-    'think\\Service' => $vendorDir . '/topthink/framework/src/think/Service.php',
-    'think\\Session' => $vendorDir . '/topthink/framework/src/think/Session.php',
-    'think\\Template' => $vendorDir . '/topthink/think-template/src/Template.php',
-    'think\\Validate' => $vendorDir . '/topthink/framework/src/think/Validate.php',
-    'think\\View' => $vendorDir . '/topthink/framework/src/think/View.php',
-    'think\\admin\\Command' => $vendorDir . '/zoujingli/think-library/src/Command.php',
-    'think\\admin\\Controller' => $vendorDir . '/zoujingli/think-library/src/Controller.php',
-    'think\\admin\\Exception' => $vendorDir . '/zoujingli/think-library/src/Exception.php',
-    'think\\admin\\Helper' => $vendorDir . '/zoujingli/think-library/src/Helper.php',
-    'think\\admin\\Library' => $vendorDir . '/zoujingli/think-library/src/Library.php',
-    'think\\admin\\Queue' => $vendorDir . '/zoujingli/think-library/src/Queue.php',
-    'think\\admin\\Service' => $vendorDir . '/zoujingli/think-library/src/Service.php',
-    'think\\admin\\Storage' => $vendorDir . '/zoujingli/think-library/src/Storage.php',
-    'think\\admin\\command\\Database' => $vendorDir . '/zoujingli/think-library/src/command/Database.php',
-    'think\\admin\\command\\Install' => $vendorDir . '/zoujingli/think-library/src/command/Install.php',
-    'think\\admin\\command\\Queue' => $vendorDir . '/zoujingli/think-library/src/command/Queue.php',
-    'think\\admin\\command\\Replace' => $vendorDir . '/zoujingli/think-library/src/command/Replace.php',
-    'think\\admin\\command\\Version' => $vendorDir . '/zoujingli/think-library/src/command/Version.php',
-    'think\\admin\\extend\\CodeExtend' => $vendorDir . '/zoujingli/think-library/src/extend/CodeExtend.php',
-    'think\\admin\\extend\\DataExtend' => $vendorDir . '/zoujingli/think-library/src/extend/DataExtend.php',
-    'think\\admin\\extend\\ExcelExtend' => $vendorDir . '/zoujingli/think-library/src/extend/ExcelExtend.php',
-    'think\\admin\\extend\\HttpExtend' => $vendorDir . '/zoujingli/think-library/src/extend/HttpExtend.php',
-    'think\\admin\\extend\\JsonRpcClient' => $vendorDir . '/zoujingli/think-library/src/extend/JsonRpcClient.php',
-    'think\\admin\\extend\\JsonRpcServer' => $vendorDir . '/zoujingli/think-library/src/extend/JsonRpcServer.php',
-    'think\\admin\\extend\\Parsedown' => $vendorDir . '/zoujingli/think-library/src/extend/Parsedown.php',
-    'think\\admin\\helper\\DeleteHelper' => $vendorDir . '/zoujingli/think-library/src/helper/DeleteHelper.php',
-    'think\\admin\\helper\\FormHelper' => $vendorDir . '/zoujingli/think-library/src/helper/FormHelper.php',
-    'think\\admin\\helper\\PageHelper' => $vendorDir . '/zoujingli/think-library/src/helper/PageHelper.php',
-    'think\\admin\\helper\\QueryHelper' => $vendorDir . '/zoujingli/think-library/src/helper/QueryHelper.php',
-    'think\\admin\\helper\\SaveHelper' => $vendorDir . '/zoujingli/think-library/src/helper/SaveHelper.php',
-    'think\\admin\\helper\\TokenHelper' => $vendorDir . '/zoujingli/think-library/src/helper/TokenHelper.php',
-    'think\\admin\\helper\\ValidateHelper' => $vendorDir . '/zoujingli/think-library/src/helper/ValidateHelper.php',
-    'think\\admin\\multiple\\BuildUrl' => $vendorDir . '/zoujingli/think-library/src/multiple/BuildUrl.php',
-    'think\\admin\\multiple\\Multiple' => $vendorDir . '/zoujingli/think-library/src/multiple/Multiple.php',
-    'think\\admin\\multiple\\command\\Build' => $vendorDir . '/zoujingli/think-library/src/multiple/command/Build.php',
-    'think\\admin\\service\\AdminService' => $vendorDir . '/zoujingli/think-library/src/service/AdminService.php',
-    'think\\admin\\service\\CaptchaService' => $vendorDir . '/zoujingli/think-library/src/service/CaptchaService.php',
-    'think\\admin\\service\\ExpressService' => $vendorDir . '/zoujingli/think-library/src/service/ExpressService.php',
-    'think\\admin\\service\\InterfaceService' => $vendorDir . '/zoujingli/think-library/src/service/InterfaceService.php',
-    'think\\admin\\service\\MenuService' => $vendorDir . '/zoujingli/think-library/src/service/MenuService.php',
-    'think\\admin\\service\\MessageService' => $vendorDir . '/zoujingli/think-library/src/service/MessageService.php',
-    'think\\admin\\service\\ModuleService' => $vendorDir . '/zoujingli/think-library/src/service/ModuleService.php',
-    'think\\admin\\service\\NodeService' => $vendorDir . '/zoujingli/think-library/src/service/NodeService.php',
-    'think\\admin\\service\\ProcessService' => $vendorDir . '/zoujingli/think-library/src/service/ProcessService.php',
-    'think\\admin\\service\\QueueService' => $vendorDir . '/zoujingli/think-library/src/service/QueueService.php',
-    'think\\admin\\service\\SystemService' => $vendorDir . '/zoujingli/think-library/src/service/SystemService.php',
-    'think\\admin\\service\\TokenService' => $vendorDir . '/zoujingli/think-library/src/service/TokenService.php',
-    'think\\admin\\service\\ZtSmsService' => $vendorDir . '/zoujingli/think-library/src/service/ZtSmsService.php',
-    'think\\admin\\storage\\AliossStorage' => $vendorDir . '/zoujingli/think-library/src/storage/AliossStorage.php',
-    'think\\admin\\storage\\LocalStorage' => $vendorDir . '/zoujingli/think-library/src/storage/LocalStorage.php',
-    'think\\admin\\storage\\QiniuStorage' => $vendorDir . '/zoujingli/think-library/src/storage/QiniuStorage.php',
-    'think\\admin\\storage\\TxcosStorage' => $vendorDir . '/zoujingli/think-library/src/storage/TxcosStorage.php',
-    'think\\cache\\Driver' => $vendorDir . '/topthink/framework/src/think/cache/Driver.php',
-    'think\\cache\\TagSet' => $vendorDir . '/topthink/framework/src/think/cache/TagSet.php',
-    'think\\cache\\driver\\File' => $vendorDir . '/topthink/framework/src/think/cache/driver/File.php',
-    'think\\cache\\driver\\Memcache' => $vendorDir . '/topthink/framework/src/think/cache/driver/Memcache.php',
-    'think\\cache\\driver\\Memcached' => $vendorDir . '/topthink/framework/src/think/cache/driver/Memcached.php',
-    'think\\cache\\driver\\Redis' => $vendorDir . '/topthink/framework/src/think/cache/driver/Redis.php',
-    'think\\cache\\driver\\Wincache' => $vendorDir . '/topthink/framework/src/think/cache/driver/Wincache.php',
-    'think\\console\\Command' => $vendorDir . '/topthink/framework/src/think/console/Command.php',
-    'think\\console\\Input' => $vendorDir . '/topthink/framework/src/think/console/Input.php',
-    'think\\console\\Output' => $vendorDir . '/topthink/framework/src/think/console/Output.php',
-    'think\\console\\Table' => $vendorDir . '/topthink/framework/src/think/console/Table.php',
-    'think\\console\\command\\Clear' => $vendorDir . '/topthink/framework/src/think/console/command/Clear.php',
-    'think\\console\\command\\Help' => $vendorDir . '/topthink/framework/src/think/console/command/Help.php',
-    'think\\console\\command\\Lists' => $vendorDir . '/topthink/framework/src/think/console/command/Lists.php',
-    'think\\console\\command\\Make' => $vendorDir . '/topthink/framework/src/think/console/command/Make.php',
-    'think\\console\\command\\RouteList' => $vendorDir . '/topthink/framework/src/think/console/command/RouteList.php',
-    'think\\console\\command\\RunServer' => $vendorDir . '/topthink/framework/src/think/console/command/RunServer.php',
-    'think\\console\\command\\ServiceDiscover' => $vendorDir . '/topthink/framework/src/think/console/command/ServiceDiscover.php',
-    'think\\console\\command\\VendorPublish' => $vendorDir . '/topthink/framework/src/think/console/command/VendorPublish.php',
-    'think\\console\\command\\Version' => $vendorDir . '/topthink/framework/src/think/console/command/Version.php',
-    'think\\console\\command\\make\\Command' => $vendorDir . '/topthink/framework/src/think/console/command/make/Command.php',
-    'think\\console\\command\\make\\Controller' => $vendorDir . '/topthink/framework/src/think/console/command/make/Controller.php',
-    'think\\console\\command\\make\\Event' => $vendorDir . '/topthink/framework/src/think/console/command/make/Event.php',
-    'think\\console\\command\\make\\Listener' => $vendorDir . '/topthink/framework/src/think/console/command/make/Listener.php',
-    'think\\console\\command\\make\\Middleware' => $vendorDir . '/topthink/framework/src/think/console/command/make/Middleware.php',
-    'think\\console\\command\\make\\Model' => $vendorDir . '/topthink/framework/src/think/console/command/make/Model.php',
-    'think\\console\\command\\make\\Service' => $vendorDir . '/topthink/framework/src/think/console/command/make/Service.php',
-    'think\\console\\command\\make\\Subscribe' => $vendorDir . '/topthink/framework/src/think/console/command/make/Subscribe.php',
-    'think\\console\\command\\make\\Validate' => $vendorDir . '/topthink/framework/src/think/console/command/make/Validate.php',
-    'think\\console\\command\\optimize\\Route' => $vendorDir . '/topthink/framework/src/think/console/command/optimize/Route.php',
-    'think\\console\\command\\optimize\\Schema' => $vendorDir . '/topthink/framework/src/think/console/command/optimize/Schema.php',
-    'think\\console\\input\\Argument' => $vendorDir . '/topthink/framework/src/think/console/input/Argument.php',
-    'think\\console\\input\\Definition' => $vendorDir . '/topthink/framework/src/think/console/input/Definition.php',
-    'think\\console\\input\\Option' => $vendorDir . '/topthink/framework/src/think/console/input/Option.php',
-    'think\\console\\output\\Ask' => $vendorDir . '/topthink/framework/src/think/console/output/Ask.php',
-    'think\\console\\output\\Descriptor' => $vendorDir . '/topthink/framework/src/think/console/output/Descriptor.php',
-    'think\\console\\output\\Formatter' => $vendorDir . '/topthink/framework/src/think/console/output/Formatter.php',
-    'think\\console\\output\\Question' => $vendorDir . '/topthink/framework/src/think/console/output/Question.php',
-    'think\\console\\output\\descriptor\\Console' => $vendorDir . '/topthink/framework/src/think/console/output/descriptor/Console.php',
-    'think\\console\\output\\driver\\Buffer' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Buffer.php',
-    'think\\console\\output\\driver\\Console' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Console.php',
-    'think\\console\\output\\driver\\Nothing' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Nothing.php',
-    'think\\console\\output\\formatter\\Stack' => $vendorDir . '/topthink/framework/src/think/console/output/formatter/Stack.php',
-    'think\\console\\output\\formatter\\Style' => $vendorDir . '/topthink/framework/src/think/console/output/formatter/Style.php',
-    'think\\console\\output\\question\\Choice' => $vendorDir . '/topthink/framework/src/think/console/output/question/Choice.php',
-    'think\\console\\output\\question\\Confirmation' => $vendorDir . '/topthink/framework/src/think/console/output/question/Confirmation.php',
-    'think\\contract\\Arrayable' => $vendorDir . '/topthink/think-helper/src/contract/Arrayable.php',
-    'think\\contract\\CacheHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/CacheHandlerInterface.php',
-    'think\\contract\\Jsonable' => $vendorDir . '/topthink/think-helper/src/contract/Jsonable.php',
-    'think\\contract\\LogHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/LogHandlerInterface.php',
-    'think\\contract\\ModelRelationInterface' => $vendorDir . '/topthink/framework/src/think/contract/ModelRelationInterface.php',
-    'think\\contract\\SessionHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/SessionHandlerInterface.php',
-    'think\\contract\\TemplateHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/TemplateHandlerInterface.php',
-    'think\\db\\BaseQuery' => $vendorDir . '/topthink/think-orm/src/db/BaseQuery.php',
-    'think\\db\\Builder' => $vendorDir . '/topthink/think-orm/src/db/Builder.php',
-    'think\\db\\CacheItem' => $vendorDir . '/topthink/think-orm/src/db/CacheItem.php',
-    'think\\db\\Connection' => $vendorDir . '/topthink/think-orm/src/db/Connection.php',
-    'think\\db\\ConnectionInterface' => $vendorDir . '/topthink/think-orm/src/db/ConnectionInterface.php',
-    'think\\db\\Fetch' => $vendorDir . '/topthink/think-orm/src/db/Fetch.php',
-    'think\\db\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/Mongo.php',
-    'think\\db\\PDOConnection' => $vendorDir . '/topthink/think-orm/src/db/PDOConnection.php',
-    'think\\db\\Query' => $vendorDir . '/topthink/think-orm/src/db/Query.php',
-    'think\\db\\Raw' => $vendorDir . '/topthink/think-orm/src/db/Raw.php',
-    'think\\db\\Where' => $vendorDir . '/topthink/think-orm/src/db/Where.php',
-    'think\\db\\builder\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/builder/Mongo.php',
-    'think\\db\\builder\\Mysql' => $vendorDir . '/topthink/think-orm/src/db/builder/Mysql.php',
-    'think\\db\\builder\\Oracle' => $vendorDir . '/topthink/think-orm/src/db/builder/Oracle.php',
-    'think\\db\\builder\\Pgsql' => $vendorDir . '/topthink/think-orm/src/db/builder/Pgsql.php',
-    'think\\db\\builder\\Sqlite' => $vendorDir . '/topthink/think-orm/src/db/builder/Sqlite.php',
-    'think\\db\\builder\\Sqlsrv' => $vendorDir . '/topthink/think-orm/src/db/builder/Sqlsrv.php',
-    'think\\db\\concern\\AggregateQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/AggregateQuery.php',
-    'think\\db\\concern\\JoinAndViewQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/JoinAndViewQuery.php',
-    'think\\db\\concern\\ModelRelationQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/ModelRelationQuery.php',
-    'think\\db\\concern\\ParamsBind' => $vendorDir . '/topthink/think-orm/src/db/concern/ParamsBind.php',
-    'think\\db\\concern\\ResultOperation' => $vendorDir . '/topthink/think-orm/src/db/concern/ResultOperation.php',
-    'think\\db\\concern\\TableFieldInfo' => $vendorDir . '/topthink/think-orm/src/db/concern/TableFieldInfo.php',
-    'think\\db\\concern\\TimeFieldQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/TimeFieldQuery.php',
-    'think\\db\\concern\\Transaction' => $vendorDir . '/topthink/think-orm/src/db/concern/Transaction.php',
-    'think\\db\\concern\\WhereQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/WhereQuery.php',
-    'think\\db\\connector\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/connector/Mongo.php',
-    'think\\db\\connector\\Mysql' => $vendorDir . '/topthink/think-orm/src/db/connector/Mysql.php',
-    'think\\db\\connector\\Oracle' => $vendorDir . '/topthink/think-orm/src/db/connector/Oracle.php',
-    'think\\db\\connector\\Pgsql' => $vendorDir . '/topthink/think-orm/src/db/connector/Pgsql.php',
-    'think\\db\\connector\\Sqlite' => $vendorDir . '/topthink/think-orm/src/db/connector/Sqlite.php',
-    'think\\db\\connector\\Sqlsrv' => $vendorDir . '/topthink/think-orm/src/db/connector/Sqlsrv.php',
-    'think\\db\\exception\\BindParamException' => $vendorDir . '/topthink/think-orm/src/db/exception/BindParamException.php',
-    'think\\db\\exception\\DataNotFoundException' => $vendorDir . '/topthink/think-orm/src/db/exception/DataNotFoundException.php',
-    'think\\db\\exception\\DbEventException' => $vendorDir . '/topthink/think-orm/src/db/exception/DbEventException.php',
-    'think\\db\\exception\\DbException' => $vendorDir . '/topthink/think-orm/src/db/exception/DbException.php',
-    'think\\db\\exception\\InvalidArgumentException' => $vendorDir . '/topthink/think-orm/src/db/exception/InvalidArgumentException.php',
-    'think\\db\\exception\\ModelEventException' => $vendorDir . '/topthink/think-orm/src/db/exception/ModelEventException.php',
-    'think\\db\\exception\\ModelNotFoundException' => $vendorDir . '/topthink/think-orm/src/db/exception/ModelNotFoundException.php',
-    'think\\db\\exception\\PDOException' => $vendorDir . '/topthink/think-orm/src/db/exception/PDOException.php',
-    'think\\event\\AppInit' => $vendorDir . '/topthink/framework/src/think/event/AppInit.php',
-    'think\\event\\HttpEnd' => $vendorDir . '/topthink/framework/src/think/event/HttpEnd.php',
-    'think\\event\\HttpRun' => $vendorDir . '/topthink/framework/src/think/event/HttpRun.php',
-    'think\\event\\LogRecord' => $vendorDir . '/topthink/framework/src/think/event/LogRecord.php',
-    'think\\event\\LogWrite' => $vendorDir . '/topthink/framework/src/think/event/LogWrite.php',
-    'think\\event\\RouteLoaded' => $vendorDir . '/topthink/framework/src/think/event/RouteLoaded.php',
-    'think\\exception\\ClassNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/ClassNotFoundException.php',
-    'think\\exception\\ErrorException' => $vendorDir . '/topthink/framework/src/think/exception/ErrorException.php',
-    'think\\exception\\FileException' => $vendorDir . '/topthink/framework/src/think/exception/FileException.php',
-    'think\\exception\\FuncNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/FuncNotFoundException.php',
-    'think\\exception\\Handle' => $vendorDir . '/topthink/framework/src/think/exception/Handle.php',
-    'think\\exception\\HttpException' => $vendorDir . '/topthink/framework/src/think/exception/HttpException.php',
-    'think\\exception\\HttpResponseException' => $vendorDir . '/topthink/framework/src/think/exception/HttpResponseException.php',
-    'think\\exception\\InvalidArgumentException' => $vendorDir . '/topthink/framework/src/think/exception/InvalidArgumentException.php',
-    'think\\exception\\RouteNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/RouteNotFoundException.php',
-    'think\\exception\\ValidateException' => $vendorDir . '/topthink/framework/src/think/exception/ValidateException.php',
-    'think\\facade\\App' => $vendorDir . '/topthink/framework/src/think/facade/App.php',
-    'think\\facade\\Cache' => $vendorDir . '/topthink/framework/src/think/facade/Cache.php',
-    'think\\facade\\Config' => $vendorDir . '/topthink/framework/src/think/facade/Config.php',
-    'think\\facade\\Console' => $vendorDir . '/topthink/framework/src/think/facade/Console.php',
-    'think\\facade\\Cookie' => $vendorDir . '/topthink/framework/src/think/facade/Cookie.php',
-    'think\\facade\\Db' => $vendorDir . '/topthink/think-orm/src/facade/Db.php',
-    'think\\facade\\Env' => $vendorDir . '/topthink/framework/src/think/facade/Env.php',
-    'think\\facade\\Event' => $vendorDir . '/topthink/framework/src/think/facade/Event.php',
-    'think\\facade\\Filesystem' => $vendorDir . '/topthink/framework/src/think/facade/Filesystem.php',
-    'think\\facade\\Lang' => $vendorDir . '/topthink/framework/src/think/facade/Lang.php',
-    'think\\facade\\Log' => $vendorDir . '/topthink/framework/src/think/facade/Log.php',
-    'think\\facade\\Middleware' => $vendorDir . '/topthink/framework/src/think/facade/Middleware.php',
-    'think\\facade\\Request' => $vendorDir . '/topthink/framework/src/think/facade/Request.php',
-    'think\\facade\\Route' => $vendorDir . '/topthink/framework/src/think/facade/Route.php',
-    'think\\facade\\Session' => $vendorDir . '/topthink/framework/src/think/facade/Session.php',
-    'think\\facade\\Template' => $vendorDir . '/topthink/think-template/src/facade/Template.php',
-    'think\\facade\\Validate' => $vendorDir . '/topthink/framework/src/think/facade/Validate.php',
-    'think\\facade\\View' => $vendorDir . '/topthink/framework/src/think/facade/View.php',
-    'think\\file\\UploadedFile' => $vendorDir . '/topthink/framework/src/think/file/UploadedFile.php',
-    'think\\filesystem\\CacheStore' => $vendorDir . '/topthink/framework/src/think/filesystem/CacheStore.php',
-    'think\\filesystem\\Driver' => $vendorDir . '/topthink/framework/src/think/filesystem/Driver.php',
-    'think\\filesystem\\driver\\Local' => $vendorDir . '/topthink/framework/src/think/filesystem/driver/Local.php',
-    'think\\helper\\Arr' => $vendorDir . '/topthink/think-helper/src/helper/Arr.php',
-    'think\\helper\\Str' => $vendorDir . '/topthink/think-helper/src/helper/Str.php',
-    'think\\initializer\\BootService' => $vendorDir . '/topthink/framework/src/think/initializer/BootService.php',
-    'think\\initializer\\Error' => $vendorDir . '/topthink/framework/src/think/initializer/Error.php',
-    'think\\initializer\\RegisterService' => $vendorDir . '/topthink/framework/src/think/initializer/RegisterService.php',
-    'think\\log\\Channel' => $vendorDir . '/topthink/framework/src/think/log/Channel.php',
-    'think\\log\\ChannelSet' => $vendorDir . '/topthink/framework/src/think/log/ChannelSet.php',
-    'think\\log\\driver\\File' => $vendorDir . '/topthink/framework/src/think/log/driver/File.php',
-    'think\\log\\driver\\Socket' => $vendorDir . '/topthink/framework/src/think/log/driver/Socket.php',
-    'think\\middleware\\AllowCrossDomain' => $vendorDir . '/topthink/framework/src/think/middleware/AllowCrossDomain.php',
-    'think\\middleware\\CheckRequestCache' => $vendorDir . '/topthink/framework/src/think/middleware/CheckRequestCache.php',
-    'think\\middleware\\FormTokenCheck' => $vendorDir . '/topthink/framework/src/think/middleware/FormTokenCheck.php',
-    'think\\middleware\\LoadLangPack' => $vendorDir . '/topthink/framework/src/think/middleware/LoadLangPack.php',
-    'think\\middleware\\SessionInit' => $vendorDir . '/topthink/framework/src/think/middleware/SessionInit.php',
-    'think\\model\\Collection' => $vendorDir . '/topthink/think-orm/src/model/Collection.php',
-    'think\\model\\Pivot' => $vendorDir . '/topthink/think-orm/src/model/Pivot.php',
-    'think\\model\\Relation' => $vendorDir . '/topthink/think-orm/src/model/Relation.php',
-    'think\\model\\concern\\Attribute' => $vendorDir . '/topthink/think-orm/src/model/concern/Attribute.php',
-    'think\\model\\concern\\Conversion' => $vendorDir . '/topthink/think-orm/src/model/concern/Conversion.php',
-    'think\\model\\concern\\ModelEvent' => $vendorDir . '/topthink/think-orm/src/model/concern/ModelEvent.php',
-    'think\\model\\concern\\OptimLock' => $vendorDir . '/topthink/think-orm/src/model/concern/OptimLock.php',
-    'think\\model\\concern\\RelationShip' => $vendorDir . '/topthink/think-orm/src/model/concern/RelationShip.php',
-    'think\\model\\concern\\SoftDelete' => $vendorDir . '/topthink/think-orm/src/model/concern/SoftDelete.php',
-    'think\\model\\concern\\TimeStamp' => $vendorDir . '/topthink/think-orm/src/model/concern/TimeStamp.php',
-    'think\\model\\concern\\Virtual' => $vendorDir . '/topthink/think-orm/src/model/concern/Virtual.php',
-    'think\\model\\relation\\BelongsTo' => $vendorDir . '/topthink/think-orm/src/model/relation/BelongsTo.php',
-    'think\\model\\relation\\BelongsToMany' => $vendorDir . '/topthink/think-orm/src/model/relation/BelongsToMany.php',
-    'think\\model\\relation\\HasMany' => $vendorDir . '/topthink/think-orm/src/model/relation/HasMany.php',
-    'think\\model\\relation\\HasManyThrough' => $vendorDir . '/topthink/think-orm/src/model/relation/HasManyThrough.php',
-    'think\\model\\relation\\HasOne' => $vendorDir . '/topthink/think-orm/src/model/relation/HasOne.php',
-    'think\\model\\relation\\HasOneThrough' => $vendorDir . '/topthink/think-orm/src/model/relation/HasOneThrough.php',
-    'think\\model\\relation\\MorphMany' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphMany.php',
-    'think\\model\\relation\\MorphOne' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphOne.php',
-    'think\\model\\relation\\MorphTo' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphTo.php',
-    'think\\model\\relation\\MorphToMany' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphToMany.php',
-    'think\\model\\relation\\OneToOne' => $vendorDir . '/topthink/think-orm/src/model/relation/OneToOne.php',
-    'think\\paginator\\driver\\Bootstrap' => $vendorDir . '/topthink/think-orm/src/paginator/driver/Bootstrap.php',
-    'think\\response\\File' => $vendorDir . '/topthink/framework/src/think/response/File.php',
-    'think\\response\\Html' => $vendorDir . '/topthink/framework/src/think/response/Html.php',
-    'think\\response\\Json' => $vendorDir . '/topthink/framework/src/think/response/Json.php',
-    'think\\response\\Jsonp' => $vendorDir . '/topthink/framework/src/think/response/Jsonp.php',
-    'think\\response\\Redirect' => $vendorDir . '/topthink/framework/src/think/response/Redirect.php',
-    'think\\response\\View' => $vendorDir . '/topthink/framework/src/think/response/View.php',
-    'think\\response\\Xml' => $vendorDir . '/topthink/framework/src/think/response/Xml.php',
-    'think\\route\\Dispatch' => $vendorDir . '/topthink/framework/src/think/route/Dispatch.php',
-    'think\\route\\Domain' => $vendorDir . '/topthink/framework/src/think/route/Domain.php',
-    'think\\route\\Resource' => $vendorDir . '/topthink/framework/src/think/route/Resource.php',
-    'think\\route\\Rule' => $vendorDir . '/topthink/framework/src/think/route/Rule.php',
-    'think\\route\\RuleGroup' => $vendorDir . '/topthink/framework/src/think/route/RuleGroup.php',
-    'think\\route\\RuleItem' => $vendorDir . '/topthink/framework/src/think/route/RuleItem.php',
-    'think\\route\\RuleName' => $vendorDir . '/topthink/framework/src/think/route/RuleName.php',
-    'think\\route\\Url' => $vendorDir . '/topthink/framework/src/think/route/Url.php',
-    'think\\route\\dispatch\\Callback' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Callback.php',
-    'think\\route\\dispatch\\Controller' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Controller.php',
-    'think\\route\\dispatch\\Url' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Url.php',
-    'think\\service\\ModelService' => $vendorDir . '/topthink/framework/src/think/service/ModelService.php',
-    'think\\service\\PaginatorService' => $vendorDir . '/topthink/framework/src/think/service/PaginatorService.php',
-    'think\\service\\ValidateService' => $vendorDir . '/topthink/framework/src/think/service/ValidateService.php',
-    'think\\session\\Store' => $vendorDir . '/topthink/framework/src/think/session/Store.php',
-    'think\\session\\driver\\Cache' => $vendorDir . '/topthink/framework/src/think/session/driver/Cache.php',
-    'think\\session\\driver\\File' => $vendorDir . '/topthink/framework/src/think/session/driver/File.php',
-    'think\\template\\TagLib' => $vendorDir . '/topthink/think-template/src/template/TagLib.php',
-    'think\\template\\driver\\File' => $vendorDir . '/topthink/think-template/src/template/driver/File.php',
-    'think\\template\\exception\\TemplateNotFoundException' => $vendorDir . '/topthink/think-template/src/template/exception/TemplateNotFoundException.php',
-    'think\\template\\taglib\\Cx' => $vendorDir . '/topthink/think-template/src/template/taglib/Cx.php',
-    'think\\validate\\ValidateRule' => $vendorDir . '/topthink/framework/src/think/validate/ValidateRule.php',
-    'think\\view\\driver\\Php' => $vendorDir . '/topthink/framework/src/think/view/driver/Php.php',
-    'think\\view\\driver\\Think' => $vendorDir . '/topthink/think-view/src/Think.php',
 );

+ 0 - 7
vendor/composer/autoload_psr4.php

@@ -10,11 +10,6 @@ return array(
     'think\\admin\\' => array($vendorDir . '/zoujingli/think-library/src'),
     'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'),
     'app\\' => array($baseDir . '/app'),
-    'WePay\\' => array($vendorDir . '/zoujingli/wechat-developer/WePay'),
-    'WePayV3\\' => array($vendorDir . '/zoujingli/wechat-developer/WePayV3'),
-    'WeMini\\' => array($vendorDir . '/zoujingli/wechat-developer/WeMini'),
-    'WeChat\\' => array($vendorDir . '/zoujingli/wechat-developer/WeChat'),
-    'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
@@ -22,6 +17,4 @@ return array(
     'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'),
     'League\\Flysystem\\Cached\\' => array($vendorDir . '/league/flysystem-cached-adapter/src'),
     'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
-    'Endroid\\QrCode\\' => array($vendorDir . '/endroid/qr-code/src'),
-    'AliPay\\' => array($vendorDir . '/zoujingli/wechat-developer/AliPay'),
 );

+ 0 - 552
vendor/composer/autoload_static.php

@@ -23,17 +23,6 @@ class ComposerStaticInit1566b4f708bea65fef23c749d181d3ec
         array (
             'app\\' => 4,
         ),
-        'W' => 
-        array (
-            'WePay\\' => 6,
-            'WePayV3\\' => 8,
-            'WeMini\\' => 7,
-            'WeChat\\' => 7,
-        ),
-        'S' => 
-        array (
-            'Symfony\\Component\\OptionsResolver\\' => 34,
-        ),
         'P' => 
         array (
             'Psr\\SimpleCache\\' => 16,
@@ -47,14 +36,6 @@ class ComposerStaticInit1566b4f708bea65fef23c749d181d3ec
             'League\\Flysystem\\Cached\\' => 24,
             'League\\Flysystem\\' => 17,
         ),
-        'E' => 
-        array (
-            'Endroid\\QrCode\\' => 15,
-        ),
-        'A' => 
-        array (
-            'AliPay\\' => 7,
-        ),
     );
 
     public static $prefixDirsPsr4 = array (
@@ -77,26 +58,6 @@ class ComposerStaticInit1566b4f708bea65fef23c749d181d3ec
         array (
             0 => __DIR__ . '/../..' . '/app',
         ),
-        'WePay\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay',
-        ),
-        'WePayV3\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3',
-        ),
-        'WeMini\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini',
-        ),
-        'WeChat\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat',
-        ),
-        'Symfony\\Component\\OptionsResolver\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/symfony/options-resolver',
-        ),
         'Psr\\SimpleCache\\' => 
         array (
             0 => __DIR__ . '/..' . '/psr/simple-cache/src',
@@ -125,14 +86,6 @@ class ComposerStaticInit1566b4f708bea65fef23c749d181d3ec
         array (
             0 => __DIR__ . '/..' . '/league/flysystem/src',
         ),
-        'Endroid\\QrCode\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/endroid/qr-code/src',
-        ),
-        'AliPay\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay',
-        ),
     );
 
     public static $fallbackDirsPsr0 = array (
@@ -140,513 +93,8 @@ class ComposerStaticInit1566b4f708bea65fef23c749d181d3ec
     );
 
     public static $classMap = array (
-        'AliPay\\App' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/App.php',
-        'AliPay\\Bill' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Bill.php',
-        'AliPay\\Pos' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Pos.php',
-        'AliPay\\Scan' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Scan.php',
-        'AliPay\\Trade' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Trade.php',
-        'AliPay\\Transfer' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Transfer.php',
-        'AliPay\\Wap' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Wap.php',
-        'AliPay\\Web' => __DIR__ . '/..' . '/zoujingli/wechat-developer/AliPay/Web.php',
         'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
-        'Endroid\\QrCode\\Bundle\\Controller\\QrCodeController' => __DIR__ . '/..' . '/endroid/qr-code/src/Bundle/Controller/QrCodeController.php',
-        'Endroid\\QrCode\\Bundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/endroid/qr-code/src/Bundle/DependencyInjection/Configuration.php',
-        'Endroid\\QrCode\\Bundle\\DependencyInjection\\EndroidQrCodeExtension' => __DIR__ . '/..' . '/endroid/qr-code/src/Bundle/DependencyInjection/EndroidQrCodeExtension.php',
-        'Endroid\\QrCode\\Bundle\\EndroidQrCodeBundle' => __DIR__ . '/..' . '/endroid/qr-code/src/Bundle/EndroidQrCodeBundle.php',
-        'Endroid\\QrCode\\Bundle\\Twig\\Extension\\QrCodeExtension' => __DIR__ . '/..' . '/endroid/qr-code/src/Bundle/Twig/Extension/QrCodeExtension.php',
-        'Endroid\\QrCode\\Exceptions\\DataDoesntExistsException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/DataDoesntExistsException.php',
-        'Endroid\\QrCode\\Exceptions\\FreeTypeLibraryMissingException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/FreeTypeLibraryMissingException.php',
-        'Endroid\\QrCode\\Exceptions\\ImageFunctionFailedException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/ImageFunctionFailedException.php',
-        'Endroid\\QrCode\\Exceptions\\ImageFunctionUnknownException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/ImageFunctionUnknownException.php',
-        'Endroid\\QrCode\\Exceptions\\ImageSizeTooLargeException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/ImageSizeTooLargeException.php',
-        'Endroid\\QrCode\\Exceptions\\ImageTypeInvalidException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/ImageTypeInvalidException.php',
-        'Endroid\\QrCode\\Exceptions\\VersionTooLargeException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exceptions/VersionTooLargeException.php',
-        'Endroid\\QrCode\\Factory\\QrCodeFactory' => __DIR__ . '/..' . '/endroid/qr-code/src/Factory/QrCodeFactory.php',
-        'Endroid\\QrCode\\QrCode' => __DIR__ . '/..' . '/endroid/qr-code/src/QrCode.php',
         'Ip2Region' => __DIR__ . '/..' . '/zoujingli/ip2region/Ip2Region.php',
-        'League\\Flysystem\\AdapterInterface' => __DIR__ . '/..' . '/league/flysystem/src/AdapterInterface.php',
-        'League\\Flysystem\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractAdapter.php',
-        'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php',
-        'League\\Flysystem\\Adapter\\CanOverwriteFiles' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/CanOverwriteFiles.php',
-        'League\\Flysystem\\Adapter\\Ftp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftp.php',
-        'League\\Flysystem\\Adapter\\Ftpd' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftpd.php',
-        'League\\Flysystem\\Adapter\\Local' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Local.php',
-        'League\\Flysystem\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/NullAdapter.php',
-        'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php',
-        'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php',
-        'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php',
-        'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php',
-        'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php',
-        'League\\Flysystem\\Adapter\\SynologyFtp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/SynologyFtp.php',
-        'League\\Flysystem\\Cached\\CacheInterface' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/CacheInterface.php',
-        'League\\Flysystem\\Cached\\CachedAdapter' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/CachedAdapter.php',
-        'League\\Flysystem\\Cached\\Storage\\AbstractCache' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/AbstractCache.php',
-        'League\\Flysystem\\Cached\\Storage\\Adapter' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Adapter.php',
-        'League\\Flysystem\\Cached\\Storage\\Memcached' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Memcached.php',
-        'League\\Flysystem\\Cached\\Storage\\Memory' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Memory.php',
-        'League\\Flysystem\\Cached\\Storage\\Noop' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Noop.php',
-        'League\\Flysystem\\Cached\\Storage\\PhpRedis' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/PhpRedis.php',
-        'League\\Flysystem\\Cached\\Storage\\Predis' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Predis.php',
-        'League\\Flysystem\\Cached\\Storage\\Psr6Cache' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php',
-        'League\\Flysystem\\Cached\\Storage\\Stash' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Stash.php',
-        'League\\Flysystem\\Config' => __DIR__ . '/..' . '/league/flysystem/src/Config.php',
-        'League\\Flysystem\\ConfigAwareTrait' => __DIR__ . '/..' . '/league/flysystem/src/ConfigAwareTrait.php',
-        'League\\Flysystem\\ConnectionErrorException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionErrorException.php',
-        'League\\Flysystem\\ConnectionRuntimeException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionRuntimeException.php',
-        'League\\Flysystem\\CorruptedPathDetected' => __DIR__ . '/..' . '/league/flysystem/src/CorruptedPathDetected.php',
-        'League\\Flysystem\\Directory' => __DIR__ . '/..' . '/league/flysystem/src/Directory.php',
-        'League\\Flysystem\\Exception' => __DIR__ . '/..' . '/league/flysystem/src/Exception.php',
-        'League\\Flysystem\\File' => __DIR__ . '/..' . '/league/flysystem/src/File.php',
-        'League\\Flysystem\\FileExistsException' => __DIR__ . '/..' . '/league/flysystem/src/FileExistsException.php',
-        'League\\Flysystem\\FileNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FileNotFoundException.php',
-        'League\\Flysystem\\Filesystem' => __DIR__ . '/..' . '/league/flysystem/src/Filesystem.php',
-        'League\\Flysystem\\FilesystemException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemException.php',
-        'League\\Flysystem\\FilesystemInterface' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemInterface.php',
-        'League\\Flysystem\\FilesystemNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemNotFoundException.php',
-        'League\\Flysystem\\Handler' => __DIR__ . '/..' . '/league/flysystem/src/Handler.php',
-        'League\\Flysystem\\InvalidRootException' => __DIR__ . '/..' . '/league/flysystem/src/InvalidRootException.php',
-        'League\\Flysystem\\MountManager' => __DIR__ . '/..' . '/league/flysystem/src/MountManager.php',
-        'League\\Flysystem\\NotSupportedException' => __DIR__ . '/..' . '/league/flysystem/src/NotSupportedException.php',
-        'League\\Flysystem\\PluginInterface' => __DIR__ . '/..' . '/league/flysystem/src/PluginInterface.php',
-        'League\\Flysystem\\Plugin\\AbstractPlugin' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/AbstractPlugin.php',
-        'League\\Flysystem\\Plugin\\EmptyDir' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/EmptyDir.php',
-        'League\\Flysystem\\Plugin\\ForcedCopy' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedCopy.php',
-        'League\\Flysystem\\Plugin\\ForcedRename' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedRename.php',
-        'League\\Flysystem\\Plugin\\GetWithMetadata' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/GetWithMetadata.php',
-        'League\\Flysystem\\Plugin\\ListFiles' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListFiles.php',
-        'League\\Flysystem\\Plugin\\ListPaths' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListPaths.php',
-        'League\\Flysystem\\Plugin\\ListWith' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListWith.php',
-        'League\\Flysystem\\Plugin\\PluggableTrait' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluggableTrait.php',
-        'League\\Flysystem\\Plugin\\PluginNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluginNotFoundException.php',
-        'League\\Flysystem\\ReadInterface' => __DIR__ . '/..' . '/league/flysystem/src/ReadInterface.php',
-        'League\\Flysystem\\RootViolationException' => __DIR__ . '/..' . '/league/flysystem/src/RootViolationException.php',
-        'League\\Flysystem\\SafeStorage' => __DIR__ . '/..' . '/league/flysystem/src/SafeStorage.php',
-        'League\\Flysystem\\UnreadableFileException' => __DIR__ . '/..' . '/league/flysystem/src/UnreadableFileException.php',
-        'League\\Flysystem\\Util' => __DIR__ . '/..' . '/league/flysystem/src/Util.php',
-        'League\\Flysystem\\Util\\ContentListingFormatter' => __DIR__ . '/..' . '/league/flysystem/src/Util/ContentListingFormatter.php',
-        'League\\Flysystem\\Util\\MimeType' => __DIR__ . '/..' . '/league/flysystem/src/Util/MimeType.php',
-        'League\\Flysystem\\Util\\StreamHasher' => __DIR__ . '/..' . '/league/flysystem/src/Util/StreamHasher.php',
-        'League\\MimeTypeDetection\\EmptyExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php',
-        'League\\MimeTypeDetection\\ExtensionMimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/ExtensionMimeTypeDetector.php',
-        'League\\MimeTypeDetection\\ExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/ExtensionToMimeTypeMap.php',
-        'League\\MimeTypeDetection\\FinfoMimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/FinfoMimeTypeDetector.php',
-        'League\\MimeTypeDetection\\GeneratedExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php',
-        'League\\MimeTypeDetection\\MimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/MimeTypeDetector.php',
-        'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php',
-        'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php',
-        'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php',
-        'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php',
-        'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
-        'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
-        'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
-        'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
-        'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
-        'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
-        'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
-        'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
-        'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
-        'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
-        'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
-        'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php',
-        'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
-        'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
-        'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php',
-        'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php',
-        'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php',
-        'Symfony\\Component\\OptionsResolver\\Debug\\OptionsResolverIntrospector' => __DIR__ . '/..' . '/symfony/options-resolver/Debug/OptionsResolverIntrospector.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/AccessException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/ExceptionInterface.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/InvalidArgumentException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\InvalidOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/InvalidOptionsException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\MissingOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/MissingOptionsException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\NoConfigurationException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/NoConfigurationException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\NoSuchOptionException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/NoSuchOptionException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\OptionDefinitionException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/OptionDefinitionException.php',
-        'Symfony\\Component\\OptionsResolver\\Exception\\UndefinedOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/UndefinedOptionsException.php',
-        'Symfony\\Component\\OptionsResolver\\Options' => __DIR__ . '/..' . '/symfony/options-resolver/Options.php',
-        'Symfony\\Component\\OptionsResolver\\OptionsResolver' => __DIR__ . '/..' . '/symfony/options-resolver/OptionsResolver.php',
-        'We' => __DIR__ . '/..' . '/zoujingli/wechat-developer/We.php',
-        'WeChat\\Card' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Card.php',
-        'WeChat\\Contracts\\BasicAliPay' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/BasicAliPay.php',
-        'WeChat\\Contracts\\BasicPushEvent' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/BasicPushEvent.php',
-        'WeChat\\Contracts\\BasicWeChat' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWeChat.php',
-        'WeChat\\Contracts\\BasicWePay' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWePay.php',
-        'WeChat\\Contracts\\BasicWeWork' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/BasicWeWork.php',
-        'WeChat\\Contracts\\DataArray' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/DataArray.php',
-        'WeChat\\Contracts\\DataError' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/DataError.php',
-        'WeChat\\Contracts\\MyCurlFile' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/MyCurlFile.php',
-        'WeChat\\Contracts\\Tools' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Contracts/Tools.php',
-        'WeChat\\Custom' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Custom.php',
-        'WeChat\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidArgumentException.php',
-        'WeChat\\Exceptions\\InvalidDecryptException' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidDecryptException.php',
-        'WeChat\\Exceptions\\InvalidInstanceException' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidInstanceException.php',
-        'WeChat\\Exceptions\\InvalidResponseException' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Exceptions/InvalidResponseException.php',
-        'WeChat\\Exceptions\\LocalCacheException' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Exceptions/LocalCacheException.php',
-        'WeChat\\Limit' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Limit.php',
-        'WeChat\\Media' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Media.php',
-        'WeChat\\Menu' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Menu.php',
-        'WeChat\\Oauth' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Oauth.php',
-        'WeChat\\Pay' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Pay.php',
-        'WeChat\\Product' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Product.php',
-        'WeChat\\Qrcode' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Qrcode.php',
-        'WeChat\\Receive' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Receive.php',
-        'WeChat\\Scan' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Scan.php',
-        'WeChat\\Script' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Script.php',
-        'WeChat\\Shake' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Shake.php',
-        'WeChat\\Tags' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Tags.php',
-        'WeChat\\Template' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Template.php',
-        'WeChat\\User' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/User.php',
-        'WeChat\\Wifi' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat/Wifi.php',
-        'WeMini\\Crypt' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Crypt.php',
-        'WeMini\\Delivery' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Delivery.php',
-        'WeMini\\Guide' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Guide.php',
-        'WeMini\\Image' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Image.php',
-        'WeMini\\Live' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Live.php',
-        'WeMini\\Logistics' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Logistics.php',
-        'WeMini\\Message' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Message.php',
-        'WeMini\\Newtmpl' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Newtmpl.php',
-        'WeMini\\Ocr' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Ocr.php',
-        'WeMini\\Operation' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Operation.php',
-        'WeMini\\Plugs' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Plugs.php',
-        'WeMini\\Poi' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Poi.php',
-        'WeMini\\Qrcode' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Qrcode.php',
-        'WeMini\\Search' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Search.php',
-        'WeMini\\Security' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Security.php',
-        'WeMini\\Soter' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Soter.php',
-        'WeMini\\Template' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Template.php',
-        'WeMini\\Total' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini/Total.php',
-        'WePayV3\\Cert' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3/Cert.php',
-        'WePayV3\\Contracts\\BasicWePay' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3/Contracts/BasicWePay.php',
-        'WePayV3\\Contracts\\DecryptAes' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3/Contracts/DecryptAes.php',
-        'WePayV3\\Order' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3/Order.php',
-        'WePayV3\\Refund' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePayV3/Refund.php',
-        'WePay\\Bill' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Bill.php',
-        'WePay\\Coupon' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Coupon.php',
-        'WePay\\Custom' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Custom.php',
-        'WePay\\Order' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Order.php',
-        'WePay\\Redpack' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Redpack.php',
-        'WePay\\Refund' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Refund.php',
-        'WePay\\Transfers' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/Transfers.php',
-        'WePay\\TransfersBank' => __DIR__ . '/..' . '/zoujingli/wechat-developer/WePay/TransfersBank.php',
-        'app\\AppService' => __DIR__ . '/../..' . '/app/AppService.php',
-        'app\\BaseController' => __DIR__ . '/../..' . '/app/BaseController.php',
-        'app\\ExceptionHandle' => __DIR__ . '/../..' . '/app/ExceptionHandle.php',
-        'app\\Request' => __DIR__ . '/../..' . '/app/Request.php',
-        'app\\admin\\controller\\Auth' => __DIR__ . '/../..' . '/app/admin/controller/Auth.php',
-        'app\\admin\\controller\\Base' => __DIR__ . '/../..' . '/app/admin/controller/Base.php',
-        'app\\admin\\controller\\Config' => __DIR__ . '/../..' . '/app/admin/controller/Config.php',
-        'app\\admin\\controller\\Index' => __DIR__ . '/../..' . '/app/admin/controller/Index.php',
-        'app\\admin\\controller\\Login' => __DIR__ . '/../..' . '/app/admin/controller/Login.php',
-        'app\\admin\\controller\\Menu' => __DIR__ . '/../..' . '/app/admin/controller/Menu.php',
-        'app\\admin\\controller\\Module' => __DIR__ . '/../..' . '/app/admin/controller/Module.php',
-        'app\\admin\\controller\\Oplog' => __DIR__ . '/../..' . '/app/admin/controller/Oplog.php',
-        'app\\admin\\controller\\Queue' => __DIR__ . '/../..' . '/app/admin/controller/Queue.php',
-        'app\\admin\\controller\\User' => __DIR__ . '/../..' . '/app/admin/controller/User.php',
-        'app\\admin\\controller\\api\\Plugs' => __DIR__ . '/../..' . '/app/admin/controller/api/Plugs.php',
-        'app\\admin\\controller\\api\\Queue' => __DIR__ . '/../..' . '/app/admin/controller/api/Queue.php',
-        'app\\admin\\controller\\api\\Runtime' => __DIR__ . '/../..' . '/app/admin/controller/api/Runtime.php',
-        'app\\admin\\controller\\api\\Update' => __DIR__ . '/../..' . '/app/admin/controller/api/Update.php',
-        'app\\admin\\controller\\api\\Upload' => __DIR__ . '/../..' . '/app/admin/controller/api/Upload.php',
-        'app\\admin\\model\\SystemAuth' => __DIR__ . '/../..' . '/app/admin/model/SystemAuth.php',
-        'app\\admin\\model\\SystemBase' => __DIR__ . '/../..' . '/app/admin/model/SystemBase.php',
-        'app\\admin\\model\\SystemQueue' => __DIR__ . '/../..' . '/app/admin/model/SystemQueue.php',
-        'app\\admin\\model\\SystemUser' => __DIR__ . '/../..' . '/app/admin/model/SystemUser.php',
-        'app\\controller\\Index' => __DIR__ . '/../..' . '/app/controller/Index.php',
-        'app\\index\\controller\\Index' => __DIR__ . '/../..' . '/app/index/controller/Index.php',
-        'app\\wechat\\command\\Auto' => __DIR__ . '/../..' . '/app/wechat/command/Auto.php',
-        'app\\wechat\\command\\Fans' => __DIR__ . '/../..' . '/app/wechat/command/Fans.php',
-        'app\\wechat\\controller\\Auto' => __DIR__ . '/../..' . '/app/wechat/controller/Auto.php',
-        'app\\wechat\\controller\\Config' => __DIR__ . '/../..' . '/app/wechat/controller/Config.php',
-        'app\\wechat\\controller\\Fans' => __DIR__ . '/../..' . '/app/wechat/controller/Fans.php',
-        'app\\wechat\\controller\\Keys' => __DIR__ . '/../..' . '/app/wechat/controller/Keys.php',
-        'app\\wechat\\controller\\Menu' => __DIR__ . '/../..' . '/app/wechat/controller/Menu.php',
-        'app\\wechat\\controller\\News' => __DIR__ . '/../..' . '/app/wechat/controller/News.php',
-        'app\\wechat\\controller\\api\\Js' => __DIR__ . '/../..' . '/app/wechat/controller/api/Js.php',
-        'app\\wechat\\controller\\api\\Login' => __DIR__ . '/../..' . '/app/wechat/controller/api/Login.php',
-        'app\\wechat\\controller\\api\\Push' => __DIR__ . '/../..' . '/app/wechat/controller/api/Push.php',
-        'app\\wechat\\controller\\api\\Test' => __DIR__ . '/../..' . '/app/wechat/controller/api/Test.php',
-        'app\\wechat\\controller\\api\\View' => __DIR__ . '/../..' . '/app/wechat/controller/api/View.php',
-        'app\\wechat\\service\\AutoService' => __DIR__ . '/../..' . '/app/wechat/service/AutoService.php',
-        'app\\wechat\\service\\FansService' => __DIR__ . '/../..' . '/app/wechat/service/FansService.php',
-        'app\\wechat\\service\\MediaService' => __DIR__ . '/../..' . '/app/wechat/service/MediaService.php',
-        'app\\wechat\\service\\WechatService' => __DIR__ . '/../..' . '/app/wechat/service/WechatService.php',
-        'think\\App' => __DIR__ . '/..' . '/topthink/framework/src/think/App.php',
-        'think\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/Cache.php',
-        'think\\Collection' => __DIR__ . '/..' . '/topthink/think-helper/src/Collection.php',
-        'think\\Config' => __DIR__ . '/..' . '/topthink/framework/src/think/Config.php',
-        'think\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/Console.php',
-        'think\\Container' => __DIR__ . '/..' . '/topthink/framework/src/think/Container.php',
-        'think\\Cookie' => __DIR__ . '/..' . '/topthink/framework/src/think/Cookie.php',
-        'think\\Db' => __DIR__ . '/..' . '/topthink/framework/src/think/Db.php',
-        'think\\DbManager' => __DIR__ . '/..' . '/topthink/think-orm/src/DbManager.php',
-        'think\\Env' => __DIR__ . '/..' . '/topthink/framework/src/think/Env.php',
-        'think\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/Event.php',
-        'think\\Exception' => __DIR__ . '/..' . '/topthink/framework/src/think/Exception.php',
-        'think\\Facade' => __DIR__ . '/..' . '/topthink/framework/src/think/Facade.php',
-        'think\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/File.php',
-        'think\\Filesystem' => __DIR__ . '/..' . '/topthink/framework/src/think/Filesystem.php',
-        'think\\Http' => __DIR__ . '/..' . '/topthink/framework/src/think/Http.php',
-        'think\\Lang' => __DIR__ . '/..' . '/topthink/framework/src/think/Lang.php',
-        'think\\Log' => __DIR__ . '/..' . '/topthink/framework/src/think/Log.php',
-        'think\\Manager' => __DIR__ . '/..' . '/topthink/framework/src/think/Manager.php',
-        'think\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/Middleware.php',
-        'think\\Model' => __DIR__ . '/..' . '/topthink/think-orm/src/Model.php',
-        'think\\Paginator' => __DIR__ . '/..' . '/topthink/think-orm/src/Paginator.php',
-        'think\\Pipeline' => __DIR__ . '/..' . '/topthink/framework/src/think/Pipeline.php',
-        'think\\Request' => __DIR__ . '/..' . '/topthink/framework/src/think/Request.php',
-        'think\\Response' => __DIR__ . '/..' . '/topthink/framework/src/think/Response.php',
-        'think\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/Route.php',
-        'think\\Service' => __DIR__ . '/..' . '/topthink/framework/src/think/Service.php',
-        'think\\Session' => __DIR__ . '/..' . '/topthink/framework/src/think/Session.php',
-        'think\\Template' => __DIR__ . '/..' . '/topthink/think-template/src/Template.php',
-        'think\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/Validate.php',
-        'think\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/View.php',
-        'think\\admin\\Command' => __DIR__ . '/..' . '/zoujingli/think-library/src/Command.php',
-        'think\\admin\\Controller' => __DIR__ . '/..' . '/zoujingli/think-library/src/Controller.php',
-        'think\\admin\\Exception' => __DIR__ . '/..' . '/zoujingli/think-library/src/Exception.php',
-        'think\\admin\\Helper' => __DIR__ . '/..' . '/zoujingli/think-library/src/Helper.php',
-        'think\\admin\\Library' => __DIR__ . '/..' . '/zoujingli/think-library/src/Library.php',
-        'think\\admin\\Queue' => __DIR__ . '/..' . '/zoujingli/think-library/src/Queue.php',
-        'think\\admin\\Service' => __DIR__ . '/..' . '/zoujingli/think-library/src/Service.php',
-        'think\\admin\\Storage' => __DIR__ . '/..' . '/zoujingli/think-library/src/Storage.php',
-        'think\\admin\\command\\Database' => __DIR__ . '/..' . '/zoujingli/think-library/src/command/Database.php',
-        'think\\admin\\command\\Install' => __DIR__ . '/..' . '/zoujingli/think-library/src/command/Install.php',
-        'think\\admin\\command\\Queue' => __DIR__ . '/..' . '/zoujingli/think-library/src/command/Queue.php',
-        'think\\admin\\command\\Replace' => __DIR__ . '/..' . '/zoujingli/think-library/src/command/Replace.php',
-        'think\\admin\\command\\Version' => __DIR__ . '/..' . '/zoujingli/think-library/src/command/Version.php',
-        'think\\admin\\extend\\CodeExtend' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/CodeExtend.php',
-        'think\\admin\\extend\\DataExtend' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/DataExtend.php',
-        'think\\admin\\extend\\ExcelExtend' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/ExcelExtend.php',
-        'think\\admin\\extend\\HttpExtend' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/HttpExtend.php',
-        'think\\admin\\extend\\JsonRpcClient' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/JsonRpcClient.php',
-        'think\\admin\\extend\\JsonRpcServer' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/JsonRpcServer.php',
-        'think\\admin\\extend\\Parsedown' => __DIR__ . '/..' . '/zoujingli/think-library/src/extend/Parsedown.php',
-        'think\\admin\\helper\\DeleteHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/DeleteHelper.php',
-        'think\\admin\\helper\\FormHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/FormHelper.php',
-        'think\\admin\\helper\\PageHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/PageHelper.php',
-        'think\\admin\\helper\\QueryHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/QueryHelper.php',
-        'think\\admin\\helper\\SaveHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/SaveHelper.php',
-        'think\\admin\\helper\\TokenHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/TokenHelper.php',
-        'think\\admin\\helper\\ValidateHelper' => __DIR__ . '/..' . '/zoujingli/think-library/src/helper/ValidateHelper.php',
-        'think\\admin\\multiple\\BuildUrl' => __DIR__ . '/..' . '/zoujingli/think-library/src/multiple/BuildUrl.php',
-        'think\\admin\\multiple\\Multiple' => __DIR__ . '/..' . '/zoujingli/think-library/src/multiple/Multiple.php',
-        'think\\admin\\multiple\\command\\Build' => __DIR__ . '/..' . '/zoujingli/think-library/src/multiple/command/Build.php',
-        'think\\admin\\service\\AdminService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/AdminService.php',
-        'think\\admin\\service\\CaptchaService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/CaptchaService.php',
-        'think\\admin\\service\\ExpressService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ExpressService.php',
-        'think\\admin\\service\\InterfaceService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/InterfaceService.php',
-        'think\\admin\\service\\MenuService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/MenuService.php',
-        'think\\admin\\service\\MessageService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/MessageService.php',
-        'think\\admin\\service\\ModuleService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ModuleService.php',
-        'think\\admin\\service\\NodeService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/NodeService.php',
-        'think\\admin\\service\\ProcessService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ProcessService.php',
-        'think\\admin\\service\\QueueService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/QueueService.php',
-        'think\\admin\\service\\SystemService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/SystemService.php',
-        'think\\admin\\service\\TokenService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/TokenService.php',
-        'think\\admin\\service\\ZtSmsService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ZtSmsService.php',
-        'think\\admin\\storage\\AliossStorage' => __DIR__ . '/..' . '/zoujingli/think-library/src/storage/AliossStorage.php',
-        'think\\admin\\storage\\LocalStorage' => __DIR__ . '/..' . '/zoujingli/think-library/src/storage/LocalStorage.php',
-        'think\\admin\\storage\\QiniuStorage' => __DIR__ . '/..' . '/zoujingli/think-library/src/storage/QiniuStorage.php',
-        'think\\admin\\storage\\TxcosStorage' => __DIR__ . '/..' . '/zoujingli/think-library/src/storage/TxcosStorage.php',
-        'think\\cache\\Driver' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/Driver.php',
-        'think\\cache\\TagSet' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/TagSet.php',
-        'think\\cache\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/File.php',
-        'think\\cache\\driver\\Memcache' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Memcache.php',
-        'think\\cache\\driver\\Memcached' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Memcached.php',
-        'think\\cache\\driver\\Redis' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Redis.php',
-        'think\\cache\\driver\\Wincache' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Wincache.php',
-        'think\\console\\Command' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Command.php',
-        'think\\console\\Input' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Input.php',
-        'think\\console\\Output' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Output.php',
-        'think\\console\\Table' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Table.php',
-        'think\\console\\command\\Clear' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Clear.php',
-        'think\\console\\command\\Help' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Help.php',
-        'think\\console\\command\\Lists' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Lists.php',
-        'think\\console\\command\\Make' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Make.php',
-        'think\\console\\command\\RouteList' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/RouteList.php',
-        'think\\console\\command\\RunServer' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/RunServer.php',
-        'think\\console\\command\\ServiceDiscover' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/ServiceDiscover.php',
-        'think\\console\\command\\VendorPublish' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/VendorPublish.php',
-        'think\\console\\command\\Version' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Version.php',
-        'think\\console\\command\\make\\Command' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Command.php',
-        'think\\console\\command\\make\\Controller' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Controller.php',
-        'think\\console\\command\\make\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Event.php',
-        'think\\console\\command\\make\\Listener' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Listener.php',
-        'think\\console\\command\\make\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Middleware.php',
-        'think\\console\\command\\make\\Model' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Model.php',
-        'think\\console\\command\\make\\Service' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Service.php',
-        'think\\console\\command\\make\\Subscribe' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Subscribe.php',
-        'think\\console\\command\\make\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Validate.php',
-        'think\\console\\command\\optimize\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/optimize/Route.php',
-        'think\\console\\command\\optimize\\Schema' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/optimize/Schema.php',
-        'think\\console\\input\\Argument' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Argument.php',
-        'think\\console\\input\\Definition' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Definition.php',
-        'think\\console\\input\\Option' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Option.php',
-        'think\\console\\output\\Ask' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Ask.php',
-        'think\\console\\output\\Descriptor' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Descriptor.php',
-        'think\\console\\output\\Formatter' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Formatter.php',
-        'think\\console\\output\\Question' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Question.php',
-        'think\\console\\output\\descriptor\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/descriptor/Console.php',
-        'think\\console\\output\\driver\\Buffer' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Buffer.php',
-        'think\\console\\output\\driver\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Console.php',
-        'think\\console\\output\\driver\\Nothing' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Nothing.php',
-        'think\\console\\output\\formatter\\Stack' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/formatter/Stack.php',
-        'think\\console\\output\\formatter\\Style' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/formatter/Style.php',
-        'think\\console\\output\\question\\Choice' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/question/Choice.php',
-        'think\\console\\output\\question\\Confirmation' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/question/Confirmation.php',
-        'think\\contract\\Arrayable' => __DIR__ . '/..' . '/topthink/think-helper/src/contract/Arrayable.php',
-        'think\\contract\\CacheHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/CacheHandlerInterface.php',
-        'think\\contract\\Jsonable' => __DIR__ . '/..' . '/topthink/think-helper/src/contract/Jsonable.php',
-        'think\\contract\\LogHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/LogHandlerInterface.php',
-        'think\\contract\\ModelRelationInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/ModelRelationInterface.php',
-        'think\\contract\\SessionHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/SessionHandlerInterface.php',
-        'think\\contract\\TemplateHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/TemplateHandlerInterface.php',
-        'think\\db\\BaseQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/BaseQuery.php',
-        'think\\db\\Builder' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Builder.php',
-        'think\\db\\CacheItem' => __DIR__ . '/..' . '/topthink/think-orm/src/db/CacheItem.php',
-        'think\\db\\Connection' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Connection.php',
-        'think\\db\\ConnectionInterface' => __DIR__ . '/..' . '/topthink/think-orm/src/db/ConnectionInterface.php',
-        'think\\db\\Fetch' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Fetch.php',
-        'think\\db\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Mongo.php',
-        'think\\db\\PDOConnection' => __DIR__ . '/..' . '/topthink/think-orm/src/db/PDOConnection.php',
-        'think\\db\\Query' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Query.php',
-        'think\\db\\Raw' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Raw.php',
-        'think\\db\\Where' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Where.php',
-        'think\\db\\builder\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Mongo.php',
-        'think\\db\\builder\\Mysql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Mysql.php',
-        'think\\db\\builder\\Oracle' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Oracle.php',
-        'think\\db\\builder\\Pgsql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Pgsql.php',
-        'think\\db\\builder\\Sqlite' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Sqlite.php',
-        'think\\db\\builder\\Sqlsrv' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Sqlsrv.php',
-        'think\\db\\concern\\AggregateQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/AggregateQuery.php',
-        'think\\db\\concern\\JoinAndViewQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/JoinAndViewQuery.php',
-        'think\\db\\concern\\ModelRelationQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ModelRelationQuery.php',
-        'think\\db\\concern\\ParamsBind' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ParamsBind.php',
-        'think\\db\\concern\\ResultOperation' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ResultOperation.php',
-        'think\\db\\concern\\TableFieldInfo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/TableFieldInfo.php',
-        'think\\db\\concern\\TimeFieldQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/TimeFieldQuery.php',
-        'think\\db\\concern\\Transaction' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/Transaction.php',
-        'think\\db\\concern\\WhereQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/WhereQuery.php',
-        'think\\db\\connector\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Mongo.php',
-        'think\\db\\connector\\Mysql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Mysql.php',
-        'think\\db\\connector\\Oracle' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Oracle.php',
-        'think\\db\\connector\\Pgsql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Pgsql.php',
-        'think\\db\\connector\\Sqlite' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Sqlite.php',
-        'think\\db\\connector\\Sqlsrv' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Sqlsrv.php',
-        'think\\db\\exception\\BindParamException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/BindParamException.php',
-        'think\\db\\exception\\DataNotFoundException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/DataNotFoundException.php',
-        'think\\db\\exception\\DbEventException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/DbEventException.php',
-        'think\\db\\exception\\DbException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/DbException.php',
-        'think\\db\\exception\\InvalidArgumentException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/InvalidArgumentException.php',
-        'think\\db\\exception\\ModelEventException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/ModelEventException.php',
-        'think\\db\\exception\\ModelNotFoundException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/ModelNotFoundException.php',
-        'think\\db\\exception\\PDOException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/PDOException.php',
-        'think\\event\\AppInit' => __DIR__ . '/..' . '/topthink/framework/src/think/event/AppInit.php',
-        'think\\event\\HttpEnd' => __DIR__ . '/..' . '/topthink/framework/src/think/event/HttpEnd.php',
-        'think\\event\\HttpRun' => __DIR__ . '/..' . '/topthink/framework/src/think/event/HttpRun.php',
-        'think\\event\\LogRecord' => __DIR__ . '/..' . '/topthink/framework/src/think/event/LogRecord.php',
-        'think\\event\\LogWrite' => __DIR__ . '/..' . '/topthink/framework/src/think/event/LogWrite.php',
-        'think\\event\\RouteLoaded' => __DIR__ . '/..' . '/topthink/framework/src/think/event/RouteLoaded.php',
-        'think\\exception\\ClassNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ClassNotFoundException.php',
-        'think\\exception\\ErrorException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ErrorException.php',
-        'think\\exception\\FileException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/FileException.php',
-        'think\\exception\\FuncNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/FuncNotFoundException.php',
-        'think\\exception\\Handle' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/Handle.php',
-        'think\\exception\\HttpException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/HttpException.php',
-        'think\\exception\\HttpResponseException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/HttpResponseException.php',
-        'think\\exception\\InvalidArgumentException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/InvalidArgumentException.php',
-        'think\\exception\\RouteNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/RouteNotFoundException.php',
-        'think\\exception\\ValidateException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ValidateException.php',
-        'think\\facade\\App' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/App.php',
-        'think\\facade\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Cache.php',
-        'think\\facade\\Config' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Config.php',
-        'think\\facade\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Console.php',
-        'think\\facade\\Cookie' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Cookie.php',
-        'think\\facade\\Db' => __DIR__ . '/..' . '/topthink/think-orm/src/facade/Db.php',
-        'think\\facade\\Env' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Env.php',
-        'think\\facade\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Event.php',
-        'think\\facade\\Filesystem' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Filesystem.php',
-        'think\\facade\\Lang' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Lang.php',
-        'think\\facade\\Log' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Log.php',
-        'think\\facade\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Middleware.php',
-        'think\\facade\\Request' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Request.php',
-        'think\\facade\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Route.php',
-        'think\\facade\\Session' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Session.php',
-        'think\\facade\\Template' => __DIR__ . '/..' . '/topthink/think-template/src/facade/Template.php',
-        'think\\facade\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Validate.php',
-        'think\\facade\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/View.php',
-        'think\\file\\UploadedFile' => __DIR__ . '/..' . '/topthink/framework/src/think/file/UploadedFile.php',
-        'think\\filesystem\\CacheStore' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/CacheStore.php',
-        'think\\filesystem\\Driver' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/Driver.php',
-        'think\\filesystem\\driver\\Local' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/driver/Local.php',
-        'think\\helper\\Arr' => __DIR__ . '/..' . '/topthink/think-helper/src/helper/Arr.php',
-        'think\\helper\\Str' => __DIR__ . '/..' . '/topthink/think-helper/src/helper/Str.php',
-        'think\\initializer\\BootService' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/BootService.php',
-        'think\\initializer\\Error' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/Error.php',
-        'think\\initializer\\RegisterService' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/RegisterService.php',
-        'think\\log\\Channel' => __DIR__ . '/..' . '/topthink/framework/src/think/log/Channel.php',
-        'think\\log\\ChannelSet' => __DIR__ . '/..' . '/topthink/framework/src/think/log/ChannelSet.php',
-        'think\\log\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/log/driver/File.php',
-        'think\\log\\driver\\Socket' => __DIR__ . '/..' . '/topthink/framework/src/think/log/driver/Socket.php',
-        'think\\middleware\\AllowCrossDomain' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/AllowCrossDomain.php',
-        'think\\middleware\\CheckRequestCache' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/CheckRequestCache.php',
-        'think\\middleware\\FormTokenCheck' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/FormTokenCheck.php',
-        'think\\middleware\\LoadLangPack' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/LoadLangPack.php',
-        'think\\middleware\\SessionInit' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/SessionInit.php',
-        'think\\model\\Collection' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Collection.php',
-        'think\\model\\Pivot' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Pivot.php',
-        'think\\model\\Relation' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Relation.php',
-        'think\\model\\concern\\Attribute' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/Attribute.php',
-        'think\\model\\concern\\Conversion' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/Conversion.php',
-        'think\\model\\concern\\ModelEvent' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/ModelEvent.php',
-        'think\\model\\concern\\OptimLock' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/OptimLock.php',
-        'think\\model\\concern\\RelationShip' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/RelationShip.php',
-        'think\\model\\concern\\SoftDelete' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/SoftDelete.php',
-        'think\\model\\concern\\TimeStamp' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/TimeStamp.php',
-        'think\\model\\concern\\Virtual' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/Virtual.php',
-        'think\\model\\relation\\BelongsTo' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/BelongsTo.php',
-        'think\\model\\relation\\BelongsToMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/BelongsToMany.php',
-        'think\\model\\relation\\HasMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasMany.php',
-        'think\\model\\relation\\HasManyThrough' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasManyThrough.php',
-        'think\\model\\relation\\HasOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasOne.php',
-        'think\\model\\relation\\HasOneThrough' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasOneThrough.php',
-        'think\\model\\relation\\MorphMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphMany.php',
-        'think\\model\\relation\\MorphOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphOne.php',
-        'think\\model\\relation\\MorphTo' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphTo.php',
-        'think\\model\\relation\\MorphToMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphToMany.php',
-        'think\\model\\relation\\OneToOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/OneToOne.php',
-        'think\\paginator\\driver\\Bootstrap' => __DIR__ . '/..' . '/topthink/think-orm/src/paginator/driver/Bootstrap.php',
-        'think\\response\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/response/File.php',
-        'think\\response\\Html' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Html.php',
-        'think\\response\\Json' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Json.php',
-        'think\\response\\Jsonp' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Jsonp.php',
-        'think\\response\\Redirect' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Redirect.php',
-        'think\\response\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/response/View.php',
-        'think\\response\\Xml' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Xml.php',
-        'think\\route\\Dispatch' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Dispatch.php',
-        'think\\route\\Domain' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Domain.php',
-        'think\\route\\Resource' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Resource.php',
-        'think\\route\\Rule' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Rule.php',
-        'think\\route\\RuleGroup' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleGroup.php',
-        'think\\route\\RuleItem' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleItem.php',
-        'think\\route\\RuleName' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleName.php',
-        'think\\route\\Url' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Url.php',
-        'think\\route\\dispatch\\Callback' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Callback.php',
-        'think\\route\\dispatch\\Controller' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Controller.php',
-        'think\\route\\dispatch\\Url' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Url.php',
-        'think\\service\\ModelService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/ModelService.php',
-        'think\\service\\PaginatorService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/PaginatorService.php',
-        'think\\service\\ValidateService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/ValidateService.php',
-        'think\\session\\Store' => __DIR__ . '/..' . '/topthink/framework/src/think/session/Store.php',
-        'think\\session\\driver\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/session/driver/Cache.php',
-        'think\\session\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/session/driver/File.php',
-        'think\\template\\TagLib' => __DIR__ . '/..' . '/topthink/think-template/src/template/TagLib.php',
-        'think\\template\\driver\\File' => __DIR__ . '/..' . '/topthink/think-template/src/template/driver/File.php',
-        'think\\template\\exception\\TemplateNotFoundException' => __DIR__ . '/..' . '/topthink/think-template/src/template/exception/TemplateNotFoundException.php',
-        'think\\template\\taglib\\Cx' => __DIR__ . '/..' . '/topthink/think-template/src/template/taglib/Cx.php',
-        'think\\validate\\ValidateRule' => __DIR__ . '/..' . '/topthink/framework/src/think/validate/ValidateRule.php',
-        'think\\view\\driver\\Php' => __DIR__ . '/..' . '/topthink/framework/src/think/view/driver/Php.php',
-        'think\\view\\driver\\Think' => __DIR__ . '/..' . '/topthink/think-view/src/Think.php',
     );
 
     public static function getInitializer(ClassLoader $loader)

+ 0 - 222
vendor/composer/installed.json

@@ -1,78 +1,5 @@
 {
     "packages": [
-        {
-            "name": "endroid/qr-code",
-            "version": "1.9.3",
-            "version_normalized": "1.9.3.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/endroid/qr-code.git",
-                "reference": "c9644bec2a9cc9318e98d1437de3c628dcd1ef93"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/endroid/qr-code/zipball/c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
-                "reference": "c9644bec2a9cc9318e98d1437de3c628dcd1ef93",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "ext-gd": "*",
-                "php": ">=5.4",
-                "symfony/options-resolver": "^2.3|^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.0|^5.0",
-                "sensio/framework-extra-bundle": "^3.0",
-                "symfony/browser-kit": "^2.3|^3.0",
-                "symfony/framework-bundle": "^2.3|^3.0",
-                "symfony/http-kernel": "^2.3|^3.0"
-            },
-            "time": "2017-04-08T09:13:59+00:00",
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.x-dev"
-                }
-            },
-            "installation-source": "dist",
-            "autoload": {
-                "psr-4": {
-                    "Endroid\\QrCode\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jeroen van den Enden",
-                    "email": "info@endroid.nl",
-                    "homepage": "http://endroid.nl/"
-                }
-            ],
-            "description": "Endroid QR Code",
-            "homepage": "https://github.com/endroid/QrCode",
-            "keywords": [
-                "bundle",
-                "code",
-                "endroid",
-                "qr",
-                "qrcode",
-                "symfony"
-            ],
-            "support": {
-                "issues": "https://github.com/endroid/qr-code/issues",
-                "source": "https://github.com/endroid/qr-code/tree/1.9.3"
-            },
-            "install-path": "../endroid/qr-code"
-        },
         {
             "name": "league/flysystem",
             "version": "1.1.4",
@@ -493,81 +420,6 @@
             },
             "install-path": "../psr/simple-cache"
         },
-        {
-            "name": "symfony/options-resolver",
-            "version": "v3.4.47",
-            "version_normalized": "3.4.47.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744",
-                "reference": "c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "php": "^5.5.9|>=7.0.8"
-            },
-            "time": "2020-10-24T10:57:07+00:00",
-            "type": "library",
-            "installation-source": "dist",
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\OptionsResolver\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony OptionsResolver Component",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "config",
-                "configuration",
-                "options"
-            ],
-            "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v3.4.47"
-            },
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "install-path": "../symfony/options-resolver"
-        },
         {
             "name": "topthink/framework",
             "version": "v6.0.9",
@@ -962,80 +814,6 @@
                 "wiki": "https://thinkadmin.top"
             },
             "install-path": "../zoujingli/think-library"
-        },
-        {
-            "name": "zoujingli/wechat-developer",
-            "version": "v1.2.31",
-            "version_normalized": "1.2.31.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zoujingli/WeChatDeveloper.git",
-                "reference": "0cf699c725f69d66657a50e60d22f71c9e5a5e16"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zoujingli/WeChatDeveloper/zipball/0cf699c725f69d66657a50e60d22f71c9e5a5e16",
-                "reference": "0cf699c725f69d66657a50e60d22f71c9e5a5e16",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "ext-bcmath": "*",
-                "ext-curl": "*",
-                "ext-json": "*",
-                "ext-libxml": "*",
-                "ext-mbstring": "*",
-                "ext-openssl": "*",
-                "ext-simplexml": "*",
-                "ext-xml": "*",
-                "php": ">=5.4"
-            },
-            "time": "2021-05-19T06:25:20+00:00",
-            "type": "library",
-            "installation-source": "dist",
-            "autoload": {
-                "classmap": [
-                    "We.php"
-                ],
-                "psr-4": {
-                    "WePay\\": "WePay",
-                    "WeChat\\": "WeChat",
-                    "WeMini\\": "WeMini",
-                    "AliPay\\": "AliPay",
-                    "WePayV3\\": "WePayV3"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Anyon",
-                    "email": "zoujingli@qq.com",
-                    "homepage": "https://thinkadmin.top"
-                }
-            ],
-            "description": "WeChat platform and WeChat payment development tools",
-            "homepage": "https://github.com/kentwangit/WeChatDeveloper",
-            "keywords": [
-                "WeChatDeveloper",
-                "WeMini",
-                "alipay",
-                "wechat",
-                "wechatpay",
-                "wepay"
-            ],
-            "support": {
-                "issues": "https://github.com/zoujingli/WeChatDeveloper/issues",
-                "source": "https://github.com/zoujingli/WeChatDeveloper/tree/v1.2.31"
-            },
-            "install-path": "../zoujingli/wechat-developer"
         }
     ],
     "dev": true,

+ 149 - 195
vendor/composer/installed.php

@@ -1,197 +1,151 @@
-<?php return array (
-  'root' => 
-  array (
-    'pretty_version' => 'dev-master',
-    'version' => 'dev-master',
-    'aliases' => 
-    array (
+<?php return array(
+    'root' => array(
+        'pretty_version' => 'dev-master',
+        'version' => 'dev-master',
+        'type' => 'project',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'reference' => '9eff4947806a492d35f7c061724c1316047f9533',
+        'name' => 'zoujingli/thinkadmin',
+        'dev' => true,
+    ),
+    'versions' => array(
+        'league/flysystem' => array(
+            'pretty_version' => '1.1.4',
+            'version' => '1.1.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem',
+            'aliases' => array(),
+            'reference' => 'f3ad69181b8afed2c9edf7be5a2918144ff4ea32',
+            'dev_requirement' => false,
+        ),
+        'league/flysystem-cached-adapter' => array(
+            'pretty_version' => '1.1.0',
+            'version' => '1.1.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem-cached-adapter',
+            'aliases' => array(),
+            'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff',
+            'dev_requirement' => false,
+        ),
+        'league/mime-type-detection' => array(
+            'pretty_version' => '1.7.0',
+            'version' => '1.7.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/mime-type-detection',
+            'aliases' => array(),
+            'reference' => '3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3',
+            'dev_requirement' => false,
+        ),
+        'psr/cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/cache',
+            'aliases' => array(),
+            'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
+            'dev_requirement' => false,
+        ),
+        'psr/container' => array(
+            'pretty_version' => '1.1.1',
+            'version' => '1.1.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/container',
+            'aliases' => array(),
+            'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
+            'dev_requirement' => false,
+        ),
+        'psr/log' => array(
+            'pretty_version' => '1.1.4',
+            'version' => '1.1.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/log',
+            'aliases' => array(),
+            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
+            'dev_requirement' => false,
+        ),
+        'psr/simple-cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/simple-cache',
+            'aliases' => array(),
+            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
+            'dev_requirement' => false,
+        ),
+        'topthink/framework' => array(
+            'pretty_version' => 'v6.0.9',
+            'version' => '6.0.9.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/framework',
+            'aliases' => array(),
+            'reference' => '0b5fb453f0e533de3af3a1ab6a202510b61be617',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-helper' => array(
+            'pretty_version' => 'v3.1.5',
+            'version' => '3.1.5.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-helper',
+            'aliases' => array(),
+            'reference' => 'f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-orm' => array(
+            'pretty_version' => 'v2.0.44',
+            'version' => '2.0.44.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-orm',
+            'aliases' => array(),
+            'reference' => '5d3d5c1ebf8bfccf34bacd90edb42989b16ea409',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-template' => array(
+            'pretty_version' => 'v2.0.8',
+            'version' => '2.0.8.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-template',
+            'aliases' => array(),
+            'reference' => 'abfc293f74f9ef5127b5c416310a01fe42e59368',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-view' => array(
+            'pretty_version' => 'v1.0.14',
+            'version' => '1.0.14.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-view',
+            'aliases' => array(),
+            'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d',
+            'dev_requirement' => false,
+        ),
+        'zoujingli/ip2region' => array(
+            'pretty_version' => 'v1.0.10',
+            'version' => '1.0.10.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../zoujingli/ip2region',
+            'aliases' => array(),
+            'reference' => '453480d0ab5b6fdbdf4aa400b7598a10ff2dc5c0',
+            'dev_requirement' => false,
+        ),
+        'zoujingli/think-library' => array(
+            'pretty_version' => 'v6.0.x-dev',
+            'version' => '6.0.9999999.9999999-dev',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../zoujingli/think-library',
+            'aliases' => array(
+                0 => '9999999-dev',
+            ),
+            'reference' => '00a0080e4b0e72bd94a2facd426eb0cc585c1b6d',
+            'dev_requirement' => false,
+        ),
+        'zoujingli/thinkadmin' => array(
+            'pretty_version' => 'dev-master',
+            'version' => 'dev-master',
+            'type' => 'project',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'reference' => '9eff4947806a492d35f7c061724c1316047f9533',
+            'dev_requirement' => false,
+        ),
     ),
-    'reference' => 'dea0d88a83dbe63381a4034a0904ca604a897359',
-    'name' => 'zoujingli/thinkadmin',
-    'dev' => true,
-  ),
-  'versions' => 
-  array (
-    'endroid/qr-code' => 
-    array (
-      'pretty_version' => '1.9.3',
-      'version' => '1.9.3.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'c9644bec2a9cc9318e98d1437de3c628dcd1ef93',
-      'dev-requirement' => false,
-    ),
-    'league/flysystem' => 
-    array (
-      'pretty_version' => '1.1.4',
-      'version' => '1.1.4.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'f3ad69181b8afed2c9edf7be5a2918144ff4ea32',
-      'dev-requirement' => false,
-    ),
-    'league/flysystem-cached-adapter' => 
-    array (
-      'pretty_version' => '1.1.0',
-      'version' => '1.1.0.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff',
-      'dev-requirement' => false,
-    ),
-    'league/mime-type-detection' => 
-    array (
-      'pretty_version' => '1.7.0',
-      'version' => '1.7.0.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3',
-      'dev-requirement' => false,
-    ),
-    'psr/cache' => 
-    array (
-      'pretty_version' => '1.0.1',
-      'version' => '1.0.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
-      'dev-requirement' => false,
-    ),
-    'psr/container' => 
-    array (
-      'pretty_version' => '1.1.1',
-      'version' => '1.1.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
-      'dev-requirement' => false,
-    ),
-    'psr/log' => 
-    array (
-      'pretty_version' => '1.1.4',
-      'version' => '1.1.4.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
-      'dev-requirement' => false,
-    ),
-    'psr/simple-cache' => 
-    array (
-      'pretty_version' => '1.0.1',
-      'version' => '1.0.1.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
-      'dev-requirement' => false,
-    ),
-    'symfony/options-resolver' => 
-    array (
-      'pretty_version' => 'v3.4.47',
-      'version' => '3.4.47.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'c7efc97a47b2ebaabc19d5b6c6b50f5c37c92744',
-      'dev-requirement' => false,
-    ),
-    'topthink/framework' => 
-    array (
-      'pretty_version' => 'v6.0.9',
-      'version' => '6.0.9.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '0b5fb453f0e533de3af3a1ab6a202510b61be617',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-helper' => 
-    array (
-      'pretty_version' => 'v3.1.5',
-      'version' => '3.1.5.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-orm' => 
-    array (
-      'pretty_version' => 'v2.0.44',
-      'version' => '2.0.44.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '5d3d5c1ebf8bfccf34bacd90edb42989b16ea409',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-template' => 
-    array (
-      'pretty_version' => 'v2.0.8',
-      'version' => '2.0.8.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'abfc293f74f9ef5127b5c416310a01fe42e59368',
-      'dev-requirement' => false,
-    ),
-    'topthink/think-view' => 
-    array (
-      'pretty_version' => 'v1.0.14',
-      'version' => '1.0.14.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/ip2region' => 
-    array (
-      'pretty_version' => 'v1.0.10',
-      'version' => '1.0.10.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '453480d0ab5b6fdbdf4aa400b7598a10ff2dc5c0',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/think-library' => 
-    array (
-      'pretty_version' => 'v6.0.x-dev',
-      'version' => '6.0.9999999.9999999-dev',
-      'aliases' => 
-      array (
-        0 => '9999999-dev',
-      ),
-      'reference' => '00a0080e4b0e72bd94a2facd426eb0cc585c1b6d',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/thinkadmin' => 
-    array (
-      'pretty_version' => 'dev-master',
-      'version' => 'dev-master',
-      'aliases' => 
-      array (
-      ),
-      'reference' => 'dea0d88a83dbe63381a4034a0904ca604a897359',
-      'dev-requirement' => false,
-    ),
-    'zoujingli/wechat-developer' => 
-    array (
-      'pretty_version' => 'v1.2.31',
-      'version' => '1.2.31.0',
-      'aliases' => 
-      array (
-      ),
-      'reference' => '0cf699c725f69d66657a50e60d22f71c9e5a5e16',
-      'dev-requirement' => false,
-    ),
-  ),
 );

+ 0 - 5
vendor/endroid/qr-code/.gitignore

@@ -1,5 +0,0 @@
-/bin
-/composer.lock
-/composer.phar
-/phpunit.xml
-/vendor

+ 0 - 21
vendor/endroid/qr-code/.travis.yml

@@ -1,21 +0,0 @@
-language: php
-
-php:
-  - 5.4
-  - 5.5
-  - 5.6
-  - 7.0
-  - 7.1
-  - hhvm
-
-matrix:
-  fast_finish: true
-
-before_install:
-  - if [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then phpenv config-rm xdebug.ini; fi;
-  - composer self-update && composer install --no-interaction
-
-script: bin/phpunit
-
-notifications:
-  email: info@endroid.nl

+ 0 - 19
vendor/endroid/qr-code/LICENSE

@@ -1,19 +0,0 @@
-Copyright (c) Jeroen van den Enden
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.

+ 0 - 132
vendor/endroid/qr-code/README.md

@@ -1,132 +0,0 @@
-QR Code
-=======
-
-*By [endroid](http://endroid.nl/)*
-
-[![Latest Stable Version](http://img.shields.io/packagist/v/endroid/qrcode.svg)](https://packagist.org/packages/endroid/qrcode)
-[![Build Status](http://img.shields.io/travis/endroid/QrCode.svg)](http://travis-ci.org/endroid/QrCode)
-[![Total Downloads](http://img.shields.io/packagist/dt/endroid/qrcode.svg)](https://packagist.org/packages/endroid/qrcode)
-[![Monthly Downloads](http://img.shields.io/packagist/dm/endroid/qrcode.svg)](https://packagist.org/packages/endroid/qrcode)
-[![License](http://img.shields.io/packagist/l/endroid/qrcode.svg)](https://packagist.org/packages/endroid/qrcode)
-
-This library based on QRcode Perl CGI & PHP scripts by Y. Swetake helps you generate images containing a QR code.
-
-## Installation
-
-Use [Composer](https://getcomposer.org/) to install the library.
-
-``` bash
-$ composer require endroid/qrcode
-```
-
-## Usage
-
-```php
-use Endroid\QrCode\QrCode;
-
-$qrCode = new QrCode();
-$qrCode
-    ->setText('Life is too short to be generating QR codes')
-    ->setSize(300)
-    ->setPadding(10)
-    ->setErrorCorrection('high')
-    ->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0])
-    ->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0])
-    ->setLabel('Scan the code')
-    ->setLabelFontSize(16)
-    ->setImageType(QrCode::IMAGE_TYPE_PNG)
-;
-
-// now we can directly output the qrcode
-header('Content-Type: '.$qrCode->getContentType());
-$qrCode->render();
-
-// save it to a file
-$qrCode->save('qrcode.png');
-
-// or create a response object
-$response = new Response($qrCode->get(), 200, ['Content-Type' => $qrCode->getContentType()]);
-```
-
-![QR Code](http://endroid.nl/qrcode/Life%20is%20too%20short%20to%20be%20generating%20QR%20codes.png?label=Scan%20the%20code)
-
-## Symfony integration
-
-Register the Symfony bundle in the kernel.
-
-```php
-// app/AppKernel.php
-
-public function registerBundles()
-{
-    $bundles = [
-        // ...
-        new Endroid\QrCode\Bundle\EndroidQrCodeBundle(),
-    ];
-}
-```
-
-The default parameters can be overridden via the configuration.  
-Alpha channel available range is [0, 127] in foreground and background colors.
-
-```yaml
-endroid_qr_code:
-    size: 100
-    padding: 10
-    extension: gif
-    error_correction_level: high
-    foreground_color: { r: 0, g: 0, b: 0, a: 0 }
-    background_color: { r: 255, g: 255, b: 255, a: 0 }
-    label: 'My label'
-    label_font_size: 16
-```
-
-Now you can retrieve the factory as follows.
-
-```php
-$factory = $this->get('endroid.qrcode.factory');
-$factory->createQrCode();
-```
-
-Add the following section to your routing to be able to handle QR code URLs.
-This step can be skipped when you only use data URIs to display your images.
-
-``` yml
-EndroidQrCodeBundle:
-    resource: "@EndroidQrCodeBundle/Controller/"
-    type:     annotation
-    prefix:   /qrcode
-```
-
-After installation and configuration, QR codes can be generated by appending
-the QR code text to the url as mounted, followed by .png, .jpg or .gif.
-
-## Twig extension
-
-The bundle also provides a Twig extension for quickly generating QR code urls.
-Optional parameters are extension, size, padding and errorCorrectionLevel. When
-a parameter is omitted, the value in the bundle configuration is used.
-
-``` twig
-<img src="{{ qrcode_url(message) }}" />
-<img src="{{ qrcode_url(message, { extension: 'png' }) }}" />
-<img src="{{ qrcode_url(message, { size: 150 }) }}" />
-```
-
-You can also use the data URI helper to embed the QR code within your HTML
-instead of requiring a separate HTTP request to load your image.
-
-``` twig
-<img src="{{ qrcode_data_uri(message, { size: 200, padding: 10 }) }}" />
-```
-
-## Versioning
-
-Version numbers follow the MAJOR.MINOR.PATCH scheme. Backwards compatibility
-breaking changes will be kept to a minimum but be aware that these can occur.
-Lock your dependencies for production and test your code when upgrading.
-
-## License
-
-This bundle is under the MIT license. For the full copyright and license
-information please view the LICENSE file that was distributed with this source code.

BIN
vendor/endroid/qr-code/assets/data/qrv10_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv10_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv10_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv10_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv11_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv11_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv11_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv11_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv12_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv12_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv12_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv12_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv13_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv13_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv13_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv13_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv14_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv14_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv14_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv14_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv15_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv15_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv15_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv15_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv16_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv16_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv16_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv16_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv17_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv17_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv17_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv17_3.dat


BIN
vendor/endroid/qr-code/assets/data/qrv18_0.dat


BIN
vendor/endroid/qr-code/assets/data/qrv18_1.dat


BIN
vendor/endroid/qr-code/assets/data/qrv18_2.dat


BIN
vendor/endroid/qr-code/assets/data/qrv18_3.dat


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff