当前位置: 首页 > news >正文

活动系统开发之采用设计模式与非设计模式的区别-非设计模式

1、父类Base.php

<?php
/*** 初始化控制器* User: Administrator* Date: 2022/9/26* Time: 18:00*/
declare (strict_types = 1);
namespace app\controller;
use app\model\common\Token;
use app\BaseController;
use app\BaseError;
use OpenSSL\Encrypt;
use app\model\permission\Role;
use app\model\permission\Menu;
use Redis\Redis;
use app\model\param\Notice as NoticeModel;class Base extends BaseController
{protected $user_id = 0;//用户编号,整个系统内部使用protected $account_avatar = '';//登录用户的头像protected $account_note = '';//登录用户的描述protected $account = '';//登录用户的登录名称protected $key = '';//登录用户权限组标识protected $frontend_butt_list = [];//前端页面权限protected $role_id = '';//登录用户的权限编号protected $rules = [];//登录用户的权限组,内部使用protected $adress_code = [];//管理员地址protected $isUnserialize = true;protected $token = '';//唯一值public function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->isLoginAuth();//判断是否登录}//登录验证及其延长登录private function isLoginAuth(){$headInfo = $this->request->header();if(!isset($headInfo['authorization']))throw new BaseError('非法操作!');if(empty($headInfo['authorization']))throw new BaseError('操作异常!');$tokenValue = explode('|', Encrypt::getEncrypt($headInfo['authorization']));//解密 --转换tokenif(count($tokenValue) != 2)throw new BaseError('登录认证权限错误',50034,200);$token = sha1(sha1($tokenValue[0]).strtotime($tokenValue[1]));$res = Token::setToken($token, $headInfo['authorization']);if($res['status'] === false)throw new BaseError($res['info'],50034,200);//赋值错误信息$this->user_id = $res['data']['admin_id'];$this->account_note = $res['data']['account_note'];$this->account_avatar = $res['data']['account_avatar'];$this->account = $res['data']['account'];$this->role_id = $res['data']['role_id'];$this->token = $token;}//验证权限protected function checkRoleMenu($auth){if(empty($this->rules) || empty($this->key) || count($this->frontend_butt_list) == 0) $this->setAuth();if(!in_array($auth, $this->frontend_butt_list))throw new BaseError("权限不足,请联系管理员",50000,200);//赋值错误信息 权限验证}//获取权限protected function getRoleMenu(){if(empty($this->rules) || empty($this->key) || count($this->frontend_butt_list) == 0) $this->setAuth();$data['rules'] = $this->rules;$data['key'] = $this->key;$data['adress_code'] = $this->adress_code;$data['frontend_butt_list'] = $this->frontend_butt_list;return $data;}//设置权限protected function setAuth(){$resRole = Role::dataFind(['id' => $this->role_id],'key,rules,adress_code,status',true);if(empty($resRole) || $resRole['status'] !== 1) throw new BaseError("该用户没有权限",50000,200);//赋值错误信息$rules = explode(',',$resRole['rules']);$frontendButtList = Redis::select(config('cache.stores.redis.cache_db'))->get('platform_frontend_butt_list'.$this->user_id);if(empty($frontendButtList)){$this->isUnserialize = false;$list = Menu::getAll([['id', 'in', $rules], ['status', '=', 1], ['button_type', 'in', [0,1,2,3,4,5]]], 'name','sort DESC,id DESC');if(empty($list))throw new BaseError("该用户没有权限",50000,200);//赋值错误信息$frontendButtList = array_column($list,'name');Redis::select(config('cache.stores.redis.cache_db'))->setex('platform_frontend_butt_list'.$this->user_id,rand(40,80),serialize($frontendButtList));}$this->rules = $rules;$this->key = $resRole['key'];$this->adress_code = json_decode($resRole['adress_code'],true);$this->frontend_butt_list = $this->isUnserialize == true ? unserialize($frontendButtList) : $frontendButtList;}
}

2、模板Template.php

