Prechádzať zdrojové kódy

【Add】灯谜活动

liuxiangxin 4 mesiacov pred
rodič
commit
fe9f90b772

+ 261 - 0
app/Http/Controllers/Admin/RiddleActive.php

@@ -0,0 +1,261 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Facades\Servers\WechatMini\Mini;
+use App\Http\Requests\Admin\Riddle\Active as Request;
+use App\Models\Riddle\Active as Model;
+use App\Models\City;
+use App\Models\WeiBan\Tags as WeiBanTags;
+use Intervention\Image\Facades\Image;
+
+/**
+ * 灯谜活动规则
+ *
+ * @author    刘相欣
+ *
+ */
+class RiddleActive extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','灯谜活动');
+		$this->assign('breadcrumb2','活动列表');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model){
+		// 接收参数
+		$name					= request('name','');
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $name )				$map[] = ['name','=',$name];
+		// 查询数据
+		$list					= $Model->query()->where($map)->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 小程序链接
+			$value['mp_urllink']= $this->getUrlLink($value['id']);
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 分配数据
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		$this->assign('list',$list);
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+	/**
+	 * 获取小程序链接
+	 * 
+	 */
+	private function getUrlLink($id){
+
+		return                 '';
+		// 结果数据
+        $link                  = cache('admin:riddle:active:urllink:'.$id);
+        // 不存在数据
+        if ( is_null($link) ) {
+            // 从数据库获取数据
+            $link              = Mini::getUrlLink('pages/riddle/active','id='.$id);
+            // 存起来
+            cache(['admin:riddle:active:urllink:'.$id=>$link],$link ? now()->addDays(28) : now()->addMinutes(3));
+        }
+        // 返回结果
+        return                  $link;
+
+	}
+
+	/**
+	 * 获取小程序海报
+	 * 
+	 */
+	public function get_poster(Model $Model){
+		// 接收参数
+		$id								= request('id',0);
+		// 查询用户
+		$oldData						= $Model->where(['id'=>$id])->first();
+		// 错误告知
+		if( !$oldData )					return $this->error('查无数据');
+		// 获取分享海报图片
+		$result 						= $this->getShareImage('id='.$id);
+		// 错误提示
+		if( isset($result['error']) )	return $this->error($result['error']);
+		// 分配数据
+		$this->assign('image',$result);
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','海报');
+		// 加载模板
+		return 							$this->fetch();
+	}
+
+	/**
+	 * 获取分享海报图片
+	 * @param  int $scene  场景值
+	 * 
+	 */
+	private function getShareImage($scene){
+		// 尝试执行
+		try {
+			// 加载图片
+			$image							= Image::make(public_path('uploads/images/poster/').'score_reward.png');
+			// 生成小程序二维码
+			$qrcode							= Mini::getUnlimit($scene,['page'=>'pages/orders/lottery','width'=>280,'is_hyaline'=>true]);
+			// 错误提示
+			if( isset($qrcode['error']) )	return $qrcode;
+			// 加载图片
+			$qrcode							= Image::make($qrcode)->resize(200,200);
+			// 插入图片
+			$image->insert($qrcode,'bottom-left',60,60);
+			// 转码成字符串
+			$image							= $image->encode('jpg', 90)->__toString();
+			// 转base64
+			$base64							= 'data:image/jpg;base64,' . base64_encode($image);
+			// 返回结果
+			return							$base64;
+		} catch (\Throwable $th) {
+			// 错误提示
+			return 							['error'=>$th->getMessage()];
+		}
+	}
+
+	/**
+	 * 添加
+	 * 
+	 * */
+	public function add(Request $request,Model $Model,City $City,WeiBanTags $WeiBanTags){
+		if( request()->isMethod('post') ){
+			// 验证参数
+			$request->scene('add')->validate();
+			// 接收数据
+			$data['logo']			= request('logo','');
+			$data['name']			= request('name','');
+			$data['rule']			= request('rule','');
+			$data['join_total']		= request('join_total',0);
+			$data['join_share']		= request('join_share',0);
+			$data['lottery_id']		= request('lottery_id',0);
+			$data['start_time']		= request('start_time','');
+			$data['end_time']		= request('end_time','');
+			$data['start_time']		= $data['start_time'] ? strtotime($data['start_time']) : 0;
+			$data['end_time']		= $data['end_time'] ? strtotime($data['end_time']) : 0;
+			$cityIds				= request('city_ids',[]);
+			$tagScope				= request('tag_scope',[]);
+			$data['city_ids']		= implode(',',$cityIds);
+			$data['tag_scope']		= implode(',',$tagScope);
+			$data['status']			= 1;
+			// 写入数据表
+			$id						= $Model->add($data);
+			// 如果操作失败
+			if( !$id ) 				return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
+		}
+		// 获取列表
+		$cityList					= $City->getCityList();
+		// 标签列表
+		$tagData					= $WeiBanTags->query()->groupBy('group')->groupBy('name')->get(['group','name'])->toArray();
+		// 标签列表
+		$tagList					= [];
+		// 循环数据
+		foreach ($tagData as $value) {
+			$tagList[$value['group']][] = $value['name'];
+		}
+		// 分配数据
+		$this->assign('cityList',$cityList);
+		$this->assign('tagList',$tagList);
+		$this->assign('crumbs','新增');
+		// 加载模板
+		return						$this->fetch(); 
+	}
+
+	/**
+	 * 修改
+	 * 
+	 * */
+	public function edit(Request $request,Model $Model,City $City,WeiBanTags $WeiBanTags){
+		// 接收参数
+		$id							= request('id',0);
+		// 查询用户
+		$oldData					= $Model->where(['id'=>$id])->first();
+		// 修改
+		if(request()->isMethod('post')){
+			// 验证参数
+			$request->scene('edit')->validate();
+			// 接收数据
+			$data['logo']			= request('logo','');
+			$data['name']			= request('name','');
+			$data['rule']			= request('rule','');
+			$data['join_total']		= request('join_total',0);
+			$data['join_share']		= request('join_share',0);
+			$data['lottery_id']		= request('lottery_id',0);
+			$data['start_time']		= request('start_time','');
+			$data['end_time']		= request('end_time','');
+			$data['start_time']		= $data['start_time'] ? strtotime($data['start_time']) : 0;
+			$data['end_time']		= $data['end_time'] ? strtotime($data['end_time']) : 0;
+			$cityIds				= request('city_ids',[]);
+			$tagScope				= request('tag_scope',[]);
+			$data['city_ids']		= implode(',',$cityIds);
+			$data['tag_scope']		= implode(',',$tagScope);
+			// 写入数据表
+			$result					= $Model->edit($id,$data);
+			// 如果操作失败
+			if( !$result ) 			return json_send(['code'=>'error','msg'=>'修改失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
+		}
+		// 错误告知
+		if( !$oldData )				return $this->error('查无数据');
+		// 获取城市ID
+		$oldData['city_ids']		= explode(',',$oldData['city_ids']);
+		$oldData['tag_scope']		= explode(',',$oldData['tag_scope']);
+		// 获取列表
+		$cityList					= $City->getCityList();
+		// 标签列表
+		$tagData					= $WeiBanTags->query()->groupBy('group')->groupBy('name')->get(['group','name'])->toArray();
+		// 标签列表
+		$tagList					= [];
+		// 循环数据
+		foreach ($tagData as $value) {
+			$tagList[$value['group']][] = $value['name'];
+		}
+		// 分配数据
+		$this->assign('cityList',$cityList);
+		$this->assign('tagList',$tagList);
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','修改');
+		// 加载模板
+		return						$this->fetch();
+	}
+
+	/**
+	 * 修改状态
+	 * 
+	 * */
+	public function set_status(Request $request,Model $Model){
+		// 验证参数
+		$request->scene('set_status')->validate();
+		// 设置状态
+		$id				= request('id',0);
+		$status			= request('status',0);
+		// 查询用户
+		$oldData		= $Model->where(['id'=>$id])->first();
+		// 如果用户不存在
+		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
+		// 执行修改
+		$result			= $Model->edit($id,['status'=>$status]);
+		// 提示新增失败
+		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
+		// 记录行为
+		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['status'=>$status]);
+		// 告知结果
+		return 			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
+	}
+
+}

