This commit is contained in:
zoomtk@126.com 2023-04-20 15:34:00 +08:00
commit 858f41a675
25 changed files with 1330 additions and 0 deletions

View File

@ -0,0 +1,69 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\admin\controller;
use app\admin\controller\BaseAdmin;
use app\model\message\Message as MessageModel;
/**
* 阿里云短信消息管理
*/
class Message extends BaseAdmin
{
/**
* 编辑模板消息
* @return array|mixed|string
*/
public function edit()
{
$message_model = new MessageModel();
$keywords = input("keywords", "");
$info_result = $message_model->getMessageInfo($this->site_id,$keywords);
$info = $info_result["data"];
if (request()->isAjax()) {
if (empty($info))
return error("", "不存在的模板信息!");
$sms_json_array = $info["sms_json_array"];//短信配置
$template_id = input("template_id", '');//短信模板id
$smssign = input("smssign", '');//短信签名
$content = input("content", '');//短信签名
$sms_is_open = input("sms_is_open", 0);
$sms_json_array['template_id'] = $template_id;//模板ID (备注:服务商提供的模板ID)
$sms_json_array['content'] = $content;//模板内容 (备注:仅用于显示)
$sms_json_array['smssign'] = $smssign;//短信签名 (备注:请填写短信签名(如果服务商是大于请填写审核成功的签名))
$data = array(
'sms_json' => json_encode($sms_json_array),
"sms_is_open" => $sms_is_open,
);
$condition = array(
[ "site_id", "=", $this->site_id ],
[ "keywords", "=", $keywords ]
);
$res = $message_model->editMessage($data, $condition);
return $res;
} else {
if (empty($info))
$this->error("不存在的模板信息!");
$sms_json_array = $info["sms_json_array"];//短信配置
$this->assign("info", $sms_json_array);
$this->assign("sms_is_open", $info["sms_is_open"]);
$this->assign("keywords", $keywords);
//模板变量
$message_variable_list = $info["message_json_array"];
$this->assign("message_variable_list", $message_variable_list);
return $this->fetch('message/edit');
}
}
}

View File

@ -0,0 +1,48 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\admin\controller;
use addon\cossms\model\Config as ConfigModel;
use app\admin\controller\BaseAdmin;
/**
* 阿里云短信 控制器
*/
class Sms extends BaseAdmin
{
public function config()
{
$config_model = new ConfigModel();
if (request()->isAjax()) {
$access_key_id = input("access_key_id", "");//access_key_id
$access_key_secret = input("access_key_secret", "");//access_key_secret
$smssign = input("smssign", '');//短信签名
$status = input("status", 0);//启用状态
$data = array(
"status" => $status,
"access_key_id" => $access_key_id,
"access_key_secret" => $access_key_secret,
"smssign" => $smssign
);
$result = $config_model->setSmsConfig($data);
return $result;
} else {
$info_result = $config_model->getSmsConfig();
$info = $info_result["data"];
$this->assign("info", $info);
return $this->fetch("sms/config");
}
}
}

View File

