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


第四章:后端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控制器继承了它,就能复用一些公共的方法,比如success和error。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 登场的时候了。
整个流程可以用一张时序图来清晰地展示:
简单来说,Token就是:
- 用户登录成功后,服务器发给他的一个“临时身份证”。
- 这个“身份证”有时效性,过期了就需要重新登录获取。
- 用户每次访问需要权限的接口时,都必须出示这个“身份证”。
- 服务器验证“身份证”的真伪和有效期,确认无误后,才提供服务。
由于登录和Token生成的代码会更复杂一些,我们将在下一章结合代码进行详细的拆解。
四、总结
今天,我们成功敲下了第一行后端代码,实现了用户注册这个基础而关键的功能。我们学习了如何接收和验证参数,如何对用户密码进行安全的“加盐加密”,以及如何使用ThinkPHP将数据存入数据库。
更重要的是,我们理解了API作为“服务员”的角色,并通过时序图对 Token 认证机制有了宏观的认识。这为我们后续开发所有需要登录才能访问的接口铺平了道路。
在下一章 《后端API(下):陪玩师列表?不,是“人才市场”》 中,我们将继续完善用户登录接口,亲手实现Token的生成与验证,并开发出获取陪玩师列表的核心接口。
准备好进入API开发的核心地带了吗?我们不见不散!
1553

被折叠的 条评论
为什么被折叠?



