美文网首页
php登陆接口转 Go

php登陆接口转 Go

作者: HueyYao | 来源:发表于2021-03-11 22:27 被阅读0次

    php登陆接口转 Go

    转化宗旨:

    整理原有接口的请求参数和返回数据信息
    
    分析原有代码了解业务逻辑
    
    不改变请求参数和返回数据的前提下实现功能
    

    登陆接口为例进行操作转换

    php流程梳理

    路由信息:

    //登录接口
    Route::post('login/do', 'UserController/loginDo');
    //注册接口
    Route::post('register/save', 'UserController/saveRegister');
    

    UserController:

        /**
         * 通过手机号和密码登录
         * @param string $mobile
         * @param string $password
         * @return \think\response\Json
         */
        public function loginDo()
        {
            try{
                //获取手机号
                //获取密码
                $mobile = Request::post('mobile', '');
                $password = Request::post('password', '');
                if(!$mobile){
                    throw new \Exception("手机号不能为空");
                }
                if(!$password){
                    throw new \Exception("密码不能为空");
                }
                if(!isMobile($mobile)){
                    throw new \Exception("手机号格式不正确");
                }
                $rs = User::isMobileLogin($mobile, Md5V($password));
                if($rs){
                    returnSuccess([
                        'uid' => $rs['id'], 
                        'name' => $rs['name']
                    ]);
                }
                throw new \Exception("手机号或密码不正确");
            } catch (\Exception $e) {
                returnError(5000, $e->getMessage());
            }
        }
    

    Model层涉及到的函数isMobileLogin()

        /**
         * 根据手机号和密码获取数据
         * @param string $mobile
         * @param string $password
         * @return rs
         */
        public static function isMobileLogin($mobile, $password){
            $rs = Db::table('user')->where([
                ['mobile', '=', $mobile],
                ['password', '=', $password],
            ])
            ->select();
            if(!$rs->isEmpty()){
                return $rs[0];
            }
            return false;
        }
    

    Common.php涉及到的公共加密函数Md5V()

    /**
     * 用户密码MD5方法
     * @param string $password 密码
     * @return json
     */
    function Md5V($password){
        return md5($password . 'RaW#XhH2aVgo!Iy1');
    }
    

    Common.php返回结果函数:

    function returnSuccess($data, $count = 0){
        $return = [
            'code' => 0,
            'items' => $data,
            'count' => $count
        ];
        echo json_encode($return);
        exit;
    }
    
    function returnError($code, $msg){
        $return = [
            'code' => $code,
            'msg' => $msg,
        ];
        echo json_encode($return);
        exit;
    }
    

    梳理php接口得知登陆接口涉及到的数据有:

    **需要传递的参数有:mobile  password**
    
    **需要返回的参数是:uid name**
    
    Go语言写法

    在配置好数据库的同时 创建对应路由

    func init() {
        beego.Include(&controllers.UserController{})
    }
    

    UserController

    //用户登录
    // @router /login/do [*]
    func (this *UserController) LoginDo() {
      //接收参数并赋值
        mobile := this.GetString("mobile")
        password := this.GetString("password")
        //判断数据是否为空
      //ReturnError函数写在公共Common.go文件里
        if mobile == "" {
            this.Data["json"] = ReturnError(4001, "手机号不能为空")
            this.ServeJSON()
        }
        isorno, _ := regexp.MatchString(`^1(3|4|5|7|8)[0-9]\d{8}$`, mobile)
        if !isorno {
            this.Data["json"] = ReturnError(4002, "手机号格式不正确")
            this.ServeJSON()
        }
        if password == "" {
            this.Data["json"] = ReturnError(4003, "密码不能为空")
            this.ServeJSON()
        }
        uid, name := models.IsMobileLogin(mobile, MD5V(password))
        if uid != 0 {
            this.Data["json"] = ReturnSuccess(0, "登录成功", map[string]interface{}{"uid": uid, "username": name}, 1)
            this.ServeJSON()
        } else {
            this.Data["json"] = ReturnError(4004, "手机号或密码不正确")
            this.ServeJSON()
        }
    }
    

    Common.go位控制器中的公共函数

    package controllers
    
    import (
        "crypto/md5"
        "encoding/hex"
        "time"
    
        "github.com/astaxie/beego"
    )
    
    // Operations about Users
    type CommonController struct {
        beego.Controller
    }
    //定义返回值的struct
    type JsonStruct struct {
        Code  int         `json:"code"`
        Msg   interface{} `json:"msg"`
        Items interface{} `json:"items"`
        Count int64       `json:"count"`
    }
    
    func ReturnSuccess(code int, msg interface{}, items interface{}, count int64) (json *JsonStruct) {
        json = &JsonStruct{Code: code, Msg: msg, Items: items, Count: count}
        return
    }
    
    func ReturnError(code int, msg interface{}) (json *JsonStruct) {
        json = &JsonStruct{Code: code, Msg: msg}
        return
    }
    
    //用户密码加密
    func MD5V(password string) string {
        h := md5.New()
        h.Write([]byte(password + beego.AppConfig.String("md5code")))
        return hex.EncodeToString(h.Sum(nil))
    }
    
    

    Model层 通过操作数据库来返回结果

    //登录功能
    func IsMobileLogin(mobile string, password string) (int, string) {
        o := orm.NewOrm()
        var user User
      //找到user表 通过mobile和password来获取一条数据
        err := o.QueryTable("user").Filter("mobile", mobile).Filter("password", password).One(&user)
        if err == orm.ErrNoRows {
            return 0, ""
        } else if err == orm.ErrMissPK {
            return 0, ""
        }
        return user.Id, user.Name
    }
    

    相关文章

      网友评论

          本文标题:php登陆接口转 Go

          本文链接:https://www.haomeiwen.com/subject/mlnoqltx.html