欢迎光临
我们一直在努力

Ecstore扩展新的用户体系

ecstore在前台已经有了会员机制,我们如何来扩展出另一套用户机制,比如商户等.

下边我们以商户为例,扩展一套商户的用户体系出来!!

  • 首先,新建app,新建app的方法我们就不做陈述.建立用户dbschema数据库描述文件.先建立好数据库.
    <?php
    /*用户基本信息*/
    $db['user'] = array(
        'columns' => 
        array(
            'user_id' =>
            array (
              'type' => 'number',
              'extra' => 'auto_increment',
              'pkey' => true,
              'label' => app::get('b2c')->_('ID'),
            ),
            'login_name' => 
            array(
                'type' => 'varchar(50)',
                'label' => app::get('excbe')->_('用户名'),
                'required' => true,
                'searchtype' => 'has',
                'in_list' => true,
                'default_in_list' => true,
                'order'=>10,
                'orderby'=>true,
                'default'=>'',
                'filtertype'=>'normal',
                'filterdefault'=>true,
            ),
            'login_password'=>
            array(
                'type'=>'varchar(32)',
                'required' => true,
                'comment' => app::get('pam')->_('登录密码'),
                'default'=>'',
            ),
    
            'name'=>
            array(
                'type'=> 'varchar(255)',
                'label'=> app::get('excbe')->_('企业/个人名称'),
                'searchtype' => 'has',
                'in_list' => true,
                'required' => true,
                'default'=>'',
                'orderby'=>true,
                'filtertype'=>'normal',
                'filterdefault'=>true,
                'default_in_list' => true,
            ),
            'phone'=>
            array(
                'type'=> 'varchar(255)',
                'label'=> app::get('excbe')->_('联系电话'),
                'searchtype' => 'has',
                'required' => true,
                'default'=>'',
                'in_list' => true,
                'orderby'=>true,
                'filtertype'=>'normal',
                'filterdefault'=>true,
                'default_in_list' => true,
            ),
           
            'ctime' => 
            array (
                'label' => app::get('excbe')->_('创建时间'),
                'type' => 'time',
                'required' => true,
                'default'=>'0',
                'filtertype' => 'time',
                'filterdefault' => true,
                'in_list' => true,
                'default_in_list' => true,
                'order'=>100,
                'orderby'=>true,
            ),
    
        ),
        'comment' => app::get('excbe')->_('商户基本信息'),
        'version' => '$Rev: 1.0.0 $',
        'engine'  => 'innodb',
    );
  • 定义前端用户登录以及商户中心的module,即商户模块控制器,文件内容如下
    <site>
        <explorer id='excbe' path='view/site'>综合服务</explorer>
        <module controller='site_passport' >
            <name>pass</name>
            <title>商户登录</title>
            <disable>false</disable>
            <allow_menu act='index'>商户登录</allow_menu>
        </module>
        <module controller='site_user' >
            <name>user</name>
            <title>商户中心</title>
            <disable>false</disable>
            <allow_menu act='index'>商户中心</allow_menu>
        </module>
    </site>
  • 控制器建立以后我们,接着就要写好对应的控制器代码,首先我们来写前端用户注册的代码
    public function signup($url=null){
            
            //检查是否登录,如果已登录则直接跳转到会员中心
           $url = $this->gen_url(array('app'=>'excbe','ctl'=>'site_user','act'=>'index'));//echo
           if($this->check_login())
                $this->redirect($url);
            $this->display("site/user/passport/signup.html");
        }
     function check_login(){
            kernel::single('base_session')->start();
            if($_SESSION['user']['user_id']>0){
                return true;
            }
            else{
                return false;
            }
        }
  • 用户注册控制器写好后我们写用户注册界面的html代码,注册代码很简单,只需要包含登录用户名,密码,重复密码接着就是用户姓名,电话等一些不必要的字段.
    <form id="signup_form"method="post"  action="<{link app=excbe ctl=site_passport act=create}>">
                        <div class="form-group">
                        <input type="text" class="form-control" name="login_name"  placeholder="请输入登录用户名">
                        </div>
                        <div class="form-group">
                            <input type="password"  class="form-control" name="login_password" id="login_password"  placeholder="请输入密码" >
                        </div>
                        <div class="form-group">
                            <input type="password" class="form-control required"  name="psw_confirm"   placeholder="请再次输入密码" >
                        </div>
                        
                        <div class="form-group">
                        <input type="text" name="name" id="name" placeholder="请输入企业名称" class="form-control required">
                        </div>    
                        
                        <div class="form-group">
                        <input type="text" name="phone"  placeholder="请输入联系电话" class="form-control required">
                        </div>
                        
                        <div class="form-group text-left">
                            <div class="checkbox i-checks">
                                <label class="no-padding">
                                    <input type="checkbox" name="license" value="on"><i></i> 我同意注册协议</label>
                            </div>
                        </div>
                        <button type="submit" rel="request"  class="btn btn-primary block full-width m-b">注 册</button>
                        <p class="text-muted text-center"><small>已经有账户了?</small><a href="<{link app=excbe ctl=site_passport act=index}>">点此登录</a>
                        </p>
    
      </form>
  • 注册界面写好后,我们接着写注册提交的action,由上边的form我们可知道提交的地址,代码如下.
     public function create(){
            if(!$this->check_signup($_POST,$msg)){
                $this->splash('failed',null,$msg,"true");
            }
            $saveData = $this->pre_signup_process($_POST);
            if($user_id = $this->save_user($saveData) ){
                
                 $url = $this->gen_url(array('app'=>'excbe','ctl'=>'site_user','act'=>'index'));
                 $this->splash('success',$url,app::get('excbe')->_('注册成功'),'true');
            }
            $back_url = $this->gen_url(array('app'=>'excbe','ctl'=>'site_passport','act'=>'index'));
            $this->splash('failed',$back_url,app::get('excbe')->_('注册失败'),'true');
         }
         
         /**
         *组织注册需要的数据
         */
        public function pre_signup_process($data){
            $login_account = strtolower($data['login_name']);
            $password_account =$login_account;
            $use_pass_data['login_name'] = $password_account;
            $use_pass_data['createtime'] = time();//fb($data['login_password']);
            $login_password = pam_encrypt::get_encrypted_password(trim($data['login_password']),'user',$use_pass_data);
            $userData=array(
            "login_name"=>$login_account,
            "login_password"=>$login_password,
            "name"=>$data['name'],
            "phone"=>$data['phone'],
            "ctime"=>$use_pass_data['createtime'],
            );
            $userData = kernel::single("excbe_site_xssfilter")->check_input($userData);
            return $userData;
        }
    
        
    
        public function check_signup($data,&$msg){
            $data =kernel::single("excbe_site_xssfilter")->check_input($data);
            $login_name=$data['login_name'];
            if(empty($login_name) ){
                $msg =app::get('excbe')->_('请输入用户名');
                return false;
            }
    
            if( strlen(trim($login_name))< 4 ){
                $msg = $this->app->_('登录账号最少4个字符');
                return false;
            }
            elseif( strlen($login_name)>100 ){
                $msg = $this->app->_('登录账号过长,请换一个重试');
            }
    
            if( is_numeric($login_name) ){
                $msg = $this->app->_('登录账号不能全为数字');
                return false;
            }
    
            if(!preg_match('/^[^\x00-\x2d^\x2f^\x3a-\x3f]+$/i', trim($login_name)) ){
                $msg = $this->app->_('该登录账号包含非法字符');
                return false;
            }
            //判断账号是否存在
            if( $this->is_exists_login_name($login_name) ){
                $msg = $this->app->_('该账号已经被占用,请换一个重试');
                return false;
            }
            //检查密码
            $psw_confirm=$data['psw_confirm'];
            $passwdlen = strlen( trim($data['login_password']) );
            $password = $data['login_password'];
            if($passwdlen<6){
                $msg = $this->app->_('密码长度不能小于6位');
                return false;
            }
            if($passwdlen>20){
                $msg = $this->app->_('密码长度不能大于20位');
                return false;
            }
            if($password != $psw_confirm){
                $msg = $this->app->_('输入的密码不一致');
                return false;
            }
            
            if(empty($data['name']) ){
                $msg =app::get('excbe')->_('请输入企业名称');
                return false;
            }
            
            if(empty($data['phone']) ){
                $msg =app::get('excbe')->_('请输入联系电话');
                return false;
            }
            
            
            return true;
            
         }
         
    
    
        public function save_user($saveData,&$msg){
            $user_model = $this->app->model('user');
            $db = kernel::database();
            $db->beginTransaction();//fb($saveData);die;
            $user_id=$user_model->save($saveData);
            if($user_id>0){
                $db->commit();
            }else{
                $db->rollBack();
                $msg = '保存失败,请联系客服!';
                return false;
            }
            return $user_id;
        }
    
    
         
        /*
         * 判断前台用户名是否存在
         * */
        public function is_exists_login_name($login_name){
            if(empty($login_name)){
                return false;
            }
            $user_model = app::get('excbe')->model('user');
            $flag = $user_model->getList('*',array('login_name'=>trim($login_name)));
            return $flag ? true : false;
        }

    该代码包含:用户登录检查form字段的过滤,用户名称检查是否重复,密码是否规范,以及密码的加密规则,和数据保存等操作,就这样一个注册的操作已经做完了.

  • 接着我们来写前端登录页面控制器以及登录界面的调用,根据site.xml定义的控制器路径,在app/excbe/controller/site/passport.php,代码如下.
       public function index(){
            $url = $this->gen_url(array('app'=>'excbe','ctl'=>'site_user','act'=>'index'));//echo
            if($this->check_login())
                $this->redirect($url);
            $this->display('site/user/passport/login.html');
        }

    以上代码解释为:首先检查用户是否是已经登录状态,若已登录就直接跳转到商户中心,如果未登录就直接显示登录界面

  • 登录界面的设计只需要一个登录帐号,一个密码,一个验证码即可
       <form class="m-t" id="loginForm" method="post" action="<{link app=excbe ctl=site_passport act=post_login}>">
            <div class="form-group">
                <input name="login_name"  class="form-control required" type="text"  placeholder="用户名">
            </div>
            <div class="form-group">
                <input type="password"  class="form-control required" name="login_password"  placeholder="密码" >
            </div>
            <div class="form-group clearfix" style="text-align:left;">
              <span style="width:50%;float:left;"> 
              
              <{input type="vcode" name="verifycode" class="verify-input" placeholder="填写验证码" data-caution="请正确填写验证码" key='b2c'}>
              </span> 
            </div>
            
            <button type="submit" rel="request" class="btn btn-primary block full-width m-b">登 录</button>
            <p class="text-muted text-center"> <a href="#" id="forgetpwd"><small>忘记密码了?</small></a> | <a href="<{link app=excbe ctl=site_passport act=signup}>">注册一个新账号</a>
            </p>
        </form>
  • 接着我们就根据登录提交的form,写对应php登录代码
    function post_login() {
            $post = utils::_filter_input($_POST);
            unset($_POST);
            $userData = array(
                'login_name' => $post['login_name'],
                'login_password' => $post['login_password'],
                'login_type'=>'user'
            );
            if(empty($post['verifycode'])){
                $msg = app::get('excbe')->_('请输入验证码!');
                $this->splash('failed',null,$msg,true);exit;
            }
            $user_id = kernel::single('excbe_site_vetrify')->login($userData,$post['verifycode'],$msg);
            if(!$user_id){
                $this->splash('failed',null,$msg,true,$data);exit;
            }    
            $excbe_user_model = $this->app->model('user');
            $user_data = $excbe_user_model->getList( '*', array('user_id'=>$user_id) );
            if(!$user_data){
              
                $msg = $this->app->_('登录失败:数据存在问题,请联系客服');
                $this->splash('failed',null,$msg,true,$data);exit;
            }
            $user_data = $user_data[0];
            $this->set_user_session($user_data);
            $url = kernel::single('excbe_frontpage')->gen_url(array('app'=>'excbe','ctl'=>'site_user','act'=>'index'));
            $this->splash('success',$url,app::get('b2c')->_('登录成功'),true);
        }
    
        public function set_user_session($user_data){
            unset($_SESSION['error_count']['excbe']);
            $_SESSION['user']['user_id'] = $user_data['user_id'];
            $_SESSION['user']['login_name'] = $user_data['login_name'];
            $_SESSION['user']['name'] = $user_data['name'];
        }

    至此一个新的user的用户体系已经建立完毕,以上登录模块包含有验证码模块,请见验证码模块详细说明,

 

未经允许不得转载:PHP之窗 » Ecstore扩展新的用户体系

分享到:更多 ()

评论 4

  • (必填)
  • 13 + 15 = ?(必填)
  1. #4

    不错,不错,看看了!

    zengda3年前 (2016-04-07)回复
  2. #3

    真的没看懂

    孩子7个月前 (05-09)回复
  3. #2

    写得是很好,但是对于开发者还说写得还是不够详细,比如文件名、文件路径没写清楚

    sean6个月前 (07-02)回复
  4. #1

    各位ecstore的同事大家好,我建了一个ecstore的交流群,欢迎大家加入进行技术交流 群内气氛和谐 广告秒踢 群号是:930607753

    黎明之前2个月前 (10-11)回复

产品与解决方案,顶尖的服务!!

联系我们