@ -0,0 +1,107 @@
{extend name="../app/admin/view/base.html"/}
{block name="resources"}
<style>
.layui-btn-primary:hover {border-color: #C9C9C9;}
.number-con {margin-right: 10px;}
.ns-form {margin-top: 0;}
</style>
{/block}
{block name="main"}
<div class="layui-form ns-form">
<div class="layui-form-item">
<label class="layui-form-label">是否开启:</label>
<div class="layui-input-block">
<input type="checkbox" name="sms_is_open" value="1" {if $sms_is_open == 1}checked{/if} lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>模板ID</label>
<div class="layui-input-block">
<input name="template_id" type="text" value="{if !empty($info)}{$info.template_id}{/if}" lay-verify="required" placeholder="短信模板ID" class="layui-input ns-len-long">
</div>
<div class="ns-word-aux">必须与短信接口的模板ID一致否则无效!</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">数据值:</label>
<div class="layui-input-block">
{foreach $message_variable_list as $message_variable_k => $message_variable_v}
<button class="layui-btn layui-btn-primary number-con" onclick="clickBtn('{$message_variable_k}')">{$message_variable_v}</button>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">短信内容:</label>
<div class="layui-input-block">
<textarea id="text_area" name="content" class="layui-textarea ns-len-long">{if !empty($info)}{$info.content}{/if}</textarea>
</div>
<div class="ns-word-aux">变量只能使用上方的可用变量中的变量,否则不会被解析;如果要使用凌凯短信时,短信内容必须进行设置。</div>
</div>
<div class="ns-form-row">
<button class="layui-btn ns-bg-color" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="keywords" value="{$keywords}">
</div>
{/block}
{block name="script"}
<script>
layui.use('form', function() {
var form = layui.form;
repeat_flag = false; //防重复标识
form.render();
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
dataType: 'JSON',
type: 'POST',
url: ns.url("cossms://admin/message/edit"),
data: data.field,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(){
location.href = ns.url("admin/message/lists")
},
btn2: function() {
location.reload();
}
});
}else{
layer.msg(res.message);
}
}
});
});
});
function back(){
location.href = ns.url("admin/message/lists");
}
function clickBtn(con) {
var txtArea = $("#text_area")[0];
var content = txtArea.value; //文本域内容
var start = txtArea.selectionStart; //光标的初始位置selectionStart选区开始位置selectionEnd选区结束位置。
txtArea.value = content.substring(0, txtArea.selectionStart) + '{' + con + '}' + content.substring(txtArea.selectionEnd, content.length);
var position = start + con.length;
$("#text_area").focus();
txtArea.setSelectionRange(position+1, position+1); //setSelectionRange()方法用来设置<input>元素当前选中的文本的开始和结束位置
}
</script>
{/block}

View File

@ -0,0 +1,84 @@
{extend name="../app/admin/view/base.html"/}
{block name="resources"}
<style>
.ns-form {margin-top: 0;}
</style>
{/block}
{block name="main"}
<div class="layui-form ns-form">
<div class="layui-form-item">
<label class="layui-form-label">是否开启:</label>
<div class="layui-input-block" id="isOpen">
<input type="checkbox" name="status" lay-filter="isOpen" value="1" lay-skin="switch" {if condition="$info.value && $info.value.status == 1"} checked {/if} />
</div>
<div class="ns-word-aux">当前使用腾讯云短信配置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">APP_KEY</label>
<div class="layui-input-block">
<input type="text" name="access_key_id" placeholder="请输入内容APP_KEY" {if $info.value } value="{$info.value.access_key_id}" {/if} autocomplete="off" class="layui-input ns-len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SECRET_KEY</label>
<div class="layui-input-block">
<input type="text" name="access_key_secret" placeholder="请输入SECRET_KEY" {if $info.value } value="{$info.value.access_key_secret}" {/if} autocomplete="off" class="layui-input ns-len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">短信内容签名:</label>
<div class="layui-input-block">
<input type="text" name="smssign" placeholder="请输入短信内容签名" {if $info.value } value="{$info.value.smssign}" {/if} autocomplete="off" class="layui-input ns-len-long">
</div>
</div>
<!-- 表单操作 -->
<div class="ns-form-row">
<button class="layui-btn ns-bg-color" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
{/block}
{block name="script"}
<script>
layui.use('form', function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("cossms://admin/sms/config"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(){
location.href = ns.url("admin/message/sms")
},
btn2: function() {
location.reload();
}
});
}else{
layer.msg(res.message);
}
}
});
});
});
function back() {
location.href = ns.url("admin/message/sms");
}
</script>
{/block}

View File

@ -0,0 +1,24 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
return [
'diy' => [
'view' => [
],
'util' => [
],
'link' => [
],
],
];

View File

@ -0,0 +1,28 @@
<?php
// 事件定义文件
return [
'bind' => [],
'listen' => [
//展示活动
'ShowPromotion' => [
'addon\cossms\event\ShowPromotion',
],
//短信方式
'SmsType' => [
'addon\cossms\event\SmsType'
],
'CloseSMS'=>[
'addon\cossms\event\CloseSMS'
],
'DoEditSmsMessage' => [
'addon\cossms\event\DoEditSmsMessage'
],
'SendSms' => [
'addon\cossms\event\SendSms'
],
'SmsTemplateInfo' => [
'addon\cossms\event\SmsTemplateInfo'
]
],
'subscribe' => [],
];

