moonsflyer 2 месяцев назад
Родитель
Сommit
ae42e77b98

+ 23 - 0
app/admin/controller/wechat/Hfive.php

@@ -0,0 +1,23 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\common\basics\AdminBase;
+use app\admin\logic\wechat\HfiveLogic;
+use app\common\server\JsonServer;
+
+class Hfive extends AdminBase
+{
+    /**
+     * H5商城设置
+     */
+    public function set()
+    {
+        if($this->request->isPost()) {
+            $params = $this->request->post();
+            HfiveLogic::set($params);
+            return JsonServer::success('设置成功');
+        }
+        $config = HfiveLogic::getConfig();
+        return view('set', ['config' => $config]);
+    }
+}

+ 31 - 0
app/admin/controller/wechat/Mnp.php

@@ -0,0 +1,31 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\common\basics\AdminBase;
+use app\admin\logic\wechat\MnpLogic;
+use app\common\server\JsonServer;
+use app\common\server\ConfigServer;
+
+class Mnp extends AdminBase
+{
+    /**
+     * 小程序设置
+     */
+    public function setMnp()
+    {
+        if($this->request->isAjax()) {
+            $post = $this->request->post();
+            if(isset($post['qr_code'])){
+                $domain = $this->request->domain();
+                $post['qr_code'] = str_replace($domain, '', $post['qr_code']);
+            }else{
+                $post['qr_code'] = '';
+            }
+            MnpLogic::setMnp($post);
+            return JsonServer::success('设置成功');
+        }
+
+        $mnp = MnpLogic::getMnp();
+        return view('set_mnp', ['mnp' => $mnp]);
+    }
+}

+ 55 - 0
app/admin/controller/wechat/Oa.php

@@ -0,0 +1,55 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\common\basics\AdminBase;
+use app\admin\logic\wechat\OaLogic;
+use app\common\server\JsonServer;
+use app\common\server\ConfigServer;
+
+class Oa extends AdminBase
+{
+    /**
+     * 公众号设置
+     */
+    public function setOa()
+    {
+        if($this->request->isAjax()){
+            $post = $this->request->post();
+            if(isset($post['qr_code']) && !empty($post['qr_code'])) {
+                $domain = $this->request->domain();
+                $post['qr_code'] = str_replace($domain, '', $post['qr_code']);
+            }else{
+                $post['qr_code'] = '';
+            }
+            OaLogic::setOa($post);
+            return JsonServer::success('设置成功');
+        }
+        $oa = OaLogic::getOa();
+        return view('setoa', ['oa' => $oa]);
+    }
+
+    /**
+     * 菜单管理
+     */
+    public function oaMenu()
+    {
+        $wechat_menu = ConfigServer::get('menu', 'wechat_menu',[]);
+        return view('oamenu', ['menu' => $wechat_menu]);
+    }
+
+    /**
+     * 发布菜单
+     */
+    public function pulishMenu()
+    {
+        $menu = $this->request->post('button');
+        if(empty($menu)){
+            return JsonServer::error('请设置菜单');
+        }
+        $result = OaLogic::pulishMenu($menu);
+        if($result){
+            return JsonServer::success('菜单发布成功');
+        }
+        return JsonServer::error(OaLogic::getError());
+    }
+}

+ 26 - 0
app/admin/controller/wechat/Op.php

@@ -0,0 +1,26 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\common\basics\AdminBase;
+use app\admin\logic\wechat\OpLogic;
+use app\common\server\JsonServer;
+
+class Op extends AdminBase
+{
+    /**
+     * 开放平台配置
+     */
+    public function config()
+    {
+        if($this->request->isAjax()){
+            $post = $this->request->post();
+            OpLogic::setConfig($post);
+            return JsonServer::success('设置成功');
+        }
+
+        return view('config', [
+            'config' => OpLogic::getConfig(['app_id','secret']), //微信公众开放平台-APP应用
+            'web_config' => OpLogic::getConfig(['web_app_id','web_secret'])  //微信公众开放平台-网站应用
+        ]);
+    }
+}

+ 23 - 0
app/admin/controller/wechat/Pc.php

@@ -0,0 +1,23 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\admin\logic\wechat\PcLogic;
+use app\common\basics\AdminBase;
+use app\common\server\JsonServer;
+
+class Pc extends AdminBase
+{
+    /**
+     * PC商城设置
+     */
+    public function set()
+    {
+        if($this->request->isPost()) {
+            $params = $this->request->post();
+            PcLogic::set($params);
+            return JsonServer::success('设置成功');
+        }
+        $config = PcLogic::getConfig();
+        return view('set', ['config' => $config]);
+    }
+}

+ 99 - 0
app/admin/controller/wechat/Reply.php

@@ -0,0 +1,99 @@
+<?php
+namespace  app\admin\controller\wechat;
+
+use app\common\basics\AdminBase;
+use app\admin\logic\wechat\ReplyLogic;
+use app\common\server\JsonServer;
+use app\common\server\ConfigServer;
+use app\common\model\wechat\Wechat;
+use app\admin\validate\wechat\ReplyValidate;
+
+class Reply extends AdminBase
+{
+    public function lists(){
+        if($this->request->isAjax()){
+            $get = $this->request->get();
+            $data = ReplyLogic::lists($get);
+            return JsonServer::success('', $data);
+        }
+
+        $type_list= Wechat::getCustomReply();
+        return view('lists', ['type_list' => $type_list]);
+    }
+
+    public function add()
+    {
+        if($this->request->isAjax()){
+            try{
+                $post = $this->request->post();
+                validate(ReplyValidate::class)->scene($post['reply_type'])->check($post);
+            }catch(\think\exception\ValidateException $e) {
+                return JsonServer::error($e->getError());
+            }
+            $result= ReplyLogic::add($post);
+            if($result) {
+                return JsonServer::success('新增成功');
+            }else{
+                return JsonServer::error('新增失败');
+            }
+        }
+
+        $type = $this->request->get('type');
+        $template = 'add_'.$type;
+        return view($template);
+    }
+
+    public function edit()
+    {
+        if($this->request->isAjax()){
+            try{
+                $post = $this->request->post();
+                validate(ReplyValidate::class)->scene($post['reply_type'])->check($post);
+            }catch(\think\exception\ValidateException $e) {
+                return JsonServer::error($e->getError());
+            }
+            $result= ReplyLogic::edit($post);
+            if($result) {
+                return JsonServer::success('编辑成功');
+            }else{
+                return JsonServer::error('编辑失败');
+            }
+        }
+
+        $id = $this->request->get('id');
+        $detail = ReplyLogic::getReply($id);
+        $template = 'edit_'.$detail['reply_type'];
+        return view($template, ['detail' => $detail]);
+    }
+
+    public function del(){
+        if($this->request->isPost()) {
+            try{
+                $post = $this->request->post();
+                validate(ReplyValidate::class)->scene('del')->check($post);
+            }catch(\think\exception\ValidateException $e) {
+                return JsonServer::error($e->getError());
+            }
+            $result = ReplyLogic::del($post['id']);
+            if($result) {
+                return JsonServer::success('删除成功');
+            }else{
+                return JsonServer::error('删除失败');
+            }
+        }else{
+            return JsonServer::error('请求类型错误');
+        }
+    }
+
+    public function changeFields(){
+        $pk_value = $this->request->post('id');
+        $field = $this->request->post('field');
+        $field_value = $this->request->post('value');
+        $reply_type = $this->request->post('reply_type');
+        $result = ReplyLogic::changeFields($pk_value, $field, $field_value,$reply_type);
+        if ($result) {
+            return JsonServer::success('修改成功');
+        }
+        return JsonServer::error('修改失败');
+    }
+}

+ 85 - 0
app/admin/logic/wechat/HfiveLogic.php

@@ -0,0 +1,85 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+use think\facade\Env;
+
+class HfiveLogic extends Logic
+{
+
+    /**
+     * 获取H5商城设置
+     */
+    public static function getConfig()
+    {
+        $config = [
+            'is_open' => ConfigServer::get('h5', 'is_open', 1),
+            'page' => ConfigServer::get('h5', 'page', 1),
+            'page_url' => ConfigServer::get('h5', 'page_url', ''),
+            'h5_url' => request()->domain() . '/mobile'
+        ];
+
+        return $config;
+    }
+
+    /**
+     * H5商城设置
+     */
+    public static function set($params)
+    {
+        ConfigServer::set('h5', 'is_open', $params['is_open']);
+        ConfigServer::set('h5', 'page', $params['page']);
+        ConfigServer::set('h5', 'page_url', $params['page_url']);
+
+
+        // 恢复原入口
+        if(file_exists('./mobile/index_lock.html')) {
+            // 存在则原商城入口被修改过,先清除修改后的入口
+            unlink('./mobile/index.html');
+            // 恢复原入口
+            rename('./mobile/index_lock.html', './mobile/index.html');
+
+            // 删除旧的缓存文件
+            array_map('unlink', glob('../runtime/index/temp/'.'*.php'));
+        }
+
+        // H5商城关闭 且 显示空白页
+        if($params['is_open'] == 0 && $params['page'] == 1) {
+            // 变更文件名
+            rename('./mobile/index.html', './mobile/index_lock.html');
+            // 创建新空白文件
+            $newfile = fopen('./mobile/index.html', 'w');
+            fclose($newfile);
+        }
+
+        // H5商城关闭 且 跳转指定页
+        if($params['is_open'] == 0 && $params['page'] == 2 && !empty($params['page_url'])) {
+            // 变更文件名
+            rename('./mobile/index.html', './mobile/index_lock.html');
+            // 创建重定向文件
+            $newfile = fopen('./mobile/index.html', 'w');
+            $content = '<script>window.location.href = "' . $params['page_url'] . '";</script>';
+            fwrite($newfile, $content);
+            fclose($newfile);
+        }
+    }
+}

+ 85 - 0
app/admin/logic/wechat/MnpLogic.php