+ 154 - 0
app/Http/Controllers/Admin/RiddleAnswer.php

@@ -0,0 +1,154 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Http\Requests\Admin\Riddle\Answer as Request;
+use App\Models\Riddle\Answer as Model;
+use App\Models\Riddle\Question as Question;
+/**
+ * 灯谜答案
+ *
+ * @author    刘相欣
+ *
+ */
+class RiddleAnswer extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','灯谜活动');
+		$this->assign('breadcrumb2','灯谜选项');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,Question $Question){
+		// 接收参数
+		$questionId				= request('question_id','');
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $questionId )		$map[] = ['question_id','=',$questionId];
+		// 查询数据
+		$list					= $Model->query()->where($map)->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 问题列表
+		$questionList			= $Question->query()->get(['id','title'])->toArray();
+		// 分配数据
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		$this->assign('questionList',$questionList);
+		$this->assign('list',$list);
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+
+	/**
+	 * 添加
+	 * 
+	 * */
+	public function add(Request $request,Model $Model,Question $Question){
+		if( request()->isMethod('post') ){
+			// 验证参数
+			$request->scene('add')->validate();
+			// 接收数据
+			$data['question_id']	= request('question_id',0);
+			$data['value']			= request('value','');
+			// 通过查询
+			$count					= count($Model->getListByQuestion($data['question_id']));
+			// 最多添加4个选项
+			if( $count >= 4 )		return json_send(['code'=>'error','msg'=>'最多添加4个选项']);
+			// 写入数据表
+			$id						= $Model->add($data);
+			// 如果操作失败
+			if( !$id ) 				return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
+		}
+		// 问题列表
+		$questionList				= $Question->query()->get(['id','title'])->toArray();
+		// 分配数据
+		$this->assign('questionList',$questionList);
+		$this->assign('crumbs','新增');
+		// 加载模板
+		return						$this->fetch(); 
+	}
+
+	/**
+	 * 修改
+	 * 
+	 * */
+	public function edit(Request $request,Model $Model,Question $Question){
+		// 接收参数
+		$id							= request('id',0);
+		// 查询用户
+		$oldData					= $Model->where(['id'=>$id])->first();
+		// 修改
+		if(request()->isMethod('post')){
+			// 验证参数
+			$request->scene('edit')->validate();
+			// 接收数据
+			$data['question_id']	= request('question_id',0);
+			$data['value']			= request('value','');
+			// 获取当前问题
+			$oldQuestion			= $Model->getOne($data['question_id'],$id,'question_id');
+			// 如果当前选项值,不是当前的问题ID
+			if( $oldQuestion != $data['question_id'] ){
+				// 通过查询
+				$count					= count($Model->getListByQuestion($data['question_id']));
+				// 最多添加4个选项
+				if( $count >= 4 )		return json_send(['code'=>'error','msg'=>'最多添加4个选项']);
+			}
+			// 写入数据表
+			$result					= $Model->edit($id,$data);
+			// 如果操作失败
+			if( !$result ) 			return json_send(['code'=>'error','msg'=>'修改失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
+		}
+		// 错误告知
+		if( !$oldData )				return $this->error('查无数据');
+		// 问题列表
+		$questionList				= $Question->query()->get(['id','title'])->toArray();
+		// 分配数据
+		$this->assign('questionList',$questionList);
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','修改');
+		// 加载模板
+		return						$this->fetch();
+	}
+
+	/**
+	 * 修改状态
+	 * 
+	 * */
+	public function set_answer(Request $request,Model $Model){
+		// 验证参数
+		$request->scene('set_answer')->validate();
+		// 设置状态
+		$id				= request('id',0);
+		$status			= request('is_answer',0);
+		// 查询用户
+		$oldData		= $Model->where(['id'=>$id])->first();
+		// 如果用户不存在
+		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
+		// 执行修改
+		$result			= $Model->query()->where([['question_id','=',$oldData['question_id']]])->update(['is_answer'=>0]);
+		// 执行修改
+		$result			= $Model->edit($id,['is_answer'=>$status]);
+		// 提示新增失败
+		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
+		// 记录行为
+		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['status'=>$status]);
+		// 告知结果
+		return 			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
+	}
+
+}

+ 129 - 0
app/Http/Controllers/Admin/RiddleQuestion.php

