1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-21 19:22:45 +08:00

增加公众号自定义菜单

This commit is contained in:
xiaochong0302 2021-01-07 15:08:28 +08:00
parent 9db288c406
commit 0902fa35a7
12 changed files with 322 additions and 129 deletions

View File

@ -80,7 +80,7 @@ class UpgradeTask extends Task
$redis->del($statsKey); $redis->del($statsKey);
} }
echo "start reset metadata..." . PHP_EOL; echo "end reset metadata..." . PHP_EOL;
} }
/** /**

View File

@ -328,9 +328,9 @@ class SettingController extends Controller
} }
/** /**
* @Route("/wechat", name="admin.setting.wechat") * @Route("/wechat/oa", name="admin.setting.wechat_oa")
*/ */
public function wechatAction() public function wechatOaAction()
{ {
$settingService = new SettingService(); $settingService = new SettingService();
@ -340,7 +340,7 @@ class SettingController extends Controller
$data = $this->request->getPost(); $data = $this->request->getPost();
$settingService->updateWechatSettings($section, $data); $settingService->updateWechatOASettings($section, $data);
return $this->jsonSuccess(['msg' => '更新配置成功']); return $this->jsonSuccess(['msg' => '更新配置成功']);
@ -348,6 +348,7 @@ class SettingController extends Controller
$oa = $settingService->getWechatOASettings(); $oa = $settingService->getWechatOASettings();
$this->view->pick('setting/wechat_oa');
$this->view->setVar('oa', $oa); $this->view->setVar('oa', $oa);
} }
} }

View File

@ -11,6 +11,7 @@ use App\Services\Mail\Test as TestMailService;
use App\Services\MyStorage as StorageService; use App\Services\MyStorage as StorageService;
use App\Services\Sms\Test as TestSmsService; use App\Services\Sms\Test as TestSmsService;
use App\Services\Vod as VodService; use App\Services\Vod as VodService;
use App\Services\Wechat as WechatService;
/** /**
* @RoutePrefix("/admin/test") * @RoutePrefix("/admin/test")
@ -54,6 +55,24 @@ class TestController extends Controller
} }
} }
/**
* @Post("/wechat/oa", name="admin.test.wechat_oa")
*/
public function wechatOaAction()
{
$wechatService = new WechatService();
$oa = $wechatService->getOfficialAccount();
$result = $oa->qrcode->temporary('foo', 86400);
if (isset($result['ticket'])) {
return $this->jsonSuccess(['msg' => '接口返回成功']);
} else {
return $this->jsonError(['msg' => '接口返回失败,请检查相关配置']);
}
}
/** /**
* @Get("/live/push", name="admin.test.live_push") * @Get("/live/push", name="admin.test.live_push")
*/ */

View File

@ -759,9 +759,9 @@ class AuthNode extends Service
], ],
[ [
'id' => '5-1-13', 'id' => '5-1-13',
'title' => '微信平台', 'title' => '微信公众号',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.wechat', 'route' => 'admin.setting.wechat_oa',
], ],
], ],
], ],

View File

@ -5,6 +5,7 @@ namespace App\Http\Admin\Services;
use App\Caches\Setting as SettingCache; use App\Caches\Setting as SettingCache;
use App\Repos\Setting as SettingRepo; use App\Repos\Setting as SettingRepo;
use App\Repos\Vip as VipRepo; use App\Repos\Vip as VipRepo;
use App\Services\Wechat as WechatService;
class Setting extends Service class Setting extends Service
{ {
@ -63,6 +64,26 @@ class Setting extends Service
$oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify']); $oa['notify_url'] = $oa['notify_url'] ?: kg_full_url(['for' => 'home.wechat.oa.notify']);
$oa['menu'] = json_decode($oa['menu'], true);
/**
* 构造一个35的二维树形菜单
*/
for ($i = 0; $i < 3; $i++) {
if (!isset($oa['menu'][$i])) {
$oa['menu'][$i] = ['name' => sprintf('菜单%s', $i + 1)];
}
for ($j = 0; $j < 5; $j++) {
if (!isset($oa['menu'][$i]['children'][$j])) {
$oa['menu'][$i]['children'][$j] = [
'type' => 'view',
'name' => '',
'url' => '',
];;
}
}
}
return $oa; return $oa;
} }
@ -171,15 +192,39 @@ class Setting extends Service
} }
} }
public function updateWechatSettings($section, $settings) public function updateWechatOASettings($section, $settings)
{ {
if ($section == 'wechat.oa') { if (!empty($settings['notice_template'])) {
if (isset($settings['notice_template'])) { $settings['notice_template'] = kg_json_encode($settings['notice_template']);
$settings['notice_template'] = kg_json_encode($settings['notice_template']); }
$buttons = [];
if (!empty($settings['menu'])) {
foreach ($settings['menu'] as $i => $top) {
$buttons[$i]['name'] = !empty($top['name']) ? $top['name'] : sprintf('菜单%s', $i + 1);
if (!empty($top['url'])) {
$buttons[$i]['url'] = $top['url'];
$buttons[$i]['type'] = 'view';
}
foreach ($top['children'] as $j => $sub) {
if (!empty($sub['name']) && !empty($sub['url'])) {
$buttons[$i]['sub_button'][$j]['name'] = $sub['name'];
$buttons[$i]['sub_button'][$j]['url'] = $sub['url'];
$buttons[$i]['sub_button'][$j]['type'] = 'view';
}
}
} }
$settings['menu'] = kg_json_encode($settings['menu']);
} }
$this->updateSettings($section, $settings); $this->updateSettings($section, $settings);
if (!empty($buttons)) {
$service = new WechatService();
$oa = $service->getOfficialAccount();
$oa->menu->create($buttons);
}
} }
} }

