ThinkPHP会员系统开发案例

老静吖_7666

老静吖_7666

2026-05-18

1021人浏览

原创

密码须用hash::make()哈希存储,禁用明文;短信验证码应存redis并设5分钟过期,验证后立即删除,失败3次封禁手机号15分钟。

thinkphp会员系统开发案例

会员注册流程中如何安全处理密码和验证码

直接用 $_POST['password'] 原样存库是典型错误,ThinkPHP 6+ 默认已弃用 md5() 和裸 sha1(),必须用框架内置的哈希方案。

推荐做法是使用 think\facade\Hash::make(),它默认调用 PHP 的 password_hash()(bcrypt 算法),兼容性好、防爆破、带盐值:

$hashedPwd = \think\facade\Hash::make($request->post('password'));

短信验证码不能只存在 session 或前端 localStorage 里——容易被绕过。正确姿势是:生成后立即写入 Redis,设置 5 分钟过期,并在验证时用 \think\facade\Cache::get('sms_' . $mobile) 对比,验证成功后立刻 delete()。

  • 别把验证码逻辑写死在控制器里,抽成独立服务类(如 SmsService),便于后续替换阿里云/腾讯云 SDK
  • 验证码校验失败超过 3 次,建议临时封禁该手机号 15 分钟(用 Redis 记录失败次数 + 时间戳)
  • 前端提交密码时,务必禁用 autocomplete:<input type="password" autocomplete="new-password">

会员等级自动升级怎么用模型事件实现

手动在每个消费成功后写“查总金额 → 判断等级 → 更新字段”极易遗漏或重复执行。ThinkPHP 的模型事件(afterWrite、afterUpdate)才是正解。

在 app\model\Member.php 中定义:

protected static function init()
{
    self::event('afterWrite', function ($member) {
        $total = $member->orders()->sum('amount');
        $level = LevelRule::getLevelByAmount($total);
        if ($level > $member->level) {
            $member->save(['level' => $level]);
        }
    });
}

注意:这里不能用 $member->level = $level; $member->save(); 再触发一次事件,否则递归死循环。必须用 $member->save(['level' => $level]) 绕过事件监听。

  • 等级规则(如 VIP1 ≥ 500 元、VIP2 ≥ 2000 元)建议单独建 level_rules 表,而非硬编码,方便运营后台调整
  • 如果订单表有退款字段,记得升级逻辑里排除已退款订单:->where('status', 'paid')
  • 高频消费场景下,避免每次下单都全量 SUM,可用数据库触发器或消费完成时用 Redis INCR 累计金额

多城市门店下如何高效关联会员与服务站

常见错误是把城市 ID、门店 ID、服务站 UID 全塞进会员表,导致查询慢、变更难。ThinkPHP 的关联模型能解耦但需注意外键设计。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

假设结构为:users(会员/服务站共用)、cities、stores、service_stations。关键点是:

  • 会员表加字段 station_id(外键指向 service_stations.id),而非直接存服务站负责人 UID
  • 服务站表加 city_id 和 store_id,形成两级归属,避免跨表 JOIN 多次
  • 查某城市下所有会员,不要写三层嵌套子查询,改用预加载 + 条件过滤:
Member::with(['station.store.city'])
    ->whereHas('station.city', fn ($q) => $q->where('id', $cityId))
    ->select();

如果并发量大,whereHas 可能变慢,此时应给 service_stations.city_id 和 users.station_id 加联合索引。

为什么推荐用 Hook 而不是中间件处理会员行为扩展

中间件适合全局拦截(如登录校验),但会员注册后发积分、发通知、同步到 CRM 这类“可插拔动作”,用中间件会污染主流程、难以开关、测试困难。

ThinkPHP 的钩子(Hook)机制更合适。例如注册完成触发 member_register_success 钩子:

// 在 app\common\hook\RegisterHook.php
public function sendWelcomeSms($member)
{
    SmsService::send($member['mobile'], '欢迎加入!');
}

// 调用处(注册控制器末尾)
\think\Hook::listen('member_register_success', $member);

这样新增“注册后推送企业微信”只需写个新 Hook 类,无需动原有控制器代码。

  • 别在 Hook 里做耗时操作(如调外部 API),应投递到队列(think-queue)异步执行
  • 钩子命名要带业务域前缀(如 member_),避免和支付、订单等其他模块冲突
  • 线上环境禁用未注册的钩子调用,可在 tags.php 显式声明启用列表,防止误触发

真正难的不是写钩子,而是定义清楚哪些逻辑属于核心链路、哪些属于可选增强——这决定了系统后期能不能不改主干就灵活响应运营需求。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9524

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5741

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2055

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3588

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4274

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3331

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4757

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3722

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11722

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程