Initial project files: BESCMS full source

This commit is contained in:
bes
2026-08-13 23:37:46 +08:00
parent fa6cddb540
commit 2e26f85723
2166 changed files with 396625 additions and 0 deletions
@@ -0,0 +1,347 @@
<?php namespace Phpcmf\Controllers\Admin;
class Template extends \Phpcmf\Table
{
public function __construct()
{
parent::__construct();
// 表单显示名称
$this->name = dr_lang('模板消息');
// 模板前缀(避免混淆)
$this->tpl_prefix = 'template_';
// 用于表储存的字段,后台可修改的表字段
$field = array(
'title' => array(
'name' => dr_lang('主题'),
'fieldname' => 'title', // 这是字段名称必须和主键相同
),
'template' => array(
'name' => dr_lang('模板ID'),
'fieldname' => 'template', // 这是字段名称必须和主键相同
),
'url' => array(
'name' => dr_lang('消息URL'),
'fieldname' => 'url', // 这是字段名称必须和主键相同
),
);
// 初始化数据表
$this->_init([
'table' => weixin_wxtable('template'),
'field' => $field, // 可查询的字段
'order_by' => 'inputtime desc', // 列表排序
'date_field' => 'inputtime', // 按时间段搜索字段
]);
// 把公共变量传入模板
\Phpcmf\Service::V()->assign([
// 搜索字段
'field' => $field,
// 后台的菜单
'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
[
WEIXIN_MORE_NAME. $this->name => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-edit'],
'创建' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'],
'修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'],
]),
'group' => \Phpcmf\Service::M('User', APP_DIR)->get_group_data(),
'ucount' => \Phpcmf\Service::M()->table(weixin_wxtable('user'))->counts(),
]);
}
// 来自cms的群发
public function show_add() {
$id = (int)\Phpcmf\Service::L('Input')->get('id');
$mid = dr_safe_filename(\Phpcmf\Service::L('Input')->get('mid'));
if (!$id || !$mid) {
$this->_json(0, '参数不能为空');
}
$data = \Phpcmf\Service::M()->table_site($mid)->get($id);
if (!$data) {
$this->_json(0, '内容不存在');
}
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
if (!$cache) {
$this->_json(0, dr_lang('没有可用粉丝'));
}
$tpl = [];
// 生成模板
$template = [];
foreach ($tpl['content'] as $t) {
if ($t['name']) {
$template[$t['name']] = [
'value' => $t['value'],
'color' => $t['color'],
];
}
}
if (!$template) {
$this->_json(0, dr_lang('模板内容解析后不存在'));
}
// 存储文件
\Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
'data' => $data,
'template' => $template,
'users' => dr_save_bfb_data($cache)
], 3600);
$this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
}
// 查看列表
public function index() {
list($tpl) = $this->_List();
\Phpcmf\Service::V()->display($tpl);
}
// 添加内容
public function add() {
list($tpl) =$this->_Post(0);
\Phpcmf\Service::V()->display($tpl);
}
// 修改内容
public function edit() {
$id = intval(\Phpcmf\Service::L('Input')->get('id'));
list($tpl) = $this->_Post($id);
\Phpcmf\Service::V()->display($tpl);
}
// 删除内容
public function del() {
$this->_Del(
\Phpcmf\Service::L('Input')->get_post_ids(),
null,
null,
\Phpcmf\Service::M()->dbprefix($this->init['table'])
);
}
// 内容处理
public function todo_add() {
$id = \Phpcmf\Service::L('input')->get('id');
$data = \Phpcmf\Service::M()->table($this->init['table'])->get($id);
if (!$data) {
$this->_json(0, dr_lang('模板内容不存在'));
} elseif (!$data['content']) {
$this->_json(0, dr_lang('内容参数不存在'));
} elseif (!$data['template']) {
$this->_json(0, dr_lang('模板ID不存在'));
}
$data['content'] = dr_string2array($data['content']);
if ($data['groupid'] < 0) {
$gid = abs($data['groupid']);
$where = 'uid in (select uid from '.\Phpcmf\Service::M()->dbprefix('member_group_index').' where gid='.$gid.')';
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where($where)->getAll();
} elseif ($data['groupid'] > 0) {
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where('groupids LIKE "%\"'.\Phpcmf\Service::M()->db->escapeString($data['groupid'], true).'\"%"')->getAll();
} else {
$cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
}
if (!$cache) {
$this->_json(0, dr_lang('没有可用粉丝'));
}
// 生成模板
$template = [];
foreach ($data['content'] as $t) {
if ($t['name']) {
$template[$t['name']] = [
'value' => $t['value'],
'color' => $t['color'],
];
}
}
if (!$template) {
$this->_json(0, dr_lang('模板内容解析后不存在'));
}
// 存储文件
\Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
'data' => $data,
'template' => $template,
'users' => $this->_save_bfb_data($cache),
]);
$this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
}
function _save_bfb_data($data) {
$cache = [];
$count = dr_count($data);
$num = ceil($count/10);
if ($count > $num) {
$pagesize = ceil($count/$num);
for ($i = 1; $i <= $num; $i ++) {
$cache[$i] = array_slice($data, ($i - 1) * $pagesize, $pagesize);
}
} else {
for ($i = 1; $i <= $count; $i ++) {
$cache[$i] = array_slice($data, ($i - 1), 1);
}
}
return $cache;
}
// 内容处理
public function show_index() {
\Phpcmf\Service::V()->assign([
'menu' => '',
'hidebtn' => 1,
'todo_url' => dr_url('weixin/template/send_add'),
'count_url' => dr_url('weixin/template/show_count_index'),
]);
\Phpcmf\Service::V()->display('bfb.html');exit;
}
// 内容数量统计
public function show_count_index() {
$data = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
!dr_count($data) && $this->_json(0, dr_lang('无可用数据,缓存已失效'));
$this->_json(count($data['users']), 'ok');
}
public function send_add() {
$page = max(1, intval($_GET['pp']));
$cache = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
!$cache && $this->_json(0, dr_lang('缓存不存在'));
$data = $cache['users'][$page];
$cts = count($cache['users']);
if ($data) {
$html = '';
foreach ($data as $user) {
$rt = $this->_send_template($user['openid'], $cache['data']['template'], $cache['template'], $cache['data']['url'], $cache['data']['color']);
if (!$rt['code']) {
$ok = "<span class='error'>".$rt['msg']."</span>";
$class = ' p_error';
} else {
$ok = "<span class='ok'>".dr_lang('发送成功')."</span>";
\Phpcmf\Service::M()->db->table($this->init['table'])
->where('id', intval($cache['data']['id']))
->increment('counts', 1);
}
$html.= '<p class="'.$class.'"><label class="rleft">'.dr_html2emoji($user['nickname']).'</label><label class="rright">'.$ok.'</label></p>';
}
$this->_json($page + 1, $html, [
'msg' => '正在执行第'.$page.'页/共'.$cts.'页',
'bfb' => round($page/$cts * 100, 2),
]);
}
// 完成
\Phpcmf\Service::L('cache')->del_auth_data('app-weixin-template-send');
$this->_json($cts, 'ok');
}
/**
* 获取微信 access token
*/
public function _weixin_template_access_token() {
$cache_data = \Phpcmf\Service::L('cache')->init('file')->get('access_token');
if (isset($cache_data['time']) && $cache_data['access_token']) {
$access_token = $cache_data['access_token'];
} else {
$weixin = \Phpcmf\Service::C()->get_cache('weixin');
$result = wx_get_https_json_data('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$weixin['account']['appid'].'&secret='.$weixin['account']['appsecret']);
if (!$result['code']) {
return dr_return_data(0, 'AccessToken'.$result['msg']);
}
\Phpcmf\Service::L('cache')->init('file')->save('access_token', $result['data'], 3600);
$access_token = $result['data']['access_token'];
}
return dr_return_data(1, 'ok', ['access_token' => $access_token]);
}
private function _send_template($oid, $id, $data, $url = '', $color = '') {
$rt = $this->_weixin_template_access_token();
if (!$rt['code']) {
return dr_return_data(0, $rt['msg']);
}
$p = [
'touser' => $oid,
'template_id' => $id,
'url' => $url,
'topcolor' => $color,
'data' => $data,
];
$rt = wx_post_https_json_data('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$rt['data']['access_token'], $p);
return $rt;
}
// 复制
public function copy_edit() {
$id = intval(\Phpcmf\Service::L('input')->get('id'));
$data = \Phpcmf\Service::M()->db->table(weixin_wxtable('template'))->where('id', $id)->get()->getRowArray();
if (!$data) {
$this->_json(0, dr_lang('数据#%s不存在', $id));
}
unset($data['id']);
$data['title'].= '_copy';
$rt = \Phpcmf\Service::M()->table(weixin_wxtable('template'))->insert($data);
if (!$rt['code']) {
$this->_json(0, dr_lang($rt['msg']));
}
$this->_json(1, dr_lang('复制成功'));
}
/**
* 获取内容
* $id 内容id,新增为0
* */
protected function _Data($id = 0) {
$data = parent::_Data($id);
if (!$data) {
return [];
}
$data['content'] = dr_string2array($data['content']);
return $data;
}
// 格式化保存数据
protected function _Format_Data($id, $data, $old) {
$data[1] = \Phpcmf\Service::L('input')->post('data');
$data[1]['content'] = dr_array2string($data[1]['content']);
if (!$id) {
// 当提交新数据时,把当前时间插入进去
$data[1]['counts'] = 0;
$data[1]['inputtime'] = SYS_TIME;
}
return $data;
}
}