<?php
/*** 模板控制管理*/
namespace app\controller\anxun\admin\activity;
use app\controller\Base;
use app\model\anxun\activity\Template as TemplateModel;
use app\model\anxun\activity\TemplateAnswer as TemplateAnswerModel;
use app\model\anxun\activity\TemplateGame as TemplateGameModel;
use app\model\anxun\activity\TemplatePic as TemplatePicModel;
use app\model\anxun\activity\Activity as ActivityModel;
use app\model\anxun\activity\ActivityFlow as ActivityFlowModel;class Template extends Base
{//   - 支持编辑、启用、禁用、查看链接操作//   - 编辑:若有正在进行中的活动关联了此模板则无法进行编辑//   - 禁用:若有正在进行中的活动关联了此模板则无法进行禁用//   - 查看链接:只有下载图片模板类型有此功能//获取数据public function getList(){$param = $this->request->param();$title = $this->request->param('title');$type = $this->request->param('type');$status = $this->request->param('status');$where = [];if(!empty($title))$where[] = ['title','like','%'.$title.'%'];if(!empty($type))$where[] = ['type','=',$type];if(in_array($status,['0','1']))$where[] = ['status','=',$status];$resList = TemplateModel::getList($where, 'id,title,type,is_ban,template_traffic,status',[$param['currentPage'], $param['currentSize']]);$list = $resList['info'];/*if($list){foreach ($list as $k => $v) {$list[$k]['is_ban'] = $this->check($v['id']);}}*/$res['list'] = $list;$res['meat'] = $resList['page'];return success($res);}//获取所有数据public function getAll(){$where = [];$where[] = ['status','=',1];$type = $this->request->param('type');if(!empty($type))$where[] = ['type','=',$type];$list = TemplateModel::getAll($where,'id,title','id asc');return success($list);}// 详情public function getInfo(){$id = $this->request->param('id');//接收参数if(empty($id)) return error('主键不能为空');$row =  TemplateModel::dataFind(['id' => $id], 'id,title,type,status');if(empty($row)) return error('数据不存在');if($row['type'] == 1){$enswer_row = TemplateAnswerModel::dataFind(['template_id' => $id],'answer_number,solve_number,is_resetting');if(!$enswer_row) return error('答题数据不存在');$row['answer_number'] = $enswer_row['answer_number'];$row['solve_number'] = $enswer_row['solve_number'];$row['is_resetting'] = $enswer_row['is_resetting'];}elseif($row['type'] == 2){$pic_row = TemplatePicModel::dataFind(['template_id' => $id],'type_pic,copywriting,pics');if(!$pic_row) return error('图片数据不存在');$row['type_pic'] = $pic_row['type_pic'];$row['copywriting'] = json_decode($pic_row['copywriting'],true);$row['pics'] = json_decode($pic_row['pics'],true);}else{$game_row = TemplateGameModel::dataFind(['template_id' => $id],'answer_number,solve_number');if(!$game_row) return error('数据不存在');}return success($row);}//添加数据public function saveInfo(){$param = $this->request->param();//接收参数// 模板基础验证$validate = new \app\validate\anxun\admin\activity\Template;if (!$validate->check($param)) return error($validate->getError());//验证参数// 答题验证if($param['type'] == 1){$validate = new \app\validate\anxun\admin\activity\TemplateAnswer;if (!$validate->check($param)) return error($validate->getError());//验证参数}elseif($param['type'] == 2){// 图片验证$validate = new \app\validate\anxun\admin\activity\TemplatePic;if (!$validate->check($param)) return error($validate->getError());//验证参数}$where = [];$time = date('Y-m-d H:i:s', time());$data = ['title' => $param['title'],'type' => $param['type'],'status' => $param['status'],];if($param['id'] == 0){$data['create_time'] = $time;$data['update_time'] = $time;}else{if($this->check($param['id'])){return error('禁止操作,有进行中的活动');}// 删除模板类型TemplateAnswerModel::dataDetele(['template_id' => $param['id']]);TemplateAnswerModel::dataDetele(['template_id' => $param['id']]);TemplateGameModel::dataDetele(['template_id' => $param['id']]);$where = ['id' => $param['id'],];}// 保存基础活动模板$id = TemplateModel::save($data,$where);// 答题if($param['type'] == 1){$answer_data = ['template_id' => $id,'answer_number' => $param['answer_number'],'solve_number' => $param['solve_number'],'is_resetting' => $param['is_resetting'],'create_time' => $time,'update_time' => $time,];TemplateAnswerModel::save($answer_data);// 图片}elseif($param['type'] == 2){$pic_data = ['template_id' => $id,'type_pic' => $param['type_pic'],'copywriting' => json_encode($param['copywriting']),'pics' => json_encode($param['pics'],JSON_UNESCAPED_UNICODE),'create_time' => $time,'update_time' => $time,];TemplatePicModel::save($pic_data);}else{$game_data = ['template_id' => $id,'answer_number' => 1,'solve_number' => 1,'create_time' => $time,'update_time' => $time,];TemplateGameModel::save($game_data);}return success([], '操作成功');}// 修改状态public function saveStatus(){$id = $this->request->param('id');if(empty($id)) return error('主键不能为空');$row =  TemplateModel::dataFind(['id' => $id], 'status');if(empty($row)) return error('数据不存在');if($row['status'] == 1){$data = ['status' => 0,];if($this->check($id)){return error('禁止操作,有进行中的活动');}}else{$data = ['status' => 1,];}TemplateModel::save($data, ['id' => $id]);return success([],'ok');}// 检查是否支持编辑、启用、禁用、查看链接操作private function check($id){$flow_arr = ActivityFlowModel::getAll(['template_id' => $id],'activity_id');if($flow_arr){$where = [];$where[] = ['status','=',1];$where[] = ['start_time','<=',date('Y-m-d H:i:s')];$where[] = ['end_time','>=',date('Y-m-d H:i:s')];$where[] = ['id','in',array_column($flow_arr,'activity_id')];$ret = ActivityModel::dataFind($where,'id');if($ret) return true;}return false;}
}

3、活动Activity.php