@@ -0,0 +1,85 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+use app\common\server\UrlServer;
+use app\common\server\WeChatServer;
+use EasyWeChat\Factory;
+use EasyWeChat\Kernel\Exceptions\Exception;
+
+class MnpLogic extends Logic
+{
+    /**
+     * 获取小程序配置
+     */
+    public static function getMnp()
+    {
+        $domain_name = $_SERVER['SERVER_NAME'];
+        $qr_code = ConfigServer::get('mnp', 'qr_code', '');
+        $config = [
+            'name'                  => ConfigServer::get('mnp', 'name', ''),
+            'original_id'           => ConfigServer::get('mnp', 'original_id', ''),
+            'qr_code'               => $qr_code,
+            'abs_qr_code'           => UrlServer::getFileUrl($qr_code),
+            'app_id'                => ConfigServer::get('mnp', 'app_id', ''),
+            'app_secret'            => ConfigServer::get('mnp', 'secret', ''),
+            'request_domain'        => 'https://'.$domain_name,
+            'socket_domain'         => 'wss://'.$domain_name,
+            'uploadfile_domain'     => 'https://'.$domain_name,
+            'downloadfile_domain'   => 'https://'.$domain_name,
+            'udp_domain'            => 'udp://'.$domain_name,
+            'tcp_domain'            => 'tcp://'.$domain_name,
+            'business_domain'       => $domain_name,
+            'url'                   => url('api/wechat/index',[],'',true),
+            'token'                 => ConfigServer::get('mnp', 'token', 'LikeMall'),
+            'encoding_ses_key'      => ConfigServer::get('mnp', 'encoding_ses_key', ''),
+            'encryption_type'       => ConfigServer::get('mnp', 'encryption_type', ''),
+            'data_type'             => ConfigServer::get('mnp', 'data_type', ''),
+            
+            // 小程序同步发货开关 1开启 0关闭
+            'express_send_sync'     => ConfigServer::get('mnp', 'express_send_sync', 1),
+        ];
+        return $config;
+    }
+
+    public static function setMnp($post)
+    {
+        if($post){
+            $encryption_type  = $post['encryption_type'] ?? '';
+            $data_type  = $post['data_type'] ?? '';
+
+            ConfigServer::set('mnp','name',$post['name']);
+            ConfigServer::set('mnp','original_id',$post['original_id']);
+            ConfigServer::set('mnp','qr_code', $post['qr_code']);
+            ConfigServer::set('mnp','app_id',$post['app_id']);
+            ConfigServer::set('mnp','secret',$post['app_secret']);
+            ConfigServer::set('mnp','token',$post['token']);
+            ConfigServer::set('mnp','encoding_ses_key',$post['encoding_ses_key']);
+            ConfigServer::set('mnp','encryption_type', $encryption_type);
+            ConfigServer::set('mnp','data_type', $data_type);
+    
+    
+            ConfigServer::set('mnp','express_send_sync', $post['express_send_sync'] ?? 1);
+        }
+        return true;
+    }
+}

+ 95 - 0
app/admin/logic/wechat/OaLogic.php

@@ -0,0 +1,95 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+use app\common\server\UrlServer;
+use app\common\server\WeChatServer;
+use EasyWeChat\Factory;
+use EasyWeChat\Kernel\Exceptions\Exception;
+
+class OaLogic extends Logic
+{
+    public static function setOa($post)
+    {
+        ConfigServer::set('oa','name', trim($post['name']));
+        ConfigServer::set('oa','original_id', trim($post['original_id']));
+        ConfigServer::set('oa','app_id',$post['app_id']);
+        ConfigServer::set('oa','secret',$post['app_secret']);
+        ConfigServer::set('oa','token',$post['token']);
+        ConfigServer::set('oa','encoding_ses_key',$post['encoding_ses_key']);
+        ConfigServer::set('oa','encryption_type',$post['encryption_type']);
+        ConfigServer::set('oa','qr_code',$post['qr_code']);
+    }
+
+    public static function getOa()
+    {
+        $domain_name = $_SERVER['SERVER_NAME'];
+        $qr_code = ConfigServer::get('oa', 'qr_code', '');
+        $config = [
+            'name'              => ConfigServer::get('oa', 'name', ''),
+            'original_id'       => ConfigServer::get('oa', 'original_id', ''),
+            'qr_code'           => $qr_code,
+            'abs_qr_code'       => UrlServer::getFileUrl($qr_code),
+            'app_id'            => ConfigServer::get('oa', 'app_id', ''),
+            'app_secret'        => ConfigServer::get('oa', 'secret', ''),
+            'url'               => url('api/wechat/index',[],'',true),
+            'token'             => ConfigServer::get('oa', 'token', 'LikeMall'),
+            'encoding_ses_key'  => ConfigServer::get('oa', 'encoding_ses_key', ''),
+            'encryption_type'   => ConfigServer::get('oa', 'encryption_type', 1),
+            'business_domain'   => $domain_name,
+            'safety_domain'     => $domain_name,
+            'auth_domain'       => $domain_name,
+        ];
+        return $config;
+    }
+
+    /**
+     * 发布菜单
+     */
+    public static function pulishMenu($menu)
+    {
+        try {
+            $config = WeChatServer::getOaConfig();
+
+            if(empty($config['app_id']) || empty($config['secret'])){
+                throw new \think\Exception('请先配置微信公众号参数');
+            }
+
+            $app = Factory::officialAccount($config);
+
+            $result = $app->menu->create($menu);
+
+            if($result['errcode'] == 0){
+                ConfigServer::set('menu','wechat_menu',$menu);
+                return true;
+            }
+            self::$error = '菜单发布失败:'.json_encode($result);
+            return false;
+        } catch (\think\Exception $e){
+            self::$error = $e->getError();
+            return false;
+        } catch(\Exception $e) {
+            self::$error = $e->getMessage();
+            return false;
+        }
+    }
+}

+ 44 - 0
app/admin/logic/wechat/OpLogic.php

@@ -0,0 +1,44 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+
+class OpLogic extends Logic
+{
+    public static function getConfig($config_list)
+    {
+        $config = [];
+        foreach ($config_list as $config_name){
+            $value = ConfigServer::get('op', $config_name, '');
+            $config[$config_name] = $value;
+        }
+        return $config;
+    }
+
+    public static function setConfig($config_list)
+    {
+        foreach ($config_list as $config_name => $config_value){
+            ConfigServer::set('op',$config_name,$config_value);
+        }
+        return true;
+    }
+}

+ 84 - 0
app/admin/logic/wechat/PcLogic.php

@@ -0,0 +1,84 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+
+class PcLogic extends Logic
+{
+
+    /**
+     * 获取PC商城设置
+     */
+    public static function getConfig()
+    {
+        $config = [
+            'is_open' => ConfigServer::get('pc', 'is_open', 1),
+            'page' => ConfigServer::get('pc', 'page', 1),
+            'page_url' => ConfigServer::get('pc', 'page_url', ''),
+            'pc_url' => request()->domain() . '/pc'
+        ];
+
+        return $config;
+    }
+
+    /**
+     * PC商城设置
+     */
+    public static function set($params)
+    {
+        ConfigServer::set('pc', 'is_open', $params['is_open']);
+        ConfigServer::set('pc', 'page', $params['page']);
+        ConfigServer::set('pc', 'page_url', $params['page_url']);
+
+
+        // 恢复原入口
+        if(file_exists('./pc/index_lock.html')) {
+            // 存在则原商城入口被修改过,先清除修改后的入口
+            unlink('./pc/index.html');
+            // 恢复原入口
+            rename('./pc/index_lock.html', './pc/index.html');
+
+            // 删除旧的缓存文件
+            array_map('unlink', glob('../runtime/index/temp/'.'*.php'));
+        }
+
+        // pc商城关闭 且 显示空白页
+        if($params['is_open'] == 0 && $params['page'] == 1) {
+            // 变更文件名
+            rename('./pc/index.html', './pc/index_lock.html');
+            // 创建新空白文件
+            $newfile = fopen('./pc/index.html', 'w');
+            fclose($newfile);
+        }
+
+        // pc商城关闭 且 跳转指定页
+        if($params['is_open'] == 0 && $params['page'] == 2 && !empty($params['page_url'])) {
+            // 变更文件名
+            rename('./pc/index.html', './pc/index_lock.html');
+            // 创建重定向文件
+            $newfile = fopen('./pc/index.html', 'w');
+            $content = '<script>window.location.href = "' . $params['page_url'] . '";</script>';
+            fwrite($newfile, $content);
+            fclose($newfile);
+        }
+    }
+}

+ 104 - 0
app/admin/logic/wechat/ReplyLogic.php

@@ -0,0 +1,104 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop开源商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
+// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | likeshop团队版权所有并拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshop.cn.team
+// +----------------------------------------------------------------------
+
+namespace app\admin\logic\wechat;
+
+use app\common\basics\Logic;
+use app\common\server\ConfigServer;
+use app\common\server\UrlServer;
+use app\common\server\WeChatServer;
+use EasyWeChat\Factory;
+use EasyWeChat\Kernel\Exceptions\Exception;
+use app\common\model\wechat\WechatReply;
+use app\common\model\wechat\Wechat;
+
+class ReplyLogic extends Logic
+{
+    public static function lists($get)
+    {
+        $where[] = ['del','=',0];
+
+        if(isset($get['type'])){ // 回复类型
+            $where[] = ['reply_type','=',$get['type']];
+        }
+
+        $count = WechatReply::where($where)->count();
+        $list = WechatReply::where($where)
+            ->order([
+                'sort' => 'asc',
+                'id' => 'desc'
+            ])
+            ->page($get['page'],$get['limit'])
+            ->select()
+            ->toArray();
+
+        foreach ($list as $key =>  $reply) {
+            // 内容类型
+            $reply['content_type'] && $list[$key]['content_type'] = '文本';
+            // 匹配类型
+            switch ($reply['matching_type']){
+                case 1:
+                    $list[$key]['matching_type'] = '全匹配';
+                    break;
+                case 2:
+                    $list[$key]['matching_type'] = '模糊匹配';
+                    break;
+            }
+        }
+        return ['count'=>$count,'list'=>$list];
+    }
+
+    public static function add($post)
+    {
+        $post['create_time'] = time();
+        $post['del'] = 0;
+
+        if($post['reply_type'] !== WeChat::msg_type_text && $post['status']){
+            // 除了关键词回复,其他回复类型开启记录只允许一条,若当前正在新增的记录将是开启状态,则该回复类型下的现有记录需先更新为停用状态
+            WechatReply::where(['reply_type'=>$post['reply_type']])->update(['update_time'=>time(),'status'=>0]);
+        }
+        return WechatReply::insert($post);
+    }
+
+    public static function getReply($id)
+    {
+        $detail =  WechatReply::findOrEmpty($id);
+        $detail = $detail->isEmpty() ? [] : $detail->toArray();
+        return $detail;
+    }
+
+    public static function edit($post){
+        $post['update_time'] = time();
+        if($post['reply_type'] !== WeChat::msg_type_text && $post['status']){
+            WechatReply::where(['reply_type'=>$post['reply_type']])->update(['update_time'=>time(),'status'=>0]);
+        }
+        return WechatReply::where(['id'=>$post['id']])->update($post);
+    }
+
+    public static function del($id){
+        return WechatReply::where(['id'=>$id])->update(['update_time'=>time(),'del'=>1]);
+    }
+
+    public static function changeFields($id,$field,$field_value,$reply_type){
+        if( 'status' === $field && $field_value && $reply_type !== WeChat::msg_type_text){
+            WechatReply::where(['reply_type'=>$reply_type])->update(['update_time'=>time(),'status'=>0]);
+        }
+        return WechatReply::where(['id'=>$id])->update(['update_time'=>time(),$field=>$field_value]);
+    }
+}

+ 28 - 0
app/admin/validate/wechat/ReplyValidate.php

