BehaviorLog.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\controller;
  4. use app\BaseController;
  5. use think\facade\Request;
  6. use app\model\UserBehaviorLogModel;
  7. use app\model\UserModel;
  8. /**
  9. * 操作日志控制器
  10. */
  11. class BehaviorLog extends BaseController
  12. {
  13. /**
  14. * 获取操作日志列表
  15. */
  16. public function list()
  17. {
  18. $userInfo = $this->request->userInfo;
  19. // 获取查询参数
  20. $page = Request::get('page', 1, 'intval');
  21. $limit = Request::get('limit', 20, 'intval');
  22. // 过滤条件
  23. $filters = [
  24. 'user_id' => Request::get('user_id', 0, 'intval'),
  25. 'behavior' => Request::get('behavior', '', 'trim'),
  26. 'behavior_status' => Request::get('behavior_status', ''),
  27. 'behavior_ip' => Request::get('behavior_ip', '', 'trim'),
  28. 'start_time' => Request::get('start_time', '', 'trim'),
  29. 'end_time' => Request::get('end_time', '', 'trim'),
  30. 'keyword' => Request::get('keyword', '', 'trim'),
  31. ];
  32. try {
  33. $result = UserBehaviorLogModel::getBehaviorLogs($userInfo['merchant_id'], $page, $limit, $filters);
  34. return json_success($result, '获取成功');
  35. } catch (\Exception $e) {
  36. return json_error([], '获取操作日志失败:' . $e->getMessage());
  37. }
  38. }
  39. /**
  40. * 获取操作统计信息
  41. */
  42. public function statistics()
  43. {
  44. $userInfo = $this->request->userInfo;
  45. $userId = Request::get('user_id', 0, 'intval');
  46. $startDate = Request::get('start_date', '', 'trim');
  47. $endDate = Request::get('end_date', '', 'trim');
  48. // 如果没有指定日期范围,默认获取最近30天
  49. if (empty($startDate)) {
  50. $startDate = date('Y-m-d', strtotime('-30 days'));
  51. }
  52. if (empty($endDate)) {
  53. $endDate = date('Y-m-d');
  54. }
  55. try {
  56. $statistics = UserBehaviorLogModel::getBehaviorStatistics($userInfo['merchant_id'], $userId, $startDate, $endDate);
  57. return json_success([
  58. 'statistics' => $statistics,
  59. 'date_range' => [
  60. 'start_date' => $startDate,
  61. 'end_date' => $endDate
  62. ]
  63. ], '获取成功');
  64. } catch (\Exception $e) {
  65. return json_error([], '获取操作统计失败:' . $e->getMessage());
  66. }
  67. }
  68. /**
  69. * 获取用户最近操作记录
  70. */
  71. public function recentLogs()
  72. {
  73. $userInfo = $this->request->userInfo;
  74. $userId = Request::get('user_id', 0, 'intval');
  75. $limit = Request::get('limit', 10, 'intval');
  76. // 如果没有指定用户ID,则获取当前用户的操作记录
  77. if ($userId == 0) {
  78. $userId = $userInfo['user_id'];
  79. } else {
  80. // 验证用户是否属于当前商户
  81. $user = UserModel::where('user_id', $userId)
  82. ->where('merchant_id', $userInfo['merchant_id'])
  83. ->find();
  84. if (!$user) {
  85. return json_error([], '用户不存在');
  86. }
  87. }
  88. try {
  89. $logs = UserBehaviorLogModel::getRecentBehaviors($userId, $limit);
  90. return json_success([
  91. 'logs' => $logs,
  92. 'user_id' => $userId
  93. ], '获取成功');
  94. } catch (\Exception $e) {
  95. return json_error([], '获取最近操作记录失败:' . $e->getMessage());
  96. }
  97. }
  98. /**
  99. * 获取所有行为类型
  100. */
  101. public function getBehaviorTypes()
  102. {
  103. try {
  104. $behaviors = UserBehaviorLogModel::getAllBehaviors();
  105. return json_success($behaviors, '获取成功');
  106. } catch (\Exception $e) {
  107. return json_error([], '获取行为类型失败:' . $e->getMessage());
  108. }
  109. }
  110. /**
  111. * 获取操作日志详情
  112. */
  113. public function detail()
  114. {
  115. $userInfo = $this->request->userInfo;
  116. $id = Request::get('id', 0, 'intval');
  117. if (!$id) {
  118. return json_error([], '日志ID不能为空');
  119. }
  120. try {
  121. $log = UserBehaviorLogModel::where('id', $id)
  122. ->where('merchant_id', $userInfo['merchant_id'])
  123. ->find();
  124. if (!$log) {
  125. return json_error([], '日志不存在');
  126. }
  127. // 获取用户信息
  128. $user = UserModel::where('user_id', $log->user_id)->find();
  129. if ($user) {
  130. $log->user_name = $user->user_name;
  131. $log->nick_name = $user->nick_name;
  132. }
  133. // 格式化数据
  134. $log->status_text = $log->behavior_status == UserBehaviorLogModel::STATUS_SUCCESS ? '成功' : '失败';
  135. $log->create_time_text = date('Y-m-d H:i:s', $log->create_time);
  136. // 解析请求参数
  137. try {
  138. $log->params = json_decode($log->behavior_desc, true) ?: [];
  139. } catch (\Exception $e) {
  140. $log->params = [];
  141. }
  142. return json_success($log, '获取成功');
  143. } catch (\Exception $e) {
  144. return json_error([], '获取日志详情失败:' . $e->getMessage());
  145. }
  146. }
  147. /**
  148. * 导出操作日志
  149. */
  150. public function export()
  151. {
  152. $userInfo = $this->request->userInfo;
  153. // 过滤条件
  154. $filters = [
  155. 'user_id' => Request::get('user_id', 0, 'intval'),
  156. 'behavior' => Request::get('behavior', '', 'trim'),
  157. 'behavior_status' => Request::get('behavior_status', ''),
  158. 'behavior_ip' => Request::get('behavior_ip', '', 'trim'),
  159. 'start_time' => Request::get('start_time', '', 'trim'),
  160. 'end_time' => Request::get('end_time', '', 'trim'),
  161. 'keyword' => Request::get('keyword', '', 'trim'),
  162. ];
  163. try {
  164. // 获取所有符合条件的数据(不分页)
  165. $result = UserBehaviorLogModel::getBehaviorLogs($userInfo['merchant_id'], 1, 100000, $filters);
  166. // 生成CSV数据
  167. $csvData = "ID,用户名,昵称,操作行为,请求参数,操作IP,操作URL,操作时间,操作状态\n";
  168. foreach ($result['list'] as $log) {
  169. // 处理请求参数,移除换行符
  170. $params = str_replace(["\r", "\n"], ' ', $log['behavior_desc']);
  171. $csvData .= sprintf(
  172. "%d,%s,%s,%s,%s,%s,%s,%s,%s\n",
  173. $log['id'],
  174. $log['user_name'],
  175. $log['nick_name'],
  176. $log['behavior'],
  177. $params,
  178. $log['behavior_ip'],
  179. $log['behavior_url'],
  180. $log['create_time_text'],
  181. $log['status_text']
  182. );
  183. }
  184. // 返回CSV数据
  185. return response($csvData)
  186. ->header(['Content-Type' => 'text/csv; charset=utf-8'])
  187. ->header(['Content-Disposition' => 'attachment; filename="behavior_logs_' . date('YmdHis') . '.csv"'])
  188. ->header(['Cache-Control' => 'no-cache, must-revalidate']);
  189. } catch (\Exception $e) {
  190. return json_error([], '导出操作日志失败:' . $e->getMessage());
  191. }
  192. }
  193. }