View File

@ -1,16 +0,0 @@
{% extends 'templates/main.volt' %}
{% block content %}
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title kg-tab-title">
<li class="layui-this">公众号</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
{{ partial('setting/wechat_oa') }}
</div>
</div>
</div>
{% endblock %}

View File

@ -1,104 +1,24 @@
{% set notice_template = oa.notice_template|json_decode %} {% extends 'templates/main.volt' %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.wechat'}) }}"> {% block content %}
<div class="layui-form-item">
<label class="layui-form-label">开启</label> <div class="layui-tab layui-tab-brief">
<div class="layui-input-block"> <ul class="layui-tab-title kg-tab-title">
<input type="radio" name="enabled" value="1" title="是" {% if oa.enabled == "1" %}checked="checked"{% endif %}> <li class="layui-this">基本设置</li>
<input type="radio" name="enabled" value="0" title="否" {% if oa.enabled == "0" %}checked="checked"{% endif %}> <li class="layui">模板消息</li>
<li class="layui">自定义菜单</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
{{ partial('setting/wechat_oa_basic') }}
</div>
<div class="layui-tab-item">
{{ partial('setting/wechat_oa_notice') }}
</div>
<div class="layui-tab-item">
{{ partial('setting/wechat_oa_menu') }}
</div>
</div> </div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label">App ID</label> {% endblock %}
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_id" value="{{ oa.app_id }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">App Secret</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_secret" value="{{ oa.app_secret }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">App Token</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_token" value="{{ oa.app_token }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Aes Key</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="aes_key" value="{{ oa.aes_key }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Notify Url</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="notify_url" value="{{ oa.notify_url }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
<input type="hidden" name="section" value="wechat.oa">
</div>
</div>
</form>
<fieldset class="layui-elem-field layui-field-title">
<legend>模板配置</legend>
</fieldset>
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.wechat'}) }}">
<table class="layui-table kg-table layui-form">
<colgroup>
<col width="12%">
<col width="40%">
<col>
</colgroup>
<thead>
<tr>
<th>名称</th>
<th>模板编号</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>登录成功通知</td>
<td><input class="layui-input" type="text" name="notice_template[account_login]" value="{{ notice_template.account_login }}" lay-verify="required"></td>
<td></td>
</tr>
<tr>
<td>购买成功提醒</td>
<td><input class="layui-input" type="text" name="notice_template[order_finish]" value="{{ notice_template.order_finish }}" lay-verify="required"></td>
<td></td>
</tr>
<tr>
<td>退款成功通知</td>
<td><input class="layui-input" type="text" name="notice_template[refund_finish]" value="{{ notice_template.refund_finish }}" lay-verify="required"></td>
<td></td>
</tr>
<tr>
<td>课程直播提醒</td>
<td><input class="layui-input" type="text" name="notice_template[live_begin]" value="{{ notice_template.live_begin }}" lay-verify="required"></td>
<td></td>
</tr>
<tr>
<td>咨询结果通知</td>
<td><input class="layui-input" type="text" name="notice_template[consult_reply]" value="{{ notice_template.consult_reply }}" lay-verify="required"></td>
<td></td>
</tr>
</tbody>
</table>
<br>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
<input type="hidden" name="section" value="wechat.oa">
</div>
</div>
</form>

View File

@ -0,0 +1,66 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.wechat_oa'}) }}">
<div class="layui-form-item">
<label class="layui-form-label">开启</label>
<div class="layui-input-block">
<input type="radio" name="enabled" value="1" title="是" {% if oa.enabled == "1" %}checked="checked"{% endif %}>
<input type="radio" name="enabled" value="0" title="否" {% if oa.enabled == "0" %}checked="checked"{% endif %}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">App ID</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_id" value="{{ oa.app_id }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">App Secret</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_secret" value="{{ oa.app_secret }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">App Token</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="app_token" value="{{ oa.app_token }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Aes Key</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="aes_key" value="{{ oa.aes_key }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Notify Url</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="notify_url" value="{{ oa.notify_url }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
<input type="hidden" name="section" value="wechat.oa">
</div>
</div>
</form>
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.test.wechat_oa'}) }}">
<fieldset class="layui-elem-field layui-field-title">
<legend>接口测试</legend>
</fieldset>
<div class="layui-form-item">
<label class="layui-form-label">请求方法</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="file" value="qrcode/create" readonly="readonly">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
</div>
</div>
</form>

View File

@ -0,0 +1,42 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.wechat_oa'}) }}">
<table class="layui-table kg-table layui-form">
<colgroup>
<col width="15%">
<col width="20%">
<col>
</colgroup>
<thead>
<tr>
<th>层级</th>
<th>名称</th>
<th>链接</th>
</tr>
</thead>
<tbody>
{% for i,top in oa.menu %}
<tr>
<td>├──</td>
<td><input class="layui-input" type="text" name="menu[{{ i }}][name]" value="{{ top.name }}" placeholder="一级菜单最多4个汉字" lay-verify="required"></td>
<td><input class="layui-input" type="text" name="menu[{{ i }}][url]" value="{{ top.url }}" placeholder="网页链接"></td>
</tr>
{% for j,sub in top.children %}
<tr>
<td><span style="padding: 0 15px;"></span>├──</td>
<td><input class="layui-input" type="text" name="menu[{{ i }}][children][{{ j }}][name]" value="{{ sub.name }}" placeholder="二级菜单最多7个汉字"></td>
<td><input class="layui-input" type="text" name="menu[{{ i }}][children][{{ j }}][url]" value="{{ sub.url }}" placeholder="网页链接"></td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
<br>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
<input type="hidden" name="section" value="wechat.oa">
</div>
</div>
</form>

View File

@ -0,0 +1,47 @@
{% set notice_template = oa.notice_template|json_decode %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.wechat_oa'}) }}">
<table class="layui-table kg-table layui-form">
<colgroup>
<col width="15%">
<col>
</colgroup>
<thead>
<tr>
<th>模板名称</th>
<th>模板编号</th>
</tr>
</thead>
<tbody>
<tr>
<td>登录成功通知</td>
<td><input class="layui-input" type="text" name="notice_template[account_login]" value="{{ notice_template.account_login }}" lay-verify="required"></td>
</tr>
<tr>
<td>购买成功提醒</td>
<td><input class="layui-input" type="text" name="notice_template[order_finish]" value="{{ notice_template.order_finish }}" lay-verify="required"></td>
</tr>
<tr>
<td>退款成功通知</td>
<td><input class="layui-input" type="text" name="notice_template[refund_finish]" value="{{ notice_template.refund_finish }}" lay-verify="required"></td>
</tr>
<tr>
<td>课程直播提醒</td>
<td><input class="layui-input" type="text" name="notice_template[live_begin]" value="{{ notice_template.live_begin }}" lay-verify="required"></td>
</tr>
<tr>
<td>咨询结果通知</td>
<td><input class="layui-input" type="text" name="notice_template[consult_reply]" value="{{ notice_template.consult_reply }}" lay-verify="required"></td>
</tr>
</tbody>
</table>
<br>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
<input type="hidden" name="section" value="wechat.oa">
</div>
</div>
</form>

View File

@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class Data202101061830 extends AbstractMigration
{
public function up()
{
$menu = [
[
'name' => '菜单1',
'url' => '',
'children' => [
[
'type' => 'view',
'name' => '菜单1-1',
'url' => 'https://gitee.com/koogua'
],
],
],
[
'name' => '菜单2',
'url' => '',
'children' => [
[
'type' => 'view',
'name' => '菜单2-1',
'url' => 'https://gitee.com/koogua'
],
],
],
[
'name' => '菜单3',
'url' => '',
'children' => [
[
'type' => 'view',
'name' => '菜单3-1',
'url' => 'https://gitee.com/koogua'
],
],
],
];
$rows = [
[
'section' => 'wechat.oa',
'item_key' => 'menu',
'item_value' => json_encode($menu),
],
];
$this->table('kg_setting')->insert($rows)->save();
}
public function down()
{
$this->getQueryBuilder()
->delete('kg_setting')
->where(['section' => 'wechat.oa', 'item_key' => 'menu'])
->execute();
}
}

View File

@ -30,8 +30,9 @@ layui.use(['jquery', 'form', 'element', 'layer', 'dropdown'], function () {
404: function () { 404: function () {
layer.msg('资源不存在', {icon: 2, anim: 6}); layer.msg('资源不存在', {icon: 2, anim: 6});
}, },
500: function () { 500: function (xhr) {
layer.msg('服务器内部错误', {icon: 2, anim: 6}); var res = JSON.parse(xhr.responseText);
layer.msg(res.msg, {icon: 2, anim: 6});
} }
} }
}); });