@@ -0,0 +1,129 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Http\Requests\Admin\Riddle\Question as Request;
+use App\Models\Riddle\Question as Model;
+
+/**
+ * 灯谜活动题目
+ *
+ * @author    刘相欣
+ *
+ */
+class RiddleQuestion extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','灯谜活动');
+		$this->assign('breadcrumb2','灯谜题目');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model){
+		// 接收参数
+		$name					= request('title','');
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $name )				$map[] = ['title','=',$name];
+		// 查询数据
+		$list					= $Model->query()->where($map)->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 分配数据
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		$this->assign('list',$list);
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+
+	/**
+	 * 添加
+	 * 
+	 * */
+	public function add(Request $request,Model $Model){
+		if( request()->isMethod('post') ){
+			// 验证参数
+			$request->scene('add')->validate();
+			// 接收数据
+			$data['title']			= request('title','');
+			$data['status']			= 1;
+			// 写入数据表
+			$id						= $Model->add($data);
+			// 如果操作失败
+			if( !$id ) 				return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
+		}
+		// 分配数据
+		$this->assign('crumbs','新增');
+		// 加载模板
+		return						$this->fetch(); 
+	}
+
+	/**
+	 * 修改
+	 * 
+	 * */
+	public function edit(Request $request,Model $Model){
+		// 接收参数
+		$id							= request('id',0);
+		// 查询用户
+		$oldData					= $Model->where(['id'=>$id])->first();
+		// 修改
+		if(request()->isMethod('post')){
+			// 验证参数
+			$request->scene('edit')->validate();
+			// 接收数据
+			$data['title']			= request('title','');
+			// 写入数据表
+			$result					= $Model->edit($id,$data);
+			// 如果操作失败
+			if( !$result ) 			return json_send(['code'=>'error','msg'=>'修改失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
+		}
+		// 错误告知
+		if( !$oldData )				return $this->error('查无数据');
+		// 分配数据
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','修改');
+		// 加载模板
+		return						$this->fetch();
+	}
+
+	/**
+	 * 修改状态
+	 * 
+	 * */
+	public function set_status(Request $request,Model $Model){
+		// 验证参数
+		$request->scene('set_status')->validate();
+		// 设置状态
+		$id				= request('id',0);
+		$status			= request('status',0);
+		// 查询用户
+		$oldData		= $Model->where(['id'=>$id])->first();
+		// 如果用户不存在
+		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
+		// 执行修改
+		$result			= $Model->edit($id,['status'=>$status]);
+		// 提示新增失败
+		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
+		// 记录行为
+		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['status'=>$status]);
+		// 告知结果
+		return 			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
+	}
+
+}

+ 81 - 0
app/Http/Controllers/Api/Riddle/Active.php

@@ -0,0 +1,81 @@
+<?php namespace App\Http\Controllers\Api\Riddle;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Riddle\Active as Model;
+use App\Models\Riddle\ActiveShare;
+use App\Models\Riddle\ActiveRecord;
+use App\Models\Custom;
+use App\Models\WeiBan\Tags as WeiBanTags;
+
+/**
+ * 灯谜活动
+ * 
+ * @author 刘相欣
+ * 
+ * */
+class Active extends Api{
+
+	/**
+	 * 获取抽奖配置		/api/riddle_active/get_detail
+	 * 
+	 * */
+	public function get_detail(Model $Model,Custom $Custom,WeiBanTags $WeiBanTags,ActiveShare $ActiveShare,ActiveRecord $ActiveRecord){
+		// 接口验签
+		// $this->verify_sign();
+		// 检查登录
+		$uid							= $this->checkLogin();
+		// 获取客户信息
+		$custom							= $Custom->getOne($uid);
+		// 如果存在的话
+		if( !$custom )					return json_send(['code'=>'no_login','msg'=>'请登录','data'=>['error'=>'无对应客户']]);
+		// 接收参数
+		$id 							= request('id',0);
+		// 获取客户城市的数据
+		$data			                = $Model->getOne($id);
+		// 如果存在的话
+		if( !$data )					return json_send(['code'=>'error','msg'=>'暂无活动','data'=>$data]);
+		// 默认可以参加活动
+		$data['allow_join']				= 1;
+		// 判断是不是可以参与
+		if( $data['tag_scope'] )		{
+			// 解析数组
+			$data['tag_scope']			= explode(',',$data['tag_scope']);
+			// 查询用户标签
+			$tags						= $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']);
+			// 标签范围限定时,默认不能参与
+			$data['allow_join'] 		= 0;
+			// 判断标签是不是存在
+			foreach ($tags as $value) 	{
+				// 标签范围内,允许参加
+				if( in_array($value['name'],$data['tag_scope']) )  $data['allow_join'] = 1;
+			}
+			// 如果不能参与
+			if( !$data['allow_join'] )	return json_send(['code'=>'error','msg'=>'账号不在标签范围','data'=>['error'=>'不在标签范围内']]);
+		}
+		// 判断是不是可以参与
+		if( $data['city_ids'] )			{
+			// 解析数组
+			$data['city_ids']			= explode(',',$data['city_ids']);
+			// 如果不在城市范围
+			if( !in_array($custom['city_id'],$data['city_ids']) ) $data['allow_join'] = 0;
+			// 如果不能参与
+			if( !$data['allow_join'] )	return json_send(['code'=>'error','msg'=>'账号不在活动城市','data'=>['error'=>'账号不在活动城市']]);
+		}
+		// 获取参与次数
+		$joinTotal						= $ActiveRecord->query()->where([['active_id','=',$id],['custom_uid','=',$uid]])->count();
+		// 获取答题次数
+		$shareTotal						= $ActiveShare->query()->where([['active_id','=',$id],['custom_uid','=',$uid]])->count();
+		// 计算答题次数
+		$data['join_total']				= $data['join_total'] + ( $shareTotal >= $data['join_share'] ? $data['join_share'] : $shareTotal);
+		// 计算剩余参与次数
+		$data['join_last']				= $data['join_total'] - $joinTotal;
+		// 计算剩余分享次数
+		$data['share_last']				= ($data['join_share'] - $shareTotal <= 0 ? 0 : $data['join_share'] - $shareTotal);
+		// 删除不必要的数据
+		unset($data['allow_join'],$data['tag_scope'],$data['city_ids']);
+		// 返回结果
+		return							json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+	}
+
+	
+}

+ 45 - 0
app/Http/Controllers/Api/Riddle/ActiveShare.php