@@ -0,0 +1,28 @@
+<?php
+namespace app\admin\validate\wechat;
+
+use think\Validate;
+
+class ReplyValidate extends Validate
+{
+    protected $rule = [
+        'id'            => 'require',
+        'name'          => 'require|unique:wechatReply,name^del',
+        'keyword'       => 'require|max:5',
+        'content'       => 'require',
+    ];
+    protected $message = [
+        'id.require'            => '请选择回复',
+        'name.require'          => '请输入规则名称',
+        'name.unique'           => '规则名称重复',
+        'keyword.require'       => '请输入关键词',
+        'keyword.max'           => '关键词不能超过5个字',
+        'content.require'       => '请输入回复内容',
+    ];
+    protected $scene = [
+        'subscribe' =>  ['name','content'],
+        'text'      =>  ['name','keyword','content'],
+        'default'   =>  ['name','content'],
+        'del'       =>  ['id'],
+    ];
+}

+ 98 - 0
app/admin/view/wechat/hfive/set.html

@@ -0,0 +1,98 @@
+{layout name="layout1" /}
+<style>
+  .layui-form-label {
+      width: 120px;
+      text-align: left;
+  }
+</style>
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        <p>H5商城设置</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-card-body">
+            <div class="layui-form">
+                <div class="layui-form-item">
+                    <div class="layui-form-label">渠道状态</div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="is_open" value="0" title="关闭" {if !$config.is_open}checked{/if} />
+                        <input type="radio" name="is_open" value="1" title="开启" {if $config.is_open}checked{/if} />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label">关闭后访问页面</div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="page" value="1" title="空白页" {if $config.page == 1}checked{/if} />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label"></div>
+                    <div class="layui-inline">
+                        <input type="radio" name="page" value="2" title="自定义页面" {if $config.page == 2}checked{/if} />
+                    </div>
+                    <div class="layui-inline" style="width: 420px;">
+                        <input type="text" name="page_url" value="{$config.page_url}" placeholder="请输入完整的url" class="layui-input" />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label">H5商城链接</div>
+                    <div class="layui-inline" style="width: 280px;">
+                        <input type="text" style="border:none" id="h5_url" value="{$config.h5_url}" class="layui-input" readonly />
+                    </div>
+                    <button class="layui-btn layui-btn-xs layui-btn-primary" id="copy">复制</button>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label"></div>
+                    <div class="layui-input-block">
+                        <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="set">设置</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/plug/layui-admin/dist/layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['form', 'layer'], function(){
+        var form = layui.form;
+        var layer = layui.layer;
+        var $ = layui.jquery;
+
+        form.on('submit(set)', function (data) {
+            $.ajax({
+                url:'{:url("wechat.hfive/set")}',
+                type: 'post',
+                data: data.field,
+                success:function(res) {
+                    if (res.code == 1) {
+                        layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    }
+                }
+            });
+        });
+
+        // 复制
+        $('#copy').click(function() {
+            var input = document.getElementById('h5_url');
+            input.select();
+            document.execCommand("Copy");
+            layer.msg('复制成功');
+        });
+    });
+</script>

+ 338 - 0
app/admin/view/wechat/mnp/set_mnp.html

@@ -0,0 +1,338 @@
+{layout name="layout1" /}
+<style>
+    .layui-form-label {
+        width: 156px;
+    }
+
+    .tips {
+        color: red;
+    }
+
+    .copy {
+        margin-left: 10px;
+    }
+
+    .layui-form-item .layui-input-inline {
+        width: 410px;
+    }
+
+    .layui-input {
+        display: inline-block;
+        width: 80%;
+    }
+</style>
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        *填写微信小程序开发配置,请前往微信公众平台申请小程序并完成认证。
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--        <div class="layui-card-header" style="margin-top: 20px">小程序配置</div>-->
+        <div class="layui-card-body" pad15>
+            <div class="layui-form" lay-filter="">
+                <!--                微信小程序-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>微信小程序</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">小程序名称:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="name" value="{$mnp.name}" class="layui-input" autocomnplete="off">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">原始ID:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="original_id" value="{$mnp.original_id}" class="layui-input"
+                               autocomnplete="off">
+                    </div>
+
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">小程序码:</label>
+                    <div class="layui-input-block">
+                        <div class="like-upload-image">
+                            {if $mnp.qr_code}
+                            <div class="upload-image-div">
+                                <img src="{$mnp.qr_code}" alt="img">
+                                <input type="hidden" name="bg_image" value="{$mnp.qr_code}">
+                                <div class="del-upload-btn">x</div>
+                            </div>
+                            <div class="upload-image-elem" style="display:none;"><a class="add-upload-image"
+                                                                                    id="qrcode"> + 添加图片</a></div>
+                            {else}
+                            <div class="upload-image-elem"><a class="add-upload-image" id="qrcode"> + 添加图片</a></div>
+                            {/if}
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">建议尺寸:宽400px*高400px。jpg,jpeg,png格式</span>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">发货信息管理:</label>
+                    <div class="layui-input-block">
+                        <input type="radio" name="express_send_sync" value="1" title="开启" {if $mnp.express_send_sync== 1} checked {/if} >
+                        <input type="radio" name="express_send_sync" value="0" title="关闭" {if $mnp.express_send_sync== 0} checked {/if} >
+
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序有订单发货管理时,请打开此开关,否则会导致订单资金冻结</span>
+                </div>
+                <!--                开发者ID-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>开发者ID</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppID:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="app_id" value="{$mnp.app_id}" autocomplete="off" lay-verify="required"
+                               lay-verType="tips"
+                               class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppSecret:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="app_secret" value="{$mnp.app_secret}" lay-verify="required"
+                               lay-verType="tips" autocomnplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->开发者ID,设置AppID和AppSecret</span>
+                </div>
+                <!--                服务器域名-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>服务器域名</legend>
+                    </fieldset>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">request合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="request_domain" readonly="readonly" value="{$mnp.request_domain}"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->服务器域名,填写https协议域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">socket合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="socket_domain" readonly="readonly" value="{$mnp.socket_domain}"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->服务器域名,填写wss协议域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">uploadFile合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="uploadfile_domain" readonly="readonly" value="{$mnp.uploadfile_domain}"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->服务器域名,填写https协议域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">downloadFile合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="downloadfile_domain" readonly="readonly"
+                               value="{$mnp.downloadfile_domain}"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->服务器域名,填写https协议域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">udp合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="udp_domain" readonly="readonly" value="{$mnp.udp_domain}"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">tcp合法域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="tcp_domain" readonly="readonly" value="{$mnp.tcp_domain}" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->服务器域名,填写udp协议域名</span>
+                </div>
+                <!--                业务域名-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>业务域名</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">业务域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" readonly="readonly" value="{$mnp.business_domain}" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置->业务域名,填写业务域名</span>
+                </div>
+                <!--                消息推送-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>消息推送</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">URL:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="url" readonly="readonly" value="{$mnp.url}" class="layui-input"
+                               autocomplete="off">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置>消息推送配置,填写服务器地址(URL)</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">Token:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="token" value="{$mnp.token}" autocomnplete="off" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">小程序账号登录微信公众平台,点击开发>开发设置>消息推送配置,设置令牌Token。不填默认为“LikeMall”</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">EncodingAESKey:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="encoding_ses_key" value="{$mnp.encoding_ses_key}" autocomnplete="off"
+                               class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy">复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">消息加密密钥由43位字符组成,字符范围为A-Z,a-z,0-9</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">消息加密方式:</label>
+                    <div class="layui-input-block">
+                        <input type="radio" name="encryption_type" {if $mnp.encryption_type== 1} checked {/if} value="1"
+                        title="明文模式(不使用消息体加解密功能,安全系数较低)" />
+                    </div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="encryption_type" {if $mnp.encryption_type== 2} checked {/if} value="2"
+                        title="兼容模式(明文、密文将共存,方便开发者调试和维护)" >
+                    </div>
+                    <div class="layui-input-block" style="margin-left: 186px">
+                        <input type="radio" name="encryption_type" {if $mnp.encryption_type== 3} checked {/if} value="3"
+                        title="安全模式(推荐)(消息包为纯密文,需要开发者加密和解密,安全系数高)" >
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">数据格式:</label>
+                    <div class="layui-input-block">
+                        <input type="radio" name="data_type" value="1" title="JSON" {if $mnp.data_type== 1} checked {/if}
+                        >
+                        <input type="radio" name="data_type" value="2" title="XML" {if $mnp.data_type== 2} checked {/if}
+                        >
+
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn {$view_theme_color}" lay-submit lay-filter="setmnp">确定</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script>
+    layui.config({
+        version: "{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function () {
+        var $ = layui.$, form = layui.form;
+
+        // 小程序码图片
+        $(document).on("click", "#qrcode", function () {
+            like.imageUpload({
+                limit: 1,
+                field: "qr_code",
+                that: $(this)
+            });
+        })
+        // 删除图片
+        like.delUpload();
+
+        //显示图片
+        $(document).on('click', 'img', function () {
+            var image = $(this).attr('src');
+            like.showImg(image, 600);
+        });
+
+        //复制
+        $(document).on('click', '.copy', function () {
+            var copyText = $(this).prev()
+            copyText.select()
+            document.execCommand("Copy");
+        })
+
+        form.on('submit(setmnp)', function (data) {
+            like.ajax({
+                url: '{:url("wechat.mnp/setMnp")}' //实际使用请改成服务端真实接口
+                , data: data.field
+                , type: 'post'
+                , success: function (res) {
+                    if (res.code == 1) {
+                        layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    }
+
+                }
+            });
+        });
+    });
+
+</script>

+ 1284 - 0
app/admin/view/wechat/oa/oamenu.html