View File

@ -0,0 +1,21 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
return [
'name' => 'cossms',
'title' => '腾讯云短信',
'description' => '腾讯云短信 SMS短信服务',
'status' => 1,
'author' => '',
'version' => '1.0',
'content' => '',
];

View File

@ -0,0 +1,29 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'COS_SMS_CONFIG',
'title' => '腾讯短信配置',
'url' => 'cossms://admin/sms/config',
'parent' => 'SMS_MANAGE',
'is_show' => 0,
'is_control' => 1,
'is_icon' => 0,
'picture' => '',
'picture_select' => '',
'sort' => 1,
],
[
'name' => 'MESSAGE_COSSMS_EDIT',
'title' => '编辑短信模板',
'url' => 'cossms://admin/message/edit',
'parent' => 'MESSAGE_LISTS',
'is_show' => 0,
'picture' => '',
'picture_select' => '',
'sort' => 1,
'child_list' => [],
],
];

View File

@ -0,0 +1,29 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'COS_SMS_CONFIG',
'title' => 'COS短信配置',
'url' => 'cossms://shop/sms/config',
'parent' => 'SMS_MANAGE',
'is_show' => 0,
'is_control' => 1,
'is_icon' => 0,
'picture' => '',
'picture_select' => '',
'sort' => 1,
],
[
'name' => 'MESSAGE_COSSMS_EDIT',
'title' => '编辑短信模板',
'url' => 'cossms://shop/message/edit',
'parent' => 'MESSAGE_LISTS',
'is_show' => 0,
'picture' => '',
'picture_select' => '',
'sort' => 1,
'child_list' => [],
],
];

View File

@ -0,0 +1,35 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人未经允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\event;
use addon\cossms\model\Config;
class CloseSMS
{
/**
* 短信发送方式方式及配置
*/
public function handle($param)
{
$site_id = 0;
$app_module = 'shop';
if ($param) {
if (isset($param['site_id'])) $site_id = $param['site_id'];
if (isset($param['app_module'])) $app_module = $param['app_module'];
}
if ($param[ 'sms_type' ] != 'alisms') {
$config_model = new Config();
$res = $config_model->modifyConfigIsUse(0, $site_id,$app_module);
return $res;
}
}
}

View File

@ -0,0 +1,42 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\event;
use addon\cossms\model\Config as ConfigModel;
/**
* 短信模板 (后台调用)
*/
class DoEditSmsMessage
{
/**
* 短信发送方式方式及配置
*/
public function handle($param=[])
{
$site_id=request()->siteid();
$app_module='shop';
if($param){
if(isset($param['site_id'])) $site_id=$param['site_id'];
if(isset($param['app_module'])) $app_module=$param['app_module'];
}
$config_model = new ConfigModel();
$config_result = $config_model->getSmsConfig($site_id,$app_module);
$config = $config_result["data"];
if ($config["is_use"] == 1) {
return [
"edit_url" => "cossms://{$app_module}/message/edit",
"shop_url" => "cossms://{$app_module}/message/edit",
"admin_url" => "cossms://{$app_module}/message/edit"
];
}
}
}

View File