@@ -0,0 +1,45 @@
+<?php namespace App\Http\Controllers\Api\Riddle;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Riddle\Active;
+use App\Models\Riddle\ActiveShare as Model;
+
+/**
+ * 活动分享记录
+ * 
+ * @author 刘相欣
+ * 
+ * */
+class ActiveShare extends Api{
+
+	/**
+	 * 获取题目		/api/riddle_active_share/add
+	 * 
+	 * */
+	public function add(Model $Model,Active $Active){
+		// 接口验签
+		// $this->verify_sign();
+		// 检查登录
+		$uid							= $this->checkLogin();
+		// 获取参数
+		$activeId						= request('active_id',0);
+		// 获取客户城市的数据
+		$data			                = $Active->getOne($activeId);
+		// 如果存在的话
+		if( !$data )					return json_send(['code'=>'error','msg'=>'活动已下线或不存在','data'=>'']);
+		// 获取答题次数
+		$shareTotal						= $Model->query()->where([['active_id','=',$activeId],['custom_uid','=',$uid]])->count();
+		// 计算剩余分享次数
+		$data['share_last']				= ($data['join_share'] - $shareTotal <= 0 ? 0 : $data['join_share'] - $shareTotal);
+		// 如果次数不够
+		if( $data['share_last'] <= 0 )	return json_send(['code'=>'error','msg'=>'您已经没有分享次数了','data'=>'']);
+		// 记录分享
+		$id 							= $Model->add(['active_id'=>$activeId,'custom_uid'=>$uid]);
+		// 分享成功
+		if( !$id )						return json_send(['code'=>'error','msg'=>'记录失败','data'=>'']);
+		// 返回结果
+		return							json_send(['code'=>'success','msg'=>'记录成功','data'=>['id'=>$id]]);
+	}
+
+	
+}

+ 78 - 0
app/Http/Controllers/Api/Riddle/Answer.php

@@ -0,0 +1,78 @@
+<?php namespace App\Http\Controllers\Api\Riddle;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Riddle\Answer as Model;
+use App\Models\Riddle\Active;
+use App\Models\Riddle\ActiveShare;
+use App\Models\Riddle\ActiveRecord;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 灯谜问答
+ * 
+ * @author 刘相欣
+ * 
+ * */
+class Answer extends Api{
+
+
+	/**
+	 * 判断回答是否正确		/api/riddle_answer/check_answer
+	 * 
+	 * */
+	public function check_answer(Model $Model,Active $Active,ActiveRecord $ActiveRecord,ActiveShare $ActiveShare){
+		// 接口验签
+		// $this->verify_sign();
+		// 检查登录
+		$uid							= $this->checkLogin();
+		// 获取参数
+		$activeId						= request('active_id',0);
+		$questionId						= request('question_id',0);
+		$answerId						= request('answer_id',0);
+		// 获取客户城市的数据
+		$data			                = $Active->getOne($activeId);
+		// 如果存在的话
+		if( !$data )					return json_send(['code'=>'error','msg'=>'活动已下线或不存在','data'=>'']);
+		// 获取参与次数
+		$joinTotal						= $ActiveRecord->query()->where([['active_id','=',$activeId],['custom_uid','=',$uid]])->count();
+		// 获取答题次数
+		$shareTotal						= $ActiveShare->query()->where([['active_id','=',$activeId],['custom_uid','=',$uid]])->count();
+		// 计算答题次数
+		$data['join_total']				= $data['join_total'] + ( $shareTotal >= $data['join_share'] ? $data['join_share'] : $shareTotal);
+		// 计算剩余参与次数
+		$data['join_last']				= $data['join_total'] - $joinTotal;
+		// 如果次数不够
+		if( $data['join_last'] <= 0 )	return json_send(['code'=>'error','msg'=>'您已经没有参与次数了','data'=>'']);
+		// 获取问题列表
+		$answer							= $Model->getOne($questionId,$answerId);
+		// 组合数据,写入订单表,子表
+		DB::beginTransaction();
+		try {
+			// 记录答题记录
+			$result						= $ActiveRecord->add(['active_id'=>$activeId,'custom_uid'=>$uid,'question_id'=>$questionId,'answer_id'=>$answerId,'is_answer'=>$answer['is_answer']]);
+			// 如果记录失败
+			if( !$result )				{
+				// 回滚事务
+				DB::rollBack();
+				// 返回结果
+				return					json_send(['code'=>'error','msg'=>'提交失败','data'=>['error'=>'答题记录失败']]);
+			}
+			// 判断答案是否正确
+			if( $answer['is_answer'] ) 	{
+				/**  
+				 * @todo
+				 * 对应的抽奖活动 为用户增加一次抽奖机会
+				 */
+			}
+			// 提交事务
+			DB::commit();
+			// 返回结果
+			return							json_send(['code'=>'success','msg'=>'提交成功','data'=>['is_answer'=>$answer['is_answer']]]);
+		} catch (\Throwable $th) {
+			// 返回结果
+			return							json_send(['code'=>'success','msg'=>'提交失败','data'=>['error'=>$th->getMessage()]]);
+		}
+	}
+
+	
+}

+ 46 - 0
app/Http/Controllers/Api/Riddle/Question.php

@@ -0,0 +1,46 @@
+<?php namespace App\Http\Controllers\Api\Riddle;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Riddle\Answer;
+use App\Models\Riddle\Question as Model;
+
+/**
+ * 灯谜问答
+ * 
+ * @author 刘相欣
+ * 
+ * */
+class Question extends Api{
+
+	/**
+	 * 获取题目		/api/riddle_question/get_question
+	 * 
+	 * */
+	public function get_question(Model $Model,Answer $Answer){
+		// 接口验签
+		// $this->verify_sign();
+		// 检查登录
+		$uid							= $this->checkLogin();
+		// 获取数据
+		$list							= $Model->getList();
+		// 返回结果
+		if( !$list )					return json_send(['code'=>'error','msg'=>'暂无题目','data'=>'']);
+		// 随机获取一条
+		$data							= $list[array_rand($list)];
+		// 获取问题列表
+		$data['answer_list']			= $Answer->getListByQuestion($data['id']);
+		// 循环处理
+		foreach ($data['answer_list'] as $key => $value) {
+			// 删除不必要字段
+			unset($value['is_answer'],$value['question_id']);
+			// 返回结果
+			$data['answer_list'][$key]	= $value;
+		}
+		// 重组结构
+		$data['answer_list']			= array_values($data['answer_list']);
+		// 返回结果
+		return							json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+	}
+
+	
+}

+ 52 - 0
app/Http/Requests/Admin/Riddle/Active.php

