Helper.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\Core;
  4. use SixShop\Core\Exception\LogicException;
  5. use SixShop\Core\Response\Xml;
  6. use SixShop\Core\Service\CoreService;
  7. use think\Container;
  8. use think\Paginator;
  9. use think\Response;
  10. // 函数版本的Helper方法
  11. /**
  12. * 返回成功数据
  13. */
  14. function success_response(mixed $data = [], string $status = 'ok', int $code = 200, string $msg = 'success', string $type = 'json', string $xslt = ''): Response
  15. {
  16. return Helper::success_response($data, $status, $code, $msg, $type, $xslt);
  17. }
  18. /**
  19. * 返回分页数据
  20. */
  21. function page_response(Paginator $page, mixed $data = [], string $status = 'ok', int $code = 200, string $msg = 'success'): Response
  22. {
  23. return Helper::page_response($page, $data, $status, $code, $msg);
  24. }
  25. /**
  26. * 返回失败数据
  27. */
  28. function error_response(string $msg = 'error', string $status = 'error', int $code = 1, mixed $data = [], int $httpCode = 400, $header = [], $options = []): Response
  29. {
  30. return Helper::error_response($msg, $status, $code, $data, $httpCode, $header, $options);
  31. }
  32. /**
  33. * 抛出逻辑异常
  34. * @throws LogicException
  35. */
  36. function throw_logic_exception(string $msg = 'error', int $code = 1, string $status = 'error', mixed $data = [], int $httpCode = 200, $header = [], $options = []): void
  37. {
  38. Helper::throw_logic_exception($msg, $code, $status, $data, $httpCode, $header, $options);
  39. }
  40. /**
  41. * 构建树形结构选项
  42. * @param array $data 数据源
  43. * @param string $valueField 值字段
  44. * @param string $labelField 标签字段
  45. * @param string $parentField 父字段
  46. * @param int $parentId 父ID
  47. * @param string $childrenKey 子节点键
  48. * @param bool $preserveOriginal 是否保留原始数据
  49. */
  50. function build_tree_options(
  51. array $data,
  52. string $valueField = 'id',
  53. string $labelField = 'name',
  54. string $parentField = 'parent_id',
  55. int $parentId = 0,
  56. string $childrenKey = 'children',
  57. bool $preserveOriginal = true
  58. ): array
  59. {
  60. return Helper::build_tree_options($data, $valueField, $labelField, $parentField, $parentId, $childrenKey, $preserveOriginal);
  61. }
  62. /**
  63. * 生成随机密码
  64. * @param int $length 密码长度
  65. * @return string 生成的密码
  66. */
  67. function secret_password(int $length = 16): string
  68. {
  69. return Helper::secret_password($length);
  70. }
  71. /**
  72. * 获取扩展路径
  73. */
  74. function extension_path(string $extensionID = ''): string
  75. {
  76. return Helper::extension_path($extensionID);
  77. }
  78. /**
  79. * 获取扩展名称列表
  80. */
  81. function extension_name_list(): array
  82. {
  83. return CoreService::$extensionNameList;
  84. }
  85. /**
  86. * 获取扩展Composer信息
  87. */
  88. function extension_composer_info(string $extensionID): array
  89. {
  90. return CoreService::$extensionComposerMap[$extensionID];
  91. }
  92. /**
  93. * 助手类
  94. * @deprecated 类已弃用, 请使用函数版本的助手方法
  95. */
  96. final class Helper
  97. {
  98. /**
  99. * 返回成功数据
  100. * @deprecated 函数已弃用, 请使用 success_response()
  101. */
  102. public static function success_response(mixed $data = [], string $status = 'ok', int $code = 200, string $msg = 'success', string $type = 'json', string $xslt = ''): Response
  103. {
  104. if ($xslt) {
  105. $type = 'xml';
  106. }
  107. $responseData = [
  108. 'code' => $code,
  109. 'status' => $status,
  110. 'msg' => $msg,
  111. 'data' => $data
  112. ];
  113. if ($type == 'xml') {
  114. /* @var Xml $response */
  115. $response = Container::getInstance()->invokeClass(Xml::class, [$responseData, 200]);
  116. $response = $response->options(['root_node' => 'root', 'xslt' => $xslt]);
  117. } else {
  118. $response = Response::create($responseData, $type);
  119. }
  120. return $response;
  121. }
  122. /**
  123. * 返回分页数据
  124. * @deprecated 函数已弃用, 请使用 page_response()
  125. */
  126. public static function page_response(Paginator $page, mixed $data = [], string $status = 'ok', int $code = 200, string $msg = 'success'): Response
  127. {
  128. return json([
  129. 'code' => $code,
  130. 'status' => $status,
  131. 'msg' => $msg,
  132. 'page' => $page,
  133. 'data' => $data
  134. ]);
  135. }
  136. /**
  137. * 抛出逻辑异常
  138. * @throws LogicException
  139. * @deprecated 函数已弃用, 请使用 throw_logic_exception()
  140. */
  141. public static function throw_logic_exception(string $msg = 'error', int $code = 1, string $status = 'error', mixed $data = [], int $httpCode = 200, $header = [], $options = []): void
  142. {
  143. throw new LogicException(self::error_response($msg, $status, $code, $data, $httpCode, $header, $options));
  144. }
  145. /**
  146. * 返回失败数据
  147. * @deprecated 函数已弃用, 请使用 error_response()
  148. */
  149. public static function error_response(string $msg = 'error', string $status = 'error', int $code = 1, mixed $data = [], int $httpCode = 400, $header = [], $options = []): Response
  150. {
  151. return json([
  152. 'code' => $code,
  153. 'status' => $status,
  154. 'msg' => $msg,
  155. 'data' => $data
  156. ], $httpCode, $header, $options);
  157. }
  158. /**
  159. * 构建树形结构选项
  160. * @param array $data 数据源
  161. * @param string $valueField 值字段
  162. * @param string $labelField 标签字段
  163. * @param string $parentField 父字段
  164. * @param int $parentId 父ID
  165. * @param string $childrenKey 子节点键
  166. * @param bool $preserveOriginal 是否保留原始数据
  167. *
  168. * @deprecated 函数已弃用, 请使用 build_tree_options()
  169. */
  170. public static function build_tree_options(
  171. array $data,
  172. string $valueField = 'id',
  173. string $labelField = 'name',
  174. string $parentField = 'parent_id',
  175. int $parentId = 0,
  176. string $childrenKey = 'children',
  177. bool $preserveOriginal = true
  178. ): array
  179. {
  180. $tree = [];
  181. foreach ($data as $item) {
  182. if ($item[$parentField] == $parentId) {
  183. $node = [
  184. 'value' => $item[$valueField],
  185. 'label' => $item[$labelField]
  186. ];
  187. // 根据参数决定是否保留原始数据
  188. if ($preserveOriginal) {
  189. $node = array_merge($item, $node);
  190. }
  191. $children = self::build_tree_options(
  192. $data,
  193. $valueField,
  194. $labelField,
  195. $parentField,
  196. $item[$valueField],
  197. $childrenKey,
  198. $preserveOriginal // 传递参数到递归调用
  199. );
  200. if ($children) {
  201. $node[$childrenKey] = $children;
  202. }
  203. $tree[] = $node;
  204. }
  205. }
  206. return $tree;
  207. }
  208. /**
  209. * 生成随机密码
  210. * @param int $length 密码长度
  211. * @return string 生成的密码
  212. * @deprecated 函数已弃用, 请使用 secret_password()
  213. */
  214. public static function secret_password(int $length = 16): string
  215. {
  216. // 确保密码包含各种字符类型
  217. $lowercase = 'abcdefghijklmnopqrstuvwxyz';
  218. $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  219. $numbers = '0123456789';
  220. $specialChars = '!@#$%^&*()_+-=[]{}|;:,.<>?';
  221. // 至少包含每种类型的一个字符
  222. $password = $lowercase[random_int(0, strlen($lowercase) - 1)];
  223. $password .= $uppercase[random_int(0, strlen($uppercase) - 1)];
  224. $password .= $numbers[random_int(0, strlen($numbers) - 1)];
  225. $password .= $specialChars[random_int(0, strlen($specialChars) - 1)];
  226. // 剩余字符随机生成
  227. $allChars = $lowercase . $uppercase . $numbers . $specialChars;
  228. for ($i = 4; $i < $length; $i++) {
  229. $password .= $allChars[random_int(0, strlen($allChars) - 1)];
  230. }
  231. // 打乱字符顺序
  232. return str_shuffle($password);
  233. }
  234. /**
  235. * 获取插件目录
  236. * @param string $extensionID 插件ID
  237. * @return string 插件目录
  238. * @deprecated 函数已弃用, 请使用 extension_path()
  239. */
  240. public static function extension_path(string $extensionID = ''): string
  241. {
  242. if (!$extensionID) {
  243. return CoreService::$extensionPath;
  244. }
  245. if (isset(CoreService::$extensionComposerMap[$extensionID]['name'])) {
  246. $extensionName = CoreService::$extensionComposerMap[$extensionID]['name'];
  247. $versions = Plugin::getInstalledSixShopExtensions()['versions'];
  248. if (isset($versions[$extensionName]['install_path'])) {
  249. return realpath($versions[$extensionName]['install_path']) . DIRECTORY_SEPARATOR;
  250. }
  251. }
  252. return CoreService::$extensionPath . $extensionID . DIRECTORY_SEPARATOR;
  253. }
  254. /**
  255. *
  256. * @deprecated 废弃方法,请使用 extension_name_list 方法
  257. */
  258. public static function extension_name_list(): array
  259. {
  260. return CoreService::$extensionNameList;
  261. }
  262. }