多样青春活动版:

开发了抖音端授权登录
修改原有活动管理,增加渠道设置,添加和查询时可单独只展示抖音端或者微信端任意一端,而其他端不展示
核销码这块原来是小程序生成,但前端生成无法调成ui需要的样式,改为了后端生成
This commit is contained in:
qinzexin 2025-05-07 18:48:18 +08:00
parent 8522d72498
commit 6b8be76b29
16 changed files with 430 additions and 48 deletions

View File

@ -44,12 +44,12 @@ class Activity extends Backend
$this->view->assign("addTypeList", $this->model->getAddTypeList()); $this->view->assign("addTypeList", $this->model->getAddTypeList());
$this->view->assign("feelList", $this->model->getFeelList()); $this->view->assign("feelList", $this->model->getFeelList());
$this->view->assign("authStatusList", $this->model->getAuthStatusList()); $this->view->assign("authStatusList", $this->model->getAuthStatusList());
$this->view->assign("showList", $this->model->getShowList());
$this->view->assign("cateList", $this->model->getCateList()); $this->view->assign("cateList", $this->model->getCateList());
$this->view->assign("cateListJson", json_encode($this->model->getCateList(), JSON_UNESCAPED_UNICODE)); $this->view->assign("cateListJson", json_encode($this->model->getCateList(), JSON_UNESCAPED_UNICODE));
$this->view->assign("platformList", $this->model->getPlatformList());
$this->view->assign("platformListJson", json_encode($this->model->getPlatformList(), JSON_UNESCAPED_UNICODE));
} }

View File

@ -76,4 +76,10 @@ return [
'Admin.nickname' => '昵称', 'Admin.nickname' => '昵称',
'Admin.avatar' => '头像', 'Admin.avatar' => '头像',
"Refund_id" => '退款策略', "Refund_id" => '退款策略',
'Show' => '显示状态',
'Show 1' => '显示',
'Show 2' => '隐藏',
"Platform" => '上架平台',
"Platform wechat_miniapp" => '微信小程序',
"Platform tt_miniapp" => '抖音小程序',
]; ];

View File