@@ -0,0 +1,52 @@
+<?php namespace App\Http\Requests\Admin\Riddle;
+
+use App\Http\Requests\BaseRequest;
+
+/**
+ * 灯谜活动验证器
+ * 
+ */
+class Active extends BaseRequest
+{
+    /**
+     * 获取应用于请求的规则
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        // 返回结果
+        return      [
+            // 有时候我们希望某个字段在第一次验证失败后就停止运行验证规则,只需要将 bail 添加到规则中:
+            // 验证字段,验证规则,提示信息
+	        'name' 			    => 'required|unique:riddle_active,name,'.request('id',0),
+	        'id'                => 'required|integer|gt:0',
+            'logo'              => 'required',
+        ];
+    }
+
+    // 场景列表
+    protected   $scenes         = [
+		'add'  		            => ['name','logo'],
+        'edit'  		        => ['id','name','logo'],
+        'set_status'  		    => ['id'],
+	];
+
+    /**
+     * 获取已定义验证规则的错误消息
+     *
+     * @return array
+     */
+    public function messages()
+    {
+        return [
+            'logo.required'     => '首图必选',
+            'name.required'     => '活动名称必填',
+            'name.required'     => '活动名称已存在',
+            'id.required'       => 'ID未知',
+            'id.integer'        => 'ID格式错误',
+            'id.gt'   		    => 'ID格式错误',
+        ];
+    }
+    
+}

+ 51 - 0
app/Http/Requests/Admin/Riddle/Answer.php

@@ -0,0 +1,51 @@
+<?php namespace App\Http\Requests\Admin\Riddle;
+
+use App\Http\Requests\BaseRequest;
+
+/**
+ * 灯谜选项验证器
+ * 
+ */
+class Answer extends BaseRequest
+{
+    /**
+     * 获取应用于请求的规则
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        // 返回结果
+        return      [
+            // 有时候我们希望某个字段在第一次验证失败后就停止运行验证规则,只需要将 bail 添加到规则中:
+            // 验证字段,验证规则,提示信息
+            'question_id' 		=> 'required|integer|gt:0',
+	        'value' 			=> 'required',
+	        'id'                => 'required|integer|gt:0',
+        ];
+    }
+
+    // 场景列表
+    protected   $scenes         = [
+		'add'  		            => ['value','question_id'],
+        'edit'  		        => ['id','value','question_id'],
+        'set_answer'  		    => ['id'],
+	];
+
+    /**
+     * 获取已定义验证规则的错误消息
+     *
+     * @return array
+     */
+    public function messages()
+    {
+        return [
+            'title.required'    => '灯谜题目必填',
+            'title.required'    => '灯谜题目已存在',
+            'id.required'       => 'ID未知',
+            'id.integer'        => 'ID格式错误',
+            'id.gt'   		    => 'ID格式错误',
+        ];
+    }
+    
+}

+ 50 - 0
app/Http/Requests/Admin/Riddle/Question.php

@@ -0,0 +1,50 @@
+<?php namespace App\Http\Requests\Admin\Riddle;
+
+use App\Http\Requests\BaseRequest;
+
+/**
+ * 灯谜活动验证器
+ * 
+ */
+class Question extends BaseRequest
+{
+    /**
+     * 获取应用于请求的规则
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        // 返回结果
+        return      [
+            // 有时候我们希望某个字段在第一次验证失败后就停止运行验证规则,只需要将 bail 添加到规则中:
+            // 验证字段,验证规则,提示信息
+	        'title' 			=> 'required|unique:riddle_question,title,'.request('id',0),
+	        'id'                => 'required|integer|gt:0',
+        ];
+    }
+
+    // 场景列表
+    protected   $scenes         = [
+		'add'  		            => ['title'],
+        'edit'  		        => ['id','title'],
+        'set_status'  		    => ['id'],
+	];
+
+    /**
+     * 获取已定义验证规则的错误消息
+     *
+     * @return array
+     */
+    public function messages()
+    {
+        return [
+            'title.required'    => '灯谜题目必填',
+            'title.required'    => '灯谜题目已存在',
+            'id.required'       => 'ID未知',
+            'id.integer'        => 'ID格式错误',
+            'id.gt'   		    => 'ID格式错误',
+        ];
+    }
+    
+}

+ 103 - 0
app/Models/Riddle/Active.php

@@ -0,0 +1,103 @@
+<?php namespace App\Models\Riddle;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 灯谜活动模型
+ * 
+ */
+class Active extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'riddle_active';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 如果操作失败
+        if( !$id )                          return $id;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 如果操作失败
+        if( !$result )                      return $result;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $result;
+    }
+
+    /**
+     * 获取列表
+     * @param   Bool    $force  是否强制更新
+     * 
+     */
+    public function getList($force = false)
+    {
+        // 结果数据
+        $list                  = $force ? [] : cache('admin:riddle:active:list');
+        // 不存在数据
+        if ( !$list ) {
+            // 从数据库获取数据
+            $data              = $this->query()->where(['status'=>0])->get(['id','name','logo','rule as active_rule','lottery_id','join_total','join_share','status','start_time','end_time','tag_scope','city_ids'])->toArray();
+            // 循环处理数据
+            $list              = [];
+            // 进行更新
+            foreach ($data as $value) {
+                // 重组数据
+                $list[$value['id']] = $value;
+            }
+            // 存起来
+            cache(['admin:riddle:active:list'=>$list]);
+        }
+        // 返回结果
+        return                  $list;
+    }
+
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   Array      用户ID
+     * @param   String     指定字段
+     * 
+     */
+    public function getOne($id,$field='')
+    {
+        // 获取列表数据
+        $list                   = $this->getList();
+        // 获取数据
+        $one                    = isset($list[$id]) ? $list[$id] : [];
+        // 返回值
+        return                  empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
+    }
+
+}

+ 56 - 0
app/Models/Riddle/ActiveRecord.php

@@ -0,0 +1,56 @@
+<?php namespace App\Models\Riddle;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 灯谜活动模型
+ * 
+ */
+class ActiveRecord extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'riddle_active_record';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 如果操作失败
+        if( !$id )                          return $id;
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 如果操作失败
+        if( !$result )                      return $result;
+        // 返回结果
+        return                              $result;
+    }
+
+
+}

+ 56 - 0
app/Models/Riddle/ActiveShare.php

@@ -0,0 +1,56 @@
+<?php namespace App\Models\Riddle;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 灯谜活动模型
+ * 
+ */
+class ActiveShare extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'riddle_active_share';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 如果操作失败
+        if( !$id )                          return $id;
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 如果操作失败
+        if( !$result )                      return $result;
+        // 返回结果
+        return                              $result;
+    }
+
+
+}

+ 125 - 0
app/Models/Riddle/Answer.php