<?php
/*** 活动管理*/
namespace app\controller\anxun\admin\activity;
use app\controller\Base;
use app\model\anxun\activity\Activity as ActivityModel;
use app\model\anxun\activity\ActivityFlow as ActivityFlowModel;
use app\model\anxun\activity\Template as TemplateModel;class Activity extends Base
{protected $php_max_date = '9999-12-31 00:00:00';//获取所有数据public function getList(){$param = $this->request->param();$name = $this->request->param('name');$activity_status = $this->request->param('activity_status');$status = $this->request->param('status');$where = [];if(!empty($name))$where[] = ['name','like','%'.$name.'%'];if(in_array($status,['0','1']))$where[] = ['status','=',$status];// 活动状态 1=进行中,2=已结束,3=未开始if($activity_status == 1){$where[] = ['start_time','<=',date('Y-m-d H:i:s')];$where[] = ['end_time','>=',date('Y-m-d H:i:s')];}elseif($activity_status == 2){$where[] = ['end_time','<',date('Y-m-d H:i:s')];}elseif($activity_status == 3){$where[] = ['start_time','>',date('Y-m-d H:i:s')];}$resList = ActivityModel::getList($where, 'id,name,title,start_time,end_time,update_time,status,attend_count,attend_complete_count',[$param['currentPage'], $param['currentSize']]);$info  =  $resList['info'];if($info){$time = time();foreach ($info as $k => $v) {if($v['end_time'] == $this->php_max_date) $info[$k]['end_time'] = '';$info[$k]['activity_status'] = '';$info[$k]['template_str'] = '';// $info[$k]['attend_count'] = 0;// $info[$k]['attend_complete_count'] = 0;$flow_arr = ActivityFlowModel::getAll(['activity_id' => $v['id']], 'template_id');if($flow_arr){$template_ids = array_column($flow_arr,'template_id');$template_all = TemplateModel::getAll([['id','in',$template_ids]]);if($template_all){$template_titile_arr = array_column($template_all,'title');$info[$k]['template_str'] = implode(',',$template_titile_arr);}}// - 进行中-启用(活动已经开始且状态为启用):编辑、禁用和查看链接操作// - 已结束-启用(到了活动结束时间且状态为启用):查看、禁用和查看链接操作// - 未开始-启用(未到活动开始时间且状态为启用):查看、编辑和查看链接操作// - 进行中-禁用(活动已经开始且状态为禁用):编辑、启用和查看链接操作// - 已结束-禁用(到了活动结束时间且状态为禁用):查看、启用和查看链接操作// - 未开始-禁用(未到活动开始时间且状态为禁用):查看、启用和查看链接操作$start_time = strtotime($v['start_time']);$end_time = strtotime($v['end_time']);// $status = $v['status'];if($time >= $start_time && $time <= $end_time){$activity_status = 1;}elseif( $time > $end_time){$activity_status = 2;}elseif($time < $start_time){$activity_status = 3;}$info[$k]['activity_status'] = $activity_status;unset($info[$k]['flow_json']);}}$res['list'] = $info;$res['meat'] = $resList['page'];return success($res);}// 详情public function getInfo(){$id = $this->request->param('id');//接收参数if(empty($id)) return error('主键不能为空');$row =  ActivityModel::dataFind(['id' => $id], 'id,name,title,status,is_activity_home,start_time,end_time,notes');if(empty($row)) return error('数据不存在');if($row['end_time'] == $this->php_max_date){$row['end_time'] = '';}$row['flow_json'] = [];$flow_json = ActivityFlowModel::getAll(['activity_id' => $id], 'id,activity_id,template_type,template_id');if($flow_json){$row['flow_json'] = $flow_json;}$time = time();if(strtotime($row['start_time']) > $time){$row['activity_status'] = 3;}elseif (!empty($row['end_time']) && strtotime($row['end_time']) < $time){$row['activity_status'] = 2;}else{$row['activity_status'] = 1;}return success($row);}//添加数据public function saveInfo(){$param = $this->request->param();//接收参数// 模板基础验证$validate = new \app\validate\anxun\admin\activity\Activity;if (!$validate->check($param)) return error($validate->getError());//验证参数$where = [];$time = date('Y-m-d H:i:s', time());$data = ['name' => $param['name'],'title' => $param['title'],'start_time' => $param['start_time'] ?: $time,'end_time' => $param['end_time'] ?: $this->php_max_date,'notes' => $param['notes'],'status' => $param['status'],'is_activity_home' => (int)$param['is_activity_home'],];if($param['id'] == 0){$data['create_time'] = $time;$data['update_time'] = $time;}else{$where = ['id' => $param['id'],];}// 保存基础活动模板$id = ActivityModel::save($data,$where);// 先删除活动流程ActivityFlowModel::dataDetele(['activity_id' => $id]);// 保存活动流程foreach ($param['flow_json'] as $k => $v) {$flow_data[] = ['activity_id' => $id,'template_type' => $v['template_type'],'template_id' => $v['template_id'],'create_time' => $time,'update_time' => $time,];}ActivityFlowModel::saveAll($flow_data);return success([], '操作成功');}// 修改状态public function saveStatus(){$id = $this->request->param('id');if(empty($id)) return error('主键不能为空');$row =  ActivityModel::dataFind(['id' => $id], 'status');if(empty($row)) return error('数据不存在');if($row['status'] == 1){$data = ['status' => 0,];}else{$data = ['status' => 1,];}ActivityModel::save($data, ['id' => $id]);return success([],'ok');}
}

4、素材图库MaterialWarehouse.php

<?php
/*** 素材图库控制* User: 龙哥·三年风水* Date: 2024/8/27* Time: 17:55*/
namespace app\controller\anxun\admin\activity;
use app\controller\Base;
use app\model\anxun\activity\MaterialWarehouse as AAMWModel;
class MaterialWarehouse extends Base
{// 列表public function getList(){$param = $this->request->param();$where[] = ['file_category','=',1];if(!empty($param['primary_file_name']))$where[] = ['primary_file_name','like','%'.$param['primary_file_name'].'%'];if(!empty($param['file_name_type']))$where[] = ['file_name_type','=',$param['file_name_type']];$resList = AAMWModel::getList($where, 'id,primary_file_name,file_name_type,file_name_size,encryption_file_name,update_time,status,url,create_time',[$param['currentPage'], $param['currentSize']]);$list  =  $resList['info'];$res['list'] = $list;$res['meat'] = $resList['page'];return success($res);}// 所有public function getAll(){$param = $this->request->param();$where[] = ['file_category','=',1];$where[] = ['status','=',1];if(!empty($param['primary_file_name']))$where[] = ['primary_file_name','like','%'.$param['primary_file_name'].'%'];if(!empty($param['file_name_type']))$where[] = ['file_name_type','=',$param['file_name_type']];$resList = AAMWModel::getList($where, 'id,primary_file_name,file_name_type,url',[$param['currentPage'], $param['currentSize']]);$list  =  $resList['info'];$res['list'] = $list;$res['meat'] = $resList['page'];return success($res);}// 详情public function getInfo(){$id = $this->request->param('id',0);if(empty($id)) return error('主键不能为空');$data = AAMWModel::dataFind([['id','=',$id]],'id,primary_file_name,file_name_type,file_name_size,encryption_file_name,status,url',true);return success($data);}// 保存public function saveInfo(){$param = $this->request->param();$validate = new \app\validate\anxun\admin\activity\MaterialWarehouse;if (!$validate->check($param)) return error($validate->getError());//验证参数$where = empty($param['id']) ? [] : ['id' => $param['id']];$data['primary_file_name'] = $param['primary_file_name'];$data['file_name_type'] = $param['file_name_type'];$data['file_name_size'] = $param['file_name_size'];$data['encryption_file_name'] = $param['encryption_file_name'];$data['url'] = $param['url'];$data['file_category'] = isset($param['file_category']) ? $param['file_category'] : 1;$data['status'] = $param['status'];$data['update_time'] = date('Y-m-d H:i:s',time());if(empty($param['id']))$data['create_time'] = date('Y-m-d H:i:s',time());AAMWModel::save($data,$where);return success([],"操作成功");}// 启禁用public function saveStatus(){$param = $this->request->param();AAMWModel::save(['status' => $param['status']],['id' => $param['id']]);return success([],"操作成功");}
}

5、添加问题及选项内容Question.php

