手把手教你写项目之游戏陪玩app全栈开发---第四章:后端API(上):用户的“身份证”与“通行证”

阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!

效果预览:
在这里插入图片描述

在这里插入图片描述

第四章:后端API(上):用户的“身份证”与“通行证”

Hello,代码世界的“探险家”们,我们又见面了!

前面的章节里,我们搭好了“营地”(开发环境),绘制了“藏宝图”(数据库设计)。现在,装备齐全,粮草充足,是时候正式踏上“寻宝”之路了。从这一章开始,我们将正式进入编码环节,亲手打造后端API——这个连接前端与数据库的“交通枢纽”。

我们的第一站,是用户系统。这是一个App的“大门”,所有故事都从这里开始。我们将实现两个最基础、也最重要的接口:用户注册和登录。并且,我们会引入一个关键的概念——Token,为我们后续所有需要用户登录才能操作的接口,颁发一张“赛博通行证”。

一、API是什么?——餐厅服务员的比喻

在动手之前,我们先用个接地气的比喻搞懂API到底是啥。

想象一下,你(前端)去一家餐厅吃饭,想点一份宫保鸡丁。你不会自己跑到后厨去,跟厨师(数据库)说:“嘿,哥们儿,给我炒个菜,要几克鸡肉,几勺酱油……” 你会累死,厨师也会烦死。

正确的姿势是,你招手叫来服务员(API),把你的需求(HTTP请求)告诉他。服务员拿到你的“订单”后,会用后厨能听懂的“黑话”跟厨师沟通。厨师炒好菜(处理完数据)后,再由服务员把菜(JSON数据)端到你的面前。

所以,API就是这个“服务员”,它定义了一套前端与后端沟通的“菜单”和“规矩”,让双方的协作变得高效、有序。

二、注册接口:发放下线“身份证”

我们开发的第一个接口是“用户注册”。它负责接收前端传来的手机号、密码等信息,然后在数据库的 fa_user 表里创建一个新用户,相当于给新用户办理一张“身份证”。

1. 代码位置

文件路径: /application/api/controller/User.php

这个文件是用户相关接口的“大本营”,我们大部分用户操作的逻辑都会写在这里面。

2. 代码片段

// 文件路径:/application/api/controller/User.php

<?php
namespace app\api\controller;

use app\common\controller\Api;
use fast\Random;
use think\Db;

class User extends Api
{
    // ... 其他代码 ...

    /**
     * 会员注册
     */
    public function register()
    {
        // 接收前端传来的手机号、密码等参数
        $mobile = $this->request->request('mobile');
        $password = $this->request->request('password');
        $code = $this->request->request('code'); // 短信验证码

        if (!$mobile || !$password) {
            $this->error('参数不完整');
        }
        
        // 此处可以加入对短信验证码的校验逻辑
        // if (验证码不正确) { $this->error('验证码错误'); }

        // 核心逻辑:往用户表(fa_user)里插入数据
        $salt = Random::alnum(); // 生成一个随机盐值
        $new_password = md5(md5($password) . $salt); // 对密码进行加密

        $data = [
            'mobile'     => $mobile,
            'password'   => $new_password,
            'salt'       => $salt,
            'group_id'   => 1, // 默认为普通用户组
            'createtime' => time(),
            'status'     => 'normal',
        ];

        $user = Db::name('user')->insert($data);

        if (!$user) {
            $this->error('注册失败,请重试');
        }

        $this->success('注册成功');
    }

    // ... 其他代码 ...
}

3. 结构化分析

这段代码的“宏观”作用非常明确:接收注册信息 -> 验证信息合法性 -> 加密密码 -> 存储到数据库 -> 返回注册结果。它为我们的App提供了“纳新”的能力,是构建用户体系的第一块砖。