@ -0,0 +1,27 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
declare (strict_types = 1);
namespace addon\cossms\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@ -0,0 +1,33 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
declare (strict_types = 1);
namespace addon\cossms\event;
use addon\cossms\model\Sms;
/**
* 短信发送
*/
class SendSms
{
/**
* 短信发送方式方式及配置
* @param $param
* @return array|mixed
* @throws \Overtrue\EasySms\Exceptions\InvalidArgumentException
*/
public function handle($param)
{
$sms = new Sms();
$res = $sms->send($param);
return $res;
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\event;
/**
* 店铺活动
*/
class ShowPromotion
{
/**
* 活动展示
*
* @return multitype:number unknown
*/
public function handle()
{
$data = [
'admin' => [
[
//插件名称
'name' => 'cossms',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'tool',
//展示主题
'title' => '腾讯COS短信',
//展示介绍
'description' => '腾讯云短信管理',
//展示图标
'icon' => 'addon/cossms/icon.png',
//跳转链接
'url' => 'cossms://admin/sms/config',
]
],
'shop' => [
[
//插件名称
'name' => 'cossms',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'tool',
//展示主题
'title' => '腾讯COS短信',
//展示介绍
'description' => '腾讯云短信管理',
//展示图标
'icon' => 'addon/cossms/icon.png',
//跳转链接
'url' => 'cossms://shop/sms/config',
]
]
];
return $data;
}
}

View File

@ -0,0 +1,38 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人未经允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\event;
use addon\cossms\model\Config;
class SmsTemplateInfo
{
/**
* 获取短信模板数据
*/
public function handle($param)
{
$site_id=0;
$app_module='shop';
if($param){
if(isset($param['site_id'])) $site_id=$param['site_id'];
if(isset($param['app_module'])) $app_module=$param['app_module'];
}
$config_model = new Config();
$sms_config = $config_model->getSmsConfig($site_id, $app_module);
$sms_config = $sms_config[ 'data' ];
if ($sms_config['is_use']) {
$template_info = model('message_template')->getInfo([ ['keywords', '=', $param['keywords'] ]]);
if (!empty($template_info['sms_json'])) {
return json_decode($template_info['sms_json'], true);
}
}
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
declare (strict_types = 1);
namespace addon\cossms\event;
use addon\cossms\model\Config;
/**
* 短信方式 (后台调用)
*/
class SmsType
{
/**
* 短信发送方式方式及配置
*/
public function handle($param=[])
{
$site_id=0;
$app_module='shop';
if($param){
if(isset($param['site_id'])) $site_id=$param['site_id'];
if(isset($param['app_module'])) $app_module=$param['app_module'];
}
$config_model = new Config();
$config = $config_model->getSmsConfig($site_id,$app_module)['data'];
$info = array(
"sms_type" => "cossms",
"sms_type_name" => "腾讯云短信",
"status" => $config['is_use']??0,
"admin_url" => "cossms://{$app_module}/sms/config",
"edit_url" => "cossms://{$app_module}/sms/config",
"shop_url" => "cossms://{$app_module}/sms/config",
"desc" => "腾讯云短信Short Message ServiceSMS沉淀腾讯十多年短信服务技术和经验为 QQ、微信等亿级平台和10万+客户提供国内短信和国际/港澳台短信服务。国内短信验证秒级触达99%到达率;国际/港澳台短信覆盖全球200+国家/地区,稳定可靠。腾讯云短信旨在帮助广大开发者快速灵活接入高质量的国内、国际/港澳台短信服务。"
);
return $info;
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
declare (strict_types = 1);
namespace addon\cossms\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return success();
}
}

BIN
addon/cossms/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,58 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\model;
use app\model\system\Config as ConfigModel;
use app\model\BaseModel;
/**
* 支付宝支付配置
*/
class Config extends BaseModel
{
/**
* 设置短信配置
* array $data
*/
public function setSmsConfig($data,$is_use,$site_id=0,$app_module='shop')
{
$config = new ConfigModel();
if($is_use){
event('CloseSMS', ['sms_type' => 'cossms', 'is_use' => $is_use, 'site_id' => $site_id ,'app_module'=>$app_module]);
}
$res = $config->setConfig($data,'腾讯云短信配置',$is_use,[[ 'site_id', '=', $site_id ],[ 'app_module', '=',$app_module ], [ 'config_key', '=', 'COS_SMS_CONFIG' ] ]);
return $res;
}
/**
* 获取短信配置
*/
public function getSmsConfig($site_id=0,$app_module='shop')
{
$config = new ConfigModel();
$res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', $app_module ], [ 'config_key', '=', 'COS_SMS_CONFIG' ] ]);
return $res;
}
/**
* 设置开关
*/
public function modifyConfigIsUse($is_use, $site_id = 1, $app_module = 'shop')
{
if($is_use){
event('CloseSMS', ['sms_type' => 'cossms', 'is_use' => $is_use, 'site_id' => $site_id ,'app_module'=>$app_module]);
}
$config = new ConfigModel();
$res = $config->modifyConfigIsUse($is_use, [ [ 'site_id', '=', $site_id ], [ 'app_module', '=', $app_module ], [ 'config_key', '=', 'COS_SMS_CONFIG' ] ]);
return $res;
}
}

View File

@ -0,0 +1,81 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\model;
use app\model\BaseModel;
use Overtrue\EasySms\EasySms;
use Overtrue\EasySms\Exceptions\InvalidArgumentException;
use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
use Overtrue\EasySms\Strategies\OrderStrategy;
/**
* 腾讯云短信
*/
class Sms extends BaseModel
{
/**
* 短信发送
* @param array $param
* @return array|mixed
* @throws InvalidArgumentException
*/
public function send($param = [])
{
$config_model = new Config();
$site_id=$param['site_id']??0;
$app_module=$param['app_module']??'shop';
$config_result = $config_model->getSmsConfig($site_id,$app_module);
if ($config_result["data"]["is_use"]) {
$config = $config_result["data"]["value"];
$sms_info = $param["message_info"]["sms_json_array"];//消息类型模板 短信模板信息
if (empty($sms_info)) return $this->error([], "消息模板尚未配置");
$sms_info = $sms_info[ "cossms" ];
$var_parse = $param["var_parse"];//变量解析
$account = $param["sms_account"]??$param['mobile'];//发送手机号
$template = $sms_info["template_id"]??'';//发送模板ID
//加入腾讯云短信配置
$sms_config = [
// HTTP 请求的超时时间(秒)
'timeout' => 5.0,
// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => OrderStrategy::class,
// 默认可用的发送网关
'gateways' => ['qcloud'],
],
// 可用的网关配置
'gateways' => [
'qcloud' => [
'sdk_app_id' => $config["sdk_app_id"], // SDK APP ID
'app_key' => $config["sdk_app_key"],// APP KEY
'secret_id' =>$config['secret_id'], //'AKIDARZRAj9KGySjmaBalgbT8oaCau21nLgo', // SECRET ID
'secret_key' =>$config['secret_key'], //'8DGOXYRBsS3b2Mdp15xb2W3RluqhNnzw', // SECRET KEY
'sign_name' =>$config['smssign'] //'恒泰茶缘网络', // 短信签名
]
],
];
try {
unset($var_parse['site_name']);
$easySms = new EasySms($sms_config);
$easySms->send($account, [
'template' => $template, // 模板ID
'content' =>$sms_info["content"], // 模板内容
'data' => $var_parse
]);
return $this->success([ "addon" => "cossms", "addon_name" => "腾讯云短信", "content" => $sms_info["content"] ]);
} catch (NoGatewayAvailableException $exception) {
$message = $exception->getException('qcloud')->getMessage();
return $this->error([ "content" => $sms_info["content"] ], $message ? : '短信发送异常');
}
}
}
}

View File

@ -0,0 +1,86 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\shop\controller;
use app\model\message\Message as MessageModel;
use app\model\message\MessageTemplate as MessageTemplateModel;
use app\shop\controller\BaseShop;
/**
* 阿里云短信消息管理
*/
class Message extends BaseShop
{
/**
* 编辑模板消息
* @return array|mixed|string
*/
public function edit()
{
$message_model = new MessageModel();
$keywords = input("keywords", "");
$info_result = $message_model->getMessageInfo($this->site_id, $keywords);
$info = $info_result["data"];
if (request()->isAjax()) {
if (empty($info))
return error("", "不存在的模板信息!");
$sms_is_open = input('sms_is_open', 0);
$sms_json_array = !empty($info["sms_json_array"]) ? $info["sms_json_array"] : [];//短信配置
$template_id = input("template_id", '');//短信模板id
$smssign = input("smssign", '');//短信签名
$content = input("content", '');//短信签名
$cossms_array = [];
if (!empty($sms_json_array["cossms"])) {
$cossms_array = $sms_json_array["cossms"];
}
$cossms_array['template_id'] = $template_id;//模板ID (备注:服务商提供的模板ID)
$cossms_array['content'] = $content;//模板内容 (备注:仅用于显示)
$cossms_array['smssign'] = $smssign;//短信签名 (备注:请填写短信签名(如果服务商是大于请填写审核成功的签名))
$sms_json_array["cossms"] = $cossms_array;
$data = array(
'sms_json' => json_encode($sms_json_array),
);
$condition = array(
["keywords", "=", $keywords]
);
$template_model = new MessageTemplateModel();
$res = $template_model->editMessageTemplate($data, $condition);
if ($res['code'] == 0) {
$res = $message_model->editMessage(['sms_is_open' => $sms_is_open, 'site_id' => $this->site_id, 'keywords' => $keywords], [
["keywords", "=", $keywords],
['site_id', '=', $this->site_id],
]);
}
return $res;
} else {
if (empty($info))
$this->error("不存在的模板信息!");
$sms_json_array = $info["sms_json_array"];//短信配置
$cossms_array = [];
if (!empty($sms_json_array["cossms"])) {
$cossms_array = $sms_json_array["cossms"];
}
$this->assign("info", $cossms_array);
$this->assign("keywords", $keywords);
//模板变量
$message_variable_list = $info["message_json_array"];
$this->assign("message_variable_list", $message_variable_list);
$this->assign('sms_is_open', $info['sms_is_open']);
return $this->fetch('message/edit');
}
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\cossms\shop\controller;
use addon\cossms\model\Config as ConfigModel;
use app\shop\controller\BaseShop;
/**
* 短信 控制器
*/
class Sms extends BaseShop
{
public function config()
{
$config_model = new ConfigModel();
if (request()->isAjax()) {
$sdk_app_id = input("sdk_app_id", "");//sdk_app_id
$sdk_app_key = input("sdk_app_key", "");//sdk_app_key
$secret_id = input("secret_id", "");//secret_id
$secret_key = input("secret_key", "");//secret_key
$smssign = input("smssign", '');//短信签名
$status = input("status", 0);//启用状态
$data = array (
"sdk_app_id" => $sdk_app_id,
"sdk_app_key" => $sdk_app_key,
"secret_id" => $secret_id,
"secret_key" => $secret_key,
"smssign" => $smssign
);
$result = $config_model->setSmsConfig($data, $status, $this->site_id, $this->app_module);
return $result;
} else {
$info_result = $config_model->getSmsConfig($this->site_id, $this->app_module);
$info = $info_result[ "data" ];
$this->assign("info", $info);
return $this->fetch("sms/config");
}
}
}

View File

@ -0,0 +1,104 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.layui-btn-primary:hover {border-color: #C9C9C9;}
.number-con {margin-right: 10px;}
.ns-form {margin-top: 0;}
</style>
{/block}
{block name="main"}
<div class="layui-form ns-form">
<div class="layui-form-item">
<label class="layui-form-label">是否开启:</label>
<div class="layui-input-block">
<input type="checkbox" name="sms_is_open" value="1" {if $sms_is_open == 1}checked{/if} lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>模板ID</label>
<div class="layui-input-block">
<input name="template_id" type="text" value="{if !empty($info)}{$info.template_id}{/if}" lay-verify="required" placeholder="短信模板ID" class="layui-input len-long">
</div>
<div class="word-aux">必须与短信接口的模板ID一致否则无效!</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">数据值:</label>
<div class="layui-input-block">
{foreach $message_variable_list as $message_variable_k => $message_variable_v}
<button class="layui-btn layui-btn-primary number-con" onclick="clickBtn('{$message_variable_k}')">{$message_variable_v}</button>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">短信内容:</label>
<div class="layui-input-block">
<textarea id="text_area" name="content" class="layui-textarea ns-len-long">{if !empty($info)}{$info.content}{/if}</textarea>
</div>
<div class="word-aux">变量只能使用上方的可用变量中的变量,否则不会被解析;如果要使用凌凯短信时,短信内容必须进行设置。</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="keywords" value="{$keywords}">
</div>
{/block}
{block name="script"}
<script>
layui.use('form', function() {
var form = layui.form;
repeat_flag = false; //防重复标识
form.render();
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
dataType: 'JSON',
type: 'POST',
url: ns.url("cossms://shop/message/edit"),
data: data.field,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(){
location.href = ns.url("shop/message/lists")
},
btn2: function() {
location.reload();
}
});
}else{
layer.msg(res.message);
}
}
});
});
});
function back(){
location.href = ns.url("shop/message/lists");
}
function clickBtn(con) {
var txtArea = $("#text_area")[0];
var content = txtArea.value; //文本域内容
var start = txtArea.selectionStart; //光标的初始位置selectionStart选区开始位置selectionEnd选区结束位置。
txtArea.value = content.substring(0, txtArea.selectionStart) + '{' + con + '}' + content.substring(txtArea.selectionEnd, content.length);
var position = start + con.length;
$("#text_area").focus();
txtArea.setSelectionRange(position+1, position+1); //setSelectionRange()方法用来设置<input>元素当前选中的文本的开始和结束位置
}
</script>
{/block}

