ManagerLogRepository.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. /**
  3. * 管理员操作日志仓库.
  4. *
  5. * @author nj
  6. * @date 2021-01-24 14:11:56
  7. */
  8. namespace App\Repositories;
  9. use KZ2\Laravel\Repositories\Eloquent\Repository;
  10. use App\Models\Mysql\ManagerLogModel;
  11. use Ip;
  12. class ManagerLogRepository extends Repository
  13. {
  14. public function model()
  15. {
  16. return ManagerLogModel::class;
  17. }
  18. /**
  19. * 创建1条日志
  20. * @param $inputs
  21. * @return mixed
  22. */
  23. public function createOne($inputs)
  24. {
  25. $managerUid = data_get($inputs, 'manager_uid', '');
  26. $username = data_get($inputs, 'username', '');
  27. $nick = data_get($inputs, 'nick', '');
  28. $subject = $inputs['subject']; // 一定是主题的.
  29. $module = data_get($inputs, 'module', '');
  30. $action = data_get($inputs, 'action', '');
  31. $svalue = data_get($inputs, 'svalue', '');
  32. $dbData = data_get($inputs, 'db_data', []);
  33. if (!empty($dbData)) {
  34. if (!empty($dbData['after_items'])) {
  35. if (is_object($dbData['after_items'])) {
  36. $dbData['after_items'] = collect($dbData['after_items'])->toArray();
  37. }
  38. if (is_array($dbData['after_items'])) {
  39. $dbData['after_items'] = array_filter($dbData['after_items']);
  40. }
  41. }
  42. if (!empty($dbData['before_items'])) {
  43. if (is_object($dbData['before_items'])) {
  44. $dbData['before_items'] = collect($dbData['before_items'])->toArray();
  45. }
  46. if (is_array($dbData['before_items'])) {
  47. $dbData['before_items'] = array_filter($dbData['before_items']);
  48. }
  49. }
  50. $dbData['compared_items'] = $this->computeLog($dbData['after_items'], $dbData['before_items']);
  51. }
  52. $jsonDbData = !empty($dbData) ? json_encode($dbData, JSON_UNESCAPED_UNICODE) : null;
  53. $request = request();
  54. $arrUa = $request->header('user-agent');
  55. // 取第一个.
  56. $ua = is_array($arrUa) ? current($arrUa) : $arrUa;
  57. if (empty($ua)) {
  58. $ua = '';
  59. }
  60. $ua = mb_substr($ua, 0, 255);
  61. $arrIpInfo = client_ip_info();
  62. $ip = $arrIpInfo[0];
  63. $ipAddress = $arrIpInfo[1];
  64. $setarr = [
  65. 'manager_uid' => $managerUid,
  66. 'username' => $username,
  67. 'nick' => $nick,
  68. 'subject' => $subject,
  69. 'module' => $module,
  70. 'action' => $action,
  71. 'svalue' => $svalue,
  72. 'db_data' => $jsonDbData,
  73. 'ip' => $ip,
  74. 'ip_address' => $ipAddress,
  75. 'ua' => $ua,
  76. ];
  77. $log = ManagerLogModel::create($setarr);
  78. unset($inputs, $dbData, $setarr, $jsonDbData);
  79. return $log;
  80. }
  81. /**
  82. * 对比数据,返回对比结果.
  83. * @param $new_data
  84. * @param array $old_data
  85. * @return array
  86. */
  87. protected function computeLog($new_data, $old_data = [])
  88. {
  89. $result = [];
  90. if ($new_data && $old_data) {
  91. foreach ($new_data as $k1 => $v1) {
  92. $result[$k1] = [];
  93. if (is_array($v1)) {
  94. foreach ($v1 as $k2 => $v2) {
  95. if (isset($old_data[$k1][$k2])) {
  96. if (is_array($old_data[$k1][$k2])) {
  97. continue;
  98. } else {
  99. $old_len = mb_strlen((string)$old_data[$k1][$k2]);
  100. }
  101. } else {
  102. $old_len = 0;
  103. }
  104. $new_len = mb_strlen((string)$v2);
  105. if ($new_len > 255 || $old_len > 255) {
  106. if ($old_data[$k1][$k2] != $v2) {
  107. $result[$k1][$k2] = $k2 .'字段:有变动...';
  108. }
  109. } else {
  110. if ($old_data[$k1][$k2] != $v2) {
  111. if (is_array($v2)) {
  112. $result[$k1][$k2] = $k2 .'字段:有变动..';
  113. } else {
  114. $result[$k1][$k2] = $k2 .'字段:'. $old_data[$k1][$k2] . ' → '. $v2;
  115. }
  116. }
  117. }
  118. }
  119. } elseif (is_string($v1)) {
  120. $new_len = mb_strlen((string)$v1);
  121. if (isset($old_data[$k1])) {
  122. $old_len = mb_strlen((string)$old_data[$k1]);
  123. } else {
  124. $old_len = 0;
  125. }
  126. if ($new_len > 255 || $old_len > 255) {
  127. if ($old_data[$k1] != $v1) {
  128. $result[$k1] = $k1 .'索引, 有变动...';
  129. }
  130. } else {
  131. if ($old_data[$k1] != $v1) {
  132. $result[$k1] = $k1 .'索引, '. $old_data[$k1] . ' → '. $v1;
  133. }
  134. }
  135. }
  136. }
  137. } elseif (!empty($old_data) && empty($new_data)) {
  138. $result = $old_data;
  139. } elseif (!empty($new_data) && empty($old_data)) {
  140. $result = $new_data;
  141. }
  142. unset($new_data, $old_data);
  143. return $result;
  144. }
  145. }