4. 逐行/逐块详解

  • namespace app\api\controller;: 定义了当前文件所属的“命名空间”,这是PHP的组织代码的一种方式,可以理解为给代码文件分门别类。
  • use app\common\controller\Api;: 引入了一个基础的 Api 控制器。我们的 User 控制器继承了它,就能复用一些公共的方法,比如 successerror
  • public function register(): 定义了一个公开的 register 方法,这就是我们的“注册接口”本体。前端就是通过访问这个方法来发起注册请求的。
  • $this->request->request('mobile');: 这是ThinkPHP框架获取前端请求参数的方式。$this 代表当前控制器实例,request 是请求对象。
  • if (!$mobile || !$password) { ... }: 一个基础的参数校验,判断手机号和密码是否为空。在真实项目中,这里还应该有更严格的校验,比如手机号格式是否正确。
  • $salt = Random::alnum();: 生成一个随机的字符串,我们称之为“盐”。
  • $new_password = md5(md5($password) . $salt);: 这是安全性的关键! 我们绝不能把用户的明文密码直接存到数据库。正确的做法是“加盐加密”。把用户的原始密码和这个随机生成的“盐”拼接起来,再进行两次 md5 加密。这样,即便数据库被盗,黑客也无法轻易破解出用户的原始密码。
  • $data = [...]: 构建一个数组,包含了要插入到数据库的所有字段。
  • Db::name('user')->insert($data);: 调用ThinkPHP的数据库操作类,向 fa_user (框架会自动加上表前缀fa_)表中插入 $data 这条记录。
  • $this->success('注册成功');: 调用基类 Api 的方法,向前端返回一个表示成功的JSON数据,并附带提示信息。

三、登录接口与Token:颁发“赛博通行证”

用户注册后,下一步就是登录了。登录成功后,我们不能每次请求都让用户再输一次账号密码,体验太差了。我们需要一种机制,来“记住”用户的登录状态。这就是 Token 登场的时候了。

整个流程可以用一张时序图来清晰地展示:

用户 前端App 后端API 数据库 输入手机号和密码, 点击登录 发起登录请求 (带上手机号和密码) 根据手机号查询用户信息 返回用户信息 (包含加密后的密码和盐) 用同样的方式加密用户输入的密码, 与数据库中的密码比对 生成一个有时效性的Token (一长串随机字符串) 将Token与用户ID关联, 存入缓存或数据库 返回登录成功, 并附带Token 将Token保存到本地 返回登录失败 alt [密码正确] [密码错误] 在后续需要登录的请求中 每次请求都在请求头(Header)里带上Token 验证Token的有效性 执行业务操作 返回业务数据 返回业务数据 返回错误, 提示用户重新登录 alt [Token有效] [Token无效或过期] 用户 前端App 后端API 数据库

简单来说,Token就是:

  1. 用户登录成功后,服务器发给他的一个“临时身份证”。
  2. 这个“身份证”有时效性,过期了就需要重新登录获取。
  3. 用户每次访问需要权限的接口时,都必须出示这个“身份证”。
  4. 服务器验证“身份证”的真伪和有效期,确认无误后,才提供服务。

由于登录和Token生成的代码会更复杂一些,我们将在下一章结合代码进行详细的拆解。

四、总结

今天,我们成功敲下了第一行后端代码,实现了用户注册这个基础而关键的功能。我们学习了如何接收和验证参数,如何对用户密码进行安全的“加盐加密”,以及如何使用ThinkPHP将数据存入数据库。

更重要的是,我们理解了API作为“服务员”的角色,并通过时序图对 Token 认证机制有了宏观的认识。这为我们后续开发所有需要登录才能访问的接口铺平了道路。

在下一章 《后端API(下):陪玩师列表?不,是“人才市场”》 中,我们将继续完善用户登录接口,亲手实现Token的生成与验证,并开发出获取陪玩师列表的核心接口。

准备好进入API开发的核心地带了吗?我们不见不散!

源码下载地址:
https://thmail.lanzouu.com/iveW134b31qj

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值