View File

@ -0,0 +1,95 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.ns-form {margin-top: 0;}
</style>
{/block}
{block name="main"}
<div class="layui-form ns-form">
<div class="layui-form-item">
<label class="layui-form-label">是否开启:</label>
<div class="layui-input-block" id="isOpen">
<input type="checkbox" name="status" lay-filter="isOpen" value="1" lay-skin="switch" {if condition="$info.is_use == 1"} checked {/if} />
</div>
<div class="word-aux">当前使用腾讯云短信配置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SDKAppID</label>
<div class="layui-input-block">
<input type="text" name="sdk_app_id" placeholder="请输入内容APP_KEY" {if $info.value } value="{$info.value.sdk_app_id??''}" {/if} autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">APP_KEY</label>
<div class="layui-input-block">
<input type="text" name="sdk_app_key" placeholder="请输入内容APP_KEY" {if $info.value } value="{$info.value.sdk_app_key??''}" {/if} autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">secret_id</label>
<div class="layui-input-block">
<input type="text" name="secret_id" placeholder="请输入secret_id" {if $info.value } value="{$info.value.secret_id??''}" {/if} autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SECRET_KEY</label>
<div class="layui-input-block">
<input type="text" name="secret_key" placeholder="请输入SECRET_KEY" {if $info.value } value="{$info.value.secret_key??''}" {/if} autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">短信内容签名:</label>
<div class="layui-input-block">
<input type="text" name="smssign" placeholder="请输入短信内容签名" {if $info.value } value="{$info.value.smssign}" {/if} autocomplete="off" class="layui-input len-long">
</div>
</div>
<!-- 表单操作 -->
<div class="form-row">
<button class="layui-btn color" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
{/block}
{block name="script"}
<script>
layui.use('form', function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("cossms://shop/sms/config"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(){
location.href = ns.url("shop/message/sms")
},
btn2: function() {
location.reload();
}
});
}else{
layer.msg(res.message);
}
}
});
});
});
function back() {
location.href = ns.url("shop/message/sms");
}
</script>
{/block}