<?php
/*** 高校资料库问题库* User: 龙哥·三年风水* Date: 2024/9/4* Time: 10:08*/
namespace app\controller\anxun\admin\activity;
use app\controller\Base;
use app\model\anxun\QuestionBank as AQBModel;
use app\model\anxun\QuestionOpt as AQOModel;
use app\model\anxun\QuestionPrize as AQPModel;
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\facade\Filesystem;
class Question extends Base
{// 列表public function getList(){$param = $this->request->param();$where = [];if(!empty($param['title']))$where[] = ['title','like','%'.$param['title'].'%'];if(!empty($param['id']))$where[] = ['id','=',$param['id']];if(!empty($param['status']))$where[] = ['status','=',$param['status'] == 1 ? 1 : 0];$resList = AQBModel::getList($where, 'id,title,option_number,status,create_time,update_time',[$param['currentPage'], $param['currentSize']]);$list  =  $resList['info'];$res['list'] = $list;$res['meat'] = $resList['page'];return success($res);}// 所有public function getAll(){$param = $this->request->param();$where = [];if(!empty($param['title']))$where[] = ['title','like','%'.$param['title'].'%'];$list = AQBModel::getAll($where, 'id,title','id DESC');return success($list);}// 详情public function getInfo(){$id = $this->request->param('id',0);if(empty($id)) return error('主键不能为空');$data = AQBModel::dataFind([['id','=',$id]],'id,title,status',true);if(!empty($data))$data['quest_opt'] = AQOModel::getAll(['bank_id' =>  $id],'content,is_correct','id DESC');return success($data);}// 保存public function saveInfo(){$param = $this->request->param();$validateBank = new \app\validate\anxun\admin\activity\QuestionBank;if (!$validateBank->check($param)) return error($validateBank->getError());//验证参数$validateOpt = new \app\validate\anxun\admin\activity\QuestionOpt;$dataOpt = [];foreach($param['quest_opt'] as $k => $v){$dataOpt[$k]['content'] = $v['content'];$dataOpt[$k]['is_correct'] = $v['is_correct'];if (!$validateOpt->check($dataOpt[$k])) return error($validateOpt->getError());//验证参数$dataOpt[$k]['opt'] = question_bank($k);}if(count($dataOpt) < 2) return error('题目选项最低两个选项');//验证参数$where = empty($param['id']) ? [] : ['id' => $param['id']];$data['title'] = $param['title'];$data['status'] = $param['status'];$data['update_time'] = date('Y-m-d H:i:s',time());$data['option_number'] = count($dataOpt);if(empty($param['id']))$data['create_time'] = date('Y-m-d H:i:s',time());$bankId = AQBModel::save($data,$where);if($param['id'] > 0)AQOModel::dataDetele(['bank_id' => $bankId]);foreach ($dataOpt as $ks => $vs){$dataOpt[$ks]['bank_id'] = $bankId;}AQOModel::dataAllSave($dataOpt);return success([],"操作成功");}// 启禁用public function saveStatus(){$param = $this->request->param();AQBModel::save(['status' => $param['status']],[['id','in',$param['id']]]);return success([],"操作成功");}//获取奖品信息public function getPrizeInfo(){$data = AQPModel::dataFind(['id' => 1],'prize_name,prize_price,postage_price,prize_picture,status',true);return success($data);}//保存产品信息public function savePrizeInfo(){$param = $this->request->param();$validateBank = new \app\validate\anxun\admin\activity\QuestionPrize;if (!$validateBank->check($param)) return error($validateBank->getError());//验证参数$data['prize_name'] = $param['prize_name'];$data['prize_price'] = $param['prize_price'];$data['postage_price'] = $param['postage_price'];$data['prize_picture'] = $param['prize_picture'];$data['status'] = $param['status'];$data['update_time'] = date('Y-m-d H:i:s',time());AQPModel::save($data,['id' => 1]);return success([],"操作成功");}//导入答题public function saveImportInfo(){$file = $this->request->file();$savename = Filesystem::disk('public')->putFile('topic',$file['file'],'md5');$reader = IOFactory::createReader('Xlsx');$reader->setReadDataOnly(true);$filePath = app()->getRootPath().'public/storage/'.$savename;$spreadsheet=$reader->load($filePath);//载入文件$worksheet=$spreadsheet->getActiveSheet();$highestRow=$worksheet->getHighestRow();//总行数for($row=2;$row<=$highestRow;$row++){$questionOpt[$row] = array_filter(explode('|', $worksheet->getCellByColumnAndRow(2, $row)->getValue()), 'remove_empty_values', ARRAY_FILTER_USE_BOTH);$questionOpt[$row] = remove_array_values($questionOpt[$row]);if(count($questionOpt[$row]) < 2)continue;$title[$row] = trim($worksheet->getCellByColumnAndRow(1, $row)->getValue());$bankId[$row] = AQBModel::dataFind([['title','=',$title[$row]]],'id',false);if(empty($bankId[$row])){//添加题目$data[$row]['title'] = $title[$row];$data[$row]['status'] = 1;$data[$row]['option_number'] = count($questionOpt[$row]);$data[$row]['create_time'] = date('Y-m-d H:i:s', time());$data[$row]['update_time'] = date('Y-m-d H:i:s', time());$bankId[$row] = AQBModel::save($data[$row]);$correct[$row] = array_filter(explode(',', $worksheet->getCellByColumnAndRow(3, $row)->getValue()), 'remove_empty_values', ARRAY_FILTER_USE_BOTH);//添加选项foreach($questionOpt[$row] as $k => $v) {$da[$row.$k]['bank_id'] = $bankId[$row];$da[$row.$k]['opt'] = question_bank($k);$da[$row.$k]['content'] = trim($v);foreach ($correct[$row] as $ko => $vo) {$da[$row.$k]['is_correct'] = $da[$row.$k]['opt'] == trim($vo) ? 1 : 0;}AQOModel::save($da[$row.$k]);}}}@unlink($filePath);return success([],'导入成功');}
}

6、前端api空Emptys.php父类

<?php
/*** 全局空处理* User: Administrator* Date: 2022/9/26* Time: 17:24*/
namespace app\controller;
use app\BaseController;
class Emptys extends BaseController
{public function index(){return error('正在开发中,敬请期待!');}
}

7、前端api模板Template.php

