“东莞梦幻网络科技”体育直播系统中 VIP会员系统 的实现思路,包括开通流程、权限控制、标识展示以及核心实现代码示例。使用 ThinkPHP + MySQL + Redis 架构的体育直播平台。
-- 用户VIP表
CREATE TABLE `user_vip` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL,
`vip_level` TINYINT NOT NULL COMMENT '1:月度,2:季度,3:年度',
`start_time` DATETIME NOT NULL,
`end_time` DATETIME NOT NULL,
`status` TINYINT DEFAULT 1 COMMENT '1:有效,0:过期',
INDEX (`user_id`)
);
-- VIP等级表
CREATE TABLE `vip_level` (
`level` TINYINT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
`permissions` JSON COMMENT '权限列表'
);public function openVIP($userId, $level)
{
// 获取VIP信息
$vipInfo = Db::name('vip_level')->where('level', $level)->find();
if (!$vipInfo) return ['status'=>0,'msg'=>'VIP等级不存在'];
// 模拟支付成功
$now = date('Y-m-d H:i:s');
$endTime = date('Y-m-d H:i:s', strtotime("+1 month")); // 假设月度VIP
Db::name('user_vip')->insert([
'user_id' => $userId,
'vip_level' => $level,
'start_time' => $now,
'end_time' => $endTime,
'status' => 1
]);
// 更新Redis缓存,方便权限校验
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->hSet("vip_user:$userId", 'vip_level', $level);
$redis->hSet("vip_user:$userId", 'end_time', $endTime);
return ['status'=>1, 'msg'=>'开通成功', 'vip_level'=>$level];
}public function checkVIPPermission($userId, $permission)
{
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$vip = $redis->hGetAll("vip_user:$userId");
if (empty($vip) || strtotime($vip['end_time']) < time()) {
return false; // 非VIP或已过期
}
// 获取权限列表
$vipLevel = $vip['vip_level'];
$permissions = Db::name('vip_level')->where('level', $vipLevel)->value('permissions');
$permissions = json_decode($permissions, true);
return in_array($permission, $permissions);
}前端调用接口时可以根据返回值显示或隐藏VIP专属内容。
<div class="user-info">
<img src="{{avatar}}" alt="头像">
<span class="username">{{username}}</span>
<!-- VIP徽章 -->
<span class="vip-badge" v-if="isVIP">VIP</span>
</div>
<div class="vip-rights" v-if="isVIP">
<ul>
<li v-for="item in vipRights">{{item}}</li>
</ul>
<p>剩余天数:{{vipDays}}天</p>
</div>// Vue/React逻辑示例
computed: {
vipDays() {
if(!this.vipEndTime) return 0;
return Math.ceil((new Date(this.vipEndTime) - new Date()) / (1000*60*60*24));
},
isVIP() {
return this.vipEndTime && new Date(this.vipEndTime) > new Date();
}
}进一步优化:
可以结合消息队列处理支付后异步更新VIP状态 Redis缓存定期同步MySQL,防止数据不一致 后台可设置VIP续费提醒、到期通知

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。