Commit 0421d2bb authored by wangzhengwen's avatar wangzhengwen

经验值修改

parent 2f4d6ada
<?php
namespace app\api\middleware;
use app\api\service\ExperienceService;
use think\facade\Db;
use think\facade\Log;
......@@ -13,8 +14,6 @@ class AddExperience
try {
// 获取当前控制器和方法(格式如:user/login)
$fullAction = strtolower($request->controller() . '/' . $request->action());
// 检查是否是登录方法
$isLoginAction = ($fullAction === 'user/login');
// 获取经验规则
$rule = Db::name('user_exp_rule')
......@@ -27,115 +26,40 @@ class AddExperience
return $response;
}
// 特殊处理登录方法
if ($isLoginAction) {
$this->handleLoginAction($response, $rule);
} else {
$this->handleNormalAction($request, $rule);
}
} catch (\Exception $e) {
Log::error('经验系统异常:'.$e->getMessage());
}
return $response;
}
/**
* 处理登录方法
*/
private function handleLoginAction($response, $rule)
{
try {
// 只有请求成功(code=1)时才处理经验
$responseData = json_decode($response->getContent(), true);
if (!isset($responseData['code']) || $responseData['code'] != 1) {
return $response;
}
$token = $responseData['data']['token'] ?? null;
if (!$token) {
return;
// 特殊处理登录方法(需解析 token 获取 userId)
if ($fullAction === 'user/login') {
$token = $responseData['data']['token'] ?? null;
if (!$token) {
return $response;
}
} else {
// 普通方法直接从 header 获取 token
$token = $request->header('token');
if (!$token) {
return $response;
}
}
$userId = Db::name('user')
->where('token', $token)
->where('delete_time', null)
->value('id');
if ($userId) {
$this->addExperience($userId, $rule);
ExperienceService::addExperience($userId, $rule);
}
} catch (\Exception $e) {
Log::error('登录经验处理失败:'.$e->getMessage());
Log::error('经验系统异常:' . $e->getMessage());
}
}
/**
* 处理普通方法
*/
private function handleNormalAction($request, $rule)
{
$token = $request->header('token');
if (!$token) return;
$userId = Db::name('user')
->where('token', $token)
->where('delete_time', null)
->value('id');
if ($userId) {
$this->addExperience($userId, $rule);
}
return $response;
}
/**
* 统一添加经验
*/
private function addExperience($userId, $rule)
{
// 检查今日是否已达到上限
$today = strtotime(date('Y-m-d'));
$expToday = Db::name('user_exp_log')
->where('user_id', $userId)
->where('rule_id', $rule['id'])
->where('create_time', '>=', $today)
->sum('exp');
if ($rule['daily_limit'] > 0 && $expToday >= $rule['daily_limit']) {
return;
}
// 2. 检查是否在间隔时间内(interval_limit > 0 时才检查)
if ($rule['interval_limit'] > 0) {
$lastRecord = Db::name('user_exp_log')
->where('user_id', $userId)
->where('rule_id', $rule['id'])
->order('create_time', 'desc')
->find();
if ($lastRecord && (time() - $lastRecord['create_time']) < $rule['interval_limit']) {
return;
}
}
Db::startTrans();
try {
// 增加用户经验
Db::name('user')
->where('id', $userId)
->inc('experience', $rule['exp'])
->update();
// 记录日志
Db::name('user_exp_log')->insert([
'user_id' => $userId,
'rule_id' => $rule['id'],
'exp' => $rule['exp'],
'create_time' => time(),
'ip' => request()->ip()
]);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
Log::error("经验添加失败:{$userId}-{$rule['id']},msg:{}{$e->getMessage()}");
}
}
}
\ No newline at end of file
<?php
namespace app\api\service;
use think\facade\Db;
use think\facade\Log;
class ExperienceService
{
/**
* 统一处理经验值增加(供中间件和支付逻辑复用)
*/
public static function addExperience($userId, $rule, $extraData = [])
{
// 1. 检查今日是否已达到上限
$today = strtotime(date('Y-m-d'));
$expToday = Db::name('user_exp_log')
->where('user_id', $userId)
->where('rule_id', $rule['id'])
->where('create_time', '>=', $today)
->sum('exp');
if ($rule['daily_limit'] != 0 && $expToday >= $rule['daily_limit']) {
return;
}
// 2. 检查是否在间隔时间内(interval_limit > 0 时才检查)
if ($rule['interval_limit'] > 0) {
$lastRecord = Db::name('user_exp_log')
->where('user_id', $userId)
->where('rule_id', $rule['id'])
->order('create_time', 'desc')
->find();
if ($lastRecord && (time() - $lastRecord['create_time']) < $rule['interval_limit']) {
return;
}
}
Db::startTrans();
try {
// 增加用户经验
Db::name('user')
->where('id', $userId)
->inc('experience', $rule['exp'])
->update();
// 记录日志
Db::name('user_exp_log')->insert([
'user_id' => $userId,
'rule_id' => $rule['id'],
'exp' => $rule['exp'],
'create_time' => time(),
'ip' => request()->ip(),
'extra_info'=>json_encode($extraData)
]);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
Log::error("经验添加失败:{$userId}-{$rule['id']}, msg: {$e->getMessage()}");
}
}
/**
* 支付成功后增加经验
*/
public static function addPaymentExperience($userId, $payment,$action)
{
// 获取支付经验规则
$rule = Db::name('user_exp_rule')
->where('action', $action)
->where('is_open', 1)
->find();
if (!$rule) return;
self::addExperience($userId, $rule, [
'order_id' => $payment['order_id'] ?? 0,
'order_type' => $payment['order_type'] ?? null,
]);
}
}
\ No newline at end of file
......@@ -209,15 +209,22 @@ class PayService
try {
if ($payment['order_type'] == self::ORDER_TYPE_COURSE) {
// 处理课程购买逻辑
// 例如: 更新课程订单状态, 分配课程权限等
// Db::name('fj_course_order')->where('id', $payment['order_id'])->update(['status' => 1]);
//增加销量
ExperienceService::addPaymentExperience(
$payment['user_id'],
$payment,
'pay/course'
);
} elseif ($payment['order_type'] == self::ORDER_TYPE_CERT) {
// 处理证书购买逻辑
$res = Db::name('cert_order')
Db::name('cert_order')
->where('cert_id', $payment['order_id'])
->update(['status' => 1]);
ExperienceService::addPaymentExperience(
$payment['user_id'],
$payment,
'pay/cert'
);
}
// 可以添加其他业务逻辑,如发送通知等
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment