新增体验者管理功能

master
李春波 1 year ago
parent 5bd17eabc3
commit 2516d33e3a
  1. 30
      app/admin/controller/MiniProgramController.php
  2. 25
      app/admin/model/Tester.php
  3. 14
      app/common/model/Tester.php
  4. 53
      app/common/service/wechat/MiniProgram.php
  5. 27
      front/src/api/miniprogram.js
  6. 7
      front/src/views/authorizer/detail.vue
  7. 174
      front/src/views/authorizer/modules/tests.vue
  8. 14
      install.sql

@ -111,4 +111,34 @@ class MiniProgramController extends BaseController
return success($data);
}
public function getTests(Request $request)
{
$id = $request->post('id');
$row = Authorizers::where('id', $id)->find();
$miniprogram = new MiniProgram($row['platform_id']);
$result = $miniprogram->getTester($row['appid']);
return json(['code' => $result['errcode'], 'msg' => $result['errmsg'], 'data' => $result['members']]);
}
public function bindTester(Request $request)
{
$id = $request->post('id');
$wechatId = $request->post('wechat_id');
$remark = $request->post('remark');
$row = Authorizers::where('id', $id)->find();
$miniprogram = new MiniProgram($row['platform_id']);
$result = $miniprogram->bindTester($row['appid'], $wechatId,$remark);
return json(['code' => $result['errcode'], 'msg' => $result['errmsg']]);
}
public function unbindTester(Request $request)
{
$id = $request->post('id');
$userstr = $request->post('userstr');
$row = Authorizers::where('id', $id)->find();
$miniprogram = new MiniProgram($row['platform_id']);
$result = $miniprogram->unbindTester($row['appid'], $userstr);
return json(['code' => $result['errcode'], 'msg' => $result['errmsg']]);
}
}

@ -0,0 +1,25 @@
<?php
namespace app\admin\model;
use app\common\model\Tester as TesterModel;
use support\Request;
use think\db\exception\DbException;
/**
* @property mixed $id
*/
class Tester extends TesterModel
{
public static function list($request): array
{
$params = self::buildWhere(null, $request);
return self::where($params['where'])
->order('id', 'desc')
->paginate([
'page' => $params['current_page'],
'list_rows' => $params['page_size']
])->toArray();
}
}

@ -0,0 +1,14 @@
<?php
namespace app\common\model;
/**
* 体验者管理
*/
class Tester extends BaseModel
{
static protected array $column = [
['key' => 'authorizer_appid', 'name' => 'authorizer_appid'],
];
protected $table = 'tester';
}

@ -10,6 +10,7 @@ use EasyWeChat\Kernel\Support\Collection;
use GuzzleHttp\Exception\GuzzleException;
use Psr\Http\Message\ResponseInterface;
use Tinywan\ExceptionHandler\Exception\BadRequestHttpException;
use app\admin\model\Tester;
class MiniProgram extends OpenPlatform
{
@ -164,4 +165,56 @@ class MiniProgram extends OpenPlatform
$params['action'] = 'set';
return $this->getMiniProgram($appid)->domain->modify($params);
}
public function getTester($appid)
{
$result = $this->getMiniProgram($appid)->tester->list();
if ($result['errcode'] == 0) {
$dbTester = Tester::where('authorizer_appid', $appid)->select()->toArray();
$txTesterUserstrs = array_column($result['members'], 'userstr');
$dbTesterUserstrs = array_column($dbTester, 'userstr');
// 小程序后台有添加体验者,系统中未记录,需要wechat-mp系统中也自动添加
$notInTxArray = array_diff($txTesterUserstrs, $dbTesterUserstrs);
$insertData = [];
foreach ($notInTxArray as $userstr) {
$data = [
'authorizer_appid' => $appid,
'userstr' => $userstr,
'remark' => '未知',
'wechat_id' => '未知',
];
array_push($insertData, $data);
}
if (!empty($insertData)) {
Tester::insertAll($insertData,false);
}
// wechat-mp系统有添加体验者,小程序后台中未记录(可能在平台或其他位置被删了),需要系统中自动删掉
$notInDbArray = array_diff($dbTesterUserstrs, $txTesterUserstrs);
Tester::where('authorizer_appid', $appid)->whereIn('userstr', $notInDbArray)->delete();
$dbTester = Tester::list(['authorizer_appid' => $appid]);
return ['errcode' => 0, 'errmsg' => '', 'members' => $dbTester];
}
return $result;
}
public function bindTester($appid, $wechatId, $remark)
{
$result = $this->getMiniProgram($appid)->tester->bind($wechatId);
if ($result['errcode'] == 0) {
$data = [
'authorizer_appid' => $appid,
'wechat_id' => $wechatId,
'remark' => $remark,
'userstr' => $result['userstr']
];
Tester::create($data);
}
return $result;
}
public function unbindTester($appid, $userStr)
{
return $this->getMiniProgram($appid)->tester->unbind(null,$userStr);
}
}

@ -11,6 +11,9 @@ const api = {
RevertCodeRelease: '/miniprogram/revertCodeRelease',
SetDomain: '/miniprogram/setDomain',
getPcAuthorizerUrl: '/miniprogram/getPcAuthorizerUrl',
getTests: '/miniprogram/getTests',
bindTester: '/miniprogram/bindTester',
unbindTester: '/miniprogram/unbindTester',
}
export function getDetail(parameter) {
@ -92,3 +95,27 @@ export function getPcAuthorizerUrl(parameter) {
data: parameter
})
}
export function getTests(parameter) {
return request({
url: api.getTests,
method: 'post',
data: parameter
})
}
export function bindTester(parameter) {
return request({
url: api.bindTester,
method: 'post',
data: parameter
})
}
export function unbindTester(parameter) {
return request({
url: api.unbindTester,
method: 'post',
data: parameter
})
}

@ -8,6 +8,9 @@
<a-tab-pane key="2" force-render tab="信息配置">
<setting/>
</a-tab-pane>
<a-tab-pane key="3" force-render tab="体验者">
<tests/>
</a-tab-pane>
</a-tabs>
</a-card>
</page-header-wrapper>
@ -16,12 +19,14 @@
<script>
import version from '@/views/authorizer/modules/version'
import setting from '@/views/authorizer/modules/setting'
import tests from '@/views/authorizer/modules/tests'
export default {
name: 'Version',
components: {
version,
setting
setting,
tests
},
data() {
return {

@ -0,0 +1,174 @@
<template>
<div>
<a-card :bordered="false" title="小程序体验者列表">
<a-button slot="extra" type="primary" @click="changeDomain">
添加
</a-button>
<s-table
ref="table"
:columns="columns"
:data="loadData"
rowKey="id"
showPagination="auto"
size="default"
>
<span slot="action" slot-scope="text, record">
<template>
<a-divider type="vertical"/>
<a-popconfirm title="确定删除该记录吗?" @confirm="handleDel(record.userstr)">
<a>删除</a>
</a-popconfirm>
</template>
</span>
</s-table>
</a-card>
<a-modal
v-model="changeDomainModal"
title="新增小程序体验者"
@cancel="modalCancel"
@ok="modalOk">
<a-form :form="form" v-bind="formLayout">
<!-- 检查是否有 id 并且大于0大于0是修改其他是新增新增不显示主键ID -->
<a-form-item label="微信号">
<a-input v-decorator="['wechat_id']" placeholder="微信号"/>
</a-form-item>
<a-form-item label="备注">
<a-input v-decorator="['remark']" placeholder="可填写体验者名字或其他内容"/>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import {getTests, bindTester, unbindTester} from '@/api/miniprogram'
import {STable} from "@/components";
import {getPlatform} from "@/api/platform";
const columns = [
{
title: '微信号',
dataIndex: 'wechat_id'
},
{
title: 'userstr',
dataIndex: 'userstr'
},
{
title: 'remark',
dataIndex: 'remark'
},
{
title: '更新时间',
dataIndex: 'update_time',
},
{
title: '操作',
dataIndex: 'action',
width: '150px',
scopedSlots: {customRender: 'action'}
}
]
//
const fields = ['wechat_id']
export default {
name: 'tests',
components: {STable},
data() {
this.formLayout = {
labelCol: {
xs: {span: 24},
sm: {span: 7}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 13}
}
}
return {
id: null,
profile: null,
columns: columns,
changeDomainModal: false,
form: this.$form.createForm(this),
loadData: parameter => {
const requestParameters = Object.assign({}, parameter, this.queryParam)
return getTests({id: this.id})
.then(res => {
return res.data
})
},
}
},
computed: {
domain() {
if (this.profile) {
return this.profile['authorizer_info']['MiniProgramInfo']['network']
} else {
return []
}
}
},
methods: {
changeDomain() {
this.changeDomainModal = true
let data = {
requestdomain: this.domain['RequestDomain'] ? this.domain['RequestDomain'].join(';') : '',
wsrequestdomain: this.domain['WsRequestDomain'] ? this.domain['WsRequestDomain'].join(';') : '',
uploaddomain: this.domain['UploadDomain'] ? this.domain['UploadDomain'].join(';') : '',
downloaddomain: this.domain['DownloadDomain'] ? this.domain['DownloadDomain'].join(';') : '',
udpdomain: this.domain['UDPDomain'] ? this.domain['UDPDomain'].join(';') : '',
tcpdomain: this.domain['TCPDomain'] ? this.domain['TCPDomain'].join(';') : ''
}
this.form.setFieldsValue(data)
},
modalOk() {
this.form.validateFields((errors, values) => {
if (!errors) {
bindTester({id: this.id, ...values}).then(res => {
this.visible = false
this.form.resetFields()
this.$message.success(res['msg'])
setTimeout(() => {
location.reload()
}, 1500)
}).catch(e => {
console.log(e)
}).finally(() => {
})
}
})
},
modalCancel() {
},
handleDel(userstr) {
console.log(userstr)
unbindTester({id:this.id, userstr}).then(res => {
this.$message.success(res['msg'])
setTimeout(() => {
location.reload()
}, 1500)
}).catch(e => {
console.log(e)
})
},
},
created() {
const {id} = this.$route.query
this.id = id
//
fields.forEach(v => this.form.getFieldDecorator(v, {}))
},
mounted() {
}
}
</script>
<style lang="less" scoped>
</style>

@ -111,5 +111,19 @@ CREATE TABLE `wxcallback_forward`
) ENGINE = InnoDB
DEFAULT CHARSET = utf8 COMMENT ='请求转发日志';
-- 体验者列表
CREATE TABLE `tester`
(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`authorizer_appid` varchar(32) NOT NULL COMMENT '授权小程序的appid',
`wechat_id` varchar(255) NOT NULL COMMENT '微信号',
`userstr` varchar(255) NOT NULL COMMENT 'userstr',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_time` int(11) NOT NULL,
`update_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8 COMMENT ='体验者列表';
INSERT INTO `user` (`id`, `username`, `password`, `create_time`, `update_time`)
VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1717411365, 1717411365);

Loading…
Cancel
Save