View File

@ -0,0 +1,106 @@
<?php
/**
* SAAS应用系统 --- 十年开发经验汇集巨献!
* ==========================================================
* Copy right 2020-2050 成都众联思索科技有限公司,保留所有权利。
* ----------------------------------------------------------
* 官方网址: https://www.zoomtk.com
* 这不是自由软件!未经允许不得用于商业目或程序代码摘取及修改。
* 任何企业和个人未经允许对程序代码以任何形式任何目的再发布传播。
* 唯一发布渠道www.zoomtk.com;非官方渠道统一视为侵权行为。
* ==========================================================
*/
namespace addon\futures\model;
use addon\futures\model\Futures as FuturesModel;
use addon\fenxiao\model\FenxiaoOrder;
use app\model\BaseModel;
class Forder extends BaseModel
{
/**
* 分销订单计算
* @param unknown $order
*/
public function calculate($order)
{
$site_id=$order['site_id'];
$futuresModel = new FuturesModel;
$basics = $futuresModel->getBasicsConfig($site_id)['data']['value'];
if(!empty(model("fenxiao_order")->getValue(['order_id'=>$order[ 'order_id' ]],'fenxiao_order_id'))){
return $this->success();
}
//检测分销商上级关系
$member_info = model("member")->getInfo([ [ 'member_id', '=', $order[ 'member_id' ] ] ], 'fenxiao_id,is_fenxiao');
//如果没有分销商直接返回不计算,没有考虑首次付款上下级绑定
if(empty($member_info)){
return $this->success();
}
if ($member_info[ 'fenxiao_id' ] == 0) {
return $this->success();
}
$fenxiao_id = $member_info[ 'fenxiao_id' ];
$fenxiao_info = model("fenxiao")->getInfo([ [ 'fenxiao_id', '=', $fenxiao_id ], [ 'is_delete', '=', 0 ] ]);
if (empty($fenxiao_info)) {
return $this->success();
}
$parent_fenxiao_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id, fenxiao_name, status, parent');
$direct_push=$basics['direct_push'];//直推
$indirect_push=$basics['indirect_push'];//间推
$is_range=$basics['is_range'];
if($is_range && $parent_fenxiao_info){ //减去极差奖励
$direct_push -=$indirect_push;
}
$order_goods = model("order_goods")->getInfo(['order_id'=>$order[ 'order_id' ]]);
$commission_rate=$direct_push+$indirect_push; //总佣金比例
$service_charge=$order['order_money']*$basics['service_price']/100;//总服务费
$commission=$commission_rate*$service_charge/100;//总佣金
$order_fenxiao_data = [
'one_rate' => $direct_push,
'one_commission' =>$direct_push*$service_charge/100,
'two_rate' => $indirect_push,
'two_commission' => $indirect_push*$service_charge/100,
'three_rate' => 0,
];
//启动分销
$data = [
'order_id' => $order[ 'order_id' ],
'order_no' => $order[ 'order_no' ],
'order_goods_id' => $order_goods[ 'order_goods_id' ],
'site_id' => $order[ 'site_id' ],
'site_name' => $order[ 'site_name' ],
'goods_id' => $order_goods[ 'goods_id' ],
'sku_id' => $order_goods[ 'sku_id' ],
'sku_name' => $order_goods[ 'sku_name' ],
'sku_image' => $order_goods[ 'sku_image' ],
'price' => $order[ 'order_money' ],
'num' => $order_goods[ 'num' ],
'real_goods_money' =>$order[ 'order_money' ],
'member_id' => $order[ 'member_id' ],
'member_name' => $order[ 'name' ],
'member_mobile' => $order[ 'mobile' ],
'full_address' => $order[ 'full_address' ] . $order[ 'address' ],
'commission' => $commission,
'commission_rate' => $commission_rate,
'one_fenxiao_id' => empty($fenxiao_info) ? 0 : $fenxiao_info[ 'fenxiao_id' ],
'one_rate' => empty($order_fenxiao_data[ 'one_rate' ]) ? 0 : $order_fenxiao_data[ 'one_rate' ],
'one_commission' => empty($order_fenxiao_data[ 'one_commission' ]) ? 0 : $order_fenxiao_data[ 'one_commission' ],
'one_fenxiao_name' => empty($fenxiao_info) ? '' : $fenxiao_info[ 'fenxiao_name' ],
'two_fenxiao_id' => empty($parent_fenxiao_info) ? 0 : $parent_fenxiao_info[ 'fenxiao_id' ],
'two_rate' => empty($order_fenxiao_data[ 'two_rate' ]) ? 0 : $order_fenxiao_data[ 'two_rate' ],
'two_commission' => empty($order_fenxiao_data[ 'two_commission' ]) ? 0 : $order_fenxiao_data[ 'two_commission' ],
'two_fenxiao_name' => empty($parent_fenxiao_info) ? '' : $parent_fenxiao_info[ 'fenxiao_name' ],
'create_time' => time()
];
model("fenxiao_order")->add($data);
$fenxiao_order_model = new FenxiaoOrder();
$fenxiao_order_model->settlement($data['order_id']);
$res = $fenxiao_order_model->calculateOrder($data['order_id']);
return $this->success();
}
}