@@ -0,0 +1,125 @@
+<?php namespace App\Models\Riddle;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 灯谜活动模型
+ * 
+ */
+class Answer extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'riddle_answer';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 如果操作失败
+        if( !$id )                          return $id;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 如果操作失败
+        if( !$result )                      return $result;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $result;
+    }
+
+    /**
+     * 获取列表
+     * @param   bool    $force  是否强制更新
+     * 
+     */
+    public function getList($force = false)
+    {
+        // 结果数据
+        $list                  = $force ? [] : cache('admin:riddle:answer:list');
+        // 不存在数据
+        if ( !$list ) {
+            // 从数据库获取数据
+            $data              = $this->query()->get(['id','question_id','value','is_answer'])->toArray();
+            // 循环处理数据
+            $list              = [];
+            // 进行更新
+            foreach ($data as $value) {
+                // 重组数据
+                $list[$value['question_id']][$value['id']] = $value;
+            }
+            // 存起来
+            cache(['admin:riddle:answer:list'=>$list]);
+        }
+        // 返回结果
+        return                  $list;
+    }
+
+
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   int     $questionId   问题ID
+     * @param   int     $id           ID
+     * @param   string  $field       字段名
+     * 
+     */
+    public function getListByQuestion($questionId)
+    {
+        // 获取列表数据
+        $list                   = $this->getList();
+        // 获取问题的列表
+        $list                   = isset($list[$questionId]) ? $list[$questionId] : [];
+        // 返回值
+        return                  $list;
+    }
+
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   int     $questionId   问题ID
+     * @param   int     $id           ID
+     * @param   string  $field       字段名
+     * 
+     */
+    public function getOne($questionId,$id,$field='')
+    {
+        // 获取列表数据
+        $list                   = $this->getList();
+        // 获取问题的列表
+        $list                   = isset($list[$questionId]) ? $list[$questionId] : [];
+        // 获取数据
+        $one                    = isset($list[$id]) ? $list[$id] : [];
+        // 返回值
+        return                  empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
+    }
+
+}

+ 103 - 0
app/Models/Riddle/Question.php

@@ -0,0 +1,103 @@
+<?php namespace App\Models\Riddle;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 灯谜活动模型
+ * 
+ */
+class Question extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'riddle_question';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 如果操作失败
+        if( !$id )                          return $id;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 如果操作失败
+        if( !$result )                      return $result;
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $result;
+    }
+
+    /**
+     * 获取列表
+     * @param   Bool    $force  是否强制更新
+     * 
+     */
+    public function getList($force = false)
+    {
+        // 结果数据
+        $list                  = $force ? [] : cache('admin:riddle:question:list');
+        // 不存在数据
+        if ( !$list ) {
+            // 从数据库获取数据
+            $data              = $this->query()->where([['status','=',0]])->get(['id','title'])->toArray();
+            // 循环处理数据
+            $list              = [];
+            // 进行更新
+            foreach ($data as $value) {
+                // 重组数据
+                $list[$value['id']] = $value;
+            }
+            // 存起来
+            cache(['admin:riddle:question:list'=>$list]);
+        }
+        // 返回结果
+        return                  $list;
+    }
+
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   Array      用户ID
+     * @param   String     指定字段
+     * 
+     */
+    public function getOne($id,$field='')
+    {
+        // 获取列表数据
+        $list                   = $this->getList();
+        // 获取数据
+        $one                    = isset($list[$id]) ? $list[$id] : [];
+        // 返回值
+        return                  empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
+    }
+
+}

+ 73 - 0
resources/views/admin/riddle_active/add.blade.php

@@ -0,0 +1,73 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-2">
+		<label class="control-label">活动首图 [1180*490]</label>
+		<div id="logo">
+			<a id="logo-image" href="#" data-toggle="image" class="img-thumb">
+				<img src="{{path_compat('')}}" width="120" />
+			</a>
+			<input type="hidden" name="logo" value="" id="input-logo" />
+		</div>
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">活动名称</label>
+		<input class="form-control" required="required" type="text" placeholder="活动名称" name="name" maxlength="45" value="" />
+	</div>
+	<div class="form-group col-sm-3">
+		<label class="control-label">参与次数</label>
+		<input class="form-control" required="required" type="number" placeholder="默认参与答题次数"  name="join_total" value="" />
+	</div>
+	<div class="form-group col-sm-3">
+		<label class="control-label">分享次数</label>
+		<input class="form-control" required="required" type="number" placeholder="分享次数,每次分享增加1次答题机会" name="join_share" value="" />
+	</div>
+	<div class="form-group col-sm-2">
+		<label class="control-label">抽奖ID</label>
+		<input class="form-control" required="required" type="number" placeholder="灯谜抽奖活动的ID" name="lottery_id" value="" />
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">开始时间</label>
+		<input class="form-control" required="required" type="datetime-local" placeholder="开始时间"  name="start_time" value="" />
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">结束时间</label>
+		<input class="form-control" required="required" type="datetime-local" placeholder="结束时间" name="end_time" value="" />
+	</div>
+	<div class="form-group col-sm-5">
+		<label class="control-label">活动城市</label>
+		<select name="city_ids[]" class="form-control selectpicker" data-max-options="20" data-live-search="true" data-live-search-placeholder="搜索城市" data-none-results-text="未搜索到 {0}" title="选择城市" multiple>
+			@foreach ($cityList as $group)
+			<optgroup label="{{$group['name']}}">
+				@foreach ($group['city'] as $city)
+				<option value="{{$city['id']}}" >{{$city['name']}}</option>
+				@endforeach
+			</optgroup>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-5">
+		<label class="control-label">标签范围(标签存在延迟,请慎用)</label>
+		<select name="tag_scope[]" class="form-control selectpicker" data-max-options="10" data-live-search="true" data-live-search-placeholder="搜索标签" data-none-results-text="未搜索到 {0}" title="选择标签" multiple>
+			@foreach ($tagList as $group=>$tags)
+			<optgroup label="{{$group}}">
+				@foreach ($tags as $tag)
+				<option value="{{$tag}}" >{{$tag}}</option>
+				@endforeach
+			</optgroup>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">活动规则</label>
+		<textarea class="form-control" name="rule" rows="10" placeholder="请输入活动规则" ></textarea>
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 74 - 0
resources/views/admin/riddle_active/edit.blade.php

