ManagerLogRepository.php 5.1 KB

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