1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-21 11:18:10 +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);
}
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();
@ -340,7 +340,7 @@ class SettingController extends Controller
$data = $this->request->getPost();
$settingService->updateWechatSettings($section, $data);
$settingService->updateWechatOASettings($section, $data);
return $this->jsonSuccess(['msg' => '更新配置成功']);
@ -348,6 +348,7 @@ class SettingController extends Controller
$oa = $settingService->getWechatOASettings();
$this->view->pick('setting/wechat_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\Sms\Test as TestSmsService;
use App\Services\Vod as VodService;
use App\Services\Wechat as WechatService;
/**
* @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")
*/

View File

@ -759,9 +759,9 @@ class AuthNode extends Service
],
[
'id' => '5-1-13',
'title' => '微信平台',
'title' => '微信公众号',
'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\Repos\Setting as SettingRepo;
use App\Repos\Vip as VipRepo;
use App\Services\Wechat as WechatService;
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['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;
}
@ -171,15 +192,39 @@ class Setting extends Service
}
}
public function updateWechatSettings($section, $settings)
public function updateWechatOASettings($section, $settings)
{
if ($section == 'wechat.oa') {
if (isset($settings['notice_template'])) {
$settings['notice_template'] = kg_json_encode($settings['notice_template']);
if (!empty($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);
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'}) }}">
<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 %}>
{% block content %}
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title kg-tab-title">
<li class="layui-this">基本设置</li>
<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 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>
<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>
{% endblock %}

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 () {
layer.msg('资源不存在', {icon: 2, anim: 6});
},
500: function () {
layer.msg('服务器内部错误', {icon: 2, anim: 6});
500: function (xhr) {
var res = JSON.parse(xhr.responseText);
layer.msg(res.msg, {icon: 2, anim: 6});
}
}
});