@@ -0,0 +1,74 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-2">
+		<label class="control-label">活动首图 [1180*490]</label>
+		<div id="logo">
+			<a id="logo-image" href="#" data-toggle="image" class="img-thumb">
+				<img src="{{path_compat($oldData['logo'])}}" width="120" />
+			</a>
+			<input type="hidden" name="logo" value="{{$oldData['logo']}}" id="input-logo" />
+		</div>
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">活动名称</label>
+		<input class="form-control" required="required" type="text" placeholder="活动名称" name="name" maxlength="45" value="{{$oldData['name']}}" />
+	</div>
+	<div class="form-group col-sm-3">
+		<label class="control-label">参与次数</label>
+		<input class="form-control" required="required" type="number" placeholder="默认参与答题次数"  name="join_total" value="{{$oldData['join_total']}}" />
+	</div>
+	<div class="form-group col-sm-3">
+		<label class="control-label">分享次数</label>
+		<input class="form-control" required="required" type="number" placeholder="分享次数,每次分享增加1次答题机会" name="join_share" value="{{$oldData['join_share']}}" />
+	</div>
+	<div class="form-group col-sm-2">
+		<label class="control-label">抽奖ID</label>
+		<input class="form-control" required="required" type="number" placeholder="灯谜抽奖活动的ID" name="lottery_id" value="{{$oldData['lottery_id']}}" />
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">开始时间</label>
+		<input class="form-control" required="required" type="datetime-local" placeholder="开始时间"  name="start_time" value="{{date('Y-m-d H:i',$oldData['start_time'])}}" />
+	</div>
+	<div class="form-group col-sm-4">
+		<label class="control-label">结束时间</label>
+		<input class="form-control" required="required" type="datetime-local" placeholder="结束时间" name="end_time" value="{{date('Y-m-d H:i',$oldData['end_time'])}}" />
+	</div>
+	<div class="form-group col-sm-5">
+		<label class="control-label">活动城市</label>
+		<select name="city_ids[]" class="form-control selectpicker" data-max-options="20" data-live-search="true" data-live-search-placeholder="搜索城市" data-none-results-text="未搜索到 {0}" title="选择城市" multiple>
+			@foreach ($cityList as $group)
+			<optgroup label="{{$group['name']}}">
+				@foreach ($group['city'] as $city)
+				<option value="{{$city['id']}}"  @if(in_array($city['id'],$oldData['city_ids'])) selected @endif >{{$city['name']}}</option>
+				@endforeach
+			</optgroup>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-5">
+		<label class="control-label">标签范围(标签存在延迟,请慎用)</label>
+		<select name="tag_scope[]" class="form-control selectpicker" data-max-options="10" data-live-search="true" data-live-search-placeholder="搜索标签" data-none-results-text="未搜索到 {0}" title="选择标签" multiple>
+			@foreach ($tagList as $group=>$tags)
+			<optgroup label="{{$group}}">
+				@foreach ($tags as $tag)
+				<option value="{{$tag}}"  @if(in_array($tag,$oldData['tag_scope'])) selected @endif >{{$tag}}</option>
+				@endforeach
+			</optgroup>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">活动规则</label>
+		<textarea class="form-control" name="rule" rows="10" placeholder="请输入活动规则" >{{$oldData['rule']}}</textarea>
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input type="hidden" name="id" id="id" value="{{$oldData['id']}}" />
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 93 - 0
resources/views/admin/riddle_active/index.blade.php

@@ -0,0 +1,93 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+@if(check_auth('admin/riddle_active/add'))
+	<div class="page-header">
+		<a href="{{url('admin/riddle_active/add')}}" class="btn btn-primary">新增</a>
+	</div>
+@endif
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="name" value="{{request('name','')}}" placeholder="请输入活动名称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/riddle_active/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>活动ID</th>
+						<th>活动名称</th>
+						<th>开始时间</th>
+						<th>结束时间</th>
+						<th>活动状态</th>
+						<!-- <th>内部跳转</th> -->
+						<!-- <th>宣发链接</th> -->
+						<th>修改时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['name']}}</td>
+							<td>{{date('Y/m/d H:i:s',$a['start_time'])}}</td>
+							<td>{{date('Y/m/d H:i:s',$a['end_time'])}}</td>
+							<td>
+								@if( $a['status'] )
+								停用
+								@else
+									@if( $a['start_time'] <= time() && $a['end_time'] <= time() )
+										已结束
+									@endif
+									@if( $a['start_time'] <= time() && $a['end_time'] > time() )
+										进行中
+									@endif
+									@if( $a['start_time'] > time() )
+										待进行
+									@endif
+								@endif
+							</td>
+							<!-- <td>/pages/riddle/active?id={{$a['id']}}</td> -->
+							<!-- <td>{{$a['mp_urllink']}}</td> -->
+							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
+							<td>
+								@if(check_auth('admin/riddle_active/edit'))
+								<a href="{{url('admin/riddle_active/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@endif
+								@if(check_auth('admin/riddle_active/set_status'))
+									@if($a['status'])
+									<a data-url="{{url('admin/riddle_active/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
+									@else
+									<a data-url="{{url('admin/riddle_active/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
+									@endif
+								@endif
+								@if(check_auth('admin/riddle_active/get_poster'))
+								<!-- <a href="{{url('admin/riddle_active/get_poster?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-success" >海报</a> -->
+								@endif
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个商店</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 24 - 0
resources/views/admin/riddle_answer/add.blade.php