@@ -0,0 +1,1284 @@
+{layout name="layout1" /}
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        *配置微信公众号菜单,点击确认,保存菜单并发布至微信公众号。
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form" lay-filter="">
+            <div id="app" class="row">
+                <div class="col-sm-12">
+                    <div class="wechat-reply-wrapper wechat-menu">
+                        <div class="ibox-content clearfix">
+                            <div class="view-wrapper col-sm-4">
+                                <div class="mobile-header">公众号</div>
+                                <section class="view-body">
+                                    <div class="time-wrapper"><span class="time">{:date('H:i:s', time())}</span></div>
+                                </section>
+                                <div class="menu-footer">
+                                    <ul class="flex" id="menu">
+                                        {foreach $menu as $item_menu => $val_menu}
+                                        <li data-id={$item_menu}>
+                                            <span class="active-menu"><i class="icon-sub"></i>{$val_menu.name}</span>
+                                            <div class="sub-menu">
+                                                <ul>
+                                                    {foreach $val_menu.sub_button as $item_child => $val_child }
+                                                    <li data-id={$item_menu}_{$item_child}>
+                                                        <span class="active-menu">{$val_child.name}</span>
+                                                    </li>
+                                                    {/foreach}
+                                                    {if count($val_menu.sub_button) <5}
+                                                    <li data-id={$item_menu}_1 class="add-menu"><i class="icon-add"></i>
+                                                    </li>
+                                                    {/if}
+
+                                                </ul>
+                                            </div>
+                                        </li>
+                                        {/foreach}
+                                        {if (!empty($menu) && count($menu) < 3) }
+                                        <li data-id={++$item_menu} class="add-menu"><i class="icon-add"></i></li>
+                                        {/if}
+                                        {if empty($menu) }
+                                        <li data-id=1 class="add-menu"><i class="icon-add"></i></li>
+                                        {/if}
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="control-wrapper menu-control col-sm-8">
+                                <h3 class="popover-title">菜单名称 <a class="fr del-menu" href="javascript:void(0);">删除</a>
+                                </h3>
+                                <p class="tips-txt">已添加子菜单,仅可设置菜单名称。</p>
+                                <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+
+                                    <div class="layui-form-item">
+                                        <div class="layui-inline">
+                                            <label class="layui-form-label">菜单名称</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="name" id="menu_name" placeholder="请输入"
+                                                       autocomplete="off" class="layui-input">
+                                            </div>
+                                        </div>
+
+                                        <div class="layui-inline">
+                                            <label class="layui-form-label">菜单类型</label>
+                                            <div class="layui-input-block">
+                                                <select lay-filter="menu_type" class="select" id="menu_type">
+                                                    <option value="click">关键字</option>
+                                                    <option value="view">跳转网页</option>
+                                                    <option value="miniprogram">小程序</option>
+                                                </select>
+                                            </div>
+                                        </div>
+
+
+                                        <div class="layui-inline click">
+                                            <label class="layui-form-label">关键字</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="key" id="key" placeholder="请输入"
+                                                       autocomplete="off" class="layui-input">
+                                            </div>
+                                        </div>
+
+                                        <div class="layui-inline view" style="display: none">
+                                            <label class="layui-form-label">网页链接</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="url" id="url" placeholder="请输入"
+                                                       autocomplete="off" class="layui-input">
+                                            </div>
+                                        </div>
+
+                                        <div class="layui-inline miniprogram" style="display: none">
+                                            <label class="layui-form-label">appid</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="appid" id="appid" placeholder="请输入"
+                                                       autocomplete="off" class="layui-input">
+                                            </div>
+                                        </div>
+
+                                        <div class="layui-inline miniprogram" style="display: none">
+                                            <label class="layui-form-label">小程序路径</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="pagepath" id="pagepath" placeholder="请输入"
+                                                       autocomplete="off" class="layui-input">
+                                            </div>
+                                        </div>
+
+                                        <div class="layui-block">
+                                            <button class="layui-btn layui-btn-sm layui-btn-add_menu {$view_theme_color}">
+                                                确定
+                                            </button>
+                                        </div>
+
+
+                                    </div>
+                                </div>
+
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn {$view_theme_color} publish" lay-submit lay-filter="setmnp">发布菜单
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    @charset "UTF-8";
+    .flex {
+        display: -webkit-box;
+        display: -moz-box;
+        display: -webkit-flex;
+        display: -moz-flex;
+        display: -ms-flexbox;
+        display: flex;
+    }
+
+    #app {
+        padding-bottom: 80px
+    }
+
+    #app .layout {
+        border: 1px solid #d7dde4;
+        background: #f5f7f9;
+        position: relative;
+        border-radius: 4px;
+        overflow: hidden
+    }
+
+    #app .layout-logo {
+        width: 100px;
+        height: 30px;
+        background: #5b6270;
+        border-radius: 3px;
+        float: left;
+        position: relative;
+        top: 15px;
+        left: 20px
+    }
+
+    #app .layout-copy {
+        text-align: center;
+        padding: 10px 0 20px;
+        color: #9ea7b4
+    }
+
+    #app .layout-ceiling {
+        background: #464c5b;
+        padding: 10px 0;
+        overflow: hidden
+    }
+
+    #app .layout-ceiling-main {
+        float: right;
+        margin-right: 15px;
+    }
+
+    #app .layout-ceiling-main a {
+        color: #9ba7b5
+    }
+
+    #app .layout-breadcrumb {
+        padding: 10px 15px 0
+    }
+
+    #app .layout-content {
+        min-height: 200px;
+        margin: 15px;
+        overflow: hidden;
+        background: #fff;
+        border-radius: 4px;
+        margin-right: 0;
+    }
+
+    #app .layout-content-main {
+        padding-left: 10px;
+        position: relative;
+        width: 98.5%;
+    }
+
+    #app .layout-copy {
+        text-align: center;
+        padding: 10px 0 20px;
+        color: #9ea7b4
+    }
+
+    #app .layout-menu-left {
+        background: #464c5b
+    }
+
+    #app .layout-header {
+        height: 40px;
+        padding-left: 15px;
+        background: #fff;
+        box-shadow: 0 1px 1px rgba(0, 0, 0, .1)
+    }
+
+    #app .layout-logo-left {
+        width: 90%;
+        height: 30px;
+        background: #5b6270;
+        border-radius: 3px;
+        margin: 15px auto
+    }
+
+    #app .m-frame {
+        position: absolute;
+        background-color: #fff;
+    }
+
+    #app .m-tag-item {
+        display: inline-block
+    }
+
+    #app .layout-header {
+        padding-left: 15px;
+        margin-bottom: 5px;
+    }
+
+    #table-list {
+        padding: 25px 25px 0 25px;
+    }
+
+    #table-list .mp-search-wrapper {
+        float: right;
+        margin-left: 12px;
+    }
+
+    #table-list .mp-header-wrapper {
+        overflow: hidden;
+    }
+
+    #table-list .mp-header-wrapper h1 {
+        padding-left: 15px;
+        float: left;
+        font-size: 18px;
+        line-height: 24px;
+        padding-bottom: 20px;
+        font-weight: 400;
+        color: #464c5b;
+    }
+
+    .mp-form {
+        padding: 20px 20px 20px 0;
+    }
+
+    .mp-form .ivu-tree li {
+        margin: 0;
+    }
+
+    .mp-form .ivu-color-picker .ivu-select-dropdown {
+        left: -38px !important;
+    }
+
+    .mp-form .mp-upload {
+        display: inline-block;
+    }
+
+    .mp-form .demo-upload-list {
+        display: inline-block;
+        width: 60px;
+        height: 60px;
+        text-align: center;
+        line-height: 60px;
+        border: 1px solid transparent;
+        border-radius: 4px;
+        overflow: hidden;
+        background: #fff;
+        position: relative;
+        box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+        margin-right: 4px;
+    }
+
+    .mp-form .demo-upload-list img {
+        width: 100%;
+        height: 100%;
+    }
+
+    .mp-form .demo-upload-list-cover {
+        display: none;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        background: rgba(0, 0, 0, .6);
+    }
+
+    .mp-form .demo-upload-list:hover .demo-upload-list-cover {
+        display: block;
+    }
+
+    .mp-form .demo-upload-list-cover i {
+        color: #fff;
+        font-size: 20px;
+        cursor: pointer;
+        margin: 0 2px;
+    }
+
+    [v-cloak] {
+        display: none
+    }
+
+    .mp-form .mp-upload-btn {
+        width: 58px;
+        height: 58px;
+        line-height: 58px;
+    }
+
+    .mp-form .add-submit-item .ivu-btn {
+        position: fixed;
+        left: 0;
+        bottom: 0;
+        border-radius: 0;
+    }
+
+
+    .frameMove-enter-active {
+        animation-name: slideInLeft;
+        animation-duration: 0.4s !important;
+    }
+
+    .frameMove-leave-active {
+        animation-name: slideOutRight;
+        animation-duration: 0.4s !important;
+    }
+
+    .vertical-center-modal {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+    }
+
+    .vertical-center-modal .ivu-modal {
+        top: 0;
+    }
+
+    .vertical-center-modal .ivu-modal-header {
+        z-index: 9;
+        position: relative;
+    }
+
+    .vertical-center-modal .ivu-modal-close {
+        z-index: 10;
+    }
+
+    .layout-header {
+        height: 40px;
+        background: #fff;
+        box-shadow: 0 1px 1px rgba(0, 0, 0, .1);
+    }
+
+    .wechat-reply-wrapper .fl {
+        float: left;
+    }
+
+    .wechat-reply-wrapper .fr {
+        float: right;
+    }
+
+    .wechat-reply-wrapper .clearfix:after {
+        content: ".";
+        display: block;
+        height: 0;
+        visibility: hidden;
+        clear: both;
+    }
+
+    .wechat-reply-wrapper .ibox-title {
+        padding: 15px;
+        font-size: 16px;
+        border-bottom: 1px solid #e7eaec;
+    }
+
+    .wechat-reply-wrapper .ibox-title p {
+        border-left: 2px solid #2494f2;
+        text-indent: 8px;
+    }
+
+    .wechat-reply-wrapper .ibox-content {
+        padding: 15px;
+        display: flex;
+        flex-wrap: wrap
+    }
+
+    .wechat-reply-wrapper .ibox-content .view-wrapper {
+        position: relative;
+        margin-right: 20px;
+        width: 317px;
+        background-image: url("/static/admin/images/mobile_head.png");
+        background-repeat: no-repeat;
+        background-position: left top;
+        background-color: #f5f5f5;
+        margin-bottom: 20px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .view-wrapper .mobile-header {
+        position: absolute;
+        left: 0;
+        top: 36px;
+        width: 100%;
+        text-align: center;
+        color: #fff;
+        font-size: 16px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .view-wrapper .view-body {
+        margin-top: 65px;
+        height: 500px;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .time-wrapper {
+        margin-bottom: 10px;
+        text-align: center;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .time-wrapper .time {
+        display: inline-block;
+        color: #f5f5f5;
+        display: inline-block;
+        color: #f5f5f5;
+        background: rgba(0, 0, 0, .3);
+        padding: 3px 8px;
+        border-radius: 3px;
+        font-size: 12px;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item {
+        display: none;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item.show {
+        display: none;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .avatar {
+        width: 40px;
+        height: 40px;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .avatar img {
+        max-width: 100%;
+        height: auto;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .box-content {
+        position: relative;
+        max-width: 60%;
+        min-height: 40px;
+        margin-left: 15px;
+        padding: 10px;
+        border: 1px solid #ccc;
+        word-break: break-all;
+        word-wrap: break-word;
+        line-height: 1.5;
+        border-radius: 5px;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .box-content .picbox {
+        max-width: 100%;
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .box-content:before {
+        content: '';
+        position: absolute;
+        left: -13px;
+        top: 11px;
+        display: block;
+        width: 0;
+        height: 0;
+        border-left: 8px solid transparent;
+        border-right: 8px solid transparent;
+        border-top: 10px solid #ccc;
+        -webkit-transform: rotate(90deg);
+        transform: rotate(90deg);
+    }
+
+    .wechat-reply-wrapper .view-wrapper .view-body .view-item .box-content:after {
+        content: '';
+        content: '';
+        position: absolute;
+        left: -12px;
+        top: 11px;
+        display: block;
+        width: 0;
+        height: 0;
+        border-left: 8px solid transparent;
+        border-right: 8px solid transparent;
+        border-top: 10px solid #f5f5f5;
+        -webkit-transform: rotate(90deg);
+        transform: rotate(90deg);
+    }
+
+    .wechat-reply-wrapper .submit {
+        text-align: center;
+    }
+
+    /* 图文 */
+    .view-wrapper .view-body .view-item.news-box {
+        width: 100%;
+        background-color: #fff;
+        border-radius: 5px;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content {
+        padding: 0;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .vn-title {
+        line-height: 1.5;
+        font-size: 16px;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .vn-time {
+        padding: 5px 0;
+        font-size: 12px;
+        color: #999;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .vn-picture {
+        width: 100%;
+        height: 150px;
+        background-size: cover;
+        background-position: center center;
+        border-radius: 5px 5px 0 0;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .vn-picture-info {
+        line-height: 22px;
+        color: #7b7b7b;
+        padding: 0;
+        display: block;
+        overflow: hidden;
+        word-break: break-all;
+        text-overflow: ellipsis;
+        font-size: 12px;
+        white-space: nowrap;
+    }
+
+    .view-wrapper .view-body .view-item .vn-more {
+        display: block;
+        padding: 10px 0 0;
+        border-top: 1px solid #dddddd;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .con-item-box {
+        position: relative;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .con-item-box .first-title {
+        width: 100%;
+        height: 44px;
+        line-height: 44px;
+        font-size: 14px;
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap; /*background: rgba(0,0,0,.8);*/
+        color: #fff;
+        text-indent: 1em;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .con-item-list {
+        margin-top: 10px;
+        margin: 6px 10px 0 10px;
+        border-top: 1px solid #FBFBFB;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .con-item-list .list-tit-info {
+        width: 70%;
+        line-height: 1.5;
+        word-wrap: break-word;
+    }
+
+    .view-wrapper .view-body .view-item .vn-content .con-item-list .list-pic {
+        width: 20%;
+        min-height: 50px;
+        background-size: cover;
+        background-position: center center;
+    }
+
+
+    /* 音乐 */
+    .view-wrapper .view-body .view-item.music-box .box-content {
+        position: relative;
+        width: 100%;
+        background: #080;
+        color: #fff;
+        border-color: #080;
+    }
+
+    .view-wrapper .view-body .view-item.music-box .box-content p {
+        width: 75%;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
+
+    .view-wrapper .view-body .view-item.music-box .box-content .music-icon {
+        position: absolute;
+        right: 11px;
+        top: 50%;
+        width: 30px;
+        height: 30px;
+        background: #0a0;
+        text-align: center;
+        line-height: 30px;
+        margin-top: -15px;
+        font-size: 16px;
+    }
+
+
+    .view-wrapper .view-body .view-item.music-box .box-content:after {
+        display: none;
+    }
+
+    .view-wrapper .view-body .view-item.music-box .box-content:before {
+        border-top: 10px solid #080;
+    }
+
+    /* 视频 */
+    .view-wrapper .view-body .view-item.video-box {
+        width: 100%;
+        background-color: #fff;
+        border: 1px solid #ccc;
+        border-radius: 5px;
+    }
+
+    .view-wrapper .view-body .view-item.video-box .vn-title {
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
+
+    /* 右侧控制器 */
+    .wechat-reply-wrapper .ibox-content .control-wrapper {
+        position: relative;
+        width: 535px;
+        height: 565px;
+        padding: 0;
+        border: 1px solid #e2e2e2;
+        display: none
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-title {
+        position: absolute;
+        left: 71px;
+        top: -12px;
+        width: auto;
+        padding: 0 10px;
+        font-size: 20px;
+        background-color: #fff;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body {
+        margin-top: 40px;
+        padding: 0 10px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .form-group label {
+        font-weight: normal;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .form-group .tips:after {
+        content: '*';
+        color: red;
+        position: absolute;
+        margin-left: 4px;
+        font-weight: bold;
+        line-height: 1.8em;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .form-group .group-item {
+        position: relative;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .form-group .group-item .file-btn {
+        position: absolute;
+        right: 15px;
+        top: 0;
+        display: block;
+        width: 66px;
+        border-radius: 6px;
+        cursor: pointer;
+        padding: .5rem;
+        background-color: #18a689;
+        color: #fff;
+        text-align: center;
+        height: 100%;
+        line-height: 23px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .form-group .group-item textarea {
+        resize: none;
+        width: 100%;
+        height: 100px;
+        padding: 10px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .tips-info {
+        padding-left: 100px;
+        font-size: 12px;
+        color: #737373;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .control-main .control-item {
+        display: none;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body .control-main .control-item.show {
+        display: block;
+    }
+
+    /* 微信菜单定制 */
+    .wechat-menu {
+        position: relative;
+    }
+
+    .wechat-menu ul {
+        padding: 0;
+    }
+
+    .wechat-menu .menu-footer {
+        position: absolute;
+        left: 0;
+        bottom: -10px;
+        width: 100%;
+        padding-left: 43px;
+        box-sizing: border-box;
+        background: url("/static/admin/images/mobile_foot.png") no-repeat 0 0;
+        border-top: 1px solid #e7e7eb;
+    }
+
+    .wechat-menu .menu-footer span {
+        display: block;
+    }
+
+    .wechat-menu .menu-footer .icon-add {
+        background: url("/static/admin/images/index.png") 0 0 no-repeat;
+        width: 14px;
+        height: 14px;
+        vertical-align: middle;
+        display: inline-block;
+        margin-top: -2px;
+        border-bottom: none !important;
+    }
+
+    .wechat-menu .menu-footer li {
+        position: relative;
+        -webkit-flex: 1;
+        -moz-flex: 1;
+        -ms-flex: 1;
+        flex: 1;
+        height: 50px;
+        line-height: 50px;
+        text-align: center;
+        cursor: pointer;
+        list-style: none;
+        border: 1px solid transparent;
+        border-right: 1px solid #e7e7eb;
+    }
+
+    .wechat-menu .menu-footer .icon-sub {
+        background: url("/static/admin/images/index.png") 0 -48px no-repeat;
+        width: 7px;
+        height: 7px;
+        vertical-align: middle;
+        display: inline-block;
+        margin-right: 2px;
+        margin-top: -2px;
+    }
+
+    .wechat-menu .menu-footer .sub-menu {
+        position: absolute;
+        border-radius: 3px;
+        border: 1px solid #d0d0d0;
+        display: block;
+        bottom: 60px;
+        width: 100%;
+        background-color: #fafafa;
+    }
+
+    .wechat-menu .menu-footer .sub-menu:after {
+        content: '';
+        position: absolute;
+        width: 10px;
+        height: 10px;
+        background: #fafafa;
+        -webkit-transform: rotate(45deg);
+        -moz-transform: rotate(45deg);
+        -ms-transform: rotate(45deg);
+        transform: rotate(45deg);
+        bottom: -5px;
+        border-bottom: 1px solid #d0d0d0;
+        border-right: 1px solid #d0d0d0;
+        left: 50%;
+        margin-left: -5px;
+    }
+
+    .wechat-menu .menu-footer .sub-menu li {
+        border-right: 0;
+        border-bottom: 1px solid #d0d0d0;
+    }
+
+    .wechat-menu .menu-footer .sub-menu li:last-child {
+        border-bottom: 0;
+    }
+
+    .wechat-menu .menu-footer .active {
+        border: 1px solid #44b549;
+    }
+
+    .wechat-menu .menu-footer .sub-menu li.active {
+        border: 1px solid #44b549 !important;
+    }
+
+    /* 右侧 */
+    .wechat-menu .menu-control .popover-title {
+        padding: 8px 14px;
+        margin: 0;
+        font-size: 14px;
+        background-color: #f7f7f7;
+        border-bottom: 1px solid #ebebeb;
+        border-radius: 5px 5px 0 0;
+        font-weight: 400;
+        wechat-reply-wrapper . ibox-content . control-wrapper
+    }
+
+    .wechat-menu .menu-control .popover-title a {
+        color: #06C;
+        font-size: 12px;
+    }
+
+    .wechat-menu .menu-control .tips-txt {
+        line-height: 40px;
+        padding: 0 20px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body.menu-content {
+        padding: 0 20px;
+        margin-top: 0;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body.menu-content .radio {
+        display: inline-block !important;
+        width: 45%;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body.menu-content .menu-control-box {
+        padding: 0 20px;
+    }
+
+    .wechat-reply-wrapper .ibox-content .control-wrapper .control-body.menu-content .menu-control-box .radio {
+        display: block !important;
+        width: 100%;
+    }
+
+    .menu-control-box .item {
+        display: none;
+    }
+
+    .menu-control-box .show {
+        display: block;
+    }
+
+
+</style>
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['element', 'table', 'jquery'], function () {
+        var $ = layui.$, form = layui.form;
+        var menu = JSON.parse('{:json_encode($menu)}');
+
+        // 菜单被选中
+        $(document).on('click', '.active-menu', function () {
+
+            var ids = $(this).parent().attr("data-id");
+            var id = ids.split("_");
+
+            $('.active').removeClass('active');
+            $(this).addClass("active");
+
+            if (id.length < 2) {  // 一级菜单
+                var one_id = $('.active').parent().index();
+                menu_info = menu[one_id];
+
+            } else { // 二级菜单
+                var two_id = $('.active').parent().index();
+                var one_id = $('.active').parent().parent().parent().parent().index();
+                menu_info = menu[one_id].sub_button[two_id];
+
+            }
+
+            if (menu_info) {
+                // 回显菜单信息
+                menuInfo(menu_info);
+                // 显示 右侧菜单控制框
+                $('.menu-control').css('display', 'block');
+            } else { //
+                initMenu();
+            }
+
+        })
+
+        //删除菜单
+        $(document).on('click', '.del-menu', function () {
+            var data_id = $('.active').parent();
+
+            //用于判断几级菜单
+            var ids = data_id.attr("data-id");
+            var id = ids.split("_");
+
+            if (id.length == 1) { // 一级菜单
+                var one_id = $('.active').parent().index();
+                menu.splice(one_id, 1);
+
+                if (menu.length == 2) { // 如果一级菜单的第3个菜单被删除了,要追加一个 添加一级菜单 的按钮
+                    var data_id = parseInt(id[0]) + 1;
+                    $('#menu').append("<li data-id='" + data_id + " ' class='add-menu'> <i class='icon-add'></i></li>");
+                }
+
+            } else {  // 二级菜单
+
+                var two_id = $('.active').parent().index();
+                var one_id = $('.active').parent().parent().parent().parent().index();
+
+                menu[one_id].sub_button.splice(two_id, 1);
+
+                if (menu[one_id].sub_button.length < 5) { // 二级菜单数量限制判断
+
+                    var sub_button_id = parseInt(id[1]) + 1
+                    var data_id = id[0] + '_' + sub_button_id;
+                    if (menu[one_id].sub_button.length == 4) { // 如果删除的是二级菜单的第5个菜单,追加 添加菜单按钮
+                        $('.active').parent().parent().append("<li  data-id='" + data_id + " ' class='add-menu'><i class='icon-add'></i></li>");
+                    }
+
+                }
+            }
+
+            $('.active').parent().remove()
+            $('.active').removeClass('active');
+            $('.menu-control').css('display', 'none');
+
+        })
+
+        //添加菜单
+        $(document).on('click', '.add-menu', function () {
+
+            if ($('.menu-control').css('display') == 'block') {
+                layer.msg('请先确定菜单', {
+                    time: 2000, //2s后自动关闭
+                });
+                return false;
+            }
+
+            $(this).removeClass("add-menu");
+
+            var ids = $(this).attr("data-id");
+            var id = ids.split("_");
+            $('.menu-control').css('display', 'block');
+            initMenu();
+
+            if (id.length == 1) { // 一级菜单
+                // 只有一个一级菜单
+                if (menu.length < 2) {
+                    var data_id = menu.length + 1
+                    // 追加 添加菜单按钮
+                    $(this).parent().append("<li data-id='" + data_id + " ' class='add-menu'> <i class='icon-add'></i></li>");
+                    // 移除添加图标
+                    $(this).children().remove();
+                    // 增加 一级菜单 文本
+                    $(this).append("<span class='active-menu'> <i class='icon-sub'></i>一级菜单</span>")
+                    // 置为 被激活状态
+                    $(this).children().addClass('active');
+                }
+                // 最后一个一级菜单
+                if (menu.length == 2) {
+                    $(this).children().remove();
+                    $(this).append("<span class='active-menu'><i class='icon-sub'></i>一级菜单</span>")
+                    $(this).children().addClass('active');
+
+                }
+                // 追加 二级菜单添加按钮
+                var data_id = id[0] + '_' + 0;
+                $(this).append("<div class='sub-menu'><ul><li data-id='" + data_id + "  'class='add-menu'><i class='icon-add'></i></li></ul></div>");
+
+
+            } else {   //二级菜单
+                var one_id = $(this).parent().parent().parent().index();
+
+                if (menu[one_id].sub_button.length < 4) { // 不是最后一个二级菜单
+                    var sub_button_id = parseInt(id[1]) + 1
+                    var data_id = id[0] + '_' + sub_button_id;
+                    $(this).parent().append("<li data-id='" + data_id + " ' class='add-menu'> <i class='icon-add'></i></li>");
+                    $(this).children().remove();
+                    $(this).append("<span class='active-menu' >二级菜单</span>")
+                    $(this).children().addClass('active');
+                    return 0;
+                }
+                // 最后一个二级菜单
+                if (menu[one_id].sub_button.length == 4) {
+                    $(this).children().remove();
+                    $(this).append("<span class='active-menu'>二级菜单</span>")
+                }
+
+                $(this).children().addClass('active');
+            }
+
+        })
+
+        // 右侧菜单控制器输入完菜单名称后,同步至被激活的菜单上
+        $(document).on('change', '#menu_name', function () {
+            menu_name = $(this).val();
+            active = $('.active').text(menu_name);
+        });
+
+        // 确认添加菜单
+        $(document).on('click', '.layui-btn-add_menu', function () {
+
+            var menu_name = $('#menu_name').val();
+            var menu_type = $('#menu_type').val();
+
+            var result = checkData(menu_name, menu_type);     //验证数据
+            if (result) {
+                mergeMenu(menu_name, menu_type);     //合并菜单
+                $('.active').removeClass('active');
+                $('.menu-control').css('display', 'none');
+            }
+        })
+
+        //菜单类型切换
+        form.on('select(menu_type)', function (data) {
+
+            if (data.value == 'click') {
+                $('.click').css('display', 'block');
+                $('.view').css('display', 'none');
+                $('.miniprogram').css('display', 'none');
+            }
+            if (data.value == 'view') {
+                $('.click').css('display', 'none');
+                $('.view').css('display', 'block');
+                $('.miniprogram').css('display', 'none');
+            }
+            if (data.value == 'miniprogram') {
+                $('.click').css('display', 'none');
+                $('.view').css('display', 'block');
+                $('.miniprogram').css('display', 'block');
+            }
+        })
+
+        //回显菜单信息
+        function menuInfo(menu_info) {
+
+            $('#menu_name').val(menu_info.name);
+
+            $("#menu_type").val(menu_info.type);
+
+            form.render('select');
+            if (menu_info.type == 'click') { // 关键字
+                $('.click').css('display', 'block');
+                $('.view').css('display', 'none');
+                $('.miniprogram').css('display', 'none');
+                $('#key').val(menu_info.key);
+            }
+            if (menu_info.type == 'view') { // 跳转网页
+                $('.click').css('display', 'none');
+                $('.view').css('display', 'block');
+                $('.miniprogram').css('display', 'none');
+                $('#url').val(menu_info.url);
+            }
+            if (menu_info.type == 'miniprogram') { // 小程序
+                $('.click').css('display', 'none');
+                $('.view').css('display', 'block');
+                $('.miniprogram').css('display', 'block');
+                $('#url').val(menu_info.url);
+                $('#appid').val(menu_info.appid);
+                $('#pagepath').val(menu_info.pagepath);
+            }
+
+        }
+
+        //验证数据
+        function checkData(name, type) {
+            if ($.trim(name) == '') {
+                layer.msg('请输入菜单名称', {
+                    time: 2000, //2s后自动关闭
+                });
+                return false;
+            }
+            switch (type) {
+                case 'click':
+                    if ($('#key').val() == '') {
+                        layer.msg('请输入关键词', {
+                            time: 2000, //2s后自动关闭
+                        });
+                        return false;
+
+                    }
+                    break;
+                case 'view':
+                    if ($('#url').val() == '') {
+                        layer.msg('请输入网页链接', {
+                            time: 2000, //2s后自动关闭
+                        });
+                        return false;
+
+                    }
+                    break;
+
+
+                case 'miniprogram':
+                    if ($('#url').val() == '') {
+                        layer.msg('请输入网页链接', {
+                            time: 2000, //2s后自动关闭
+                        });
+                        return false;
+
+                    }
+                    if ($('#appid').val() == '') {
+                        layer.msg('请输入appid', {
+                            time: 2000, //2s后自动关闭
+                        });
+                        return false;
+
+                    }
+                    if ($('#pagepath').val() == '') {
+                        layer.msg('请输入小程序路径', {
+                            time: 2000, //20s后自动关闭
+                        });
+                        return false;
+
+                    }
+                    break;
+            }
+            return true;
+        }
+
+        //合并菜单
+        function mergeMenu(name, type) {
+            var data_id = $('.active').parent();
+            var ids = data_id.attr("data-id");
+            var id = ids.split("_");
+            var data = new Object();
+            switch (type) {
+                case 'click':
+                    data = {
+                        'name': name,
+                        'key': $('#key').val(),
+                        'type': type,
+                    }
+                    break;
+                case 'view':
+                    data = {
+                        'name': name,
+                        'url': $('#url').val(),
+                        'type': type,
+                    }
+
+                    break;
+
+
+                case 'miniprogram':
+                    data = {
+                        'name': name,
+                        'url': $('#url').val(),
+                        'appid': $('#appid').val(),
+                        'pagepath': $('#pagepath').val(),
+                        'type': type,
+                    }
+                    break;
+            }
+            if (id.length < 2) {  // 一级菜单
+                var one_id = $('.active').parent().index();
+                data.sub_button = [];
+                if (menu[one_id]) {  //如果存在数组,进行更新
+                    menu[one_id] = data;
+                    return true
+                }
+                menu.push(data);
+            } else {   // 二级菜单
+                var two_id = $('.active').parent().index();
+                var one_id = $('.active').parent().parent().parent().parent().index();
+                if (menu[one_id].sub_button[two_id]) { //如果存在数组,进行更新
+                    menu[one_id].sub_button[two_id] = data;
+                    return true;
+                }
+                menu[one_id].sub_button.push(data);
+            }
+
+            return true;
+        }
+
+        //初始化菜单
+        function initMenu() {
+            // 显示 关键字输入框
+            $('.click').css('display', 'block');
+            // 隐藏 网页链接输入框
+            $('.view').css('display', 'none');
+            // 隐藏 appid/小程序路径 输入框
+            $('.miniprogram').css('display', 'none');
+            // 设置 菜单类型 为 click(关键字)
+            $("#menu_type").val('click');
+            // 刷新 下拉菜单
+            form.render('select');
+            // 设置输入框初始值为 空字符串
+            $('#menu_name').val('');
+            $('#url').val('');
+            $('#key').val('');
+            $('#appid').val('');
+            $('#pagepath').val('');
+        }
+
+        //发布
+        $(document).on('click', '.publish', function () {
+            if (menu.length === 0) {
+                layer.msg('请先设置菜单', {
+                    time: 2000, //20s后自动关闭
+                });
+                return false;
+            }
+            like.ajax({
+                url: '{:url("wechat.oa/pulishMenu")}',
+                data: JSON.stringify({button: menu}),
+                type: 'post',
+                dataType: 'json',
+                contentType: "application/json;charset=utf-8",
+                success: function (res) {
+                    if (res.code) {
+                        layui.layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    } else {
+                        layui.layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 2
+                            , time: 2000
+                        });
+                    }
+                }
+            })
+        })
+
+    });
+</script>

+ 244 - 0
app/admin/view/wechat/oa/setoa.html

@@ -0,0 +1,244 @@
+{layout name="layout1" /}
+<style>
+    .layui-form-label {
+        width: 120px;
+    }
+    .copy{
+        margin-left: 10px;
+    }
+    .tips{
+        color: red;
+    }
+    .layui-form-item .layui-input-inline{
+        width: 410px;
+    }
+    .layui-input{
+        display: inline-block;
+        width: 80%;
+    }
+</style>
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        *填写微信公众号开发配置,请前往微信公众平台申请服务号并完成认证。
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="layui-card-body" pad15>
+            <div class="layui-form" lay-filter="">
+                <!-- 微信公众号-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>微信公众号</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">公众号名称:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="name" value="{$oa.name}" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">原始ID:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="original_id" value="{$oa.original_id}" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">公众号二维码:</label>
+                    <div class="layui-input-block">
+                        <div class="like-upload-image">
+                            {if $oa.qr_code}
+                            <div class="upload-image-div">
+                                <img src="{$oa.qr_code}" alt="img">
+                                <input type="hidden" name="qr_code" value="{$oa.qr_code}">
+                                <div class="del-upload-btn">x</div>
+                            </div>
+                            <div class="upload-image-elem" style="display:none;"><a class="add-upload-image" id="qrimage"> + 添加图片</a></div>
+                            {else}
+                            <div class="upload-image-elem"><a class="add-upload-image" id="qrimage"> + 添加图片</a></div>
+                            {/if}
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">建议尺寸:宽400px*高400px。jpg,jpeg,png格式</span>
+                </div>
+                <!-- 公众号开发者信息-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>公众号开发者信息</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppID:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="app_id" value="{$oa.app_id}"  lay-verify="required" lay-verType="tips" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppSecret:</label>
+                    <div class="layui-input-inline">
+                        <input type="text"  name="app_secret" value="{$oa.app_secret}"  lay-verify="required"  lay-verType="tips" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击开发>基本配置>公众号开发信息,设置AppID和AppSecret</span>
+                </div>
+                <!--                服务器配置-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>服务器配置</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">URL:</label>
+                    <div class="layui-input-inline">
+                        <input  type="text" value="{$oa.url}" readonly="readonly" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击开发>基本配置>服务器配置,填写服务器地址(URL)</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">Token:</label>
+                    <div class="layui-input-inline">
+                        <input type="text"  name="token" value="{$oa.token}" autocomplete="off" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy " >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击开发>基本配置>服务器配置,设置令牌Token。不填默认为“LikeMall”</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">EncodingAESKey:</label>
+                    <div class="layui-input-inline">
+                        <input type="text"  name="encoding_ses_key" value="{$oa.encoding_ses_key}" autocomplete="off" class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">消息加密密钥由43位字符组成,字符范围为A-Z,a-z,0-9</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">消息加密方式:</label>
+                    <div class="layui-input-block">
+                        <input type="radio" name="encryption_type" value="1" title="明文模式(不使用消息体加解密功能,安全系数较低)"{if $oa.encryption_type == 1} checked {/if}   >
+                    </div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="encryption_type"  value="2" title="兼容模式(明文、密文将共存,方便开发者调试和维护)" {if $oa.encryption_type == 2} checked {/if} >
+                    </div>
+                    <div class="layui-input-block" style="margin-left: 150px">
+                        <input type="radio" name="encryption_type"  value="3" title="安全模式(推荐)(消息包为纯密文,需要开发者加密和解密,安全系数高)" {if $oa.encryption_type == 3} checked {/if}  >
+                    </div>
+                </div>
+                <!--                功能设置-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>功能设置</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">业务域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" readonly="readonly" value="{$oa.business_domain}"  class="layui-input">
+                        <button type="button"  class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击设置>公众号设置>功能设置,填写业务域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">JS接口安全域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" readonly="readonly" value="{$oa.safety_domain}"  class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击设置>公众号设置>功能设置,填写JS接口安全域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">网页授权域名:</label>
+                    <div class="layui-input-inline">
+                        <input type="text" readonly="readonly"  value="{$oa.auth_domain}"  class="layui-input">
+                        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm copy" >复制</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"></label>
+                    <span style="color: #a3a3a3;font-size: 9px">登录微信公众平台,点击设置>公众号设置>功能设置,填写网页授权域名</span>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-input-inline" style="text-align: center;width: 560px">
+                        <button class="layui-btn {$view_theme_color}" lay-submit lay-filter="setoa">确定</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function () {
+        var $ = layui.$, form = layui.form
+
+        // 图片上传
+        $(document).on("click", "#qrimage", function () {
+            like.imageUpload({
+                limit: 1,
+                field: "qr_code",
+                that: $(this)
+            });
+        })
+        // 删除图片
+        like.delUpload();
+        // 放大图片
+        $(document).on('click', 'img', function () {
+            var image = $(this).attr('src');
+            like.showImg(image,600);
+        });
+
+        //复制
+        $(document).on('click','.copy',function () {
+            var copyText = $(this).prev()
+            copyText.select()
+            document.execCommand("Copy");
+        })
+        // 提交表单
+        form.on('submit(setoa)', function (data) {
+            like.ajax({
+                url: '{:url("wechat.oa/setOa")}' //实际使用请改成服务端真实接口
+                , data: data.field
+                , type: 'post'
+                , success: function (res) {
+                    if (res.code == 1) {
+                        layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    }
+
+                }
+            });
+        });
+    });
+
+</script>

+ 121 - 0
app/admin/view/wechat/op/config.html

@@ -0,0 +1,121 @@
+{layout name="layout1" /}
+<style>
+    .layui-form-label{
+        width: 150px;
+    }
+    .tips{
+        color: red;
+    }
+</style>
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        <p>*填写微信开放平台开发配置,请前往微信开放平台创建应用并完成认证。</p>
+                        <p>*APP应用配置主要用于APP微信登录和微信支付。</p>
+                        <p>*网站应用配置主要用于PC端商城微信扫码登录。</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="layui-card-body" pad15>
+            <div class="layui-form" lay-filter="">
+                <!--APP应用开发者信息-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>APP应用</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppID:</label>
+                    <div class="layui-input-block">
+                        <div class="layui-col-md3">
+                            <input type="text"  name="app_id" value="{$config.app_id}"  lay-verify="required"  autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppSecret:</label>
+                    <div class="layui-input-block">
+                        <div class="layui-col-md3">
+                            <input type="text"  name="secret" value="{$config.secret}"  lay-verify="required"  autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label"></label>
+                        <span style="color: #a3a3a3;font-size: 9px">登录微信开放平台,查看并设置</span>
+                    </div>
+                </div>
+
+                <!--网站应用开发者信息-->
+                <div class="layui-form-item div-flex">
+                    <fieldset class="layui-elem-field layui-field-title">
+                        <legend>网站应用</legend>
+                    </fieldset>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppID:</label>
+                    <div class="layui-input-block">
+                        <div class="layui-col-md3">
+                            <input type="text"  name="web_app_id" value="{$web_config.web_app_id}"  lay-verify="required"  autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><span class="tips">*</span>AppSecret:</label>
+                    <div class="layui-input-block">
+                        <div class="layui-col-md3">
+                            <input type="text"  name="web_secret" value="{$web_config.web_secret}"  lay-verify="required"  autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label"></label>
+                        <span style="color: #a3a3a3;font-size: 9px">登录微信开放平台,查看并设置</span>
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn layui-btn-sm {$view_theme_color}" lay-submit lay-filter="set">确定</button>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+
+<style>
+    .layui-table-cell {
+        height: auto;
+    }
+</style>
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$,form = layui.form;
+
+        form.on('submit(set)', function (data) {
+            like.ajax({
+                url: '{:url("wechat.Op/config")}' //实际使用请改成服务端真实接口
+                , data: data.field
+                , type: 'post'
+                , success: function (res) {
+                    if (res.code == 1) {
+                        layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    }
+
+                }
+            });
+        });
+    });
+</script>

+ 98 - 0
app/admin/view/wechat/pc/set.html

@@ -0,0 +1,98 @@
+{layout name="layout1" /}
+<style>
+  .layui-form-label {
+      width: 120px;
+      text-align: left;
+  }
+</style>
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        <p>PC商城设置</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-card-body">
+            <div class="layui-form">
+                <div class="layui-form-item">
+                    <div class="layui-form-label">渠道状态</div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="is_open" value="0" title="关闭" {if !$config.is_open}checked{/if} />
+                        <input type="radio" name="is_open" value="1" title="开启" {if $config.is_open}checked{/if} />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label">关闭后访问页面</div>
+                    <div class="layui-input-block">
+                        <input type="radio" name="page" value="1" title="空白页" {if $config.page == 1}checked{/if} />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label"></div>
+                    <div class="layui-inline">
+                        <input type="radio" name="page" value="2" title="自定义页面" {if $config.page == 2}checked{/if} />
+                    </div>
+                    <div class="layui-inline" style="width: 420px;">
+                        <input type="text" name="page_url" value="{$config.page_url}" placeholder="请输入完整的url" class="layui-input" />
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label">PC商城链接</div>
+                    <div class="layui-inline" style="width: 280px;">
+                        <input type="text" style="border:none" id="pc_url" value="{$config.pc_url}" class="layui-input" readonly />
+                    </div>
+                    <button class="layui-btn layui-btn-xs layui-btn-primary" id="copy">复制</button>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-form-label"></div>
+                    <div class="layui-input-block">
+                        <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="set">设置</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/plug/layui-admin/dist/layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['form', 'layer'], function(){
+        var form = layui.form;
+        var layer = layui.layer;
+        var $ = layui.jquery;
+
+        form.on('submit(set)', function (data) {
+            $.ajax({
+                url:'{:url("wechat.pc/set")}',
+                type: 'post',
+                data: data.field,
+                success:function(res) {
+                    if (res.code == 1) {
+                        layer.msg(res.msg, {
+                            offset: '15px'
+                            , icon: 1
+                            , time: 1000
+                        });
+                    }
+                }
+            });
+        });
+
+        // 复制
+        $('#copy').click(function() {
+            var input = document.getElementById('pc_url');
+            input.select();
+            document.execCommand("Copy");
+            layer.msg('复制成功');
+        });
+    });
+</script>

+ 48 - 0
app/admin/view/wechat/reply/add_default.html

@@ -0,0 +1,48 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" >
+                <option value="1">文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" checked>
+            <input type="radio" name="status" value="0" title="停用" >
+        </div>
+    </div>
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="add-reply-submit" id="add-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$,form = layui.form;
+    });
+</script>

+ 49 - 0
app/admin/view/wechat/reply/add_subscribe.html

@@ -0,0 +1,49 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font> 规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" >
+                <option value="1">文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" checked>
+            <input type="radio" name="status" value="0" title="停用" >
+        </div>
+    </div>
+
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="add-reply-submit" id="add-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var form = layui.form;
+    });
+</script>

+ 68 - 0
app/admin/view/wechat/reply/add_text.html

@@ -0,0 +1,68 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font> 规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>关键词:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="keyword" value="" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">关键词不能超过5个字</span>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">匹配方式:</label>
+        <div class="layui-input-inline">
+            <select name="matching_type">
+                <option value="1">全匹配</option>
+                <option value="2">模糊匹配</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" lay-filter="aihao">
+                <option value="1">文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" checked>
+            <input type="radio" name="status" value="0" title="停用" >
+        </div>
+    </div>
+
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="add-reply-submit" id="add-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$
+            ,form = layui.form;
+
+    });
+</script>

+ 49 - 0
app/admin/view/wechat/reply/edit_default.html

@@ -0,0 +1,49 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <input name="id" type="hidden" value="{$detail.id}">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" >
+                <option value="1"   {if condition="$detail.content_type eq 1"  } selected {/if}  >文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" {if condition="$detail.status eq 1" } checked {/if} >
+            <input type="radio" name="status" value="0" title="停用" {if condition="$detail.status eq 0"  } checked {/if} >
+        </div>
+    </div>
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="edit-reply-submit" id="edit-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$,form = layui.form;
+    });
+</script>

+ 50 - 0
app/admin/view/wechat/reply/edit_subscribe.html

@@ -0,0 +1,50 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <input name="id" type="hidden" value="{$detail.id}">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" >
+                <option value="1"  {if condition="$detail.content_type eq 1" } selected {/if} >文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" {if condition="$detail.status eq 1" } checked {/if}>
+            <input type="radio" name="status" value="0" title="停用"{if condition="$detail.status eq 0" } checked {/if} >
+        </div>
+    </div>
+
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="edit-reply-submit" id="edit-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$,form = layui.form;
+    });
+</script>

+ 67 - 0
app/admin/view/wechat/reply/edit_text.html

@@ -0,0 +1,67 @@
+{layout name="layout2" /}
+<div class="layui-form" lay-filter="layuiadmin-form-reply" id="layuiadmin-form-reply" style="padding: 20px 30px 0 0;">
+    <input name="id" type="hidden" value="{$detail.id}">
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>规则名称:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="name"  value="{$detail.name}" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">方便通过名称管理默认回复内容</span>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"><font color="red">*</font>关键词:</label>
+        <div class="layui-input-inline">
+            <input type="text" name="keyword" value="{$detail.keyword}" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"></label><span style="color: #a3a3a3;font-size: 9px">关键词不能超过5个字</span>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">匹配方式:</label>
+        <div class="layui-input-inline">
+            <select name="matching_type">
+                <option value="1" {if condition="$detail.matching_type eq 1" } selected {/if}>全匹配</option>
+                <option value="2" {if condition="$detail.matching_type eq 2" } selected {/if}>模糊匹配</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">内容类型:</label>
+        <div class="layui-input-inline">
+            <select name="content_type" lay-filter="aihao">
+                <option value="1" {if condition="$detail.content_type eq 1" } selected {/if} >文本</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">回复内容:</label>
+        <div class="layui-input-inline">
+            <textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">启用状态:</label>
+        <div class="layui-input-inline">
+            <input type="radio" name="status" value="1" title="启用" {if condition="$detail.status eq 1" } checked {/if}>
+            <input type="radio" name="status" value="0" title="停用" {if condition="$detail.status eq 0" } checked {/if}>
+        </div>
+    </div>
+
+    <div class="layui-form-item layui-hide">
+        <input type="button" lay-submit lay-filter="edit-reply-submit" id="edit-reply-submit" value="确认">
+    </div>
+</div>
+
+<script>
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['form'], function(){
+        var $ = layui.$
+            ,form = layui.form;
+    });
+</script>

+ 311 - 0
app/admin/view/wechat/reply/lists.html

@@ -0,0 +1,311 @@
+{layout name="layout1" /}
+<div class="wrapper">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-collapse like-layui-collapse" lay-accordion="" style="border:1px dashed #c4c4c4">
+                <div class="layui-colla-item">
+                    <h2 class="layui-colla-title like-layui-colla-title" style="background-color: #fff">操作提示</h2>
+                    <div class="layui-colla-content layui-show">
+                        <p>*微信公众号回复管理,可以设置自动回复用户输入内容;</p>
+                        <p>*关注回复用于用户关注公众号时回复;</p>
+                        <p>*关键词回复用于用户输入内容时回复。关键词相同时,根据排序回复,排序值越小越前;</p>
+                        <p>*默认回复用于用户输入内容未匹配时回复;</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="layui-tab layui-tab-card" lay-filter="tab-all">
+        <!-- 选项卡头部-->
+            <ul class="layui-tab-title">
+                {foreach $type_list as $type =>  $name}
+                <li data-type={$type}  {if 'subscribe' == $type } class="layui-this" {/if} >{$name}</li>
+                {/foreach}
+            </ul>
+
+            <div class="layui-tab-item layui-show">
+                <div class="layui-card">
+                    <div class="layui-card-body">
+                        <div style="padding-bottom: 10px;">
+                            <button class="layui-btn layui-btn-sm layuiadmin-btn-reply {$view_theme_color}" data-type="add">新增回复</button>
+                        </div>
+                        <table id="reply-lists" lay-filter="reply-lists"></table>
+                        <script type="text/html" id="status">
+                            <input type="checkbox"  lay-filter="switch-status" data-id={{d.id}} data-field='status'  lay-skin="switch"
+                                   lay-text="显示|隐藏" {{#  if(d.status){ }} checked  {{#  } }} />
+                        </script>
+                        <script type="text/html" id="reply-operation">
+                            <a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="edit"><i class="layui-icon"></i>编辑</a>
+                            <a class="layui-btn layui-btn-danger layui-btn-sm"  lay-event="del" ><i class="layui-icon"></i>删除</a>
+                        </script>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .layui-table-cell {
+        height: auto;
+    }
+</style>
+<script>
+    // 初始回复类型
+    var type = 'subscribe';
+
+    layui.config({
+        version:"{$front_version}",
+        base: '/static/lib/' //静态资源所在路径
+    }).use(['table', 'element'], function(){
+        var $ = layui.$
+            ,form = layui.form
+            ,table = layui.table
+            ,element = layui.element;
+
+        // 初始获取列表数据
+        getList()
+
+        // 事件处理函数
+        var active = {
+            add: function(){
+                var add = layer.open({
+                    type: 2
+                    ,title: '新增回复 '
+                    ,content: '{:url("wechat.reply/add")}?type='+type
+                    ,area: ['90%','90%']
+                    ,btn: ['确定', '取消']
+                    ,yes: function(index, layero){
+                        var iframeWindow = window['layui-layer-iframe'+ index]
+                            ,submitID = 'add-reply-submit'
+                            ,submit = layero.find('iframe').contents().find('#'+ submitID);
+                        //监听提交
+                        iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
+                            var field = data.field;
+                            field['reply_type'] = type;
+                            like.ajax({
+                                url:'{:url("wechat.reply/add")}',
+                                data:field,
+                                type:"post",
+                                success:function(res)
+                                {
+                                    if(res.code == 1)
+                                    {
+                                        layui.layer.msg(res.msg, {
+                                            offset: '15px'
+                                            , icon: 1
+                                            , time: 1000
+                                        });
+                                        layer.close(index); //关闭弹层
+                                        table.reload('reply-lists'); //数据刷新
+                                    }
+                                },
+                            });
+                        });
+                        submit.trigger('click');
+                    }
+                });
+            }
+        }
+
+        // 监听文本框编辑
+        table.on('edit(reply-lists)', function (obj) {
+            var ids = [];
+            var id = obj.data.id;
+            var fields = obj.field;
+            var field_value = obj.value;
+            ids.push(id);
+            if(isNaN(field_value)){
+                var old_value=$(this).prev().text();
+
+                layer.tips('请输入数字', $(this), {tips: [1, '#FF5722']});
+                $(this).val(old_value);
+
+                return false;
+            }
+
+            changeFields(ids,fields,field_value)
+
+        });
+
+        // 新增回复
+        $('.layui-btn.layuiadmin-btn-reply').on('click', function(){
+            var type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+
+        // 监听启用状态开关
+        form.on('switch(switch-status)',function (obj) {
+            var ids = [];
+            var id = obj.elem.attributes['data-id'].nodeValue
+            var fields = obj.elem.attributes['data-field'].nodeValue
+            var field_value = 0;
+            ids.push(id);
+            if(this.checked){
+                field_value = 1;
+            }
+            changeFields(ids,fields,field_value)
+
+        })
+
+        // 监听选项卡切换
+        element.on('tab(tab-all)', function (data) {
+            type = $(this).attr('data-type');
+            getList();
+        });
+
+        // 加载列表数据
+        function getList() {
+            switch (type) {
+                case "subscribe":
+                    var cols = [
+                        {field: 'name', title: '规则名称', align: 'center'}
+                        , {field: 'content_type', title: '回复类型', align: 'center'}
+                        , {field: 'content', title: '回复内容', align: 'center'}
+                        , {title:'启用状态',  align: 'center', toolbar: '#status'}
+                        , {title: '操作',  align: 'center', toolbar: '#reply-operation'}
+                    ];
+                    break;
+                case "text":
+                    var cols = [
+                        {field: 'keyword', title: '关键词', align: 'center'}
+                        , {field: 'matching_type', title: '匹配方式', align: 'center'}
+                        , {field: 'content_type', title: '回复类型', align: 'center'}
+                        , {field: 'content', title: '回复内容', align: 'center'}
+                        , {title: 'status', title:'启用状态',  align: 'center', toolbar: '#status'}
+                        , {field: 'sort', title: '排序', align: 'center',edit:'text'}
+                        , {title: '操作',  align: 'center', toolbar: '#reply-operation'}
+                    ];
+                    break;
+                case "default":
+                    var cols = [
+                        {field: 'name', title: '规则名称', align: 'center'}
+                        , {field: 'content_type', title: '回复类型', align: 'center'}
+                        , {field: 'content', title: '回复内容', align: 'center'}
+                        , {title: 'status', title:'启用状态',  align: 'center', toolbar: '#status'}
+                        , {title: '操作',  align: 'center', toolbar: '#reply-operation'}
+                    ];
+                    break;
+            }
+
+            //管理员管理
+            table.render({
+                elem: '#reply-lists'
+                , url: '{:url("wechat.reply/lists")}?type='+type
+                , cols: [
+                    cols
+                ]
+                , page: true
+                , text: {none: '暂无数据!'}
+                , response: {
+                    'statusCode': 1
+                }
+                , parseData: function (res) { //将原始数据解析成 table 组件所规定的数据
+                    return {
+                        "code": res.code,
+                        "msg": res.msg,
+                        "count": res.data.count, //解析数据长度
+                        "data": res.data.list, //解析数据列表
+                    };
+                }
+            });
+        }
+
+        //监听工具条
+        table.on('tool(reply-lists)', function(obj){
+            if(obj.event === 'del'){
+                var id = obj.data.id;
+                var attr = obj.data.attr;
+                var name = obj.data.name;
+                layer.confirm('确认删除回复:'+'<span style="color: red">'+name+'</span>', function(index){
+                    like.ajax({
+                        url:'{:url("wechat.reply/del")}',
+                        data:{id:id},
+                        type:"post",
+                        success:function(res)
+                        {
+                            if(res.code == 1)
+                            {
+                                layui.layer.msg(res.msg, {
+                                    offset: '15px'
+                                    , icon: 1
+                                    , time: 1000
+                                });
+                                layer.close(index); //关闭弹层
+                                table.reload('reply-lists'); //数据刷新
+                            }
+                        },
+                    });
+                });
+            }else if(obj.event === 'edit'){
+                var id = obj.data.id;
+                var edit = layer.open({
+                    type: 2
+                    ,title: '编辑回复'
+                    ,content: '{:url("wechat.reply/edit")}?id='+id
+                    ,area: ['90%','90%']
+                    ,btn: ['确定', '取消']
+                    ,yes: function(index, layero){
+                        var iframeWindow = window['layui-layer-iframe'+ index]
+                            ,submitID = 'edit-reply-submit'
+                            ,submit = layero.find('iframe').contents().find('#'+ submitID);
+
+                        //监听提交
+                        iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
+                            var field = data.field;
+                            field['reply_type'] = type;
+                            like.ajax({
+                                url:'{:url("wechat.reply/edit")}',
+                                data:field,
+                                type:"post",
+                                success:function(res)
+                                {
+                                    if(res.code == 1)
+                                    {
+                                        layui.layer.msg(res.msg, {
+                                            offset: '15px'
+                                            , icon: 1
+                                            , time: 1000
+                                        });
+                                        layer.close(index); //关闭弹层
+                                        table.reload('reply-lists'); //数据刷新
+                                    }
+                                },
+                            });
+                        });
+                        submit.trigger('click');
+                    }
+                })
+            }
+        });
+    });
+
+    function changeFields(ids,fields,value) {
+        like.ajax({
+            url:'{:url("wechat.reply/changeFields")}',
+            data:{id:ids,field:fields,value:value,reply_type:type},
+            type:'post',
+            dataType:'json',
+            success:function (res) {
+                if(res.code == 1) {
+                    layui.layer.msg(res.msg, {
+                        offset: '15px'
+                        , icon: 1
+                        , time: 1000
+                    }, function(){
+                            location.href = location.href;
+                    });
+
+                } else {
+                    layui.layer.msg(res.msg, {
+                        offset: '15px'
+                        , icon: 2
+                        , time: 1000
+                    }, function(){
+                        location.href = location.href;
+                    });
+                }
+            }
+        })
+
+    }
+</script>