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

225 lines
7.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare (strict_types = 1);
namespace app\admin\controller\api;
use think\admin\Controller;
use think\facade\Db;
use think\facade\Cache;
/**
* 代理商接口
*/
class Agent extends Controller
{
/**
* 代理商登录
*/
public function login()
{
try {
$data = $this->_vali([
'username.require' => '用户名不能为空',
'password.require' => '密码不能为空'
]);
// 查询代理商
$agent = Db::name('cursor_agents')
->where('username', $data['username'])
->find();
if (empty($agent)) {
return json(['code' => 400, 'msg' => '用户名或密码错误']);
}
// 验证密码
if (!password_verify($data['password'], $agent['password'])) {
return json(['code' => 400, 'msg' => '用户名或密码错误']);
}
// 检查状态
if ($agent['status'] != 1) {
return json(['code' => 400, 'msg' => '账号已被禁用']);
}
// 生成token
$token = md5($agent['id'] . time() . rand(1000, 9999));
// 存储token有效期7天
Cache::set('agent_token_' . $token, $agent['id'], 7 * 24 * 3600);
// 更新登录信息
Db::name('cursor_agents')
->where('id', $agent['id'])
->update([
'last_login_time' => date('Y-m-d H:i:s'),
'last_login_ip' => $this->request->ip(),
'updated_at' => date('Y-m-d H:i:s')
]);
// 返回登录信息
return json([
'code' => 200,
'msg' => '登录成功',
'data' => [
'token' => $token,
'agent' => [
'id' => $agent['id'],
'username' => $agent['username'],
'nickname' => $agent['nickname'],
'level' => $agent['level'],
'balance' => $agent['balance'],
'commission_rate' => $agent['commission_rate']
]
]
]);
} catch (\Exception $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
/**
* 验证token
*/
protected function checkToken()
{
$token = $this->request->header('token');
if (empty($token)) {
return json(['code' => 401, 'msg' => '请先登录']);
}
$agentId = Cache::get('agent_token_' . $token);
if (empty($agentId)) {
return json(['code' => 401, 'msg' => '登录已过期,请重新登录']);
}
return $agentId;
}
/**
* 获取代理商信息
*/
public function info()
{
try {
$agentId = $this->checkToken();
if (!is_numeric($agentId)) {
return $agentId; // 返回错误信息
}
$agent = Db::name('cursor_agents')
->where('id', $agentId)
->find();
if (empty($agent)) {
return json(['code' => 400, 'msg' => '代理商不存在']);
}
// 获取激活码统计
$codeStats = Db::name('cursor_agent_codes')
->where('agent_id', $agentId)
->field([
'COUNT(*) as total_codes',
'SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) as settled_codes',
'SUM(commission) as total_commission',
'SUM(CASE WHEN status = 1 THEN commission ELSE 0 END) as settled_commission'
])
->find();
// 获取未使用的激活码
$unusedCodes = Db::name('cursor_agent_codes')
->alias('ac')
->join('cursor_activation_codes c', 'ac.code_id = c.id')
->where('ac.agent_id', $agentId)
->where('c.is_used', 0)
->field('c.code, c.days, ac.price')
->select()
->toArray();
return json([
'code' => 200,
'msg' => '获取成功',
'data' => [
'agent' => [
'id' => $agent['id'],
'username' => $agent['username'],
'nickname' => $agent['nickname'],
'level' => $agent['level'],
'balance' => $agent['balance'],
'total_income' => $agent['total_income'],
'commission_rate' => $agent['commission_rate'],
'last_login_time' => $agent['last_login_time']
],
'stats' => [
'total_codes' => $codeStats['total_codes'] ?? 0,
'settled_codes' => $codeStats['settled_codes'] ?? 0,
'total_commission' => $codeStats['total_commission'] ?? 0,
'settled_commission' => $codeStats['settled_commission'] ?? 0
],
'unused_codes' => $unusedCodes
]
]);
} catch (\Exception $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
/**
* 获取代理商的激活码列表
*/
public function codes()
{
try {
$agentId = $this->checkToken();
if (!is_numeric($agentId)) {
return $agentId;
}
$page = input('page/d', 1);
$limit = input('limit/d', 20);
$status = input('status');
$query = Db::name('cursor_agent_codes')
->alias('ac')
->join('cursor_activation_codes c', 'ac.code_id = c.id')
->where('ac.agent_id', $agentId);
if (isset($status)) {
$query = $query->where('c.is_used', intval($status));
}
$total = $query->count();
$list = $query->field([
'c.code',
'c.days',
'c.is_used',
'c.used_at',
'c.used_by',
'ac.price',
'ac.commission',
'ac.status as settle_status',
'ac.created_at'
])
->page($page, $limit)
->order('ac.created_at desc')
->select()
->toArray();
return json([
'code' => 200,
'msg' => '获取成功',
'data' => [
'list' => $list,
'total' => $total,
'page' => $page,
'limit' => $limit
]
]);
} catch (\Exception $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
}
}