@@ -0,0 +1,24 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目标题</label>
+		<select class="form-control selectpicker" name="question_id"  data-live-search="true" data-live-search-placeholder="搜索题目" data-none-results-text="未搜索到 {0}" title="选择题目">
+			@foreach ($questionList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == request('question_id',0) ) selected="" @endif >{{$value['title']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目选项</label>
+		<input class="form-control" required="required" type="text" placeholder="题目选项" name="value" maxlength="45" value="" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 25 - 0
resources/views/admin/riddle_answer/edit.blade.php

@@ -0,0 +1,25 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目标题</label>
+		<select class="form-control selectpicker" name="question_id"  data-live-search="true" data-live-search-placeholder="搜索题目" data-none-results-text="未搜索到 {0}" title="选择题目">
+			@foreach ($questionList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == $oldData['question_id'] ) selected="" @endif >{{$value['title']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目选项</label>
+		<input class="form-control" required="required" type="text" placeholder="题目选项" name="value" maxlength="45" value="{{$oldData['value']}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input type="hidden" name="id" id="id" value="{{$oldData['id']}}" />
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 84 - 0
resources/views/admin/riddle_answer/index.blade.php

@@ -0,0 +1,84 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+@if(check_auth('admin/riddle_answer/add'))
+	<div class="page-header">
+		<a href="{{url('admin/riddle_answer/add?'.http_build_query(['question_id'=>request('question_id',0)]))}}" class="btn btn-primary">新增</a>
+	</div>
+@endif
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-8 col-md-12 col-sm-12 col-xs-12" style="margin-right: 2px;">
+		<select name="question_id" class="form-control selectpicker" data-live-search="true" data-live-search-placeholder="搜索题目" data-none-results-text="未搜索到 {0}" title="选择题目">
+			@foreach ($questionList as $value)
+				<option value="{{$value['id']}}"  @if( $value['id'] == request('question_id',0) ) selected="" @endif >{{$value['title']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/riddle_answer/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>题目</th>
+						<th>题目选项</th>
+						<th>是否答案</th>
+						<th>修改时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>
+							@foreach ($questionList as $value)
+								@if( $value['id'] == $a['question_id'] )
+								{{$value['title']}}								
+								@endif
+							@endforeach
+							</td>
+							<td>{{$a['value']}}</td>
+							<td>
+								@if( $a['is_answer'] )
+								是
+								@else
+								否
+								@endif
+							</td>
+							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
+							<td>
+								@if(check_auth('admin/riddle_answer/edit'))
+								<a href="{{url('admin/riddle_answer/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@endif
+								@if(check_auth('admin/riddle_answer/set_answer'))
+									@if( !$a['is_answer'] )
+									<a data-url="{{url('admin/riddle_answer/set_answer?'.http_build_query(['id'=>$a['id'],'is_answer'=>1]))}}" class="set_status btn btn-sm btn-danger" >设为答案</a>
+									@endif
+								@endif
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个题目</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 16 - 0
resources/views/admin/riddle_question/add.blade.php

@@ -0,0 +1,16 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目</label>
+		<input class="form-control" required="required" type="text" placeholder="题目标题" name="title" maxlength="45" value="" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 17 - 0
resources/views/admin/riddle_question/edit.blade.php

@@ -0,0 +1,17 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-12">
+		<label class="control-label">题目标题</label>
+		<input class="form-control" required="required" type="text" placeholder="题目标题" name="title" maxlength="45" value="{{$oldData['title']}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input type="hidden" name="id" id="id" value="{{$oldData['id']}}" />
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 77 - 0
resources/views/admin/riddle_question/index.blade.php

@@ -0,0 +1,77 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+@if(check_auth('admin/riddle_question/add'))
+	<div class="page-header">
+		<a href="{{url('admin/riddle_question/add')}}" class="btn btn-primary">新增</a>
+	</div>
+@endif
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="title" value="{{request('title','')}}" placeholder="请输入题目查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/riddle_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>题目</th>
+						<th>状态</th>
+						<th>修改时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['title']}}</td>
+							<td>
+								@if( $a['status'] )
+								停用
+								@else
+								启用
+								@endif
+							</td>
+							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
+							<td>
+								@if(check_auth('admin/riddle_answer/index'))
+								<a href="{{url('admin/riddle_answer/index?'.http_build_query(['question_id'=>$a['id']]))}}" class="btn btn-sm btn-primary" >答案</a>
+								@endif
+								@if(check_auth('admin/riddle_question/edit'))
+								<a href="{{url('admin/riddle_question/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@endif
+								@if(check_auth('admin/riddle_question/set_status'))
+									@if($a['status'])
+									<a data-url="{{url('admin/riddle_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
+									@else
+									<a data-url="{{url('admin/riddle_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
+									@endif
+								@endif
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个题目</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 12 - 1
routes/api.php

@@ -238,4 +238,15 @@ Route::any('redpacket/get_redpacket',[\App\Http\Controllers\Api\Redpacket::class
 //余额记录
 Route::any('custom_amount/get_record_list',[\App\Http\Controllers\Api\CustomAmount::class,'get_record_list']);
 //余额记录详情
-Route::any('custom_amount/get_record_info',[\App\Http\Controllers\Api\CustomAmount::class,'get_record_info']);
+Route::any('custom_amount/get_record_info',[\App\Http\Controllers\Api\CustomAmount::class,'get_record_info']);
+
+/**
+ * 灯谜活动
+ */
+// 获取活动详情
+Route::any('riddle_active/get_detail',[\App\Http\Controllers\Api\Riddle\Active::class,'get_detail']);
+// 获取灯谜题目
+Route::any('riddle_question/get_question',[\App\Http\Controllers\Api\Riddle\Question::class,'get_question']);
+// 分享记录
+Route::any('riddle_active_share/add',[\App\Http\Controllers\Api\Riddle\ActiveShare::class,'add']);
+

+ 34 - 0
routes/web.php

@@ -572,4 +572,38 @@ Route::middleware('admin')->prefix('admin')->group(function(){
     //生成海报
     Route::any('poster/index',[App\Http\Controllers\Admin\Poster::class,'index']);
     Route::any('poster/get_poster',[App\Http\Controllers\Admin\Poster::class,'get_poster']);
+
+
+    /* 灯谜活动 */
+    // 列表
+    Route::any('riddle_active/index',[App\Http\Controllers\Admin\RiddleActive::class,'index']);
+    // 详情
+    Route::any('riddle_active/add',[App\Http\Controllers\Admin\RiddleActive::class,'add']);
+    // 详情
+    Route::any('riddle_active/edit',[App\Http\Controllers\Admin\RiddleActive::class,'edit']);
+    // 状态
+    Route::any('riddle_active/set_status',[App\Http\Controllers\Admin\RiddleActive::class,'set_status']);
+    // 状态
+    Route::any('riddle_active/get_poster',[App\Http\Controllers\Admin\RiddleActive::class,'get_poster']);
+
+    /* 灯谜题目 */
+    // 列表
+    Route::any('riddle_question/index',[App\Http\Controllers\Admin\RiddleQuestion::class,'index']);
+    // 详情
+    Route::any('riddle_question/add',[App\Http\Controllers\Admin\RiddleQuestion::class,'add']);
+    // 详情
+    Route::any('riddle_question/edit',[App\Http\Controllers\Admin\RiddleQuestion::class,'edit']);
+    // 状态
+    Route::any('riddle_question/set_status',[App\Http\Controllers\Admin\RiddleQuestion::class,'set_status']);
+
+    /* 灯谜选项 */
+    // 列表
+    Route::any('riddle_answer/index',[App\Http\Controllers\Admin\RiddleAnswer::class,'index']);
+    // 详情
+    Route::any('riddle_answer/add',[App\Http\Controllers\Admin\RiddleAnswer::class,'add']);
+    // 详情
+    Route::any('riddle_answer/edit',[App\Http\Controllers\Admin\RiddleAnswer::class,'edit']);
+    // 状态
+    Route::any('riddle_answer/set_answer',[App\Http\Controllers\Admin\RiddleAnswer::class,'set_answer']);
+
 });