<?php
/*** 模板预览* User: 龙哥·三年风水* Date: 2024/8/19* Time: 17:08*/
namespace app\controller\anxun\index;
use app\controller\Emptys;
use app\model\anxun\activity\Template as TemplateModel;
use app\model\anxun\activity\TemplateAnswer as TemplateAnswerModel;
use app\model\anxun\QuestionBank;
use app\model\anxun\QuestionOpt;
use app\model\anxun\activity\TemplatePic as TemplatePicModel;
class Template extends Emptys
{// 模板列表public function getList(){$param = $this->request->param();if(empty($param['type']))return error('类型参数错误');if(empty($param['currentPage']) || empty($param['currentSize']))return error('分页参数错误');$where[] = ['status','=',1];$where[] = ['type','=',$param['type']];if(!empty($param['title']))$where[] = ['title','LIKE','%'.$param['title'].'%'];$resList = TemplateModel::getList($where,'id,title,type,is_ban,template_traffic,status',[$param['currentPage'],$param['currentSize']],'id DESC');$res['list'] = $resList['info'];$res['meat'] = $resList['page'];return success($res,'ok');}//模板详情public function getInfo(){$templateId = $this->request->param('template_id', 0);if(empty($templateId))return error('参数错误');$dataTemplate = TemplateModel::dataFind(['id' => $templateId],'id,title,type,status',true);if(empty($dataTemplate))return error('模板不存在');if($dataTemplate['status'] == 0)return error('模板已下架');if($dataTemplate['type'] == 1){$dataTemplateAnswer = TemplateAnswerModel::dataFind(['template_id' => $templateId],'answer_number,solve_number,is_resetting',true);if(empty($dataTemplateAnswer))return error('模板不存在');$dataTemplate['answer_number'] = $dataTemplateAnswer['answer_number'];$dataTemplate['solve_number'] = $dataTemplateAnswer['solve_number'];$dataTemplate['is_resetting'] = $dataTemplateAnswer['is_resetting'];$allList = QuestionBank::getAll(['status' => 1],'id','create_time DESC');if(count($allList) == 0)return error('没有题目');$answerArr = array_rand(array_column($allList,'id'),$dataTemplateAnswer['answer_number']);$answerList = [];foreach($answerArr as $k => $v){$answerList[$k]['id'] = $v;$answerList[$k]['title'] = QuestionBank::dataFind(['id' => $v],'title',false);$answerList[$k]['opt'] = QuestionOpt::getAll(['bank_id' => $v],'opt,content,is_correct','id DESC');}$dataTemplate['list'] = $answerList;}if($dataTemplate['type'] == 2){$dataTemplatePic = TemplatePicModel::dataFind(['template_id' => $templateId],'copywriting,pics');if(empty($dataTemplatePic)) return error('没有素材');$dataTemplate['copywriting'] = json_decode($dataTemplatePic['copywriting']);$dataTemplate['list'] = json_decode($dataTemplatePic['pics'],true);}TemplateModel::setAdd(['id' => $templateId],'template_traffic');return success($dataTemplate,'ok');}
}

8、前端api活动Activity.php