@ -38,9 +38,25 @@ class Activity extends Model
'feel_text', 'feel_text',
'auth_status_text', 'auth_status_text',
'auth_time_text', 'auth_time_text',
'show_text',
'canceltime_text' 'canceltime_text'
]; ];
public function getShowList()
{
return ['1' => __('Show 1'), '2' => __('Show 2')];
}
public function getShowTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['show']) ? $data['show'] : '');
$list = $this->getShowList();
return isset($list[$value]) ? $list[$value] : '';
}
public function getCateList(){ public function getCateList(){
return \app\admin\model\school\activity\Cate::column("name", 'id'); return \app\admin\model\school\activity\Cate::column("name", 'id');
@ -77,6 +93,17 @@ class Activity extends Model
return ['0' => __('Hot 0'), '1' => __('Hot 1')]; return ['0' => __('Hot 0'), '1' => __('Hot 1')];
} }
public function getPlatformList(){
return ['wechat_miniapp' => __('Platform wechat_miniapp'), 'tt_miniapp' => __('Platform tt_miniapp')];
}
protected function setPlatformAttr($value)
{
//如果是数组则转成字符串逗号拼接
$value = is_array($value) ? implode(',', $value) : $value;
return $value;
}
public function getNewList() public function getNewList()
{ {
return ['0' => __('New 0'), '1' => __('New 1')]; return ['0' => __('New 0'), '1' => __('New 1')];
@ -158,6 +185,9 @@ class Activity extends Model
} }
public function getNewTextAttr($value, $data) public function getNewTextAttr($value, $data)
{ {
$value = $value ? $value : (isset($data['new']) ? $data['new'] : ''); $value = $value ? $value : (isset($data['new']) ? $data['new'] : '');

View File

@ -205,6 +205,22 @@
<textarea id="c-content" data-rule="required" class="form-control editor" rows="5" name="row[content]" cols="50"></textarea> <textarea id="c-content" data-rule="required" class="form-control editor" rows="5" name="row[content]" cols="50"></textarea>
</div> </div>
</div> </div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Show')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="showList" item="vo"}
<label for="row[show]-{$key}"><input id="row[show]-{$key}" name="row[show]" type="radio" value="{$key}" {in name="key" value="1"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label> <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8"> <div class="col-xs-12 col-sm-8">
@ -262,7 +278,7 @@
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('New')}:</label> <label class="control-label col-xs-12 col-sm-2">{:__('New')}:</label>
<div class="col-xs-12 col-sm-8"> <div class="col-xs-12 col-sm-8">
<select id="c-new" class="form-control selectpicker" name="row[new]"> <select id="c-new" class="form-control selectpicker" name="row[new]">
{foreach name="newList" item="vo"} {foreach name="newList" item="vo"}
<option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option> <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option>
@ -271,6 +287,23 @@
</div> </div>
</div> </div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Platform')}:</label>
<div class="col-xs-12 col-sm-8">
<!--改为多选-->
<select id="c-platform" class="form-control selectpicker" name="row[platform][]" multiple>
{foreach name="platformList" item="vo"}
<option value="{$key}" selected >{$vo}</option>
{/foreach}
</select>
</div>
</div>
<!-- <div class="form-group">--> <!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>--> <!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">--> <!-- <div class="col-xs-12 col-sm-8">-->

View File

@ -274,7 +274,26 @@
</div> </div>
</div> </div>
<!-- <div class="form-group">-->
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Platform')}:</label>
<div class="col-xs-12 col-sm-8">
<!--改为多选-->
<select id="c-platform" class="form-control selectpicker" name="row[platform][]" multiple>
{foreach name="platformList" item="vo"}
<option value="{$key}" {in name="key" value="$row.platform"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>--> <!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">--> <!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-sale" class="form-control" name="row[sale]" type="number" value="{$row.sale|htmlentities}">--> <!-- <input id="c-sale" class="form-control" name="row[sale]" type="number" value="{$row.sale|htmlentities}">-->

View File

@ -207,6 +207,22 @@
<textarea id="c-content" data-rule="required" class="form-control editor" rows="5" name="row[content]" cols="50">{$row.content|htmlentities}</textarea> <textarea id="c-content" data-rule="required" class="form-control editor" rows="5" name="row[content]" cols="50">{$row.content|htmlentities}</textarea>
</div> </div>
</div> </div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Show')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="showList" item="vo"}
<label for="row[show]-{$key}"><input id="row[show]-{$key}" name="row[show]" type="radio" value="{$key}" {in name="key" value="$row.show"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label> <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8"> <div class="col-xs-12 col-sm-8">
@ -273,7 +289,31 @@
</div> </div>
</div> </div>
<!-- <div class="form-group">-->
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Platform')}:</label>
<div class="col-xs-12 col-sm-8">
<!--改为多选自动选中已选的-->
<select id="c-platform" class="form-control selectpicker" name="row[platform][]" multiple>
{foreach name="platformList" item="vo"}
<option value="{$key}" {in name="key" value="$row.platform"}selected{/in}>{$vo}</option>
{/foreach}
</select>
<!-- <div class="checkbox">-->
<!-- {foreach name="platformList" item="vo"}-->
<!-- <label for="row[platform]-{$key}"><input id="row[platform]-{$key}" name="row[platform][]" type="checkbox" value="{$key}" {in name="key" value="wechat_miniapp"}checked{/in} /> {$vo}</label>-->
<!-- {/foreach}-->
<!-- </div>-->
</div>
</div>
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>--> <!-- <label class="control-label col-xs-12 col-sm-2">{:__('Sale')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">--> <!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-sale" class="form-control" name="row[sale]" type="number" value="{$row.sale|htmlentities}">--> <!-- <input id="c-sale" class="form-control" name="row[sale]" type="number" value="{$row.sale|htmlentities}">-->

View File

@ -4,6 +4,13 @@
{:build_heading(null,FALSE)} {:build_heading(null,FALSE)}
<ul class="nav nav-tabs nav-custom2-condition">
<li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('不筛选渠道')}</a></li>
{foreach name="platformList" item="vo"}
<li class="{:$Think.get.platform === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
</ul>
<ul class="nav nav-tabs nav-custom-condition"> <ul class="nav nav-tabs nav-custom-condition">
<li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('不筛选审核')}</a></li> <li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('不筛选审核')}</a></li>
@ -58,4 +65,5 @@
</div> </div>
<script > <script >
var cateListJson = {$cateListJson}; var cateListJson = {$cateListJson};
var platformListJson = {$platformListJson};
</script> </script>

View File

@ -101,6 +101,7 @@ class Index extends Api
"activity_withdrawal_scale" => config("site.activity_withdrawal_scale"), "activity_withdrawal_scale" => config("site.activity_withdrawal_scale"),
"unpaid_activity_cancel_time"=> config("site.unpaid_activity_cancel_time"), "unpaid_activity_cancel_time"=> config("site.unpaid_activity_cancel_time"),
"unpaid_activity_expire_time"=> config("site.unpaid_activity_expire_time"), "unpaid_activity_expire_time"=> config("site.unpaid_activity_expire_time"),
"miniapp_activity_swtich"=> config("site.miniapp_activity_swtich"),
]; ];
$customer_service = [ $customer_service = [
"image"=>cdnurl(config('site.customer_service_image'),true), "image"=>cdnurl(config('site.customer_service_image'),true),
@ -113,7 +114,18 @@ class Index extends Api
"withdrawal_min"=>config("site.withdrawal_min"), "withdrawal_min"=>config("site.withdrawal_min"),
]; ];
$this->success('',["withdrawal_info"=>$withdrawal_info,"customer_service"=>$customer_service,"upload_config"=>$upload_config,"base_info"=>$base_info,"home_data"=>$home_data]); $activity_info = [
"refund_reason_data" =>array_values(config("site.refund_reason_data")?:[]),
];
$this->success('',[
"withdrawal_info"=>$withdrawal_info,
"customer_service"=>$customer_service,
"upload_config"=>$upload_config,
"base_info"=>$base_info,
"home_data"=>$home_data,
"activity_info"=>$activity_info,
]);
} }
/** /**

View File

@ -23,7 +23,7 @@ use app\admin\library\Wechat;
*/ */
class User extends Api class User extends Api
{ {
protected $noNeedLogin = ["registerLogin",'getOpenid','decodeData','login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third']; protected $noNeedLogin = ["registerLogin","getTtOpenid","decodeTtData",'getOpenid','decodeData','login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third'];
protected $noNeedRight = '*'; protected $noNeedRight = '*';
protected $miniConfig; protected $miniConfig;
@ -39,9 +39,64 @@ class User extends Api
/**
* @ApiTitle(获取抖音小程序openid信息)
* @ApiSummary(根据前端code换取openid信息)
* @ApiRoute(/api/user/getTtOpenid)
* @ApiMethod(GET)
* @ApiParams(name="code",type="string",required=true,description="前端code值")
* @ApiReturnParams(name="code", type="integer",required=true, sample="0")
* @ApiReturnParams(name="msg", type="string",required=true, sample="获取成功")
* @ApiReturnParams(name="data", type="bject",required=true, description= "扩展数据")
* @ApiReturn({
"code" => 1,
"msg" => "获取成功",
"data" => {}
*})
*/
public function getTtOpenid(){
$code = $this->request->param('code/s');
//获取配置
$appId = config("site.tt_app_key"); // 替换为你的抖音小程序 AppID
$appSecret = config("site.tt_app_secret"); // 替换为你的抖音小程序 AppSecret
try {
$url = "https://developer.toutiao.com/api/apps/jscode2session?appid={$appId}&secret={$appSecret}&code={$code}";
$response = file_get_contents($url);
$data = json_decode($response, true);
if (isset($data['openid'])) {
$result = [
'openid' => $data['openid'],
'unionid' => $data['unionid'] ?? null
];
} else {
$result = $data;
}
} catch (\WeChat\Exceptions\LocalCacheException $e){
$this->error($e->getMessage());
} catch (\Exception $e){
$this->error($e->getMessage());
}
if(empty($result['openid'])){
$this->error(__('获取openid失败'),$result);
}
Cache::set('tt_miniapp_code'.$code.$result['openid'],"1",60);
$this->success('',$result);
}
/** /**
* @ApiTitle(获取小程序openid信息) * @ApiTitle(获取微信小程序openid信息)
* @ApiSummary(根据前端code换取openid信息) * @ApiSummary(根据前端code换取openid信息)
* @ApiRoute(/api/user/getOpenid) * @ApiRoute(/api/user/getOpenid)
* @ApiMethod(GET) * @ApiMethod(GET)
@ -77,8 +132,8 @@ class User extends Api
} }
/** /**
* @ApiTitle(加密信息解密) * @ApiTitle(微信加密信息解密)
* @ApiSummary(解密微信信息) * @ApiSummary(微信解密微信信息)
* @ApiRoute(/api/user/decodeData) * @ApiRoute(/api/user/decodeData)
* @ApiMethod(POST) * @ApiMethod(POST)
* @ApiParams(name = "iv", type = "string",required=true) * @ApiParams(name = "iv", type = "string",required=true)
@ -107,6 +162,89 @@ class User extends Api
/**
* @ApiTitle(抖音小程序加密信息解密)
* @ApiSummary(解密抖音小程序返回的加密数据)
* @ApiRoute(/api/user/decodeTtData)
* @ApiMethod(POST)
* @ApiParams(name = "iv", type = "string", required=true, description="初始向量")
* @ApiParams(name = "encryptedData", type = "string", required=true, description="加密数据")
* @ApiParams(name = "sessionKey", type = "string", required=true, description="会话密钥")
* @ApiReturn({
"code" => 1,
"msg" => "获取成功",
"data" => {}
*})
*/
public function decodeTtData()
{
$iv = $this->request->param('iv/s');
$encryptedData = $this->request->param('encryptedData/s');
$sessionKey = $this->request->param('sessionKey/s');
if (empty($iv) || empty($encryptedData) || empty($sessionKey)) {
$this->error(__('参数缺失'));
}
try {
// 调用服务层进行解密
$result = $this->decryptTtData($encryptedData, $sessionKey, $iv);
// 缓存手机号(如存在)
$phoneNumber = $result['phoneNumber'] ?? ($result['purePhoneNumber'] ?? '');
if ($phoneNumber) {
Cache::set("tt_miniapp_core{$phoneNumber}", "1", 60);
}
$this->success('解密成功', $result);
} catch (\Exception $e) {
$this->error("解密失败:" . $e->getMessage());
}
}
/**
* 抖音小程序数据解密
*
* @param string $encryptedData 加密数据
* @param string $sessionKey 会话密钥
* @param string $iv 初始向量
* @return array 解密后的用户数据
* @throws Exception
*/
protected function decryptTtData(string $encryptedData, string $sessionKey, string $iv): array
{
// base64 decode
$sessionKey = base64_decode($sessionKey);
$iv = base64_decode($iv);
$encrypted = base64_decode($encryptedData);
// 解密
$decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $sessionKey, OPENSSL_RAW_DATA, $iv);
if (!$decrypted) {
throw new Exception('解密失败openssl_decrypt 错误');
}
// 去除 PKCS7 填充
$pad = ord($decrypted[strlen($decrypted) - 1]);
$decrypted = substr($decrypted, 0, strlen($decrypted) - $pad);
// 提取 JSON 数据
$data = json_decode($decrypted, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('JSON 解析失败');
}
return $data;
}
/** /**
* @ApiTitle(微信小程序授权登录注册通用[支持静默登录]) * @ApiTitle(微信小程序授权登录注册通用[支持静默登录])
* @ApiSummary(登录注册通用-支持静默登录) * @ApiSummary(登录注册通用-支持静默登录)
@ -115,7 +253,7 @@ class User extends Api
* @ApiParams(name = "mobile", type = "string",required=false,description = "mobile 静默非必传,手机授权必传") * @ApiParams(name = "mobile", type = "string",required=false,description = "mobile 静默非必传,手机授权必传")
* @ApiParams(name = "unionid", type = "string",required=false, description = "unionid 非必传") * @ApiParams(name = "unionid", type = "string",required=false, description = "unionid 非必传")
* @ApiParams(name = "apptype", type = "string",required=false, description = "应用类型默认miniapp") * @ApiParams(name = "apptype", type = "string",required=false, description = "应用类型默认miniapp")
* @ApiParams(name = "platform", type = "string",require=false, description = "平台标识默认wechat") * @ApiParams(name = "platform", type = "string",require=false, description = "平台标识默认wechat微信 tt抖音")
* @ApiParams(name = "openid", type = "string", require=true, description = "授权的openid") * @ApiParams(name = "openid", type = "string", require=true, description = "授权的openid")
* @ApiParams(name = "keeptime", type = "string", require=false, description = "token保持时间默认0永久") * @ApiParams(name = "keeptime", type = "string", require=false, description = "token保持时间默认0永久")
* @ApiParams(name = "code", type = "string", require=true, description = "授权的code") * @ApiParams(name = "code", type = "string", require=true, description = "授权的code")

View File

@ -10,7 +10,7 @@ use app\common\model\school\classes\Teacher as Teachermodel;
*/ */
class Message extends Base class Message extends Base
{ {
protected $noNeedLogin = ['message_count']; protected $noNeedLogin = ['message_count',"message_list"];
protected $noNeedRight = '*'; protected $noNeedRight = '*';
protected $model = null; protected $model = null;
@ -78,7 +78,7 @@ class Message extends Base
*/ */
public function message_list() public function message_list()
{ {
$user_id = 0; $user_id = -1;
$user = $this->auth->getUser();//登录用户 $user = $this->auth->getUser();//登录用户
if($user)$user_id = $user['id']; if($user)$user_id = $user['id'];
$page = $this->request->get('page/d', 0); //页数 $page = $this->request->get('page/d', 0); //页数

View File

@ -77,6 +77,7 @@ class NewActivity extends Base
* @ApiSummary(通用活动大索索列表) * @ApiSummary(通用活动大索索列表)
* @ApiMethod(GET) * @ApiMethod(GET)
* @ApiParams(name = "keywords", type = "string",required=false,description = "搜索关键字") * @ApiParams(name = "keywords", type = "string",required=false,description = "搜索关键字")
* @ApiParams(name = "platform", type = "string",required=false,description = "上架平台:wechat_miniapp=微信小程序,tt_miniapp=抖音小程序")
* @ApiParams(name = "my", type = "string",required=true,description = "是否查自己(需登录) 1是 0否") * @ApiParams(name = "my", type = "string",required=true,description = "是否查自己(需登录) 1是 0否")
* @ApiParams(name = "page", type = "string",required=true,description = "页数") * @ApiParams(name = "page", type = "string",required=true,description = "页数")
* @ApiParams(name = "limit", type = "string",required=true,description = "条数") * @ApiParams(name = "limit", type = "string",required=true,description = "条数")
@ -110,6 +111,9 @@ class NewActivity extends Base
$user = $this->auth->getUser();//登录用户 $user = $this->auth->getUser();//登录用户
if($user)$user_id = $user['id']; if($user)$user_id = $user['id'];
$params =[]; $params =[];
$params["platform"] = $this->request->get('platform/s', ''); //搜索关键字
$params["my"] = $this->request->get('my/d', 0); //机构店铺id $params["my"] = $this->request->get('my/d', 0); //机构店铺id
$params["my_user_id"] = $user_id; $params["my_user_id"] = $user_id;
$params["collect"] = $this->request->get('collect/d', 0); //页数 $params["collect"] = $this->request->get('collect/d', 0); //页数
@ -245,6 +249,7 @@ class NewActivity extends Base
* @ApiParams(name = "title", type = "string",required=true,description = "标题") * @ApiParams(name = "title", type = "string",required=true,description = "标题")
* @ApiParams(name = "sign_time", type = "string",required=true,description = "报名区间示例: 2025-04-08 00:01:00 - 2025-04-08 15:29:00") * @ApiParams(name = "sign_time", type = "string",required=true,description = "报名区间示例: 2025-04-08 00:01:00 - 2025-04-08 15:29:00")
* @ApiParams(name = "time", type = "string",required=true,description = "活动区间示例: 2025-04-09 00:01:00 - 2025-04-09 15:29:00") * @ApiParams(name = "time", type = "string",required=true,description = "活动区间示例: 2025-04-09 00:01:00 - 2025-04-09 15:29:00")
* @ApiParams(name = "platform", type = "string",required=false,description = "上架平台:wechat_miniapp=微信小程序,tt_miniapp=抖音小程序")
* @ApiParams(name = "images", type = "string",required=true,description = "轮播图多值逗号拼接") * @ApiParams(name = "images", type = "string",required=true,description = "轮播图多值逗号拼接")
* @ApiParams(name = "address", type = "string",required=false,description = "地图定位地址") * @ApiParams(name = "address", type = "string",required=false,description = "地图定位地址")
* @ApiParams(name = "address_detail", type = "string",required=false,description = "手录详细地址") * @ApiParams(name = "address_detail", type = "string",required=false,description = "手录详细地址")
@ -268,6 +273,8 @@ class NewActivity extends Base
$params["cate_ids"] = $this->request->post('cate_ids/s', ''); //课程标签 $params["cate_ids"] = $this->request->post('cate_ids/s', ''); //课程标签
$params["refund_id"] = $this->request->post('refund_id/d', ''); //课程标签 $params["refund_id"] = $this->request->post('refund_id/d', ''); //课程标签
$params["platform"] = $this->request->post('platform/s', 'wechat_miniapp'); //课程标签
$params["title"] = $this->request->post('title/s', ''); //老师id $params["title"] = $this->request->post('title/s', ''); //老师id
$params["images"] = $this->request->post('images/s', ''); //老师id $params["images"] = $this->request->post('images/s', ''); //老师id
@ -291,6 +298,8 @@ class NewActivity extends Base
//classes_type //classes_type
try{ try{
if(!config("site.miniapp_activity_swtich")) $this->error("已关闭发布渠道,请联系管理员后台添加!");
$res = $this->model->add($params,$user_id,'user',$user_id,true); $res = $this->model->add($params,$user_id,'user',$user_id,true);
}catch (\Throwable $e){ }catch (\Throwable $e){
$this->error($e->getMessage()); $this->error($e->getMessage());

View File

@ -28,7 +28,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_create_after", "event"=>"activity_order_create_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -85,7 +85,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_payed_after", "event"=>"activity_order_payed_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -149,7 +149,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_verification_after", "event"=>"activity_order_verification_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -208,7 +208,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_finish_after", "event"=>"activity_order_finish_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -272,7 +272,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_cancel_after", "event"=>"activity_order_cancel_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -326,7 +326,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_auth_fail_after", "event"=>"activity_order_auth_fail_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -393,7 +393,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_refund_success_after", "event"=>"activity_order_refund_success_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -449,7 +449,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_refund_fail_after", "event"=>"activity_order_refund_fail_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -518,7 +518,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_after_sales_after", "event"=>"activity_order_after_sales_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -584,7 +584,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_shop_confirm_after", "event"=>"activity_order_shop_confirm_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -642,7 +642,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_shop_reject_after", "event"=>"activity_order_shop_reject_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],
@ -700,7 +700,7 @@ class OrderHook
//记录订单日志 //记录订单日志
$mini_type = "activity_order"; $mini_type = "activity_order";
$to_id = $order["user_id"]; $to_id = $order["user_id"];
$status ="activity"; $status ="order";
$params=[ $params=[
"event"=>"activity_order_timeout_reject_after", "event"=>"activity_order_timeout_reject_after",
"order_id"=>$order["id"], "order_id"=>$order["id"],

View File

@ -38,7 +38,7 @@ class Message extends BaseModel
public function getCreatetimeTextAttr($value, $data) public function getCreatetimeTextAttr($value, $data)
{ {
$value = $value ? $value : (isset($data['createtime']) ? $data['createtime'] : ''); $value = $value ? $value : (isset($data['createtime']) ? $data['createtime'] : '');
return is_numeric($value) ? date("Y.m.d|H:i", $value) : $value; return is_numeric($value) ? date("Y.m.d H:i:s", $value) : $value;
} }
@ -148,6 +148,14 @@ class Message extends BaseModel
} }
public function getParamsAttr($value, $data)
{
//JSON转数组
$params = json_decode($value, true);
return $params;
}
public static $event_name = ""; public static $event_name = "";
@ -252,7 +260,7 @@ class Message extends BaseModel
$tableFields = (new static)->getTableFields(); $tableFields = (new static)->getTableFields();
foreach ($tableFields as $fields) foreach ($tableFields as $fields)
{ {
if(in_array($fields, ['platform','oper_type','to_type','status','mini_type','to_id']))continue; if(in_array($fields, ['platform','oper_type','to_type',"type",'status','mini_type','to_id']))continue;
// if (isset($whereData[$fields]) && $whereData[$fields]) $model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]); // if (isset($whereData[$fields]) && $whereData[$fields]) $model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]);
if (isset($whereData[$fields]) && $whereData[$fields]){ if (isset($whereData[$fields]) && $whereData[$fields]){
@ -266,8 +274,8 @@ class Message extends BaseModel
} }
if (isset($whereData['status'])) $model = $model->where("{$alisa}status", 'in', $whereData['status']); if (isset($whereData['status']) && $whereData['status']!=="") $model = $model->where("{$alisa}status", 'in', $whereData['status']);
if (isset($whereData['not_status'])) $model = $model->where("{$alisa}status", 'not in', $whereData['not_status']); if (isset($whereData['not_status'])&& $whereData['not_status']!=="") $model = $model->where("{$alisa}status", 'not in', $whereData['not_status']);
if (isset($whereData['keywords'])&&$whereData['keywords']) $model = $model->where("{$alisa}id|{$alisa}title|{$alisa}desc", '=', $whereData['keywords']); if (isset($whereData['keywords'])&&$whereData['keywords']) $model = $model->where("{$alisa}id|{$alisa}title|{$alisa}desc", '=', $whereData['keywords']);
if (isset($whereData['time'])&&$whereData['time']){ if (isset($whereData['time'])&&$whereData['time']){
$model = $model->time(["{$alisa}createtime",$whereData['time']]); $model = $model->time(["{$alisa}createtime",$whereData['time']]);
@ -286,6 +294,8 @@ class Message extends BaseModel
if (isset($whereData['mini_type']) && $whereData['mini_type']) $model = $model->where("{$alisa}mini_type", 'in', $whereData['mini_type']); if (isset($whereData['mini_type']) && $whereData['mini_type']) $model = $model->where("{$alisa}mini_type", 'in', $whereData['mini_type']);
if (isset($whereData['type']) && $whereData['type']) $model = $model->where("{$alisa}type", 'in', $whereData['type']);
if (isset($whereData['to_id']) && $whereData['to_id']){ if (isset($whereData['to_id']) && $whereData['to_id']){
$model = $model->where(function ($query) use($whereData,$alisa) { $model = $model->where(function ($query) use($whereData,$alisa) {
$query->where("{$alisa}to_id", $whereData['to_id']) $query->where("{$alisa}to_id", $whereData['to_id'])

View File

@ -50,6 +50,17 @@ class Activity extends BaseModel
public function getPlatformList(){
return ['wechat_miniapp' => __('Platform wechat_miniapp'), 'tt_miniapp' => __('Platform tt_miniapp')];
}
protected function setPlatformAttr($value)
{
//如果是数组则转成字符串逗号拼接
$value = is_array($value) ? implode(',', $value) : $value;
return $value;
}
public function getImagesAttr($value, $data) public function getImagesAttr($value, $data)
{ {
@ -688,7 +699,7 @@ class Activity extends BaseModel
$cate_list = Cate::where("status",'1')->column("name","id"); $cate_list = Cate::where("status",'1')->column("name","id");
// $label_list = Label::where("status",'1')->column("name","id"); // $label_list = Label::where("status",'1')->column("name","id");
// $type_list = Type::where("status",'1')->column("name","id"); // $type_list = Type::where("status",'1')->column("name","id");
$selfetch = self::with($with); $selfetch = self::with($with)->where("{$a}show", '=', '1');
@ -834,10 +845,10 @@ class Activity extends BaseModel
// if (isset($self_label_tag) && $self_label_tag) { if (isset($platform) && $platform) {
// $self_label_tag = implode("|",explode(',',$self_label_tag)); $platform = implode("|",explode(',',$platform));
// $selfetch = $selfetch->whereRaw(" {$a}self_label_tag REGEXP '({$self_label_tag})'"); $selfetch = $selfetch->whereRaw(" {$a}platform REGEXP '({$platform})'");
// } }
// //
// if (isset($classes_type) && $classes_type) { // if (isset($classes_type) && $classes_type) {
// $classes_type = implode("|",explode(',',$classes_type)); // $classes_type = implode("|",explode(',',$classes_type));

View File

@ -593,6 +593,9 @@ class Order extends BaseModel
if(!$activity ) throw new \Exception("该活动不存在!"); if(!$activity ) throw new \Exception("该活动不存在!");
//用户存不存在
$user_info = User::where('id',$user_id)->find();
if(!$user_info) throw new \Exception("用户不存在!");
//默认校验订单是否已创建 //默认校验订单是否已创建
if($check){ if($check){
if($activity['status']!='2' || $activity['auth_status']!='1') throw new \Exception("该活动不在可报名时间段!"); if($activity['status']!='2' || $activity['auth_status']!='1') throw new \Exception("该活动不在可报名时间段!");
@ -617,11 +620,21 @@ class Order extends BaseModel
throw new \Exception("活动人数已超{$sub}人!无法下单!"); throw new \Exception("活动人数已超{$sub}人!无法下单!");
} }
//检测当前活动下单总人数是否超过xx取配置超出不允许下单数量记得加上当前下单数量$num
$x = config("site.free_activity_max_people");
//查询当前活动下单总人数
$activity_order_num = self::where('activity_id',$activity_id)
->where('user_id',$user_id)
->where('status','in',['0','2','3','4','7','9'])->sum( 'num');
//修改:免费活动才判断
if($activity['feel'] == '1'){
if($activity_order_num + $num > $x){
throw new \Exception("当前活动您下单的人数已超{$x}人!无法下单!");
}
}
} }
//用户存不存在
$user_info = User::where('id',$user_id)->find();
if(!$user_info) throw new \Exception("用户不存在!");
@ -860,18 +873,23 @@ class Order extends BaseModel
$orderCode["miniurl"] = self::getMiniQrcodeLink(["order_id"=>$order['id'],"code"=>$orderCode["code"]]); $orderCode["miniurl"] = self::getMiniQrcodeLink(["order_id"=>$order['id'],"code"=>$orderCode["code"]]);
$url_params = ["id"=>$order['id'],"code"=>$orderCode["code"]];
//转成url参数?xx&xx
$url_params = http_build_query($url_params);
//生成核销二维码和一维码 //生成核销二维码和一维码
// //生成二维码和一维码 // //生成二维码和一维码
// //二维码 // //二维码
// $orderCode->codeimage = (Common::getQrcode([ $orderCode->codeimage = (Common::getQrcode([
// 'text' => $orderCode["miniurl"], 'text' => $orderCode["miniurl"] . '?' . $url_params,
// 'size' => 200, 'size' => 200,
// ]))['url']; ]))['url'];
// //一维码 //一维码
// $orderCode->codeoneimage = (Common::getBarcode([ $orderCode->codeoneimage = (Common::getBarcode([
// 'text' => $orderCode["miniurl"], 'text' => $orderCode["miniurl"] . '?' . $url_params,
// 'size' => 200, 'size' => 200,
// ]))['url']; ]))['url'];
$orderCode->save(); $orderCode->save();

View File

@ -39,13 +39,19 @@ define(['jquery', 'bootstrap', 'backend', 'csmtable', 'form'], function ($, unde
{field: 'title', title: __('Title'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content}, {field: 'title', title: __('Title'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'images', title: __('Images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images}, {field: 'images', title: __('Images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},
{field: 'feel', title: __('Feel'), searchList: {"0":__('Feel 0'),"1":__('Feel 1')}, formatter: Table.api.formatter.normal}, {field: 'feel', title: __('Feel'), searchList: {"0":__('Feel 0'),"1":__('Feel 1')}, formatter: Table.api.formatter.normal},
{field: 'cate_ids', title: __('Cate_ids'), searchList: cateListJson, formatter: Table.api.formatter.flag},
{field: 'platform', title: __('Platform'), searchList: platformListJson, formatter: Table.api.formatter.flag},
{field: 'show', title: __('Show'), searchList: {"1":__('Show 1'),"2":__('Show 2')}, formatter: Table.api.formatter.status},
{field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),"3":__('Status 3'),"4":__('Status 4'),"5":__('Status 5'),"-1":__('Status -1')}, formatter: Table.api.formatter.status}, {field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),"3":__('Status 3'),"4":__('Status 4'),"5":__('Status 5'),"-1":__('Status -1')}, formatter: Table.api.formatter.status},
{field: 'auth_status', title: __('Auth_status'), searchList: {"0":__('Auth_status 0'),"1":__('Auth_status 1'),"2":__('Auth_status 2')}, formatter: Table.api.formatter.status}, {field: 'auth_status', title: __('Auth_status'), searchList: {"0":__('Auth_status 0'),"1":__('Auth_status 1'),"2":__('Auth_status 2')}, formatter: Table.api.formatter.status},
{field: 'reason', title: __('Reason'), operate: 'LIKE'}, {field: 'reason', title: __('Reason'), operate: 'LIKE'},
// {field: 'address_city', title: __('Address_city'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content}, // {field: 'address_city', title: __('Address_city'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
// {field: 'cate_ids', title: __('Cate_ids'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content}, // {field: 'cate_ids', title: __('Cate_ids'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'cate_ids', title: __('Cate_ids'), searchList: cateListJson, formatter: Table.api.formatter.flag},
// {field: 'province', title: __('Province')}, // {field: 'province', title: __('Province')},
// {field: 'city', title: __('City')}, // {field: 'city', title: __('City')},
// {field: 'district', title: __('District')}, // {field: 'district', title: __('District')},
@ -233,6 +239,48 @@ define(['jquery', 'bootstrap', 'backend', 'csmtable', 'form'], function ($, unde
//自定义Tab筛选条件
$('.panel-heading .nav-custom2-condition a[data-toggle="tab"]', table.closest(".panel-intro")).on('shown.bs.tab', function (e) {
var value = $(this).data("value");
var options = table.bootstrapTable('getOptions');
var queryParams = options.queryParams;
options.pageNumber = 1;
options.queryParams = function (params) {
//这一行必须要存在,否则在点击下一页时会丢失搜索栏数据
params = queryParams(params);
//如果希望追加搜索条件,可使用
var filter = params.filter ? JSON.parse(params.filter) : {};
var op = params.op ? JSON.parse(params.op) : {};
if (value!=="") {
//这里可以自定义多个筛选条件
filter.platform = value;
op.platform = 'FIND_IN_SET';
}else{
//console.log("111111111111111111");
//选全部时要移除相应的条件
delete filter.platform;
delete op.platform;
}
params.filter = JSON.stringify(filter);
params.op = JSON.stringify(op);
//如果希望忽略搜索栏搜索条件,可使用
//params.filter = JSON.stringify(value?{admin_id: value}:{});
//params.op = JSON.stringify(value?{admin_id: '='}:{});
return params;
};
table.trigger("uncheckbox");
table.bootstrapTable('refresh', {pageNumber: 1});
return false;
});
}, },
recyclebin: function () { recyclebin: function () {
// 初始化表格参数配置 // 初始化表格参数配置