• thinkcmf 常用操作


    11-16  thinkcmf  

       核心文件结构:simplewind--model--lite--model.class.php /controller.class.php

       Mobile---controller:

    获取错误信息:$this->apiError()$this->apiSuccess()

    获取用户IPget_client_ip()---model.class.php 

    统计条数: $count = M('Order')->where($where_s)->count();

    条件判断:$where_s['id'] = array('in',$ids);

     分页: $page = $this->page($count,10);

     查找: $info = M('Order')->where($where_s)->order('vip desc,createtime desc')->limit($page->firstRow.','.$page->listRows)->select();

     if ( $_GET['p']>ceil($count/10) )

            {

             $this->apiError( 'over' );

            }else{

             $this->apiSuccess( '获取成功',array('info'=>$info) );

            }

    查找:$data = array( 'uid'=>$this->user['id'],'orderid'=>$_POST['id'] );

           $info = M('grab_order')->where($data)->find();

    $vo['grab_user_nicename'] =M('users')->where(array('id'=>$grab['uid']))->field('user_nicename')->find();

    查找: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');

    添加: $data['time'] = NOW_TIME;   $res = M('grab_order')->add($data);

    保存: $rel = M('order')->where($where)->save($data);

    更改设置: M('order')->where(array('id'=>$_POST['id']))->setField('status',1);

    图片地址: $vo['avatar'] = "http://".C('SERVER_NAME').C('GRAB_SET_PATH').$user['avatar'];

    推送消息: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');

      $mes = array( 'orderid'=>$_POST['id'],'msg'=>'您派发的订单已被抢,快去看看吧','type'=>2); if( (int)$this->pushcontent_test($user_login) ){

        $re = pushcontent( 0,$user_login,$mes,array(),2 );}

    写入数据过滤:filter()  $this->data($data)->filter('strip_tags')->add();

    I方法:I('变量类型.变量名',['默认值'],['过滤方法'])变量类型是指请求方式或者输入类型,   

           意为{input}是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是

            Htmlspecialchars strip_tags interval

    get    获取GET参数               post    获取POST参数    

    request    获取REQUEST 参数      put    获取PUT 参数    

    session    获取 $_SESSION 参数    cookie    获取 $_COOKIE 参数    

    server    获取 $_SERVER 参数      globals    获取 $GLOBALS参数 

    param    自动判断请求类型获取GETPOST或者PUT参数 param类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效) 

    注意:变量类型不区分大小写。变量名严格区分大小写。默认值和过滤方法均属于可选参数。

    echo I('get.name');// 相当于 $_GET['name']

    I('session.user_id',0);// 获取$_SESSION['user_id'] 如果不存在则默认为0

    echo I('get.name','','htmlspecialchars');// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串

    http://serverName/index.php/New/2013/06/01 

    echo I('param.1');// 输出2013   

    param变量类型的写法可简化:I('id');// I('param.id')I('name');// I('param.name')

    Thinkphp3.2添加了一个I方法,取义Input,用来获取前台提交过来的数据。
    I方法是放在了/ThinkPHP/Common/function.php之中

    C()方法:C方法是ThinkPHP用于设置、获取,以及保存配置参数的方法,使用频率较高。

         设置参数 

    C('DB_NAME','thinkphp');

    表示设置DB_NAME配置参数的值为thinkphp,由于配置参数不区分大小写

    $config['user_id'] = 1;   $config['user_type'] = 1;   C($config);

    如果C方法的第一个参数传入数组,就表示批量赋值,上面的赋值相当于:

    C('USER_ID',1);    C('USER_TYPE',1);

    获取参数   要获取设置的参数,可以用:

    $userId = C('USER_ID');    $userType = C('USER_TYPE');

    如USER_ID参数尚未定义过,则返回NULL。如传入的配置参数为空,表示获取全部的参数:

    $config = C();

    保存设置 
    3.1版本增加了一个永久保存设置参数的功能,仅针对批量赋值的情况,例如:

    $config['user_id'] = 1;    $config['user_type'] = 1;    C($config,'name');

    在批量设置了config参数后,会连同当前所有的配置参数保存到缓存文件(或者其他配置的缓存方式)。保存之后,如果要取回保存的参数,可以用

    $config = C('','name');

    其中name就是前面保存参数时用的缓存的标识,必须一致才能正确取回保存的参数。取回的参数会和当前的配置参数合并,无需手动合并

    惯例配置文件:simplewind--core---conf---conventionPhp

    require SPAPP_PATH.'Core/ThinkPHP.php';//载入框架核心文件

    R()方法在其他控制器里面调用这个操作方法(一般R方法用于跨模块调用是A()升级)

    R('[项目://][分组/]模块/操作','参数','控制器层名称') 

    R('Admin/User/detail',array('5'));

    表示调用Admin分组下面的User控制器的detail方法。

    R('Admin://User/detail',array('5'));

    表示调用Admin项目下面的User控制器的detail方法。

    官方建议不要在同一层多太多调用,会引起逻辑的混乱,被公共调用的部分应该封装成单独的接口,可以借助3.1的新特性多层控制器,单独添加一个控制器层用于接口调用,例如,我们增加一个Api控制器层,

    class UserApi extends Action {   public function detail($id){       return M('User')->find($id);   }  }

    然后,使用R方法调用。也就是说,R方法的第三个参数支持指定调用的控制器层。

    $data = R('User/detail',array('5'),'Api');

    别名定义:application-common-conf-alias.php   "Dir" => SPAPP_PATH.'Lib/Util/Dir.class.php',

    文件加载:导入文件,一般来说lib目录下的文件可以实现自动加载,

    方法一:impor (‘ page ’) ;   $obj = new page(); 

    方法二:import("ORG.ThinkSDK.ThinkOauth");$qq = ThinkOauth::getInstance('qq', $token);也可以直接实例化:$htt = new OrgNetHttp(); 

    方法三:  import("Org.Net.Http",dirname(__FILE__),".class.php");

                $htt = new Http();  //反斜线代表跳出当前命名空间

                $htt::download($file_path,$file_name);

    registerController.class.php

    获取验证码: getMsgcode()

           $map['time'] = array( 'lt',$time - 300 );

            M('msgcode')->where($map)->delete();

            $where['tel'] = $_POST['tel'];

            $info = M('msgcode')->where($where)->find();

    注册:doregister()

    $data['user_login'] = $_POST['tel'];

            $data['create_time'] = date( 'Y-m-d H:i:s',$time );

            $data['user_status'] = 1;

            $data['user_type'] = 2;

            $res = M('users')->add($data);

    问题:注册验证码没变?

    登陆:login()登陆--版本升级--session--广告--发布内容--头像证件等地址--会员级别--

            $where['user_login'] = $_POST['user_login'];

            $info = M('Users')->where($where)->find();

          //判断手机端的版本号和服务端最大的版本号是否相等

            if( isset($_REQUEST['version']) && $_REQUEST['version'] != $version['id'])

            {    

                //返回版本文件路径

                $info['ver_file'] =     "http://".C('SERVER_NAME').C('USER_APP_PATH').$version['filename'].".apk";

                $info['force_update'] = $version['is_force_update'];

            }

    //登陆查找数据

            $_SESSION['user'] = $info['id'];

            $data = array( 'last_login_ip'=>get_client_ip(),'last_login_time'=>date( 'Y-m-d H:i:s') );

            $adminappad = M('appad')->where(array('type'=>1))->field('content,pic')->find();

    //广告

           $sp_slide=M('slide');

        $data=$sp_slide->select();

            if($adminappad['pic']){

             $ads = explode(';',$adminappad['pic']);

             $appad['pic1'] =  "http://".C('SERVER_NAME').$data[0]['slide_pic'];

    $appad['adrr1']=  $data[0]['slide_url'];}

      /*Begin Edit for[增加显示广告的内容和链接] At[2015-10-17]*/

    $content_ad=M('ad')->field('ad_name,ad_content')->find();

    $appad['content']=$content_ad['ad_name'];

    $appad['ad_url']=$content_ad['ad_content'];

    广告表单 Sp_appadtype 1超级管理员 代理商  name content 广告内容 timepic图片多张

    广告 Sp_slideslide_nameslide_cidslide_picslide_urlslide_content

    广告内容:ad_name ad_contentad_status 

    发布内容 sp_classify :name 内容、uid 添加者idtime添加时间

    问题:手机版本号怎么判断?

          getCityId()在哪?

          获取图片和地址为什么是二维数组?

      为什么添加那么多表单?

    版本检测:appversion()

    orderController.class.php:订单控制页

    推送列表:index()  过期时间-发单分页- 遍历每条消息-推送时间

    //发单分页

            $count = M('Order')->where($where)->count();

            $page = $this->page($count,10);

    $info=M('Order')->where($where)->order('createtime')->limit($page->firstRow.','.$page->listRows)->select();

    问题:分页limit后的数据怎么回事?

    11-17  thinkcmf  

    MVCv层引用m层通过require-once包含文件,实例化model,调用类的方法,

          实现v层,通过Smarty,采用标签形式实现v的展示。

    模型(M):模型的定义由Model类来完成。

    控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。

    视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。

    但实际上,ThinkPHP并不依赖M或者,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C这是因为ThinkPHPAction之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。

    总而言之,ThinkPHPMVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。

    OrderController.class.php 订单控制页

    推送列表:index()  过期时间-发单分页- 遍历每条消息-推送时间

    pushcontent_test($people):判断推送人推送时间是否过期

    $where_content['user_login']=$people;

            $condition_content=M('users')->where($where_content)->find();

            $condition_stime=strtotime( $condition_content['pushstime']);

    推送时间判断:pushstime推送开始时间<time<pushetime推送结束时间

     Push:是否接受推送

    grab_list() :抢单列表  显示抢单分页列表--单条抢单信息--多余的显示到历史

    $where['uid'] = $this->user['id'];   //推送用户

    if ( $user['avatar'] ){ //用户头像路径

    $vo['avatar'] = "http://".C('SERVER_NAME').C('GRAB_SET_PATH').$user['avatar'];}

    Add():派单推送消息  判断content 内容time任务时间不为空--VIP用户判断--添加到 sp_order--添加后根据要求查询推送用户---推送信息到用户

     $where['lng'] = array( array( 'gt',$lng - 0.5 ),array( 'lt',$lng + 0.5 ),'and' );

             $where['lat'] = array( array( 'gt',$lat - 0.5 ),array( 'lt',$lat + 0.5 ) );

     $order = 'ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((lat * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((lat * 3.1415) / 180 ) *COS(('.$lng.'* 3.1415) / 180 - (lng * 3.1415) / 180 ) ) * 6380 asc';

     $info = M('Users')->where($where)->field('id,user_login')->order($order)->select();

    查询条件中有比较采用数组$where['id'] = array( 'neq',$this->user['id'] );

              $mes = array( 'orderid'=>$res,'msg'=>'有新的订单了' );

               foreach ( $info as $vo ) { if( (int)$this->pushcontent_test($vo['user_login']) ){

         推送消息  pushcontent( 0,$vo['user_login'],$mes,array(),2 );     }}

    sendone() :推送给指定人员

    if(empty($_POST['user_login'])){   $this->apiError('非法操作');  }

    $mes = array( 'orderid'=>$_POST['orderid'],'msg'=>'有新的订单指定发给你了','type'=>2);

    $res = pushcontent( 0,$_POST['user_login'],$mes,array(),2 );

    switchState():派单和抢单状态切换 --statue1接单切换到0---01

    isset($_post[‘statue’]) 

     $res = M('Users')->where(array('id'=>$this->user['id']))->setField( 'state',$state );

    $this->apiSuccess( array('state'=>$state) );

    grab_set()  :抢单设置 --接收图片--名字、证件照、验证,保存至user

     $filetype = pathinfo( $_FILES['pic']['name'] );

    加载文件 import ( 'UploadFile' );

          $upload = new UploadFile(); // 实例化上传类

          $upload->maxSize = 8388608; // 最大上传文件为8M

          $upload->allowExts = array('jpg', 'png', 'jpeg'); //上传类型只能为".apk"格式的文件

          $upload->savePath = SITE_PATH.C('GRAB_SET_PATH');  

          $upload->saveRule = $name;

          $info = $upload->upload();

    11-18  thinkcmf  

    OrderController.class.php 订单控制页

    grab_index() :抢单列表--判断验证审核、抢单设置--根据条件查找推送用户(半径确定派单用户)--将派单用户显示并显示用户详情  $juli=round(6378.138*2*asin(sqrt(pow(sin(($lat1*pi()/180-$v['lat']*pi()/180)/2),2)+cos($lat1*pi()/180)*cos($v['lat']*pi()/180)*   pow(sin( ($lng1*pi()/180-$v['lng']*pi()/180)/2),2)))*1000)

               //不能看到自己抢过的订单

             $where_grab['orderid'] = $v['id'];      订单id

             $where_grab['uid'] = $this->user['id'];  用户id

             $grab_list = M('grab_order')->where($where_grab)->find();

                //5个人抢过的订单不显示,根据orderid查找grab_order中的人数

             $where_gr['orderid'] = $v['id'];

             $total = M('grab_order')->where($where_gr)->count();        

             //搜索一点距离以内的所有订单

             if(($juli<$r) && (empty($grab_list)) && $total<5){

             $ids[]=$v['id'];}

    grab_add() :立即抢单--判断权限、订单存在、判断是否已抢单--添加抢单人信息至 grab_order表,同时更改order表的status=1--推送消息给派单人

    推送消息: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');

    $mes = array( 'orderid'=>$_POST['id'],'msg'=>'您派发的订单已被抢,快去看看吧','type'=>2);

    if( (int)$this->pushcontent_test($user_login) ){

        $re = pushcontent( 0,$user_login,$mes,array(),2 );

    order_his():历史发单列表---分页历史发单信息---遍历抢单信息

       $where['status'] = array('neq',0);

        $where['userid'] = $this->user['id'];。。。。。。

            $vo['grabnum'] = count( $grabInfo );

    foreach ( $grabInfo as $grab ){    $vo['grab_user_nicename'] = M('users')->where(array('id'=>$grab['uid']))->field('user_nicename')->find();  }

    $info[$k]['grab'] = $vo;

    grab_order_his()  :历史抢单列表--分页抢单信息---遍历显示发单信息    

    $order_hisInfo=M('order_his')->where(array('orderid'=>$v['orderid']))->field('userid,ordernum,content,status')->find();

        $info[$k]['ordernum'] = $order_hisInfo['ordernum'];

            $info[$k]['content'] = $order_hisInfo['content'];

             $info[$k]['user_nicename'] = M('users')->where(array('id'=>$order_hisInfo['userid']))->getField('user_nicename');

            $info[$k]['status'] = $order_hisInfo['status'];

    del_orderHis():历史发单列表删除--查找order_his,将status=0删除

       $where['id'] = I( 'post.id' );  //等同$_post[‘id’]

    del_grabHis():历史发单列表删除--查找del_grabHis,将status=0删除

    show_lnglat() :获取用户附近派单信息----根据条件查找sp_user派单用户---计算半径--将范围内的用户发出去

       $surplus_time = ($createtime+($limit_time*24*3600))-time();

       $where_time['_string']="id!=$userid AND grab_status=3 AND push=1 AND user_status=1 AND user_type!=1 AND state=1 AND cityid=$cityid AND find_in_set('$classid',classid)";

    $usersInfo = M('users')->where($where_time ->field('id,user_login,user_nicename,lng,lat,sex,grab_grade,classid')->select();

    问题:不是时间戳也可以相减吗?

    多个条件还可以用$arr[_string]=’...and...and’ ?

    order_del():取消派单或者取消接单  ---取消派单---取消接单

       if($info['userid']==$_SESSION['user']){   //判断是取消派单

               $id = I('post.id');

               $info = M('order')->where("id=$id")->find();

               if(empty($info)){   $this->apiError( '订单不存在' ); }

               unset($info['id']);   $info['orderid'] = $id;}

       注销id是因为$info包含了order的信息,查询order_grab orderID=$infoid

    问题:$info['userid']在哪查找?

    order_complaint():派单人投诉-----添加投诉信息

    $res = M('order_his')->add($info);

    问题:应该用setfield 更新投诉,为什么用add()?? 因为没有判断历史里面有没有

    grab_grade():派单人评价订单----将评价的订单添加到历史中更改状态同时删除order中数据----grab_order中的添加到历史,更改状态,同时删除

            $data['grab_grade'] = round(($user['grab_grade']+$_POST['grab_grade'])/2,1);

    $data['grab_assess'] = $_POST['grab_assess'];

    M('users')->where('id='.$user['id'])->save($data);。。。。。。

    $order['orderid'] = $order['id'];

    unset($order['id']);

    $order['status'] = 6;//订单结束(任务完成,已经评价完)

    $res = M('order_his')->add($order);

    问题:为什么可以直接保存或者添加数据,会不会覆盖原来数据???

    add_errorlog():对抢单人评价 不用了

    11-19 thinkcmf

    user_gettoken():融云聊天---判断gettoken存在发起的联系人获取通讯录---不存在创建(添加好友至通讯录,更新maillist,反向添加好友)

    $uidsarr = explode(',',$uids);

    foreach($uidsarr as $v){    $user = M('users')->where('id='.$v)->field('user_nicename,gettoken,user_login')->find();$list[] = $user;

    $this->apiSuccess('获取成功',array('token'=>$res['gettoken'],'list'=>$list));

    confirm_grabuser():确定抢单人,并推送消息   ---确定抢单人后加钱并发送消息,-- 修改grab_orderstatus=10请派单人验收任务-----遍历其他抢单人信息添加到历史抢单信息中,删除grab_order中信息

    $v['status'] = 0;

    $res = M('grab_order_his')->add($v);

    if($res){   M('grab_order')->where('id='.$id)->delete()   }

    confirm_check():派单人验收工作  ---- 判断是确认还是评价---验收完成结算钱发消息---等待验收

    //flag=0确认工作完成,派单人要验收工作

    //flag=1派单人点击验收按键提交,推送给抢单人

           if($_POST['flag']==1){

    if(!$res || $res['status']!=4){  $this->apiError('非法操作');}

    $data['status'] = 5;//等待评价(派单人去评价抢单人完成任务的状况)

    }else{   if(!$res || $res['status']!=2){    $this->apiError('非法操作');}

    $data['status'] = 4;//等待您验收任务(抢单人已经完成任务,等待派单人验收) }

    CenterController.class.php 个人中心页

    setInfo(): 接收图片---修改密码

          if ( isset( $_FILES['pic'] ) ) 

            {

                if ( empty( $_FILES['pic']['tmp_name'] ) )

                {

                    $this->apiError( '图片不能为空' );

                }

                $filetype = pathinfo( $_FILES['pic']['name'] );

                $name = $this->user['user_login'].'_'.NOW_TIME;

                import ( 'UploadFile' );

                $upload = new UploadFile(); // 实例化上传类

                $upload->maxSize = 8388608; // 最大上传文件为8M

                $upload->allowExts = array('jpg', 'png', 'jpeg'); //上传类型只能为".apk"格式的文件

                $upload->savePath = SITE_PATH.C('GRAB_SET_PATH');  

                $upload->saveRule = $name;

                $info = $upload->upload();

                if ( !$info ) 

                { // 上传错误提示错误信息

                    $this->apiError( $upload->getErrorMsg() );

                }

                $avatar = $name.'.'.$filetype['extension'];

                $res = M('users')->where(array('id'=>$this->user['id']))->setField('avatar',$avatar );

                if ( $res ) 

                {

                    $url = "http://".$_SERVER['HTTP_HOST'].sp_get_user_avatar_url($avatar);

                    $this->apiSuccess( '头像保存成功',array('avatar'=>$url));

                }

                else

                {

                    $this->apiError( '头像保存失败' );

                } }。。。。

    $key = array_keys( $_POST ); 

    $res = M('Users')->where( array( 'id'=>$this->user['id'] ) )->setField( $key[0],$_POST[$key[0]] );  

    问题:最后不知道修改的什么????

    set_grab():添加抢单设置----修改抢单状态

    $res = M('users')->where($where)->save($_POST);

    get_ErrorMsg():得到系统错误信息

         $filename =$person['user_login'].'_'.date('Ymd_His').'.txt';

            $full_path =C('CRASH_FILE').$filename;

            $fp = fopen( $full_path,'w' );

            fwrite( $fp, $_POST['stack'] );

            fclose($fp);

  • 相关阅读:
    JPA注解
    STM32—cubeMX+DMA+USART 接收任意长度的数据
    GDI+绘制有填充和无填充颜色的长方形和圆形(C#)
    C#基本线程同步
    三层架构的上位机软件开发
    C# DataTable
    外网穿透后的域名解析(C#winform)
    基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接(转)
    2019年9月6日 Cadence 16.6PCB封装设计记录(二)
    Cadence 16.6PCB封装设计记录(一)
  • 原文地址:https://www.cnblogs.com/jingzi111/p/5044814.html
Copyright © 2020-2023  润新知