<?php
/*** 活动管理* User: 龙哥·三年风水* Date: 2024/5/22* Time: 11:48*/
namespace app\controller\anxun\index;
use app\controller\Emptys;
use app\model\anxun\activity\Activity as ActivityModel;
use app\model\anxun\activity\Template as TemplateModel;
use app\model\anxun\activity\TemplatePic as TemplatePicModel;
use app\model\anxun\activity\ActivityFlow as ActivityFlowModel;
use app\model\anxun\activity\ActivityTeam as ActivityTeamModel;
use app\model\anxun\activity\ActivityTeamUser as ActivityTeamUserModel;
use app\model\anxun\activity\TemplateAnswer as TemplateAnswerModel;
use app\model\anxun\activity\TemplateGame as TemplateGameModel;use app\model\common\SmsSend as SmsSendModel;use app\model\anxun\QuestionBank;
use app\model\anxun\QuestionOpt;
use app\model\anxun\QuestionParticipantAnswer as QPAModel;
use app\model\anxun\QuestionParticipantAnswerStatistics as QPASModel;
use Redis\Redis;
use Sms\SmsFactory;class Activity extends Emptys
{protected $php_max_date = '9999-12-31 00:00:00';//活动列表public function getList(){$param = $this->request->param();$where[] = ['status','=',1];if(!empty($param['name']))$where[] = ['name','LIKE','%'.$param['name'].'%'];if(empty($param['currentPage']) || empty($param['currentSize']))return error('分页参数错误');$resList = ActivityModel::getList($where,'id,name,start_time,end_time,attend_count,attend_complete_count,is_activity_home',[$param['currentPage'],$param['currentSize']],'id DESC');$list = $resList['info'];$time = time();foreach ($list as $k => $v){if($time > strtotime($v['end_time']) && $v['end_time'] != $this->php_max_date){$list[$k]['activity_status'] = 2;}elseif ($time > strtotime($v['start_time'])){$list[$k]['activity_status'] = 1;}else{$list[$k]['activity_status'] = 3;}$list[$k]['end_time'] = $v['end_time'] == $this->php_max_date ? '' : $v['end_time'];$templateTypes[$k] = ActivityFlowModel::getAll(['activity_id' => $v['id']],'template_type','id ASC');$list[$k]['template_type'] = $templateTypes[$k][0]['template_type'];}$res['list'] = $list;$res['meat'] = $resList['page'];return success($res,'ok');}//活动首页public function getHome(){$list = [];$resList = ActivityModel::getAll(['status' => 1],'id,name,start_time,end_time,attend_count,attend_complete_count,is_activity_home','id DESC');$time = time();$i=0;foreach ($resList as $v){if(count($list) < 5){if($time > strtotime($v['end_time']) && $v['end_time'] != $this->php_max_date)continue;$list[$i] = $v;$list[$i]['activity_status'] = $time > strtotime($v['start_time']) ? 1 : 3;$list[$i]['end_time'] = $v['end_time'] == $this->php_max_date ? '' : $v['end_time'];$templateTypes[$i] = ActivityFlowModel::getAll(['activity_id' => $v['id']],'template_type','id ASC');$list[$i]['template_type'] = $templateTypes[$i][0]['template_type'];$i++;}}return success($list,'ok');}// 模板图片详情public function getTemplate(){$id = $this->request->param('id', 0);$flow_id = $this->request->param('flow_id', 0);$next_flow = [];if($id && $flow_id){$row = ActivityModel::dataFind(['id'=>$id],'id,name,title,status,start_time,end_time,attend_count,attend_complete_count');try {$this->check_statu($row);} catch (\Exception $e) {return error($e->getMessage());}$flow_arr = ActivityFlowModel::getAll(['activity_id' => $id],'id,activity_id,template_type,template_id');if(!$flow_arr) return error('流程不存在');$template_id = 0;foreach ($flow_arr as $k => $v) {if($v['id'] == $flow_id){$template_id = $v['template_id'];// 判断是否有下一个流程;if(isset($flow_arr[($k+1)])){$next_flow = $flow_arr[($k+1)];}break;}}if(!$template_id) return error('流程不存在');}else{$template_id = $this->request->param('template_id', 0);if(!$template_id) return error('参数错误');}$row = TemplateModel::dataFind(['id' => $template_id],'*');if(!$row) return error('数据不存在');if($row['status'] != 1) return error('禁止展示');if($row['type'] != 2) return error('不是图片展示类型');$pics_row = TemplatePicModel::dataFind(['template_id' => $template_id],'*');if(!$pics_row) return error('数据不存在');$data['title'] = $row['title'];$data['copywriting'] = json_decode($pics_row['copywriting'],true);$data['pics'] = json_decode($pics_row['pics'],true);$data['next_flow'] = $next_flow;return success($data,'ok');}  //获取活动状态public function getInfo(){$id = $this->request->param('id', 0);if (empty($id)) return error('主键参数必须上传');$row = ActivityModel::dataFind(['id'=>$id],'id,name,title,status,start_time,end_time,attend_count,attend_complete_count');if(!$row) return error('活动不存在');$time = time();$start_time = strtotime($row['start_time']);$end_time = strtotime($row['end_time']);if($time >= $start_time && $time <= $end_time){$activity_status = 1;}elseif( $time > $end_time){$activity_status = 2;}elseif($time < $start_time){$activity_status = 3;}$row['activity_status'] = $activity_status;if($row['end_time'] = $this->php_max_date){$row['end_time'] = '';}$flow_json = ActivityFlowModel::getAll(['activity_id' => $id], 'id,activity_id,template_type,template_id','id asc');if($flow_json){$row['flow_json'] = $flow_json;}return success($row,'操作成功');}//获取题目public function getQuestion(){$id = $this->request->param('id', 0);$flow_id = $this->request->param('flow_id', 0);if (empty($id)) return error('参数必须上传');if (empty($flow_id)) return error('参数必须上传');$row = ActivityModel::dataFind(['id'=> $id],'*');try {$this->check_statu($row);} catch (\Exception $e) {return error($e->getMessage());}// 查询活动流程$flow_arr = ActivityFlowModel::getAll(['activity_id' => $id],'id,activity_id,template_type,template_id');if(!$flow_arr) return error('流程不存在');$next_flow = [];$template_id = 0;foreach ($flow_arr as $k => $v) {if($v['id'] == $flow_id){$template_id = $v['template_id'];// 判断是否有下一个流程;if(isset($flow_arr[($k+1)])){$next_flow = $flow_arr[($k+1)];}break;}}if(!$template_id) return error('流程不存在');$flow_row = ActivityFlowModel::dataFind(['activity_id' => $id, 'template_id' => $template_id], 'id,template_type');if(!$flow_row) return error('题库不存在');if($flow_row['template_type'] == 1){$answer_row = TemplateAnswerModel::dataFind(['template_id' => $template_id],'answer_number,solve_number,is_resetting');if(!$answer_row)  return error('题库不存在');}else{$answer_row = TemplateGameModel::dataFind(['template_id' => $template_id],'answer_number,solve_number');if(!$answer_row)  return error('题库不存在');}$key = config('database.connections.anxun.prefix').'activity';$redis = Redis::select(config('cache.stores.redis.data_db_admin'));$number = $redis->smembers($key.'_pk');if(count($number) == 0){$allList = QuestionBank::getAll(['status' => 1],'id','create_time DESC');if(count($allList) == 0)return error('没有题目');foreach($allList as $v){$redis->sadd($key.'_pk',$v['id']);}}$bankList = $redis->srandmember($key.'_pk',$answer_row['answer_number']);$list = [];$statisticData['correct_rate'] = 0;$statisticData['error_rate'] = 0;$statisticData['status'] = 1;$statisticData['create_time'] = date('Y-m-d H:i:s',time());$statisticData['update_time'] = date('Y-m-d H:i:s',time());$statisticsId = QPASModel::save($statisticData,[]);foreach ($bankList as $k => $v){$list[$k]['title'] = QuestionBank::dataFind(['id' => $v],'title',false);$optList[$k] = QuestionOpt::getAll(['bank_id' => $v],'opt,content,is_correct',false);$data[$k]['bank_id'] = $v;foreach ($optList[$k] as $va){if($va['is_correct'] == 1)$data[$k]['correct_answer'] = $va['opt'];}$list[$k]['opt'] = $optList[$k];$data[$k]['statistics_id'] = $statisticsId;$data[$k]['participant_answer'] = '';$data[$k]['is_right'] = 0;$data[$k]['create_time'] = date('Y-m-d H:i:s',time());$data[$k]['update_time'] = date('Y-m-d H:i:s',time());$list[$k]['id'] = QPAModel::save($data[$k],[]);}$data_all['list'] = $list;$data_all['next_flow'] = $next_flow;$data_all['answer'] = $answer_row;return success($data_all,'操作成功');}//提交答案public function setQuestion(){$result = $this->request->param('result');if (empty($result) || count($result) != 10) return error('结果集错误');$correctRate = 0;$errorRate = 0;foreach($result as $k => $v){$correctAnswer[$k] = QPAModel::dataFind(['id' => $v['id']],'correct_answer,statistics_id',true);if(empty($correctAnswer[$k]))return error('结果集错误');if($v['participant_answer'] == $correctAnswer[$k]['correct_answer']){$data[$k]['is_right'] = 1;$correctRate++;}else{$data[$k]['is_right'] = 2;$errorRate++;}$data[$k]['participant_answer'] = $v['participant_answer'];QPAModel::save($data[$k],['id' => $v['id']]);if($k+1 == count($result)){$statisticsData['correct_rate'] = $correctRate;$statisticsData['error_rate'] = $errorRate;$statisticsData['status'] = 0;QPASModel::save($statisticsData,['id' => $correctAnswer[$k]['statistics_id']]);}}return success([],'操作成功');}// 获取活动数据public function getData(){   $id = $this->request->param('id');if(!$id) return error('参数错误');$row = ActivityModel::dataFind(['id' => $id],'title,attend_count,attend_complete_count,end_time');if(!$row) return error('活动不存在');if($row['end_time'] = $this->php_max_date){$row['end_time'] = '';}return success($row,'ok');}// 参与记录public function addLog(){// 记录type = 1 参与 ,type = 2 参与完成$id = $this->request->param('id');$type = $this->request->param('type',1);if (empty($id)) return error('参数必须上传');$row = ActivityModel::dataFind(['id'=> $id],'*');$is_save = true;try {$this->check_statu($row);} catch (\Exception $e) {if($type == 1){$is_save = false;}else{return error($e->getMessage());}}if($is_save){$data = [];if($type == 1){$data = ['attend_count' => ($row['attend_count'] + 1)];}else{$data = ['attend_complete_count' => ($row['attend_complete_count'] + 1)];}ActivityModel::save($data,['id' => $id]);}return success([],'ok');}// 团队报名public function teamSignUp(){$param = $this->request->param();$type = $this->request->param('type',1);// 模板基础验证$param['id'] = 0;$validate = new \app\validate\anxun\index\activity\Team;if (!$validate->check($param)) return error($validate->getError());//验证参数foreach ($param['arr'] as $v) {$validate = new \app\validate\anxun\index\activity\TeamUser;if (!$validate->check($v)) return error('队员的'.$validate->getError());//验证参数}if(isset($param['arr2'])){foreach ($param['arr2'] as $v) {$validate = new \app\validate\anxun\index\activity\TeamUser;if (!$validate->check($v)) return error('替补队员的'.$validate->getError());//验证参数}}// 查询活动$row = ActivityModel::dataFind(['id'=>$param['activity_id']],'id,name,title,status,start_time,end_time,attend_count,attend_complete_count');// 验证活动是否符合try {$this->check_statu($row);} catch (\Exception $e) {return error($e->getMessage());}$flow_row = ActivityFlowModel::dataFind(['activity_id' => $param['activity_id'],'template_type' => 3],'id');if(!$flow_row) return error('流程不存在');$count = ActivityTeamModel::dataNumber(['activity_id' => $param['activity_id']],'id');if($count >= 500) return error('报名团队已满,无法报名');$time = date('Y-m-d H:i:s',time());$team_data['activity_id'] = $param['activity_id'];$team_data['team_name'] = $param['team_name'];$team_data['create_time'] = $time;$team_data['update_time'] = $time;// 数据格式化$team_user_data[] = ['activity_id' => $param['activity_id'],// 'team_id' => $team_id,'type' => 1,'username' => $param['username'],'mobile' => $param['mobile'],'hero_name' => $param['hero_name'],'address' => $param['address'],'honor_name' => $param['honor_name'],];foreach ($param['arr'] as $v) {$team_user_data[] = ['activity_id' => $param['activity_id'],// 'team_id' => $team_id,'type' => 2,'username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}if(isset($param['arr2'])){foreach ($param['arr2'] as $v) {$team_user_data[] = ['activity_id' => $param['activity_id'],// 'team_id' => $team_id,'type' => 3,'username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}}// 验证团队成员手机号是否有重复$mobile_arr = array_column($team_user_data,'mobile');$mobile_arr_unique = array_unique($mobile_arr);if(count($mobile_arr) != count($mobile_arr_unique)) return error('提交的手机号有重复,请检查');//  验证该活动,团队名是否已存在$where[] = ['team_name','=',$param['team_name']];$where[] = ['activity_id','=',$param['activity_id']];$ret = ActivityTeamModel::dataFind($where,'id');if($ret) return error('团队名已存在');// 验证该活动,成员手机号是否已存在$where2[] = ['mobile','in',$mobile_arr];$where2[] = ['activity_id','=',$param['activity_id']];$ret = ActivityTeamUserModel::dataFind($where2,'id,mobile');if($ret) return error($ret['mobile'].'号码已被其它团队成员使用');if($type == 2){// 增加团队$team_id = ActivityTeamModel::save($team_data);foreach ($team_user_data as $k => $v) {$team_user_data[$k]['team_id'] = $team_id;}// 增加团队成员ActivityTeamUserModel::saveAll($team_user_data);}return success([],'ok');}// 更新团队信息public function saveTeam(){$param = $this->request->param();$code = $this->request->param('code');// 模板基础验证$validate = new \app\validate\anxun\index\activity\Team;if (!$validate->check($param)) return error($validate->getError());//验证参数foreach ($param['arr'] as $v) {$validate = new \app\validate\anxun\index\activity\TeamUser;if (!$validate->check($v)) return error('队员的'.$validate->getError());//验证参数}if(isset($param['arr2'])){foreach ($param['arr2'] as $v) {$validate = new \app\validate\anxun\index\activity\TeamUser;if (!$validate->check($v)) return error('替补队员的'.$validate->getError());//验证参数}}if(!$code) return error('验证码不能为空');$mobile = ActivityTeamUserModel::dataFind(['team_id' => $param['id']],'mobile',false);if(!$mobile) return error('团队数据不存在');$isSend = Redis::select(config('cache.stores.redis.cache_db'))->get($mobile);// if(empty($isSend))return error('没有可用的验证码');if($code != $isSend)return error('验证码不正确');// 查询活动$row = ActivityModel::dataFind(['id'=>$param['activity_id']],'id,name,title,status,start_time,end_time,attend_count,attend_complete_count');// 验证活动是否符合try {$this->check_statu($row);} catch (\Exception $e) {return error($e->getMessage());}$flow_row = ActivityFlowModel::dataFind(['activity_id' => $param['activity_id'],'template_type' => 3],'id');if(!$flow_row) return error('流程不存在');$ret = ActivityTeamModel::dataFind(['id' => $param['id']],'*');if(!$ret) return error('不存在');$team_id = $param['id'];$time = date('Y-m-d H:i:s',time());$team_data['activity_id'] = $param['activity_id'];$team_data['team_name'] = $param['team_name'];$team_data['create_time'] = $time;$team_data['update_time'] = $time;// 数据格式化$team_user_data[] = ['activity_id' => $param['activity_id'],'team_id' => $team_id,'type' => 1,'username' => $param['username'],'mobile' => $param['mobile'],'hero_name' => $param['hero_name'],'address' => $param['address'],'honor_name' => $param['honor_name'],];foreach ($param['arr'] as $v) {$team_user_data[] = ['activity_id' => $param['activity_id'],'team_id' => $team_id,'type' => 2,'username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}if(isset($param['arr2'])){foreach ($param['arr2'] as $v) {$team_user_data[] = ['activity_id' => $param['activity_id'],'team_id' => $team_id,'type' => 3,'username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}}// 验证团队成员手机号是否有重复$mobile_arr = array_column($team_user_data,'mobile');$mobile_arr_unique = array_unique($mobile_arr);if(count($mobile_arr) != count($mobile_arr_unique)) return error('提交的手机号有重复,请检查');//  验证该活动,团队名是否已存在$where[] = ['team_name','=',$param['team_name']];$where[] = ['id','<>',$team_id];$ret = ActivityTeamModel::dataFind($where,'id');if($ret) return error('团队名已存在');// 验证该活动,成员手机号是否已存在$where2[] = ['mobile','in',$mobile_arr];$where2[] = ['team_id','<>',$team_id];$ret = ActivityTeamUserModel::dataFind($where2,'id,mobile');if($ret) return error($ret['mobile'].'号码已被其它团队成员使用');// 增加团队$team_id = ActivityTeamModel::save($team_data,['id' => $param['id']]);// 先清空团队成员数据,后更新ActivityTeamUserModel::dataDetele(['team_id' => $team_id]);// 增加团队成员ActivityTeamUserModel::saveAll($team_user_data);// 更新已使用短信验证码$sms_data['status'] = 0;$sms_where[] = ['mobile', '=', $mobile];$sms_where[] = ['code', '=', $param['code']];SmsSendModel::save($sms_data, $sms_where);// 清除验证码缓存Redis::select(config('cache.stores.redis.cache_db'))->setex($mobile,1,$param['code']);return success([],'ok');}// 团队查询public function getTeam(){$activity_id = $this->request->param('activity_id');$mobile = $this->request->param('mobile');if(!$activity_id) return error('参数不正确');if(!$mobile) return error('手机号不能为空');if(!preg_match('/^1[0-9]\d{9}$/', $mobile)) return error('手机号格式不正确');$where[] = ['activity_id','=',$activity_id];$where[] = ['mobile','=',$mobile];// $where[] = ['type','=',1];$ret = ActivityTeamUserModel::dataFind($where,'*');if(!$ret) return error('不存在');$data = [];$team_data = ActivityTeamModel::dataFind(['id' => $ret['team_id']],'*');$team_user_data = ActivityTeamUserModel::getAll(['team_id' => $ret['team_id']],'*');$data['id'] = $team_data['id'];$data['activity_id'] = $team_data['activity_id'];$data['team_name'] = $team_data['team_name'];$data['username'] = '';$data['mobile'] = '';$data['hero_name'] = '';$data['address'] = '';$data['honor_name'] = '';$data['arr'] = [];// $data['arr2'] = [];foreach ($team_user_data as $k => $v) {if($v['type'] == 1){$data['username'] = $v['username'];$data['mobile'] = $v['mobile'];$data['hero_name'] = $v['hero_name'];$data['address'] = $v['address'];$data['honor_name'] = $v['honor_name'];}elseif($v['type'] == 2){$data['arr'][] = ['username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}elseif($v['type'] == 3){$data['arr2'][] = ['username' => $v['username'],'mobile' => $v['mobile'],'hero_name' => $v['hero_name'],'address' => $v['address'],'honor_name' => $v['honor_name'],];}}// 判断是否有替补数据// if(isset($data['arr2'])){//     // 判断替补数据是否一名成员,是的话,增加一名替补成员初始化格式字段//     if(count($data['arr2']) == 1){//         $data['arr2'][] = [//             'username' => '',//             'mobile' => '',//             'hero_name' => '',//             'address' => '',//             'honor_name' => ''//         ];//     }// }return success($data,'ok');}// 检测活动状态private function check_statu($row){try {if(!$row) throw new \Exception('活动不存在');if($row['status'] != 1) throw new \Exception('活动已结束');$time = time();$start_time = strtotime($row['start_time']);$end_time = strtotime($row['end_time']);if($time >= $start_time && $time <= $end_time){}else{throw new \Exception('活动未开始或已结束');}} catch (\Exception $e) {throw new \Exception($e->getMessage());}}
}

