Files
cursoradminapiformjifengqiang/app/admin/controller/api/Member.php
2025-02-12 10:45:49 +08:00

290 lines
9.8 KiB
PHP

<?php
declare (strict_types = 1);
namespace app\admin\controller\api;
use app\manager\model\Member as MemberModel;
use think\admin\Controller;
use think\facade\Db;
/**
* 会员接口管理
*/
class Member extends Controller
{
/**
* 验证会员状态
*/
public function check()
{
// 接收参数
$keyword = trim(input('keyword', ''));
if (empty($keyword)) {
return json([
'code' => 1,
'msg' => '请输入查询关键字'
]);
}
// 查询会员信息 (email = xxx OR order_id = xxx)
$member = MemberModel::whereOr('email', '=', $keyword)
->whereOr('order_id', '=', $keyword)
->find();
if (empty($member)) {
return json([
'code' => 1,
'msg' => '会员不存在'
]);
}
// 检查会员状态
if ($member['status'] != 1) {
return json([
'code' => 1,
'msg' => '会员已被禁用'
]);
}
// 检查有效期
if (strtotime($member['expire_time']) < time()) {
return json([
'code' => 1,
'msg' => '会员已过期'
]);
}
// 检查使用次数
if ($member['usage_limit'] > 0 && $member['used_count'] >= $member['usage_limit']) {
return json([
'code' => 1,
'msg' => '使用次数已达上限'
]);
}
// 更新使用次数和最后登录信息
$member->used_count = $member->used_count + 1;
$member->last_login_time = date('Y-m-d H:i:s');
$member->last_login_ip = $this->request->ip();
$member->save();
// 返回成功
return json([
'code' => 0,
'msg' => '验证通过',
'data' => [
'email' => $member['email'],
'order_id' => $member['order_id'],
'expire_time' => $member['expire_time'],
'usage_limit' => $member['usage_limit'],
'used_count' => $member['used_count'],
'last_login_time' => $member['last_login_time']
]
]);
}
/**
* 激活码验证并激活
* @return void
*/
public function activate()
{
try {
// 验证激活码
$code = input('code');
if (empty($code)) {
return json(['code' => 400, 'msg' => '激活码不能为空']);
}
// 获取设备信息
$machineId = input('machine_id', '');
if (empty($machineId)) {
return json(['code' => 400, 'msg' => '设备ID不能为空']);
}
// 收集设备详细信息
$deviceInfo = [
'machine_id' => $machineId,
'os' => input('os', ''), // 操作系统信息
'device_name' => input('device_name', ''), // 设备名称
'ip' => $this->request->ip(), // IP地址
'user_agent' => $this->request->header('user-agent', ''), // UA信息
'location' => input('location', '') // 地理位置(如果有)
];
// 获取激活码信息
$activation = Db::name('cursor_activation_codes')
->where('code', $code)
->where('is_used', 0)
->find();
if (empty($activation)) {
return json(['code' => 400, 'msg' => '激活码无效或已被使用']);
}
// 开启事务
Db::startTrans();
try {
// 标记新激活码为已使用
Db::name('cursor_activation_codes')
->where('id', $activation['id'])
->update([
'is_used' => 1,
'used_at' => date('Y-m-d H:i:s'),
'used_by' => $machineId,
'device_info' => json_encode($deviceInfo)
]);
Db::commit();
// 获取该设备所有的激活记录
$activations = Db::name('cursor_activation_codes')
->where('used_by', '=', $machineId)
->where('is_used', '=', 1)
->order('used_at desc')
->select()
->toArray();
// 计算总天数
$totalDays = array_sum(array_column($activations, 'days'));
// 计算最终到期时间
$now = time();
$firstActivationTime = strtotime($activations[count($activations)-1]['used_at']); // 第一次激活时间
$expireTime = $firstActivationTime + ($totalDays * 24 * 3600); // 总天数转换为秒数
$daysLeft = ceil(($expireTime - $now) / 86400);
// 返回成功信息
$result = [
'code' => 200,
'msg' => '激活成功',
'data' => [
'expire_time' => date('Y-m-d H:i:s', $expireTime),
'total_days' => $totalDays,
'added_days' => $activation['days'],
'days_left' => $daysLeft,
'machine_id' => $machineId,
'device_info' => $deviceInfo,
'activation_time' => date('Y-m-d H:i:s'),
'activation_records' => array_map(function($record) {
return [
'code' => $record['code'],
'days' => $record['days'],
'activation_time' => $record['used_at'],
'device_info' => json_decode($record['device_info'], true)
];
}, $activations)
]
];
return json($result);
} catch (\Exception $e) {
Db::rollback();
throw $e;
}
} catch (\Exception $e) {
return json([
'code' => 500,
'msg' => $e->getMessage()
]);
}
}
/**
* 获取会员状态
*/
public function status()
{
try {
// 获取设备ID
$machineId = input('machine_id', '');
if (empty($machineId)) {
return json(['code' => 400, 'msg' => '设备ID不能为空']);
}
// 获取该设备所有的激活记录
$activations = Db::name('cursor_activation_codes')
->where('used_by', '=', $machineId)
->where('is_used', '=', 1)
->order('used_at desc')
->select()
->toArray();
if (empty($activations)) {
return json([
'code' => 401,
'msg' => '未激活',
'data' => [
'status' => 'inactive',
'expire_time' => '',
'total_days' => 0,
'days_left' => 0,
'activation_records' => []
]
]);
}
// 计算总天数
$totalDays = array_sum(array_column($activations, 'days'));
// 计算最终到期时间
$now = time();
$firstActivationTime = strtotime($activations[count($activations)-1]['used_at']); // 第一次激活时间
$expireTime = $firstActivationTime + ($totalDays * 24 * 3600); // 总天数转换为秒数
$daysLeft = ceil(($expireTime - $now) / 86400);
// 判断是否过期
if ($daysLeft <= 0) {
return json([
'code' => 401,
'msg' => '已过期',
'data' => [
'status' => 'expired',
'expire_time' => date('Y-m-d H:i:s', $expireTime),
'total_days' => $totalDays,
'days_left' => 0,
'machine_id' => $machineId,
'activation_records' => array_map(function($record) {
return [
'code' => $record['code'],
'days' => $record['days'],
'activation_time' => $record['used_at'],
'device_info' => json_decode($record['device_info'], true)
];
}, $activations)
]
]);
}
// 返回正常状态
return json([
'code' => 200,
'msg' => '正常',
'data' => [
'status' => 'active',
'expire_time' => date('Y-m-d H:i:s', $expireTime),
'total_days' => $totalDays,
'days_left' => $daysLeft,
'machine_id' => $machineId,
'activation_records' => array_map(function($record) {
return [
'code' => $record['code'],
'days' => $record['days'],
'activation_time' => $record['used_at'],
'device_info' => json_decode($record['device_info'], true)
];
}, $activations)
]
]);
} catch (\Exception $e) {
return json([
'code' => 500,
'msg' => $e->getMessage()
]);
}
}
}