Base.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace app\extra\basic;
  3. use support\Response;
  4. use think\contract\Arrayable;
  5. use think\Validate;
  6. class Base
  7. {
  8. const DEFAULT_SUCCESS_MESSAGE = 'success';
  9. const DEFAULT_FAIL_MESSAGE = 'fail';
  10. const DEFAULT_SUCCESS_CODE = 200;
  11. const DEFAULT_FAIL_CODE = 400;
  12. public function getShopId()
  13. {
  14. return request()->header("shop",0);
  15. }
  16. protected function getDyConfig(): array
  17. {
  18. return ["appid" => sConf('dy.appid'),'secret' => sConf('dy.secret')];
  19. }
  20. /**
  21. * 短信通道
  22. * @return array[]
  23. */
  24. protected function getSmsChannel(): array
  25. {
  26. return [
  27. [
  28. "name" => "阿里云",
  29. "type" => "aliyun",
  30. "url" => "https://dysms.console.aliyun.com/dysms.htm"
  31. ],
  32. [
  33. "name" => "腾讯云",
  34. "type" => "qcloud",
  35. "url" => "https://console.cloud.tencent.com/smsv2"
  36. ],
  37. [
  38. "name" => "七牛云",
  39. "type" => "qiniu",
  40. "url" => "https://portal.qiniu.com/sms/dashboard"
  41. ]
  42. ];
  43. }
  44. /**
  45. * 快捷输入并验证( 支持 规则 # 别名 )
  46. * @param array $rules 验证规则( 验证信息数组 )
  47. * @param array|string $input 输入方式 ( post. 或 get. )
  48. * @param callable|null $callable 异常处理操作
  49. */
  50. protected function _valid(array $rules, array|string $input = '', ?callable $callable = null)
  51. {
  52. if (is_string($input)) {
  53. $type = trim($input, '.') ?: 'get';
  54. $input = request()->$type();
  55. }
  56. [$data, $rule, $info] = [[], [], []];
  57. foreach ($rules as $name => $message) if (is_numeric($name)) {
  58. [$name, $alias] = explode('#', $message . '#');
  59. $data[$name] = $input[($alias ?: $name)] ?? null;
  60. } elseif (!str_contains($name, '.')) {
  61. $data[$name] = $message;
  62. } elseif (preg_match('|^(.*?)\.(.*?)#(.*?)#?$|', $name . '#', $matches)) {
  63. [, $_key, $_rule, $alias] = $matches;
  64. if (in_array($_rule, ['value', 'default'])) {
  65. if ($_rule === 'value') $data[$_key] = $message;
  66. elseif ($_rule === 'default') $data[$_key] = $input[($alias ?: $_key)] ?? $message;
  67. } else {
  68. $info[explode(':', $name)[0]] = $message;
  69. $data[$_key] = $data[$_key] ?? ($input[($alias ?: $_key)] ?? null);
  70. $rule[$_key] = isset($rule[$_key]) ? ($rule[$_key] . '|' . $_rule) : $_rule;
  71. }
  72. }
  73. $validate = new Validate();
  74. if ($validate->rule($rule)->message($info)->check($data)) {
  75. return $data;
  76. } elseif (is_callable($callable)) {
  77. return call_user_func($callable, $validate->getError(), $data);
  78. } else {
  79. return $validate->getError();
  80. }
  81. }
  82. /**
  83. * @param $data
  84. * @return array|string|null
  85. */
  86. private function parseData($data)
  87. {
  88. if ($data instanceof Arrayable)
  89. return $data->toArray();
  90. else
  91. return $data;
  92. }
  93. /**
  94. * @param string $message
  95. * @param array|null $data
  96. * @return Response
  97. */
  98. public function success(string $message = self::DEFAULT_SUCCESS_MESSAGE, array $data = null): Response
  99. {
  100. $message = $this->parseData($message);
  101. if (is_array($message)) {
  102. $data = $message;
  103. $message = self::DEFAULT_SUCCESS_MESSAGE;
  104. } else {
  105. $data = $this->parseData($data);
  106. }
  107. return $this->make(self::DEFAULT_SUCCESS_CODE, $message, $data);
  108. }
  109. /**
  110. * @param int $status
  111. * @param string $message
  112. * @param array|Arrayable|null $data
  113. */
  114. public function make(int $status, string $message, $data = null)
  115. {
  116. $content = compact('status', 'message');
  117. if (!is_null($data))
  118. $content['data'] = $this->parseData($data);
  119. return json($content);
  120. }
  121. public function encode($message = self::DEFAULT_SUCCESS_MESSAGE, $data = null)
  122. {
  123. $message = $this->parseData($message);
  124. if (is_array($message)) {
  125. $data = $message;
  126. $message = self::DEFAULT_SUCCESS_MESSAGE;
  127. } else {
  128. $data = $this->parseData($data);
  129. }
  130. $status = self::DEFAULT_SUCCESS_CODE;
  131. $encode = true;
  132. $content = compact('status','encode', 'message');
  133. if (is_null($data) || env('APP_DEBUG', false))
  134. return $this->success($message, $data['data'] ?? $data);
  135. if (!is_array($data) || !isset($data['data'])) {
  136. $res['data'] = $data;
  137. } else {
  138. $res = $data;
  139. }
  140. $res['status'] = $status;
  141. $res['message'] = $message;
  142. $content['data'] = base64_encode(gzdeflate(json_encode($res,JSON_UNESCAPED_UNICODE),9));
  143. return json($content);
  144. }
  145. /**
  146. * 菜单信息格式化
  147. * @param array $menus
  148. * @param int $type
  149. * @param int $mch
  150. * @return array
  151. */
  152. protected function filterMenu(array $menus,int $type,int $mch = 0): array
  153. {
  154. foreach ($menus as &$menu) {
  155. $menu['meta'] = [
  156. "title" => $menu['title'],
  157. "icon" => $menu['icon']??'',
  158. "type" => $menu['type']
  159. ];
  160. if (!empty($menu['children'])) {
  161. $menu['children'] = $this->filterMenu($menu['children'],$type,$mch);
  162. }
  163. if ($mch > 0) {
  164. $menu['component'] = ($mch==1?'merchant/':'store/').$menu['name'];
  165. } else {
  166. $menu['component'] = $menu['name'];
  167. }
  168. $menu['isMenu'] = $menu['status'];
  169. if($type == 1) unset($menu['title'],$menu['icon'],$menu['type'],$menu['pid'],$menu['id']);
  170. }
  171. return $menus;
  172. }
  173. }