到此,活动api非设计模式已经结束,如果想看设计模式代码,请点击链接

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [mysql]SQL语言的规则和规范
  • 黑链、黑帽、明链分别是什么意思
  • 通话记录被删除,如果快速恢复iPhone手机通话记录
  • 网络药理学:分子动力学模拟入门、gromacs能量最小化
  • 【原理图PCB专题】案例:Cadence能设计一个没有管脚的器件吗?
  • 云曦2024秋季开学考
  • 嵌入式产品发货后出现问题,怎么办?
  • 【Unity面经】性能优化篇
  • 掌握数据库与SQL
  • Mysql基础练习题 1729.求关注者的数量 (力扣)
  • 统计上升四元组
  • The component ‘GridItem‘ can only have a single child component.
  • 基于YOLOv8的风力涡轮机表面损坏检测系统
  • Mysql高级篇(中)——SQL性能分析
  • ROS CDK魔法书:建立你的游戏王国(TypeScript篇)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • ES6语法详解(一)
  • github指令
  • Java编程基础24——递归练习
  • LeetCode29.两数相除 JavaScript
  • Redis中的lru算法实现
  • Swoft 源码剖析 - 代码自动更新机制
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ionic异常记录
  • Java数据解析之JSON
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (007)XHTML文档之标题——h1~h6
  • (void) (_x == _y)的作用
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (三)c52学习之旅-点亮LED灯
  • (算法)区间调度问题
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)可以带来幸福的一本书
  • .form文件_SSM框架文件上传篇
  • .htaccess配置重写url引擎
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET WPF 抖动动画
  • .net 流——流的类型体系简单介绍
  • .net 怎么循环得到数组里的值_关于js数组
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET6 命令行启动及发布单个Exe文件
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • @Documented注解的作用
  • @SuppressWarnings(unchecked)代码的作用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [20171102]视图v$session中process字段含义
  • [ajaxupload] - 上传文件同时附件参数值