Compare commits

..

2410 Commits

Author SHA1 Message Date
as2252258 526256302d eee 2024-09-04 10:14:31 +08:00
as2252258 95254ac300 eee 2024-09-04 10:07:59 +08:00
as2252258 fdf7757b6a eee 2024-09-03 15:05:19 +08:00
as2252258 6e4a045c7d eee 2024-09-03 14:47:30 +08:00
as2252258 03d16d8157 eee 2024-08-29 18:06:58 +08:00
as2252258 c8041cc09e eee 2024-08-29 17:01:09 +08:00
as2252258 976f67a838 eee 2024-05-01 02:06:14 +08:00
as2252258 c7e0cd4948 eee 2024-05-01 02:02:58 +08:00
as2252258 3fc1b16f33 eee 2024-04-15 15:39:31 +08:00
as2252258 103b757a05 eee 2024-04-15 15:39:03 +08:00
as2252258 b52270ff25 eee 2024-01-10 17:52:18 +08:00
as2252258 c0aa9acb19 eee 2024-01-10 17:49:50 +08:00
as2252258 89678aab1a eee 2023-12-21 14:03:24 +08:00
as2252258 fa0afbfe18 eee 2023-12-19 14:31:41 +08:00
as2252258 9fe3a0be29 eee 2023-12-13 21:01:59 +08:00
as2252258 c425543491 eee 2023-12-13 19:25:04 +08:00
as2252258 37270e8e65 eee 2023-12-13 19:23:24 +08:00
as2252258 299def8f02 eee 2023-12-13 19:22:39 +08:00
as2252258 d0241e987f eee 2023-12-13 19:19:18 +08:00
as2252258 85ceb901bd eee 2023-12-13 19:18:05 +08:00
as2252258 3ffb60e78f eee 2023-12-13 19:13:53 +08:00
as2252258 bca45371bc eee 2023-12-13 19:13:37 +08:00
as2252258 42be87dc37 eee 2023-12-13 19:04:22 +08:00
as2252258 84c253a9f6 eee 2023-12-12 15:35:38 +08:00
as2252258 827fb257ab eee 2023-12-12 14:10:09 +08:00
as2252258 10f24b60d6 eee 2023-12-12 14:09:11 +08:00
as2252258 279173cee8 eee 2023-12-12 14:08:20 +08:00
as2252258 50a4aad871 eee 2023-12-12 14:08:01 +08:00
as2252258 dc4b2ec8ca eee 2023-12-12 10:56:44 +08:00
as2252258 2add68b33a eee 2023-12-12 10:16:28 +08:00
as2252258 9a5384e3ef eee 2023-12-01 22:57:25 +08:00
as2252258 5adac967a0 eee 2023-12-01 11:35:50 +08:00
as2252258 4211f27d88 eee 2023-12-01 10:19:53 +08:00
as2252258 3c72ca7175 eee 2023-11-30 18:09:06 +08:00
as2252258 5e2862926a eee 2023-11-30 18:06:45 +08:00
as2252258 49b3085ab1 eee 2023-11-30 18:03:48 +08:00
as2252258 b74426a40c eee 2023-11-30 17:54:42 +08:00
as2252258 91e986e613 eee 2023-11-30 17:48:11 +08:00
as2252258 b25987c865 eee 2023-11-30 17:46:50 +08:00
as2252258 aa9d25d4ee eee 2023-11-30 17:30:46 +08:00
as2252258 fa562b9487 eee 2023-11-30 17:10:37 +08:00
as2252258 66ef753b67 eee 2023-11-30 17:02:21 +08:00
as2252258 c29362be7c eee 2023-11-29 15:02:48 +08:00
as2252258 d209804005 eee 2023-11-29 14:57:02 +08:00
as2252258 63b3f5df26 eee 2023-11-29 14:55:05 +08:00
as2252258 93a3a06963 eee 2023-11-29 14:18:09 +08:00
as2252258 5cb7fb73c6 eee 2023-11-29 14:08:37 +08:00
as2252258 6a9114fd9a eee 2023-11-25 17:46:47 +08:00
as2252258 b3fd42d076 eee 2023-11-24 10:46:45 +08:00
as2252258 ea13b67364 eee 2023-11-24 10:23:28 +08:00
as2252258 6b9195476a eee 2023-11-24 10:22:56 +08:00
as2252258 396248e41e eee 2023-11-23 16:33:06 +08:00
as2252258 d30df26cc8 eee 2023-11-23 16:21:57 +08:00
as2252258 5ed5ee5ca9 eee 2023-11-16 23:50:06 +08:00
as2252258 a0354a9d94 eee 2023-11-16 23:01:59 +08:00
as2252258 a7c3acce27 eee 2023-11-16 21:13:41 +08:00
as2252258 646ed19ded eee 2023-11-16 21:13:17 +08:00
as2252258 06e2b8a380 eee 2023-11-16 21:00:34 +08:00
as2252258 6cd9377866 eee 2023-11-10 14:01:37 +08:00
as2252258 781ebe1704 eee 2023-11-10 10:44:26 +08:00
as2252258 345d02e310 eee 2023-11-09 20:31:01 +08:00
as2252258 ce067c67d1 eee 2023-11-09 20:00:06 +08:00
as2252258 9c3c1cfd82 eee 2023-10-24 17:22:32 +08:00
as2252258 9c2a349242 eee 2023-10-18 10:58:25 +08:00
as2252258 575c728bdc eee 2023-10-17 21:27:47 +08:00
as2252258 67cf863c38 eee 2023-10-12 00:15:53 +08:00
as2252258 20a8b32cdf eee 2023-10-11 13:14:37 +08:00
as2252258 837f597342 eee 2023-10-08 23:43:01 +08:00
as2252258 7f129b2107 eee 2023-10-07 20:50:40 +08:00
as2252258 21d79dec0b eee 2023-09-15 16:45:09 +08:00
as2252258 6d98bcb9b2 eee 2023-09-15 16:44:48 +08:00
as2252258 41ac60fd17 eee 2023-09-15 15:58:24 +08:00
as2252258 aecf830211 eee 2023-09-13 16:59:26 +08:00
as2252258 b32a751231 eee 2023-08-29 15:23:39 +08:00
as2252258 26fc76caa0 eee 2023-08-29 01:09:57 +08:00
as2252258 9b4f5d59dc r 2023-08-28 12:01:30 +08:00
as2252258 4a607a5687 qqq 2023-08-25 09:37:59 +08:00
as2252258 28a484ee42 qqq 2023-08-24 16:22:09 +08:00
as2252258 5fdd35c4d5 qqq 2023-08-24 13:49:58 +08:00
as2252258 cf39ea4ad6 qqq 2023-08-24 12:01:34 +08:00
as2252258 07e077cba0 qqq 2023-08-24 11:39:54 +08:00
as2252258 3b51cc83ca qqq 2023-08-24 11:36:56 +08:00
as2252258 0d5bad7186 qqq 2023-08-18 21:44:32 +08:00
as2252258 797cb94716 qqq 2023-08-18 20:57:30 +08:00
as2252258 bfa5e350f8 qqq 2023-08-18 20:56:45 +08:00
as2252258 7f4e4c9757 qqq 2023-08-18 14:37:47 +08:00
as2252258 483dd6bc79 qqq 2023-08-17 15:52:02 +08:00
as2252258 62fb7a2278 qqq 2023-08-17 15:50:08 +08:00
as2252258 1406a76b6b qqq 2023-08-17 15:48:23 +08:00
as2252258 bf822fe449 qqq 2023-08-17 15:41:19 +08:00
as2252258 6ec1b8c202 qqq 2023-08-16 15:01:45 +08:00
as2252258 1cfdbd3e5d qqq 2023-08-16 12:34:11 +08:00
as2252258 4711a999f0 qqq 2023-08-16 12:32:42 +08:00
as2252258 529ae9c40c qqq 2023-08-16 12:32:32 +08:00
as2252258 58797cb20f qqq 2023-08-16 12:30:12 +08:00
as2252258 0360a9664c qqq 2023-08-16 12:00:11 +08:00
as2252258 12f8bc338e qqq 2023-08-16 10:38:59 +08:00
as2252258 a8b326437c qqq 2023-08-16 10:38:24 +08:00
as2252258 4b04a53578 qqq 2023-08-16 10:35:37 +08:00
as2252258 c30f82e468 qqq 2023-08-16 10:32:53 +08:00
as2252258 0aa6f7ac5a qqq 2023-08-16 10:26:48 +08:00
as2252258 b3f22240b0 qqq 2023-08-16 01:01:48 +08:00
as2252258 cd26b26d1d qqq 2023-08-16 00:55:05 +08:00
as2252258 c392460dd7 qqq 2023-08-16 00:45:04 +08:00
as2252258 1690fa4d44 qqq 2023-08-16 00:43:40 +08:00
as2252258 f433cff03d qqq 2023-08-16 00:34:06 +08:00
as2252258 e5e2c2ea74 qqq 2023-08-16 00:16:16 +08:00
as2252258 2c46a752f9 qqq 2023-08-16 00:01:52 +08:00
as2252258 0b29e15af6 qqq 2023-08-15 23:50:34 +08:00
as2252258 08e6f5c29f qqq 2023-08-15 16:06:50 +08:00
as2252258 a81dd74257 qqq 2023-08-14 23:21:05 +08:00
as2252258 db5fa33f61 qqq 2023-08-14 22:59:53 +08:00
as2252258 ee907ce498 qqq 2023-08-14 22:10:38 +08:00
as2252258 676f0ce1e6 qqq 2023-08-14 22:01:43 +08:00
as2252258 4850748c77 qqq 2023-08-14 21:40:02 +08:00
as2252258 5aa6291ae3 qqq 2023-08-14 21:35:23 +08:00
as2252258 baeb3a5521 qqq 2023-08-14 21:11:47 +08:00
as2252258 513690e9a3 qqq 2023-08-14 21:09:45 +08:00
as2252258 754998830c qqq 2023-08-14 14:14:40 +08:00
as2252258 00444a4c0d qqq 2023-08-11 14:02:51 +08:00
as2252258 e61ded6ef5 qqq 2023-08-11 10:10:45 +08:00
as2252258 5ce21ec2f5 qqq 2023-08-11 09:47:33 +08:00
as2252258 94ff383a86 qqq 2023-08-11 09:40:06 +08:00
as2252258 2c21e5c2fe qqq 2023-08-11 00:12:33 +08:00
as2252258 69473a349e qqq 2023-08-03 14:02:07 +08:00
as2252258 f3e90725cc qqq 2023-08-02 14:44:22 +08:00
as2252258 a99c50a116 qqq 2023-08-02 13:03:07 +08:00
as2252258 714745f649 qqq 2023-08-02 12:49:02 +08:00
as2252258 1928ddd350 qqq 2023-08-02 12:48:39 +08:00
as2252258 dcc13945a2 qqq 2023-08-02 12:47:41 +08:00
as2252258 33aec3582e qqq 2023-08-02 12:46:22 +08:00
as2252258 5f9c08984c qqq 2023-08-02 12:45:58 +08:00
as2252258 cee99fc39e qqq 2023-08-02 12:44:23 +08:00
as2252258 2e0efd6044 qqq 2023-08-02 12:42:56 +08:00
as2252258 cb2fd761a3 qqq 2023-08-02 12:40:57 +08:00
as2252258 dfa3ab413b qqq 2023-08-02 12:37:57 +08:00
as2252258 c541ecb96d qqq 2023-08-02 12:37:18 +08:00
as2252258 7da1e91f5e qqq 2023-08-02 12:34:28 +08:00
as2252258 a46e66c022 qqq 2023-08-02 12:33:38 +08:00
as2252258 e86464c3c2 qqq 2023-08-02 12:32:21 +08:00
as2252258 28e519d937 qqq 2023-08-02 12:30:22 +08:00
as2252258 9bd463cbd1 qqq 2023-08-02 10:30:37 +08:00
as2252258 29f821f026 qqq 2023-07-31 23:18:08 +08:00
as2252258 0fbb08ed58 qqq 2023-07-31 23:09:00 +08:00
as2252258 c062a8f6a3 qqq 2023-07-26 17:26:47 +08:00
as2252258 8d4dd1bda9 qqq 2023-07-26 16:45:28 +08:00
as2252258 2004391c9b qqq 2023-07-20 17:12:31 +08:00
as2252258 0b1be47fb6 qqq 2023-07-20 15:01:24 +08:00
as2252258 221183e196 qqq 2023-07-13 09:02:45 +08:00
as2252258 9f218a59a2 qqq 2023-07-10 02:06:01 +08:00
as2252258 a9ad66dc2e qqq 2023-07-10 02:05:44 +08:00
as2252258 6ea25f35a4 qqq 2023-07-10 02:04:49 +08:00
as2252258 d093dd7f57 qqq 2023-07-06 17:21:32 +08:00
as2252258 460818a50a qqq 2023-07-06 16:53:53 +08:00
as2252258 8fa9d7235f qqq 2023-07-06 15:29:32 +08:00
as2252258 95915678c3 qqq 2023-07-06 13:33:50 +08:00
as2252258 c22d7a36a0 qqq 2023-06-27 16:29:10 +08:00
as2252258 f641cb9b82 qqq 2023-05-26 18:26:46 +08:00
as2252258 74ebcbe630 qqq 2023-05-26 11:21:36 +08:00
as2252258 5b27d5c07e qqq 2023-05-26 11:16:45 +08:00
as2252258 37bbb14fdb qqq 2023-05-26 10:39:31 +08:00
as2252258 13cc75765b qqq 2023-05-26 10:30:23 +08:00
as2252258 fff3211e61 qqq 2023-05-26 10:26:13 +08:00
as2252258 a1c0da9688 qqq 2023-05-26 10:16:22 +08:00
as2252258 3c933d8e4f qqq 2023-05-26 10:08:39 +08:00
as2252258 2ddfdc1db4 qqq 2023-05-26 10:06:37 +08:00
as2252258 1f986439b2 qqq 2023-05-26 09:37:56 +08:00
as2252258 d7fd23800b qqq 2023-05-26 09:20:31 +08:00
as2252258 0f1a55462e qqq 2023-05-25 16:59:20 +08:00
as2252258 3016bb54f1 qqq 2023-05-20 22:59:07 +08:00
as2252258 93fa562e2d 变更 2023-04-23 18:34:14 +08:00
as2252258 e7c4ba752b 变更 2023-04-22 02:28:26 +08:00
as2252258 7f7ed83bba 变更 2023-04-21 17:50:33 +08:00
as2252258 e4b28f7679 变更 2023-04-19 21:39:55 +08:00
as2252258 7ff9c2b78e 变更 2023-04-19 15:38:08 +08:00
as2252258 97e1ab470a 变更 2023-04-19 15:35:57 +08:00
as2252258 a0b13362de 变更 2023-04-19 13:15:21 +08:00
as2252258 a3f2168f3a 变更 2023-04-19 12:41:41 +08:00
as2252258 84fa24e194 变更 2023-04-19 12:35:39 +08:00
as2252258 b2066bfad7 变更 2023-04-19 10:51:08 +08:00
as2252258 be6953b83f 变更 2023-04-19 10:39:28 +08:00
as2252258 c9eab465ea 变更 2023-04-19 10:32:55 +08:00
as2252258 e451efad4f 变更 2023-04-19 00:03:18 +08:00
as2252258 50b57d1fac 变更 2023-04-19 00:01:12 +08:00
as2252258 b8cc600ae6 变更 2023-04-18 23:59:29 +08:00
as2252258 af284dbe4b 变更 2023-04-18 23:47:31 +08:00
as2252258 88c2c430c6 变更 2023-04-18 23:24:33 +08:00
as2252258 e3d990077d 变更 2023-04-17 10:19:00 +08:00
as2252258 00b6d28196 变更 2023-04-17 01:39:32 +08:00
as2252258 a0cd1182c1 变更 2023-04-17 01:29:43 +08:00
as2252258 ac2f2654a3 变更 2023-04-17 00:41:30 +08:00
as2252258 3b92bdb3ea 变更 2023-04-17 00:33:52 +08:00
as2252258 6d47eb377d 变更 2023-04-17 00:30:28 +08:00
as2252258 a475e3a396 变更 2023-04-16 17:15:05 +08:00
as2252258 b782fae562 变更 2023-04-16 16:40:45 +08:00
as2252258 289ffee605 变更 2023-04-16 14:41:21 +08:00
as2252258 b29e8eb893 变更 2023-04-16 14:21:55 +08:00
as2252258 5f53ab9d7d 变更 2023-04-16 13:47:32 +08:00
as2252258 3bfa88b4d8 变更 2023-04-16 13:36:36 +08:00
as2252258 ae48aca021 变更 2023-04-16 13:26:19 +08:00
as2252258 e307494a53 变更 2023-04-16 02:51:27 +08:00
as2252258 a660e1c08e 变更 2023-04-16 02:46:54 +08:00
as2252258 656038dc7d 变更 2023-04-16 02:21:25 +08:00
as2252258 641144bd66 变更 2023-04-16 02:18:22 +08:00
as2252258 9389386030 变更 2023-04-16 02:15:51 +08:00
as2252258 4eb7e6142b 变更 2023-04-16 02:05:36 +08:00
as2252258 fef9f27c2d 变更 2023-04-16 02:01:27 +08:00
as2252258 989ec6ed03 变更 2023-04-16 01:56:54 +08:00
as2252258 12f61a5bb5 变更 2023-04-16 01:54:43 +08:00
as2252258 3aab5da74f 变更 2023-04-16 01:50:47 +08:00
as2252258 11c21f01a2 变更 2023-04-16 01:45:34 +08:00
as2252258 46baac8bbd 变更 2023-04-16 01:24:30 +08:00
as2252258 cdd8644419 变更 2023-04-16 00:59:56 +08:00
as2252258 becf0bf249 变更 2023-04-16 00:59:31 +08:00
as2252258 a10d597e7e 变更 2023-04-16 00:15:10 +08:00
as2252258 12ab8b5f88 变更 2023-04-15 23:32:00 +08:00
as2252258 c825fd0d94 变更 2023-04-11 23:49:01 +08:00
as2252258 e62d83b62b 变更 2023-04-11 14:15:14 +08:00
as2252258 1c3ef9b361 变更 2023-04-11 14:00:45 +08:00
as2252258 7a2ffac535 变更 2023-04-11 13:42:33 +08:00
as2252258 87e91ad850 变更 2023-04-07 00:11:29 +08:00
as2252258 21de24af6a 变更 2023-04-07 00:05:01 +08:00
as2252258 df76dcaa54 变更 2023-04-06 23:00:58 +08:00
as2252258 b7bcdc2096 变更 2023-04-06 22:39:32 +08:00
as2252258 99b01b7f78 变更 2023-04-06 22:15:33 +08:00
as2252258 a5b473956d 变更 2023-04-06 17:08:47 +08:00
as2252258 4e7ef150a3 变更 2023-04-05 21:54:01 +08:00
as2252258 00ee4651b9 变更 2023-04-05 19:58:07 +08:00
as2252258 fab3779116 变更 2023-04-05 15:22:01 +08:00
as2252258 b0bebb81ca 变更 2023-04-05 15:05:22 +08:00
as2252258 b4d6c66ed3 变更 2023-04-05 14:59:13 +08:00
as2252258 133e63a96f 变更 2023-04-05 14:53:08 +08:00
as2252258 49ecd46ef3 变更 2023-04-05 14:49:52 +08:00
as2252258 02df2c7432 变更 2023-04-05 14:42:26 +08:00
as2252258 4b09fbdadd 变更 2023-04-05 14:12:57 +08:00
as2252258 2d190b5103 变更 2023-04-05 14:09:46 +08:00
as2252258 eb931b5fd4 变更 2023-04-05 13:55:56 +08:00
as2252258 419dfb6e0b 变更 2023-04-05 13:54:36 +08:00
as2252258 417b8b3927 变更 2023-04-05 12:35:18 +08:00
as2252258 1f145e9d24 变更 2023-04-05 11:40:48 +08:00
as2252258 03b43ba4ac 变更 2023-04-05 11:39:15 +08:00
as2252258 c1c3ab71ba 变更 2023-04-05 11:32:56 +08:00
as2252258 d8863f79a7 变更 2023-04-05 11:17:55 +08:00
as2252258 5d2ffd3aa6 变更 2023-04-05 11:04:54 +08:00
as2252258 ebc46f6323 变更 2023-04-05 10:55:30 +08:00
as2252258 8f925a1e6c 变更 2023-04-05 10:50:17 +08:00
as2252258 cf0376d5e1 变更 2023-04-05 10:24:58 +08:00
as2252258 77dd313b12 变更 2023-04-04 15:21:20 +08:00
as2252258 bc98a865af 变更 2023-04-04 15:15:30 +08:00
as2252258 0c2a419d0b 变更 2023-04-04 13:46:01 +08:00
as2252258 68e225c3b4 变更 2023-04-03 14:03:46 +08:00
as2252258 05c1a159c1 变更 2023-04-03 14:02:56 +08:00
as2252258 ebe679914d 变更 2023-04-03 13:56:46 +08:00
as2252258 fb84e7cebd 变更 2023-04-03 13:55:24 +08:00
as2252258 c9637f2dd3 变更 2023-04-03 13:54:09 +08:00
as2252258 ac588a6f6f 变更 2023-04-03 13:45:59 +08:00
as2252258 7d574e9172 变更 2023-04-03 11:08:11 +08:00
as2252258 709e35f4dc 变更 2023-04-03 00:56:22 +08:00
as2252258 00efca071f 变更 2023-04-03 00:43:25 +08:00
as2252258 d1cd8b0d5c 变更 2023-04-03 00:43:06 +08:00
as2252258 9b331798fb 变更 2023-04-03 00:24:51 +08:00
as2252258 fb851bbfc1 变更 2023-04-03 00:14:29 +08:00
as2252258 dcf4de9900 变更 2023-04-02 23:23:55 +08:00
as2252258 4afa0064e9 变更 2023-04-02 00:58:35 +08:00
as2252258 eb880adf57 变更 2023-04-02 00:50:42 +08:00
as2252258 b4e9e204bc 变更 2023-04-02 00:34:55 +08:00
as2252258 437e52896e 变更 2023-04-02 00:28:17 +08:00
as2252258 8d27725583 变更 2023-04-02 00:16:25 +08:00
as2252258 314bc98044 变更 2023-04-02 00:09:07 +08:00
as2252258 93804a751a 变更 2023-04-02 00:05:19 +08:00
as2252258 779c13f25a 变更 2023-04-01 01:02:14 +08:00
as2252258 a659375e1f 变更 2023-03-31 23:44:16 +08:00
as2252258 0fa38df2c9 变更 2023-03-31 23:36:08 +08:00
as2252258 d7060dd82e 变更 2023-03-31 11:08:21 +08:00
as2252258 fdbf891fad 变更 2023-03-31 10:37:15 +08:00
as2252258 8cfcb18d6a 变更 2023-03-31 10:31:51 +08:00
as2252258 8f1d367484 变更 2023-03-31 10:30:39 +08:00
as2252258 bb41e1052f 变更 2023-03-30 23:10:14 +08:00
as2252258 592015e3ee 变更 2023-03-30 18:24:05 +08:00
as2252258 00f934c0d5 变更 2023-02-13 14:37:07 +08:00
as2252258 86e3ac485c 变更 2023-02-13 14:35:00 +08:00
as2252258 adffcf1852 变更 2023-02-13 14:23:29 +08:00
as2252258 da361fcca2 变更 2023-02-07 17:46:41 +08:00
as2252258 17fd230ebb 变更 2023-02-07 17:19:31 +08:00
as2252258 d83f061a1c 变更 2023-02-07 17:16:10 +08:00
as2252258 4f341594b5 变更 2023-02-07 16:46:13 +08:00
as2252258 a9472ff0a3 变更 2023-01-30 11:03:58 +08:00
as2252258 b7229f32f8 变更 2022-12-13 14:23:06 +08:00
as2252258 4a4bf7b5cb 变更 2022-12-12 17:31:12 +08:00
as2252258 eef386d6c8 变更 2022-10-12 15:03:12 +08:00
as2252258 5bfe8401f5 变更 2022-10-11 18:55:06 +08:00
as2252258 268f8665d0 变更 2022-10-11 18:28:33 +08:00
as2252258 ceefabb8e4 变更 2022-10-11 18:20:47 +08:00
as2252258 81c8f8f50e 变更 2022-10-11 18:00:22 +08:00
as2252258 090f51f624 变更 2022-10-11 17:55:03 +08:00
as2252258 0b179f9739 变更 2022-10-11 17:35:42 +08:00
as2252258 af60e61c5c 变更 2022-10-11 17:33:00 +08:00
as2252258 5d9014acc3 变更 2022-10-11 16:03:56 +08:00
as2252258 9d5ab6e80e 变更 2022-10-11 15:58:20 +08:00
as2252258 52624c4542 变更 2022-10-11 15:51:01 +08:00
as2252258 5d0c019bd5 Merge branch 'master' of github.com:as2252258/kiri-core 2022-10-11 15:37:01 +08:00
as2252258 7824a7cc7a 变更 2022-10-11 15:27:48 +08:00
as2252258 45aa4c5d92 变更 2022-10-11 15:19:48 +08:00
as2252258 6898e544f7 变更 2022-10-11 15:15:04 +08:00
as2252258 3dd5311430 变更 2022-10-11 14:33:33 +08:00
as2252258 8d8033027d 变更 2022-09-29 23:51:17 +08:00
as2252258 d8eae58bfd 变更 2022-09-29 23:49:33 +08:00
as2252258 530f2ea98d 变更 2022-09-29 23:49:07 +08:00
as2252258 6039ca70c5 变更 2022-09-29 23:06:08 +08:00
as2252258 bc2275300d 变更 2022-09-26 11:04:28 +08:00
as2252258 6485b8ca22 变更 2022-09-25 17:22:51 +08:00
as2252258 dbc7cc2dfa 变更 2022-09-25 17:22:25 +08:00
as2252258 d960f518be 变更 2022-09-25 17:16:40 +08:00
as2252258 eda1955956 变更 2022-09-25 17:15:23 +08:00
as2252258 354013fa41 变更 2022-09-25 04:38:27 +08:00
as2252258 f63f480e57 变更 2022-09-24 14:27:42 +08:00
as2252258 c2daafed59 变更 2022-09-24 14:24:02 +08:00
as2252258 64dbdf57c1 变更 2022-09-24 14:22:36 +08:00
as2252258 8e7832912d 变更 2022-09-24 13:39:06 +08:00
as2252258 e0795595e7 变更 2022-09-23 19:00:53 +08:00
as2252258 f5e7fcf51f 变更 2022-09-23 18:59:35 +08:00
as2252258 98fae744c0 变更 2022-09-23 18:55:46 +08:00
as2252258 d909aa4c4e 变更 2022-09-20 18:53:49 +08:00
as2252258 d520b5fbc4 变更 2022-09-20 18:23:19 +08:00
as2252258 2ce699faa7 变更 2022-09-19 18:51:30 +08:00
as2252258 709e40fc28 变更 2022-09-19 18:45:22 +08:00
as2252258 15214aa07e 变更 2022-09-19 18:39:28 +08:00
as2252258 9bf6d000ed 变更 2022-09-19 18:24:12 +08:00
as2252258 9b873479ac 变更 2022-09-08 11:38:00 +08:00
as2252258 e45fbef80a 变更 2022-09-08 11:31:12 +08:00
as2252258 ca24cb9e58 变更 2022-09-07 13:51:11 +08:00
as2252258 92024adb53 变更 2022-09-05 18:56:20 +08:00
as2252258 6a3aa12f1d 变更 2022-09-05 18:53:36 +08:00
as2252258 24322a411a 变更 2022-09-05 18:47:20 +08:00
as2252258 623f0362fd 变更 2022-09-05 18:42:53 +08:00
as2252258 4ea5945101 变更 2022-09-05 18:41:37 +08:00
as2252258 4b5d9b6486 变更 2022-09-05 18:39:03 +08:00
as2252258 7e02cc582c 变更 2022-09-05 18:34:35 +08:00
as2252258 14080f7e30 变更 2022-09-05 18:32:27 +08:00
as2252258 b764ced6fa 变更 2022-09-05 18:28:44 +08:00
as2252258 85d19dcccf 变更 2022-09-05 18:17:31 +08:00
as2252258 ac6c9af6d9 变更 2022-09-05 18:14:07 +08:00
as2252258 6a6f14b7a3 变更 2022-09-05 18:11:26 +08:00
as2252258 6e21c3b5ab 变更 2022-09-05 18:09:01 +08:00
as2252258 843abbeaa6 modify plugin name 2022-07-11 18:53:19 +08:00
as2252258 7e409968be modify plugin name 2022-07-11 18:33:25 +08:00
as2252258 211905278b modify plugin name 2022-07-11 17:51:41 +08:00
as2252258 d80d4af8c5 modify plugin name 2022-07-11 17:35:45 +08:00
as2252258 a03d076299 modify plugin name 2022-07-11 17:28:41 +08:00
as2252258 150cdbbbfa modify plugin name 2022-07-11 17:05:32 +08:00
as2252258 cd509b2663 modify plugin name 2022-07-11 16:54:24 +08:00
as2252258 0705eefd69 modify plugin name 2022-07-11 16:49:32 +08:00
as2252258 d2c42c8553 modify plugin name 2022-07-11 16:34:13 +08:00
as2252258 a55944a285 modify plugin name 2022-07-11 16:33:46 +08:00
as2252258 cba75d419d modify plugin name 2022-07-11 16:21:51 +08:00
as2252258 f77374519e modify plugin name 2022-07-11 16:09:58 +08:00
as2252258 52c6ee7053 modify plugin name 2022-07-11 14:50:33 +08:00
as2252258 3c3e7f900b modify plugin name 2022-07-11 14:49:47 +08:00
as2252258 e39a63523e 变更 2022-07-10 01:19:10 +08:00
as2252258 983722d22f 变更 2022-07-10 00:15:37 +08:00
as2252258 e54ac1ed39 变更 2022-07-09 23:48:01 +08:00
as2252258 912738ae1c modify plugin name 2022-07-08 18:38:19 +08:00
as2252258 d48d0d81c7 modify plugin name 2022-07-08 18:33:51 +08:00
as2252258 838847bd78 modify plugin name 2022-07-08 17:46:42 +08:00
as2252258 d50f99e144 Merge remote-tracking branch 'origin/master' 2022-07-08 17:44:19 +08:00
as2252258 7c26dff45e modify plugin name 2022-07-08 17:43:51 +08:00
as2252258 dfe62ef592 变更 2022-06-30 16:40:48 +08:00
as2252258 d2dd255c90 modify plugin name 2022-06-24 15:07:46 +08:00
as2252258 93ae880902 modify plugin name 2022-06-23 13:44:32 +08:00
as2252258 7077095f7a 变更 2022-06-23 00:32:41 +08:00
as2252258 b2dfedfe63 modify plugin name 2022-06-22 19:05:08 +08:00
as2252258 0b70d9109c modify plugin name 2022-06-22 19:02:30 +08:00
as2252258 f729233ffd modify plugin name 2022-06-22 19:01:44 +08:00
as2252258 8deff8743a modify plugin name 2022-06-22 18:55:30 +08:00
as2252258 71c1d8c9d3 modify plugin name 2022-06-22 18:28:46 +08:00
as2252258 8630d79519 modify plugin name 2022-06-22 16:57:11 +08:00
as2252258 f595f1146e modify plugin name 2022-06-22 16:50:37 +08:00
as2252258 77087baed9 modify plugin name 2022-06-22 16:42:10 +08:00
as2252258 5c91717d84 modify plugin name 2022-06-22 16:39:05 +08:00
as2252258 60003c4527 modify plugin name 2022-06-22 16:37:03 +08:00
as2252258 38f00206eb modify plugin name 2022-06-22 16:29:42 +08:00
as2252258 f139f32c85 modify plugin name 2022-06-22 10:53:59 +08:00
as2252258 f20e695919 modify plugin name 2022-06-20 17:25:02 +08:00
as2252258 4a7d4165f8 modify plugin name 2022-06-17 19:00:56 +08:00
as2252258 b515f04c97 modify plugin name 2022-06-17 15:02:31 +08:00
as2252258 287dc99362 modify plugin name 2022-06-17 14:30:31 +08:00
as2252258 824dd399db modify plugin name 2022-06-17 14:17:22 +08:00
as2252258 4419b7b237 modify plugin name 2022-06-17 14:07:16 +08:00
as2252258 3e609a48ef modify plugin name 2022-06-17 14:04:35 +08:00
as2252258 85277cd277 modify plugin name 2022-06-17 14:04:23 +08:00
as2252258 4927294b9e modify plugin name 2022-06-17 12:14:17 +08:00
as2252258 0535d6fd7f modify plugin name 2022-06-17 12:09:07 +08:00
as2252258 92b5b248a3 modify plugin name 2022-06-17 11:59:19 +08:00
as2252258 0a70a95b63 modify plugin name 2022-06-16 18:49:34 +08:00
as2252258 a79a469547 modify plugin name 2022-06-16 18:47:38 +08:00
as2252258 4daad7d111 modify plugin name 2022-06-16 17:38:23 +08:00
as2252258 10de6b5246 debug alter 2022-06-08 16:20:22 +08:00
as2252258 d1b870a8ca modify plugin name 2022-06-08 16:19:15 +08:00
as2252258 1955e73881 modify plugin name 2022-06-08 16:13:16 +08:00
as2252258 8b7dc42185 modify plugin name 2022-06-08 16:02:32 +08:00
as2252258 751168b2de modify plugin name 2022-06-08 16:00:54 +08:00
as2252258 8681a23919 modify plugin name 2022-06-08 15:50:50 +08:00
as2252258 80fd889ae4 modify plugin name 2022-06-08 14:08:32 +08:00
as2252258 def499c2f6 变更 2022-05-03 06:56:28 +08:00
as2252258 ab2ec0f790 s 2022-03-17 10:43:50 +08:00
as2252258 ffc9b57cad e 2022-03-17 10:42:50 +08:00
as2252258 734db55904 modify plugin name 2022-03-17 10:35:37 +08:00
as2252258 864c8fa84c modify plugin name 2022-03-16 18:08:49 +08:00
as2252258 4f5c63e222 modify plugin name 2022-03-16 18:06:59 +08:00
as2252258 bab0512dd6 modify plugin name 2022-03-04 17:36:12 +08:00
as2252258 4af173deff modify plugin name 2022-03-03 18:30:59 +08:00
as2252258 9cd44aad3d modify plugin name 2022-03-03 17:25:47 +08:00
as2252258 4f5fba5ce4 modify plugin name 2022-03-02 18:30:11 +08:00
as2252258 66dc6de141 modify plugin name 2022-03-02 18:20:49 +08:00
as2252258 c3e914ecf1 modify plugin name 2022-03-02 17:25:12 +08:00
as2252258 7232269ad0 modify plugin name 2022-03-01 18:01:53 +08:00
as2252258 b601c4150b modify plugin name 2022-03-01 17:58:10 +08:00
as2252258 54e1ecd10f modify plugin name 2022-03-01 17:57:22 +08:00
as2252258 9c7d284e17 modify plugin name 2022-03-01 16:13:12 +08:00
as2252258 b1b22bf835 modify plugin name 2022-03-01 15:13:54 +08:00
as2252258 35239ed0dc modify plugin name 2022-03-01 15:08:15 +08:00
as2252258 a89061c90c modify plugin name 2022-03-01 15:05:50 +08:00
as2252258 1570239840 modify plugin name 2022-03-01 14:23:36 +08:00
as2252258 875cbe08db modify plugin name 2022-03-01 14:19:48 +08:00
as2252258 0b9d570871 modify plugin name 2022-03-01 14:08:38 +08:00
as2252258 a465d2f489 modify plugin name 2022-02-28 14:40:13 +08:00
as2252258 6e7fe74130 modify plugin name 2022-02-28 10:31:44 +08:00
as2252258 eab01dee1b modify plugin name 2022-02-28 10:29:20 +08:00
as2252258 7ac19eb76b modify plugin name 2022-02-28 10:24:37 +08:00
as2252258 5ee6a6ab54 modify plugin name 2022-02-28 10:17:08 +08:00
as2252258 1c5279f7c7 modify plugin name 2022-02-28 10:13:27 +08:00
as2252258 aa598cfb4f modify plugin name 2022-02-27 18:35:58 +08:00
as2252258 2b1f5f3804 modify plugin name 2022-02-27 18:34:17 +08:00
as2252258 b7fe54451c modify plugin name 2022-02-27 18:29:57 +08:00
as2252258 e01a1cbb7b modify plugin name 2022-02-27 18:29:31 +08:00
as2252258 66a76c3fb1 modify plugin name 2022-02-27 18:26:57 +08:00
as2252258 69138a56e2 modify plugin name 2022-02-27 18:26:08 +08:00
as2252258 6bc1b9238e modify plugin name 2022-02-27 18:23:05 +08:00
as2252258 215b3ced71 modify plugin name 2022-02-27 18:21:47 +08:00
as2252258 696db2ec66 modify plugin name 2022-02-27 18:19:35 +08:00
as2252258 99250b3e03 modify plugin name 2022-02-27 17:32:38 +08:00
as2252258 adcabf4df6 modify plugin name 2022-02-27 15:31:21 +08:00
as2252258 635372cd83 modify plugin name 2022-02-27 15:29:23 +08:00
as2252258 513f947b28 modify plugin name 2022-02-25 19:00:06 +08:00
as2252258 c032120de0 modify plugin name 2022-02-25 18:59:58 +08:00
as2252258 632fe7569e modify plugin name 2022-02-25 18:58:40 +08:00
as2252258 bbd960899a modify plugin name 2022-02-25 18:37:49 +08:00
as2252258 37784a238a modify plugin name 2022-02-25 18:33:31 +08:00
as2252258 360347325e modify plugin name 2022-02-25 18:33:05 +08:00
as2252258 d67bbd69ca modify plugin name 2022-02-25 18:30:59 +08:00
as2252258 56c4f42b97 modify plugin name 2022-02-25 18:14:22 +08:00
as2252258 c0efa2f913 modify plugin name 2022-02-25 18:11:09 +08:00
as2252258 a71924dd37 modify plugin name 2022-02-25 18:00:55 +08:00
as2252258 ecddacb321 modify plugin name 2022-02-25 17:21:00 +08:00
as2252258 70271e3db4 modify plugin name 2022-02-25 15:54:57 +08:00
as2252258 7fd29e4982 modify plugin name 2022-02-25 15:42:02 +08:00
as2252258 b551e5e22c modify plugin name 2022-02-25 15:39:08 +08:00
as2252258 a0d62fdc01 modify plugin name 2022-02-25 10:25:29 +08:00
as2252258 867f76e058 modify plugin name 2022-02-24 16:58:37 +08:00
as2252258 457ae27528 modify plugin name 2022-02-24 15:24:29 +08:00
as2252258 dbfad195e3 modify plugin name 2022-02-24 13:55:23 +08:00
as2252258 d5293f28b7 modify plugin name 2022-02-24 13:53:03 +08:00
as2252258 f59e2870c0 modify plugin name 2022-02-24 13:51:44 +08:00
as2252258 698b0ad0ff modify plugin name 2022-02-24 11:00:01 +08:00
as2252258 8e4f345091 modify plugin name 2022-02-23 18:48:49 +08:00
as2252258 70a5a5ea59 modify plugin name 2022-02-23 18:20:14 +08:00
as2252258 689f1cc32a modify plugin name 2022-02-23 18:18:44 +08:00
as2252258 09dd2443c7 modify plugin name 2022-02-23 18:12:57 +08:00
as2252258 1cdb8aceac modify plugin name 2022-02-23 18:02:29 +08:00
as2252258 8bb593bf3e modify plugin name 2022-02-23 17:15:53 +08:00
as2252258 3bc08ec6d0 modify plugin name 2022-02-23 17:06:49 +08:00
as2252258 01694d39ae modify plugin name 2022-02-23 17:04:52 +08:00
as2252258 58f1eeb91c modify plugin name 2022-02-23 16:54:34 +08:00
as2252258 a0920dfb92 modify plugin name 2022-02-23 16:36:48 +08:00
as2252258 02c879442c modify plugin name 2022-02-23 16:35:41 +08:00
as2252258 99c824c467 modify plugin name 2022-02-23 16:32:08 +08:00
as2252258 fa66eef192 modify plugin name 2022-02-21 14:18:34 +08:00
as2252258 7564a8229f modify plugin name 2022-02-21 11:10:30 +08:00
as2252258 6dd4a036b0 modify plugin name 2022-02-21 11:02:10 +08:00
as2252258 f479f037f7 modify plugin name 2022-02-18 17:16:46 +08:00
as2252258 c59c564f32 modify plugin name 2022-02-18 15:57:18 +08:00
as2252258 7a331e36ad modify plugin name 2022-02-18 15:17:31 +08:00
as2252258 2e073ddbb2 modify plugin name 2022-02-18 15:16:41 +08:00
as2252258 064ca3f728 modify plugin name 2022-02-18 14:51:31 +08:00
as2252258 634b9223e0 modify plugin name 2022-02-18 14:45:59 +08:00
as2252258 7a6de074b9 modify plugin name 2022-02-18 13:45:30 +08:00
as2252258 eba7dc29b3 modify plugin name 2022-02-18 10:48:43 +08:00
as2252258 4887fb036c modify plugin name 2022-02-17 18:58:43 +08:00
as2252258 a5bb77a0ec modify plugin name 2022-02-17 18:52:03 +08:00
as2252258 59f3322635 modify plugin name 2022-02-17 18:50:14 +08:00
as2252258 2f540211c9 modify plugin name 2022-02-17 18:49:05 +08:00
as2252258 fcbdda6239 modify plugin name 2022-02-17 18:48:26 +08:00
as2252258 dca19bf88b modify plugin name 2022-02-17 18:45:59 +08:00
as2252258 04dabe755e modify plugin name 2022-02-17 18:45:32 +08:00
as2252258 3675a592c4 modify plugin name 2022-02-17 17:44:28 +08:00
as2252258 2d0f214a9f modify plugin name 2022-02-16 10:55:42 +08:00
as2252258 8cd3886494 modify plugin name 2022-02-16 10:38:58 +08:00
as2252258 a75561a415 modify plugin name 2022-02-15 17:19:06 +08:00
as2252258 106e84914d modify plugin name 2022-02-15 12:17:11 +08:00
as2252258 4f54e5bdf8 modify plugin name 2022-02-14 18:04:47 +08:00
as2252258 79ac0bd558 modify plugin name 2022-02-14 17:59:56 +08:00
as2252258 d36a359cc0 modify plugin name 2022-02-14 17:39:51 +08:00
as2252258 a36817e89c modify plugin name 2022-02-14 14:42:56 +08:00
as2252258 5b93689184 modify plugin name 2022-02-14 14:34:56 +08:00
as2252258 fce7551dc3 modify plugin name 2022-02-14 14:32:53 +08:00
as2252258 826dcb58e5 modify plugin name 2022-02-14 14:30:48 +08:00
as2252258 244ed0fded modify plugin name 2022-02-14 14:30:18 +08:00
as2252258 60e891b08c modify plugin name 2022-02-14 14:28:47 +08:00
as2252258 f42614ea5d modify plugin name 2022-02-14 13:34:54 +08:00
as2252258 a70c66cc99 modify plugin name 2022-02-14 10:23:43 +08:00
as2252258 c9a904f065 modify plugin name 2022-02-13 03:20:06 +08:00
as2252258 69a7735144 modify plugin name 2022-02-11 19:00:55 +08:00
as2252258 7b283e1c19 modify plugin name 2022-02-11 11:18:25 +08:00
as2252258 97a5b58d11 modify plugin name 2022-02-10 16:35:03 +08:00
as2252258 ca274a3910 Revert "改名"
This reverts commit fdf58326
2022-02-10 11:37:54 +08:00
as2252258 4d6f7d1d13 Revert "改名"
This reverts commit fdf58326
2022-02-03 14:54:38 +08:00
as2252258 8296cda1f2 Revert "改名"
This reverts commit fdf58326
2022-01-25 15:50:17 +08:00
as2252258 3bb14c5acb Revert "改名"
This reverts commit fdf58326
2022-01-25 15:49:48 +08:00
as2252258 b5bfff66dd 1 2022-01-25 02:00:42 +08:00
as2252258 adb2269df0 Revert "改名"
This reverts commit fdf58326
2022-01-20 19:05:57 +08:00
as2252258 b557f15a98 Revert "改名"
This reverts commit fdf58326
2022-01-20 19:04:16 +08:00
as2252258 862acf1db1 Revert "改名"
This reverts commit fdf58326
2022-01-18 16:01:02 +08:00
as2252258 a2272edc76 Revert "改名"
This reverts commit fdf58326
2022-01-18 10:29:32 +08:00
as2252258 555d653288 Revert "改名"
This reverts commit fdf58326
2022-01-18 10:18:13 +08:00
as2252258 45cf88e52c Revert "改名"
This reverts commit fdf58326
2022-01-17 19:04:26 +08:00
as2252258 a8f840bfb2 Revert "改名"
This reverts commit fdf58326
2022-01-17 18:48:57 +08:00
as2252258 d8222366b1 Revert "改名"
This reverts commit fdf58326
2022-01-17 18:45:00 +08:00
as2252258 fbe13eaa7e Revert "改名"
This reverts commit fdf58326
2022-01-17 14:04:37 +08:00
as2252258 466df3387f Revert "改名"
This reverts commit fdf58326
2022-01-17 10:59:55 +08:00
as2252258 fa76b5170a Revert "改名"
This reverts commit fdf58326
2022-01-15 10:23:57 +08:00
as2252258 b0c66c9c6a Revert "改名"
This reverts commit fdf58326
2022-01-14 16:50:01 +08:00
as2252258 2ffdf83645 Revert "改名"
This reverts commit fdf58326
2022-01-14 16:05:12 +08:00
as2252258 c3a3551ba3 Revert "改名"
This reverts commit fdf58326
2022-01-14 15:52:38 +08:00
as2252258 829c063700 Revert "改名"
This reverts commit fdf58326
2022-01-14 14:54:13 +08:00
as2252258 eaf251ac53 Revert "改名"
This reverts commit fdf58326
2022-01-14 14:45:03 +08:00
as2252258 776cc80495 Revert "改名"
This reverts commit fdf58326
2022-01-14 14:43:04 +08:00
as2252258 103cc96103 Revert "改名"
This reverts commit fdf58326
2022-01-14 14:19:52 +08:00
as2252258 f2da99efce Revert "改名"
This reverts commit fdf58326
2022-01-14 14:18:29 +08:00
as2252258 49d0ba7b3c Revert "改名"
This reverts commit fdf58326
2022-01-14 11:43:02 +08:00
as2252258 a6ed92206e Revert "改名"
This reverts commit fdf58326
2022-01-14 11:41:30 +08:00
as2252258 bb9b9dbcd2 Revert "改名"
This reverts commit fdf58326
2022-01-14 11:40:20 +08:00
as2252258 9782147a47 Revert "改名"
This reverts commit fdf58326
2022-01-14 11:39:52 +08:00
as2252258 7598bdbd63 Revert "改名"
This reverts commit fdf58326
2022-01-14 11:38:28 +08:00
as2252258 a569bd6897 Revert "改名"
This reverts commit fdf58326
2022-01-14 11:29:16 +08:00
as2252258 ffeef3ff4b Revert "改名"
This reverts commit fdf58326
2022-01-13 18:48:13 +08:00
as2252258 7f6a0c01e0 Revert "改名"
This reverts commit fdf58326
2022-01-13 18:41:16 +08:00
as2252258 32f9ebc2a2 Revert "改名"
This reverts commit fdf58326
2022-01-13 18:39:39 +08:00
as2252258 f35ffe6ff1 Revert "改名"
This reverts commit fdf58326
2022-01-13 18:33:04 +08:00
as2252258 9a76ee0184 Revert "改名"
This reverts commit fdf58326
2022-01-13 10:15:04 +08:00
as2252258 249f9b1c6f Revert "改名"
This reverts commit fdf58326
2022-01-12 18:52:13 +08:00
as2252258 1df2d43b8b Revert "改名"
This reverts commit fdf58326
2022-01-12 18:50:48 +08:00
as2252258 2daac841a3 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:49:57 +08:00
as2252258 28cd946219 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:30:28 +08:00
as2252258 70015f7ab8 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:29:49 +08:00
as2252258 a467056c86 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:28:51 +08:00
as2252258 a2a3f0fc40 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:27:49 +08:00
as2252258 cfbebeb951 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:26:54 +08:00
as2252258 94851c3f51 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:22:53 +08:00
as2252258 1896dc90b4 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:14:15 +08:00
as2252258 6168adb401 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:12:56 +08:00
as2252258 5e742e7196 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:09:49 +08:00
as2252258 4605fc9162 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:08:28 +08:00
as2252258 54f19fb058 Revert "改名"
This reverts commit fdf58326
2022-01-12 18:05:49 +08:00
as2252258 a9165b601a Revert "改名"
This reverts commit fdf58326
2022-01-12 18:03:09 +08:00
as2252258 5b35c4de4a Revert "改名"
This reverts commit fdf58326
2022-01-12 18:02:45 +08:00
as2252258 8b6aff5c7b Revert "改名"
This reverts commit fdf58326
2022-01-12 18:01:55 +08:00
as2252258 1d3b45e2c3 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:58:01 +08:00
as2252258 f2ad97c7f0 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:55:25 +08:00
as2252258 19b3f0f1e9 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:54:18 +08:00
as2252258 ebd643772d Revert "改名"
This reverts commit fdf58326
2022-01-12 17:53:27 +08:00
as2252258 08d9551245 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:52:18 +08:00
as2252258 59eec80939 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:46:16 +08:00
as2252258 241385b575 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:39:11 +08:00
as2252258 73ce2b8a50 Revert "改名"
This reverts commit fdf58326
2022-01-12 17:38:25 +08:00
as2252258 6f80b2fe6a Revert "改名"
This reverts commit fdf58326
2022-01-12 17:17:47 +08:00
as2252258 8955891c2f Revert "改名"
This reverts commit fdf58326
2022-01-12 16:01:55 +08:00
as2252258 035138a779 Revert "改名"
This reverts commit fdf58326
2022-01-12 16:00:11 +08:00
as2252258 c6e6c8d68d Revert "改名"
This reverts commit fdf58326
2022-01-12 15:47:28 +08:00
as2252258 6a30fdfa8d Revert "改名"
This reverts commit fdf58326
2022-01-12 15:08:22 +08:00
as2252258 367e1cd122 Revert "改名"
This reverts commit fdf58326
2022-01-12 15:07:40 +08:00
as2252258 667d311d73 Revert "改名"
This reverts commit fdf58326
2022-01-12 14:52:01 +08:00
as2252258 375f396467 Revert "改名"
This reverts commit fdf58326
2022-01-12 14:43:28 +08:00
as2252258 7b1cc1bd7b Revert "改名"
This reverts commit fdf58326
2022-01-12 14:10:33 +08:00
as2252258 1ae1d78ddf Revert "改名"
This reverts commit fdf58326
2022-01-12 11:52:59 +08:00
as2252258 00212d133d Revert "改名"
This reverts commit fdf58326
2022-01-12 11:39:17 +08:00
as2252258 7fbe9fbf44 Revert "改名"
This reverts commit fdf58326
2022-01-12 11:20:34 +08:00
as2252258 de1aff9efd Revert "改名"
This reverts commit fdf58326
2022-01-11 16:17:25 +08:00
as2252258 cef09a11ef Revert "改名"
This reverts commit fdf58326
2022-01-11 16:16:05 +08:00
as2252258 7122018a2a Revert "改名"
This reverts commit fdf58326
2022-01-11 15:53:31 +08:00
as2252258 f8763953c5 Revert "改名"
This reverts commit fdf58326
2022-01-11 15:48:12 +08:00
as2252258 22560d77d6 Revert "改名"
This reverts commit fdf58326
2022-01-10 11:39:56 +08:00
as2252258 483c898f51 1 2022-01-10 02:13:11 +08:00
as2252258 1fa651c587 1 2022-01-10 02:10:37 +08:00
as2252258 f7ca56a9b0 1 2022-01-09 17:56:47 +08:00
as2252258 4fa5c23c10 1 2022-01-09 16:07:58 +08:00
as2252258 f46af653f2 1 2022-01-09 14:33:33 +08:00
as2252258 5e02a79bf0 e 2022-01-09 03:50:38 +08:00
as2252258 08dc3e262b 1 2022-01-09 03:46:42 +08:00
as2252258 8c5e52940f 1 2022-01-09 02:44:09 +08:00
as2252258 4dbcacdd1f Revert "改名"
This reverts commit fdf58326
2022-01-08 19:11:23 +08:00
as2252258 97cd1a0ebf Revert "改名"
This reverts commit fdf58326
2022-01-08 18:49:08 +08:00
as2252258 7165a67294 Revert "改名"
This reverts commit fdf58326
2022-01-08 18:10:52 +08:00
as2252258 4bc7451424 Revert "改名"
This reverts commit fdf58326
2022-01-08 18:10:41 +08:00
as2252258 d7d0f685dc Revert "改名"
This reverts commit fdf58326
2022-01-08 10:07:19 +08:00
as2252258 8ee7d30d6a Revert "改名"
This reverts commit fdf58326
2022-01-07 19:01:00 +08:00
as2252258 224009e7e6 Revert "改名"
This reverts commit fdf58326
2022-01-07 19:00:45 +08:00
as2252258 b4551ae2fd Revert "改名"
This reverts commit fdf58326
2022-01-07 18:16:30 +08:00
as2252258 5ca94925e3 Revert "改名"
This reverts commit fdf58326
2022-01-07 18:05:17 +08:00
as2252258 0afa8fc400 Revert "改名"
This reverts commit fdf58326
2022-01-07 17:59:37 +08:00
as2252258 842220e4de Revert "改名"
This reverts commit fdf58326
2022-01-07 17:57:27 +08:00
as2252258 c9726e5778 Revert "改名"
This reverts commit fdf58326
2022-01-07 14:38:36 +08:00
as2252258 f867f4be9e Revert "改名"
This reverts commit fdf58326
2022-01-06 19:05:15 +08:00
as2252258 45319c3733 Revert "改名"
This reverts commit fdf58326
2022-01-04 17:27:37 +08:00
as2252258 06c9459f14 Revert "改名"
This reverts commit fdf58326
2022-01-04 16:25:03 +08:00
as2252258 5fd2abcb69 Revert "改名"
This reverts commit fdf58326
2022-01-04 16:22:37 +08:00
as2252258 58a3d91df3 Merge remote-tracking branch 'origin/master' 2022-01-04 16:05:08 +08:00
as2252258 c61842402a Revert "改名"
This reverts commit fdf58326
2022-01-04 16:04:22 +08:00
as2252258 623bae9e97 1 2022-01-04 00:07:26 +08:00
as2252258 12610c218c 1 2022-01-04 00:07:14 +08:00
as2252258 c3ca24884e Revert "改名"
This reverts commit fdf58326
2021-12-31 16:47:17 +08:00
as2252258 02c14874a2 Revert "改名"
This reverts commit fdf58326
2021-12-31 16:46:13 +08:00
as2252258 6eff48e22f Revert "改名"
This reverts commit fdf58326
2021-12-30 18:10:51 +08:00
as2252258 6c46a54d4b Revert "改名"
This reverts commit fdf58326
2021-12-28 17:54:51 +08:00
as2252258 03287cfd65 Revert "改名"
This reverts commit fdf58326
2021-12-28 14:16:45 +08:00
as2252258 93ce4c16b6 Revert "改名"
This reverts commit fdf58326
2021-12-27 15:24:29 +08:00
as2252258 4b92edd40f 1 2021-12-24 01:19:43 +08:00
as2252258 a76c81df8e 改名 2021-12-23 18:36:14 +08:00
as2252258 aa59caad07 改名 2021-12-23 18:22:27 +08:00
as2252258 6fd8a5dd34 1 2021-12-22 03:29:27 +08:00
as2252258 9ca53a73ce 1 2021-12-22 03:29:14 +08:00
as2252258 d904e78864 1 2021-12-18 03:27:14 +08:00
as2252258 0d64ef7ac4 1 2021-12-17 04:57:46 +08:00
as2252258 154d9d74d6 1 2021-12-17 04:43:20 +08:00
as2252258 2c61abff01 1 2021-12-17 04:41:00 +08:00
as2252258 b4ce762cf3 1 2021-12-17 04:26:54 +08:00
as2252258 4b3c2234af 1 2021-12-17 04:24:40 +08:00
as2252258 7ee78a9642 1 2021-12-17 04:24:01 +08:00
as2252258 f9838f781d 1 2021-12-17 04:23:12 +08:00
as2252258 848416af4f 1 2021-12-17 04:22:13 +08:00
as2252258 0216e761be 1 2021-12-17 04:17:53 +08:00
as2252258 acf6631c5c 1 2021-12-17 04:15:59 +08:00
as2252258 64e4307a57 1 2021-12-12 06:37:52 +08:00
as2252258 ab672127e6 1 2021-12-12 02:46:30 +08:00
as2252258 6e5b545a1e 1 2021-12-12 02:45:39 +08:00
as2252258 8229395e6d 1 2021-12-12 02:41:31 +08:00
as2252258 d5d2b04321 1 2021-12-11 17:56:35 +08:00
as2252258 ce9c184c83 1 2021-12-11 17:40:16 +08:00
as2252258 620de34559 1 2021-12-11 17:38:53 +08:00
as2252258 b01c71ea5e 1 2021-12-11 17:38:15 +08:00
as2252258 90e1f7eb29 1 2021-12-11 17:35:44 +08:00
as2252258 f3ad09ef66 1 2021-12-11 17:34:05 +08:00
as2252258 dfccb8816c 1 2021-12-11 17:32:28 +08:00
as2252258 1670ff3fef 1 2021-12-11 05:33:46 +08:00
as2252258 8870a7ca27 1 2021-12-11 05:33:00 +08:00
as2252258 ebb7ac9673 改名 2021-12-09 17:01:18 +08:00
as2252258 5aad8d2001 改名 2021-12-08 11:45:19 +08:00
as2252258 80713788c9 改名 2021-12-08 11:39:57 +08:00
as2252258 9f36acbbca 改名 2021-12-08 11:32:32 +08:00
as2252258 044d213a69 改名 2021-12-07 16:44:12 +08:00
as2252258 e5fe525f82 改名 2021-12-07 16:02:07 +08:00
as2252258 39e4e52908 改名 2021-12-07 16:00:52 +08:00
as2252258 f62014ff34 改名 2021-12-07 15:59:13 +08:00
as2252258 7935e6a6a3 改名 2021-12-07 15:53:56 +08:00
as2252258 d2acd50352 改名 2021-12-06 18:07:33 +08:00
as2252258 d02337ec22 改名 2021-12-06 17:58:11 +08:00
as2252258 57f12b6701 改名 2021-12-06 17:22:26 +08:00
as2252258 d500fd21ce 改名 2021-12-06 16:14:48 +08:00
as2252258 30d7b8684e 改名 2021-12-06 16:13:52 +08:00
as2252258 d8eb4d4e45 改名 2021-12-06 16:03:39 +08:00
as2252258 7004c5c0f8 改名 2021-12-06 15:54:31 +08:00
as2252258 81e55ecdf1 改名 2021-12-06 15:52:05 +08:00
as2252258 20adc186d4 改名 2021-12-06 15:51:29 +08:00
as2252258 8c16d9f4b3 改名 2021-12-06 15:48:57 +08:00
as2252258 b3e06a680a 改名 2021-12-06 15:47:12 +08:00
as2252258 3176443e5c 改名 2021-12-06 15:39:35 +08:00
as2252258 83962fa3ba 改名 2021-12-06 14:49:47 +08:00
as2252258 5475f2cd51 改名 2021-12-06 14:45:12 +08:00
as2252258 30212c0b86 改名 2021-12-06 14:44:18 +08:00
as2252258 4731463897 改名 2021-12-06 14:43:46 +08:00
as2252258 87e901f5b1 改名 2021-12-06 14:42:54 +08:00
as2252258 66f87b6da4 改名 2021-12-06 14:41:05 +08:00
as2252258 0007242b70 改名 2021-12-06 14:40:18 +08:00
as2252258 8653e6914b 改名 2021-12-06 14:39:03 +08:00
as2252258 816fec8ef4 改名 2021-12-06 14:38:17 +08:00
as2252258 b0ef09fd35 改名 2021-12-06 14:38:06 +08:00
as2252258 f7a2d6f30e 改名 2021-12-06 14:32:04 +08:00
as2252258 2950ba8fd5 改名 2021-12-06 14:24:41 +08:00
as2252258 2de5c82a73 改名 2021-12-06 14:22:08 +08:00
as2252258 758c4e7d5b 改名 2021-12-06 14:12:03 +08:00
as2252258 33f045aec7 改名 2021-12-06 13:49:01 +08:00
as2252258 35189de442 改名 2021-12-06 11:44:01 +08:00
as2252258 34e7fc0392 改名 2021-12-03 18:40:27 +08:00
as2252258 a3ce9f52ba 改名 2021-12-03 18:22:26 +08:00
as2252258 6e7da1b0ed 改名 2021-12-03 17:40:21 +08:00
as2252258 a6e0b5c1a2 改名 2021-12-03 16:24:44 +08:00
as2252258 13ab14f965 改名 2021-12-03 15:42:05 +08:00
as2252258 6729094f63 改名 2021-12-03 15:35:16 +08:00
as2252258 e1aeb17a5a 改名 2021-12-03 14:46:38 +08:00
as2252258 b9e20051ef 改名 2021-12-02 14:06:57 +08:00
as2252258 4ab6332176 改名 2021-12-01 19:05:10 +08:00
as2252258 abe2dad521 改名 2021-12-01 19:05:00 +08:00
as2252258 b0f70a13da 改名 2021-12-01 15:16:08 +08:00
as2252258 1e8aca91dd 改名 2021-12-01 14:08:09 +08:00
as2252258 b4ac5c4758 改名 2021-11-30 19:04:29 +08:00
as2252258 d161477957 改名 2021-11-30 19:04:16 +08:00
as2252258 a26b99dd1e 改名 2021-11-30 18:33:22 +08:00
as2252258 86e4a92ab0 改名 2021-11-30 18:31:41 +08:00
as2252258 ea425bb82d 改名 2021-11-30 18:30:15 +08:00
as2252258 ad0154d319 改名 2021-11-30 18:29:10 +08:00
as2252258 edb70d2b9b 改名 2021-11-30 18:26:23 +08:00
as2252258 9f3355cab4 改名 2021-11-30 18:23:56 +08:00
as2252258 4107b5bb07 改名 2021-11-30 15:48:18 +08:00
as2252258 048960c572 改名 2021-11-30 15:14:42 +08:00
as2252258 b826e1f594 改名 2021-11-30 15:10:01 +08:00
as2252258 e5b57cbcdb 改名 2021-11-30 14:59:51 +08:00
as2252258 2870a64792 改名 2021-11-30 14:32:56 +08:00
as2252258 4d1587bc8d 改名 2021-11-29 14:35:09 +08:00
as2252258 24b69507b2 改名 2021-11-29 11:44:03 +08:00
as2252258 8b45c90a04 1 2021-11-28 19:37:07 +08:00
as2252258 95ae1fe999 1 2021-11-27 17:58:17 +08:00
as2252258 9668830ee2 1 2021-11-27 17:45:39 +08:00
as2252258 f26539c41f 1 2021-11-27 17:43:29 +08:00
as2252258 3ead688d5f Merge remote-tracking branch 'origin/master' 2021-11-26 11:28:37 +08:00
as2252258 157c233ed6 改名 2021-11-26 11:27:55 +08:00
as2252258 40b4c2a4c9 1 2021-11-24 23:46:26 +08:00
as2252258 a7db58d7e4 改名 2021-11-24 17:07:35 +08:00
as2252258 87e4bfdbec 改名 2021-11-24 17:07:13 +08:00
as2252258 ee761817bf 1 2021-11-21 01:30:49 +08:00
as2252258 4a4b7db651 1 2021-11-20 02:33:53 +08:00
as2252258 905427bccc 1 2021-11-20 02:30:13 +08:00
as2252258 68ee0244a2 1 2021-11-20 02:27:25 +08:00
as2252258 7e43775b04 改名 2021-11-19 18:27:17 +08:00
as2252258 dd4e9be06a 改名 2021-11-19 18:25:54 +08:00
as2252258 73b01c288b 改名 2021-11-19 18:23:06 +08:00
as2252258 f4f48ebad7 改名 2021-11-19 18:21:59 +08:00
as2252258 ef95f912cb 改名 2021-11-19 18:19:02 +08:00
as2252258 8bbb6adcc7 改名 2021-11-19 18:15:05 +08:00
as2252258 a855765365 改名 2021-11-19 18:13:48 +08:00
as2252258 3110e69350 改名 2021-11-19 17:11:17 +08:00
as2252258 4862e7e913 改名 2021-11-19 14:49:22 +08:00
as2252258 0a52bd502b 改名 2021-11-19 12:28:08 +08:00
as2252258 95492e2863 改名 2021-11-19 11:25:50 +08:00
as2252258 3cc0a9bef2 改名 2021-11-19 11:25:06 +08:00
as2252258 d743382868 改名 2021-11-19 11:24:08 +08:00
as2252258 47f1407118 改名 2021-11-19 11:21:02 +08:00
as2252258 04395f293d 改名 2021-11-19 11:20:25 +08:00
as2252258 a44b7a31ef 改名 2021-11-19 11:19:46 +08:00
as2252258 493ef65ce8 改名 2021-11-19 11:15:40 +08:00
as2252258 3943142b86 改名 2021-11-19 11:13:32 +08:00
as2252258 786f96363b 改名 2021-11-19 11:11:40 +08:00
as2252258 bcf73a8cad 改名 2021-11-19 11:05:08 +08:00
as2252258 2b152504ec 改名 2021-11-19 11:03:55 +08:00
as2252258 e554ad3642 改名 2021-11-19 11:03:38 +08:00
as2252258 c801aec334 改名 2021-11-19 11:03:18 +08:00
as2252258 2c2c16819a 改名 2021-11-19 11:02:49 +08:00
as2252258 a48aa9a20f 改名 2021-11-19 11:02:31 +08:00
as2252258 8dadcbed16 改名 2021-11-19 11:02:08 +08:00
as2252258 86dd776388 改名 2021-11-19 11:00:10 +08:00
as2252258 d83d0871f5 改名 2021-11-19 10:59:53 +08:00
as2252258 fc6baa83a7 改名 2021-11-19 10:59:32 +08:00
as2252258 35dd2803fc 改名 2021-11-19 10:55:52 +08:00
as2252258 e3527752a7 改名 2021-11-19 10:54:30 +08:00
as2252258 340e0f1686 改名 2021-11-19 10:54:06 +08:00
as2252258 2ad6153405 改名 2021-11-19 10:41:17 +08:00
as2252258 0f172ae62d 改名 2021-11-19 10:40:49 +08:00
as2252258 f4596bf02c 改名 2021-11-19 10:37:12 +08:00
as2252258 ef4f84f696 改名 2021-11-19 10:36:55 +08:00
as2252258 08d19c9c05 改名 2021-11-19 10:36:33 +08:00
as2252258 e0537f2ee4 改名 2021-11-19 10:36:07 +08:00
as2252258 0edcf8c83f 改名 2021-11-19 10:31:43 +08:00
as2252258 6ac2c73a8c 改名 2021-11-19 10:31:26 +08:00
as2252258 b1a5db0a6b 改名 2021-11-19 10:29:46 +08:00
as2252258 8ec1a81ecd 改名 2021-11-19 10:20:49 +08:00
as2252258 b98de03317 改名 2021-11-19 10:12:53 +08:00
as2252258 251bca3d64 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	kiri-engine/FileListen/HotReload.php
2021-11-19 10:11:55 +08:00
as2252258 b2a79ef0ed 改名 2021-11-19 10:10:48 +08:00
as2252258 d9451f5087 1 2021-11-19 04:11:29 +08:00
as2252258 84d8dda8eb 1 2021-11-19 04:10:55 +08:00
as2252258 1d846a4903 1 2021-11-19 04:10:41 +08:00
as2252258 fe4f985315 1 2021-11-19 04:09:28 +08:00
as2252258 c5c1d991f2 1 2021-11-19 04:08:16 +08:00
as2252258 9ec6573ca4 1 2021-11-19 04:04:44 +08:00
as2252258 9800024d59 1 2021-11-19 04:04:36 +08:00
as2252258 57b2214433 1 2021-11-19 04:03:01 +08:00
as2252258 2f038e5637 1 2021-11-19 04:02:40 +08:00
as2252258 0f238f488d 1 2021-11-19 04:00:31 +08:00
as2252258 59243a6fed 1 2021-11-19 03:59:36 +08:00
as2252258 fbd7f874ac 1 2021-11-19 03:59:15 +08:00
as2252258 7aee3c8458 1 2021-11-19 03:59:04 +08:00
as2252258 f3446da34e 1 2021-11-19 03:57:24 +08:00
as2252258 755594b4bb 1 2021-11-19 03:54:31 +08:00
as2252258 abcf5e9feb 1 2021-11-19 03:53:57 +08:00
as2252258 f243e19b24 1 2021-11-19 03:52:44 +08:00
as2252258 5d91b61f83 1 2021-11-19 03:51:41 +08:00
as2252258 d3ed35e948 1 2021-11-19 03:50:47 +08:00
as2252258 c5bfe8110a 1 2021-11-19 03:48:54 +08:00
as2252258 1c18ee94ee 1 2021-11-19 03:48:16 +08:00
as2252258 f72c73766d 1 2021-11-19 03:46:29 +08:00
as2252258 092139c0b9 1 2021-11-19 03:46:10 +08:00
as2252258 43a1fad278 1 2021-11-19 03:45:18 +08:00
as2252258 dbc4cb15dd 1 2021-11-19 03:43:29 +08:00
as2252258 758bd650b5 1 2021-11-19 03:43:00 +08:00
as2252258 ba804c4d9c 1 2021-11-19 03:42:23 +08:00
as2252258 cac794ca20 1 2021-11-19 03:37:57 +08:00
as2252258 ea09d3e3ba 1 2021-11-19 03:36:35 +08:00
as2252258 f6552c45ae 1 2021-11-19 03:27:30 +08:00
as2252258 114f5d0279 1 2021-11-19 03:27:07 +08:00
as2252258 5638d171d0 1 2021-11-19 03:24:09 +08:00
as2252258 fa78d360b0 1 2021-11-19 03:21:21 +08:00
as2252258 ffc35090b9 1 2021-11-19 03:03:15 +08:00
as2252258 5156a606e0 1 2021-11-19 03:03:00 +08:00
as2252258 2393ef820f 1 2021-11-19 03:01:17 +08:00
as2252258 9986900b58 1 2021-11-19 02:56:34 +08:00
as2252258 07c52ef08f 1 2021-11-19 02:55:34 +08:00
as2252258 0a6fdda720 1 2021-11-19 02:54:05 +08:00
as2252258 841a6b4a19 1 2021-11-19 02:50:39 +08:00
as2252258 873da66a90 1 2021-11-19 02:20:04 +08:00
as2252258 be9f4281e6 改名 2021-11-18 19:01:11 +08:00
as2252258 57be085166 改名 2021-11-18 18:41:37 +08:00
as2252258 454c77f37a 改名 2021-11-18 17:59:46 +08:00
as2252258 323a4b8ff0 改名 2021-11-18 17:58:46 +08:00
as2252258 c66e5120e1 改名 2021-11-18 17:55:52 +08:00
as2252258 1fa7d3a3ba 改名 2021-11-18 17:50:05 +08:00
as2252258 a290108ddd 改名 2021-11-18 16:44:55 +08:00
as2252258 446fd740f2 改名 2021-11-18 16:42:24 +08:00
as2252258 a040099b99 改名 2021-11-18 16:38:55 +08:00
as2252258 78fdc7c1ca 改名 2021-11-18 16:38:43 +08:00
as2252258 dfc249b56c 改名 2021-11-18 16:31:41 +08:00
as2252258 577be309cc 改名 2021-11-18 16:30:34 +08:00
as2252258 9798be99e6 改名 2021-11-18 15:57:38 +08:00
as2252258 e3348a11c8 改名 2021-11-18 15:37:11 +08:00
as2252258 1643a839b3 改名 2021-11-18 11:37:13 +08:00
as2252258 d4a15d26ed 改名 2021-11-17 16:43:55 +08:00
as2252258 485d926dc0 改名 2021-11-17 16:39:12 +08:00
as2252258 6a5205e9a1 1 2021-11-11 02:22:14 +08:00
as2252258 471f7a92bb 1 2021-11-11 01:32:04 +08:00
as2252258 429ffe561c 改名 2021-11-08 11:12:53 +08:00
as2252258 27cdf5082f 改名 2021-11-08 11:10:58 +08:00
as2252258 4c3751ca4d 1 2021-11-07 03:18:27 +08:00
as2252258 5f1eaf8239 改名 2021-11-05 18:54:04 +08:00
as2252258 8b76ef8e41 改名 2021-11-05 14:45:24 +08:00
as2252258 981a800053 改名 2021-11-05 14:44:10 +08:00
as2252258 79544f1ad1 改名 2021-11-05 14:38:11 +08:00
as2252258 93bd3d3f69 改名 2021-11-05 14:35:16 +08:00
as2252258 975f6f85a2 改名 2021-11-05 14:27:13 +08:00
as2252258 5a99181eaf 改名 2021-11-05 14:25:32 +08:00
as2252258 da5d74f519 改名 2021-11-05 14:24:49 +08:00
as2252258 c878ed0ba4 改名 2021-11-05 14:22:57 +08:00
as2252258 e7e24a1488 改名 2021-11-05 11:30:32 +08:00
as2252258 3dba884f64 改名 2021-11-05 11:07:06 +08:00
as2252258 4b30a59f6a 改名 2021-11-05 11:04:45 +08:00
as2252258 704c0808ea 改名 2021-11-05 11:04:24 +08:00
as2252258 e738b084b4 改名 2021-11-05 11:03:00 +08:00
as2252258 77aa761e82 改名 2021-11-05 11:01:42 +08:00
as2252258 49ac53e751 改名 2021-11-05 10:58:34 +08:00
as2252258 2c0a431069 111 2021-11-05 01:24:08 +08:00
as2252258 61893335ae 111 2021-11-05 01:23:41 +08:00
as2252258 f87ddff585 111 2021-11-05 01:23:22 +08:00
as2252258 edcd873ff3 111 2021-11-05 01:22:16 +08:00
as2252258 3ac7720f5b 111 2021-11-05 01:21:47 +08:00
as2252258 a1fc45c3d7 111 2021-11-05 01:19:31 +08:00
as2252258 ac01000524 111 2021-11-05 01:16:22 +08:00
as2252258 0a313e2b99 111 2021-11-05 01:14:47 +08:00
as2252258 18b77760cd 111 2021-11-05 01:14:27 +08:00
as2252258 65a874c155 111 2021-11-05 01:14:01 +08:00
as2252258 1bf851ff6b 111 2021-11-05 01:13:02 +08:00
as2252258 3309b101b6 111 2021-11-05 01:12:45 +08:00
as2252258 27d8caec00 111 2021-11-05 01:12:36 +08:00
as2252258 0cb14bd24b 111 2021-11-05 01:11:50 +08:00
as2252258 133455a041 111 2021-11-05 01:11:32 +08:00
as2252258 9c5ba4b3e9 111 2021-11-05 01:10:58 +08:00
as2252258 6db849de8d 111 2021-11-05 01:10:42 +08:00
as2252258 5506b3e725 111 2021-11-05 01:09:59 +08:00
as2252258 d1ccbbb5e0 111 2021-11-05 01:09:20 +08:00
as2252258 c8c95d9dc9 111 2021-11-05 01:08:40 +08:00
as2252258 7d0ce48cd0 111 2021-11-05 01:07:43 +08:00
as2252258 c66b76d0be 111 2021-11-05 01:07:23 +08:00
as2252258 febc53147e 111 2021-11-05 01:05:26 +08:00
as2252258 c6279d6214 111 2021-11-05 01:05:01 +08:00
as2252258 8deea95fb8 111 2021-11-05 01:01:13 +08:00
as2252258 2512044bc5 111 2021-11-05 00:59:38 +08:00
as2252258 3a1a124db3 111 2021-11-05 00:58:03 +08:00
as2252258 d2df0cbc1a 111 2021-11-05 00:57:34 +08:00
as2252258 15b6ac1b79 111 2021-11-05 00:55:20 +08:00
as2252258 8fb60fcd76 111 2021-11-05 00:54:37 +08:00
as2252258 c8149e3754 111 2021-11-05 00:41:25 +08:00
as2252258 f49af928b6 111 2021-11-05 00:40:53 +08:00
as2252258 63aadcb31f 111 2021-11-05 00:39:53 +08:00
as2252258 5f1fd4d93c 111 2021-11-05 00:38:51 +08:00
as2252258 84e8d26371 111 2021-11-05 00:38:26 +08:00
as2252258 85fc29e76c 111 2021-11-05 00:36:55 +08:00
as2252258 ad568fa3a7 111 2021-11-05 00:36:34 +08:00
as2252258 ea8d4d9611 111 2021-11-05 00:34:12 +08:00
as2252258 d3e74965f9 111 2021-11-05 00:33:15 +08:00
as2252258 389c376c43 111 2021-11-05 00:32:52 +08:00
as2252258 81eeaa64e4 111 2021-11-05 00:25:47 +08:00
as2252258 fbad6d9938 111 2021-11-05 00:24:08 +08:00
as2252258 825539c792 111 2021-11-05 00:23:31 +08:00
as2252258 c73fe2d609 111 2021-11-05 00:21:42 +08:00
as2252258 ac66f768c3 111 2021-11-05 00:20:30 +08:00
as2252258 84e2998139 111 2021-11-05 00:14:54 +08:00
as2252258 19cab4f333 111 2021-11-05 00:13:52 +08:00
as2252258 7d8c50aed8 111 2021-11-05 00:12:13 +08:00
as2252258 8d98dc83be 111 2021-11-05 00:08:43 +08:00
as2252258 3adea33afe 111 2021-11-05 00:06:41 +08:00
as2252258 55250de396 111 2021-11-05 00:03:16 +08:00
as2252258 5fffe53022 111 2021-11-05 00:02:43 +08:00
as2252258 7a0ff2fbc5 111 2021-11-04 23:52:12 +08:00
as2252258 4f539f4e78 111 2021-11-04 23:50:26 +08:00
as2252258 9af827a11e 111 2021-11-04 23:49:35 +08:00
as2252258 3ddec68d7f 111 2021-11-04 23:48:53 +08:00
as2252258 a5519b927b 111 2021-11-04 23:46:44 +08:00
as2252258 8add22f589 111 2021-11-04 23:44:47 +08:00
as2252258 54f60e8765 111 2021-11-04 23:41:15 +08:00
as2252258 6a60b03678 111 2021-11-04 23:39:40 +08:00
as2252258 878e3b262b 111 2021-11-04 23:12:57 +08:00
as2252258 a3ad2a6f17 改名 2021-11-04 19:01:09 +08:00
as2252258 79b32df2d5 改名 2021-11-04 19:00:53 +08:00
as2252258 f40b79bb08 改名 2021-11-04 18:58:10 +08:00
as2252258 ee380aa520 改名 2021-11-04 18:57:49 +08:00
as2252258 dbf91656cb 改名 2021-11-04 18:57:13 +08:00
as2252258 52845dfdb8 改名 2021-11-04 18:56:54 +08:00
as2252258 78c187e49f 改名 2021-11-04 18:53:58 +08:00
as2252258 fe105bd7d2 改名 2021-11-04 18:53:31 +08:00
as2252258 021e9ea23a 改名 2021-11-04 18:47:32 +08:00
as2252258 794165fa67 改名 2021-11-04 18:47:23 +08:00
as2252258 6ef0f8b412 改名 2021-11-04 18:46:57 +08:00
as2252258 fcb8630095 改名 2021-11-04 18:43:19 +08:00
as2252258 ceafc139db 改名 2021-11-04 18:42:58 +08:00
as2252258 283c7c2371 改名 2021-11-04 18:42:26 +08:00
as2252258 0b170cafb2 改名 2021-11-04 18:42:05 +08:00
as2252258 d036f730ca 改名 2021-11-04 18:39:35 +08:00
as2252258 55727bb219 改名 2021-11-04 18:38:06 +08:00
as2252258 dc477978d3 改名 2021-11-04 18:37:31 +08:00
as2252258 7dda29a892 改名 2021-11-04 18:37:01 +08:00
as2252258 567cac606a 改名 2021-11-04 18:36:38 +08:00
as2252258 49d435e4a5 改名 2021-11-04 18:36:17 +08:00
as2252258 5303c05274 改名 2021-11-04 18:34:19 +08:00
as2252258 f6cb258259 改名 2021-11-04 18:33:57 +08:00
as2252258 affb161ddf 改名 2021-11-04 18:29:52 +08:00
as2252258 a80f671a22 改名 2021-11-04 18:29:29 +08:00
as2252258 497cd95731 改名 2021-11-04 18:27:41 +08:00
as2252258 3ae85beb16 改名 2021-11-04 18:25:03 +08:00
as2252258 0a76e991b9 改名 2021-11-04 18:24:42 +08:00
as2252258 bfc591b10a 改名 2021-11-04 18:23:58 +08:00
as2252258 b274140708 改名 2021-11-04 18:23:24 +08:00
as2252258 a4a9a5618d 改名 2021-11-04 18:22:42 +08:00
as2252258 0cf17a547e 改名 2021-11-04 18:21:29 +08:00
as2252258 35ea526420 改名 2021-11-04 18:16:34 +08:00
as2252258 8ba04b4ccc 改名 2021-11-04 18:15:56 +08:00
as2252258 b83a0c4c96 改名 2021-11-04 18:09:13 +08:00
as2252258 21d3738125 改名 2021-11-04 18:06:45 +08:00
as2252258 2bd18b014d 改名 2021-11-04 18:06:10 +08:00
as2252258 39be8f4b3b 改名 2021-11-04 18:03:24 +08:00
as2252258 043b62688b 改名 2021-11-04 18:02:33 +08:00
as2252258 38f5f57c4d 改名 2021-11-04 17:59:04 +08:00
as2252258 2c7a755663 改名 2021-11-04 17:58:56 +08:00
as2252258 187b4311eb 改名 2021-11-04 17:56:39 +08:00
as2252258 7d2c2cf7ff 改名 2021-11-04 17:48:27 +08:00
as2252258 3771a8fb22 改名 2021-11-04 17:47:50 +08:00
as2252258 7561bacda5 改名 2021-11-04 17:46:44 +08:00
as2252258 c7d6032010 改名 2021-11-04 17:45:53 +08:00
as2252258 48d9c5ce79 改名 2021-11-04 17:40:11 +08:00
as2252258 b9d2288ac7 改名 2021-11-04 17:38:37 +08:00
as2252258 13877c6d58 改名 2021-11-04 17:37:38 +08:00
as2252258 320a01d822 改名 2021-11-04 17:34:20 +08:00
as2252258 a435df8453 改名 2021-11-04 17:33:41 +08:00
as2252258 a7024843d3 改名 2021-11-04 16:45:40 +08:00
as2252258 92a35d8e4f 改名 2021-11-04 16:37:27 +08:00
as2252258 b8ad6be979 改名 2021-11-04 16:36:24 +08:00
as2252258 67688043d2 改名 2021-11-04 16:33:59 +08:00
as2252258 3813ebf44e 改名 2021-11-04 16:31:54 +08:00
as2252258 61728b4a6f 改名 2021-11-04 16:30:48 +08:00
as2252258 56c8befe83 改名 2021-11-04 16:19:56 +08:00
as2252258 49b38a859c 改名 2021-11-04 16:18:02 +08:00
as2252258 c0f404c497 改名 2021-11-03 18:04:03 +08:00
as2252258 86a239082e 改名 2021-11-03 16:29:47 +08:00
as2252258 2321baaa57 改名 2021-11-03 16:28:08 +08:00
as2252258 b969c86f7c e 2021-11-03 16:06:33 +08:00
as2252258 2add330382 改名 2021-11-03 15:19:08 +08:00
as2252258 383a2d8817 改名 2021-11-03 14:56:20 +08:00
as2252258 dc9e00add2 改名 2021-11-03 14:54:17 +08:00
as2252258 3169505e07 改名 2021-11-03 14:48:26 +08:00
as2252258 64f106b631 改名 2021-11-03 10:58:44 +08:00
as2252258 c7b9e5af31 改名 2021-11-03 10:57:40 +08:00
as2252258 b65abedede 改名 2021-11-01 17:12:47 +08:00
as2252258 6ee19ec336 改名 2021-10-29 18:51:14 +08:00
as2252258 c87a9b4732 改名 2021-10-29 18:50:53 +08:00
as2252258 340c67b4ac 改名 2021-10-29 18:25:12 +08:00
as2252258 c084b4b03c 改名 2021-10-29 17:19:57 +08:00
as2252258 cb91aca7af 改名 2021-10-29 14:26:51 +08:00
as2252258 f0b9d7a37b 改名 2021-10-29 14:10:53 +08:00
as2252258 df2d887d97 改名 2021-10-28 18:46:14 +08:00
as2252258 87f2825cf3 改名 2021-10-28 17:31:19 +08:00
as2252258 22b99ebc2d 改名 2021-10-28 17:13:55 +08:00
as2252258 9269a1a23e 改名 2021-10-28 17:11:20 +08:00
as2252258 b68fc5de60 改名 2021-10-28 17:09:32 +08:00
as2252258 a3f591a556 改名 2021-10-28 17:05:48 +08:00
as2252258 b764cc64aa 改名 2021-10-28 16:58:15 +08:00
as2252258 0da9dac2b8 改名 2021-10-28 16:35:52 +08:00
as2252258 14a6cb47ab 改名 2021-10-28 16:33:19 +08:00
as2252258 fb20f64513 改名 2021-10-28 16:07:48 +08:00
as2252258 905c25fd10 改名 2021-10-28 15:41:31 +08:00
as2252258 ce92f7dc7b 改名 2021-10-28 15:39:35 +08:00
as2252258 ab451a27b3 改名 2021-10-28 14:02:25 +08:00
as2252258 a55f6fc064 改名 2021-10-28 11:33:25 +08:00
as2252258 7b48d7600e 改名 2021-10-28 11:32:29 +08:00
as2252258 a69c22fc24 改名 2021-10-28 11:32:18 +08:00
as2252258 42d32242b6 改名 2021-10-28 11:26:58 +08:00
as2252258 031b576e24 改名 2021-10-28 11:21:56 +08:00
as2252258 49b1649d18 改名 2021-10-28 11:09:14 +08:00
as2252258 354ab20f08 改名 2021-10-28 10:52:10 +08:00
as2252258 ddbf5c65a3 改名 2021-10-26 11:40:16 +08:00
as2252258 4961b38a8a 改名 2021-10-26 11:39:18 +08:00
as2252258 4b861eaa56 改名 2021-10-26 11:22:18 +08:00
as2252258 2886627dc2 改名 2021-10-26 11:20:58 +08:00
as2252258 d1c60633a9 改名 2021-10-26 10:59:01 +08:00
as2252258 80be5cd036 改名 2021-10-26 10:56:16 +08:00
as2252258 4cd297bf87 改名 2021-10-26 10:56:03 +08:00
as2252258 13fc554930 改名 2021-10-26 10:45:44 +08:00
as2252258 0d624f8a1f 改名 2021-10-26 10:41:11 +08:00
as2252258 90b22a14e0 改名 2021-10-26 10:35:41 +08:00
as2252258 fdd5608367 改名 2021-10-26 10:32:52 +08:00
as2252258 86eeceda74 改名 2021-10-26 10:29:46 +08:00
as2252258 8a45ffac0e 改名 2021-10-26 10:25:36 +08:00
as2252258 3d92d3b07f 改名 2021-10-26 10:22:56 +08:00
as2252258 f4b9d57358 改名 2021-10-26 10:21:54 +08:00
as2252258 1a1b2967f4 改名 2021-10-26 10:21:19 +08:00
as2252258 e2f3be3ead 改名 2021-10-25 18:45:36 +08:00
as2252258 fc6c1ae499 改名 2021-10-25 18:42:06 +08:00
as2252258 e0f548a021 改名 2021-10-25 18:39:30 +08:00
as2252258 4be5809230 改名 2021-10-25 18:27:28 +08:00
as2252258 a9d106a1cf 改名 2021-10-25 18:25:14 +08:00
as2252258 6605aae410 改名 2021-10-25 18:20:29 +08:00
as2252258 7cf1d24b43 改名 2021-10-25 16:41:15 +08:00
as2252258 5a71c664f6 改名 2021-10-25 15:08:18 +08:00
as2252258 a98807c378 改名 2021-10-20 16:54:32 +08:00
as2252258 a2f0430b94 改名 2021-10-20 16:50:05 +08:00
as2252258 b4d0c95a80 改名 2021-10-20 14:42:20 +08:00
as2252258 2d968c3623 改名 2021-10-19 17:32:26 +08:00
as2252258 365cbb0148 改名 2021-10-19 17:10:12 +08:00
as2252258 9402b4e4a1 改名 2021-10-19 17:09:08 +08:00
as2252258 a5a017fcd3 改名 2021-10-19 17:04:47 +08:00
as2252258 b28e7b7f0d 改名 2021-10-19 16:56:39 +08:00
as2252258 653bc21c6a 改名 2021-10-19 16:41:26 +08:00
as2252258 8ccb05276c 改名 2021-10-19 16:40:58 +08:00
as2252258 dacf0d2b11 改名 2021-10-19 16:40:17 +08:00
as2252258 e3ac65cb0e 改名 2021-10-19 16:38:16 +08:00
as2252258 74fda80847 改名 2021-10-19 16:37:30 +08:00
as2252258 0893aa8f04 改名 2021-10-19 16:36:31 +08:00
as2252258 f76749fa48 改名 2021-10-19 16:23:55 +08:00
as2252258 6c3ead0a16 改名 2021-10-19 15:59:36 +08:00
as2252258 83daee274b 改名 2021-10-19 15:55:45 +08:00
as2252258 d73ea377d1 改名 2021-10-19 15:25:40 +08:00
as2252258 95b4a3e80b 改名 2021-10-19 15:07:02 +08:00
as2252258 ea5b473638 改名 2021-10-18 11:35:13 +08:00
as2252258 47be3285c5 改名 2021-09-29 17:32:56 +08:00
as2252258 db56419dbc 改名 2021-09-29 17:07:55 +08:00
as2252258 cab39ce4a1 改名 2021-09-29 16:32:16 +08:00
as2252258 b32ae6ff0c 改名 2021-09-29 16:06:16 +08:00
as2252258 3f03bb0e8b 改名 2021-09-29 16:04:00 +08:00
as2252258 170cd1455f 改名 2021-09-29 16:01:36 +08:00
as2252258 666e529b6e 改名 2021-09-29 16:00:29 +08:00
as2252258 d0505e3c96 改名 2021-09-29 15:59:16 +08:00
as2252258 42abe70f99 改名 2021-09-29 15:41:13 +08:00
as2252258 be4cb23bb9 改名 2021-09-29 13:54:13 +08:00
as2252258 e1c3c72bc9 改名 2021-09-29 11:50:45 +08:00
as2252258 6eb00a2c29 改名 2021-09-29 11:50:26 +08:00
as2252258 4c84cba83a 改名 2021-09-29 11:44:51 +08:00
as2252258 1ab94221e7 改名 2021-09-29 11:41:13 +08:00
as2252258 e024031214 改名 2021-09-29 11:39:24 +08:00
as2252258 e29659c930 改名 2021-09-29 11:19:24 +08:00
as2252258 6a954eae08 改名 2021-09-29 11:16:39 +08:00
as2252258 feafa476b1 改名 2021-09-29 11:03:49 +08:00
as2252258 7a49773881 改名 2021-09-29 11:02:01 +08:00
as2252258 1660a94941 改名 2021-09-29 10:59:55 +08:00
as2252258 3db192ce0b 改名 2021-09-29 10:54:54 +08:00
as2252258 a5477daf45 改名 2021-09-29 10:51:52 +08:00
as2252258 4944fc8ebd 改名 2021-09-29 10:49:47 +08:00
as2252258 6c396454da 改名 2021-09-29 10:44:14 +08:00
as2252258 2cd1739658 改名 2021-09-29 10:33:37 +08:00
as2252258 b9ad4ef289 改名 2021-09-29 10:32:07 +08:00
as2252258 e1963fafcd 改名 2021-09-29 10:30:36 +08:00
as2252258 089117ca85 改名 2021-09-29 10:29:31 +08:00
as2252258 509f7eb89c 改名 2021-09-29 10:27:42 +08:00
as2252258 1481025d48 改名 2021-09-29 10:26:35 +08:00
as2252258 4a5e21cc49 改名 2021-09-29 10:23:22 +08:00
as2252258 36747901ab 改名 2021-09-28 18:54:07 +08:00
as2252258 640d12269d 改名 2021-09-27 16:29:07 +08:00
as2252258 fece59aa14 改名 2021-09-27 16:22:07 +08:00
as2252258 431e72421c 改名 2021-09-27 16:17:02 +08:00
as2252258 f2a6975754 改名 2021-09-26 16:06:01 +08:00
as2252258 1f6dd0fd45 改名 2021-09-26 16:05:34 +08:00
as2252258 788cb631e0 改名 2021-09-26 16:03:55 +08:00
as2252258 5ec3916ff1 改名 2021-09-26 15:56:19 +08:00
as2252258 2a3338a41e 改名 2021-09-26 15:30:29 +08:00
as2252258@163.com e65ca9c03d 111 2021-09-26 00:37:38 +08:00
as2252258@163.com dcd2c9a7b4 111 2021-09-26 00:37:20 +08:00
as2252258@163.com 4f47a209c2 111 2021-09-26 00:33:12 +08:00
as2252258@163.com 544e36b75c 111 2021-09-26 00:29:35 +08:00
as2252258@163.com b2e70d20cc 111 2021-09-26 00:29:00 +08:00
as2252258@163.com 021d535d6c 111 2021-09-26 00:27:43 +08:00
as2252258@163.com b8b3221d51 111 2021-09-26 00:26:58 +08:00
as2252258@163.com 477de51126 111 2021-09-26 00:25:29 +08:00
as2252258@163.com 4ecb6187fa 111 2021-09-26 00:14:38 +08:00
as2252258@163.com c800679ed2 111 2021-09-26 00:09:52 +08:00
as2252258@163.com 94d37ad056 111 2021-09-26 00:09:14 +08:00
as2252258@163.com 5677cbe254 111 2021-09-26 00:08:33 +08:00
as2252258@163.com 9b240f7b45 111 2021-09-26 00:02:02 +08:00
as2252258 ad6f85734b 改名 2021-09-24 19:01:02 +08:00
as2252258 d2342d53da 改名 2021-09-24 18:59:43 +08:00
as2252258 f724d14b31 改名 2021-09-24 18:54:03 +08:00
as2252258 fce833ddde 改名 2021-09-24 18:53:14 +08:00
as2252258 bfd9f07780 改名 2021-09-24 18:46:25 +08:00
as2252258 5f2fab79e2 改名 2021-09-24 18:42:30 +08:00
as2252258 e5efe8eb84 改名 2021-09-24 18:39:46 +08:00
as2252258 b153ea4aaa 改名 2021-09-24 18:32:14 +08:00
as2252258 49f2d624ba 改名 2021-09-24 18:24:46 +08:00
as2252258 bc16f47f4f 改名 2021-09-24 18:18:15 +08:00
as2252258 e11779c1f9 改名 2021-09-24 18:17:38 +08:00
as2252258 ed44026f12 改名 2021-09-24 18:16:39 +08:00
as2252258 0f988a4c3b 改名 2021-09-24 18:14:38 +08:00
as2252258 e9bbff5f20 改名 2021-09-24 18:08:57 +08:00
as2252258 a0c5e3a82d 改名 2021-09-24 18:08:40 +08:00
as2252258 7626d413ec 改名 2021-09-24 18:06:49 +08:00
as2252258 dbbdb94bb1 改名 2021-09-24 18:00:55 +08:00
as2252258 13c4e7eca4 改名 2021-09-24 17:59:30 +08:00
as2252258 b8fe0413ed 改名 2021-09-24 17:58:02 +08:00
as2252258 152600f985 改名 2021-09-24 17:56:05 +08:00
as2252258 47a1b8d191 改名 2021-09-24 17:54:56 +08:00
as2252258 d7dd082f8e 改名 2021-09-24 17:50:31 +08:00
as2252258 d55efb4f00 改名 2021-09-24 17:49:43 +08:00
as2252258 7dbadf32e9 改名 2021-09-24 17:46:20 +08:00
as2252258 ab6ee6e95e 改名 2021-09-24 17:40:52 +08:00
as2252258 8a0858fbd7 改名 2021-09-24 17:27:25 +08:00
as2252258 dbc30827f8 改名 2021-09-24 17:22:02 +08:00
as2252258 0aafbb03e2 改名 2021-09-24 13:47:34 +08:00
as2252258 323f37b744 改名 2021-09-24 10:17:40 +08:00
as2252258@163.com ac63427a51 111 2021-09-24 02:28:06 +08:00
as2252258@163.com 3d9bea7fb6 111 2021-09-24 02:23:24 +08:00
as2252258@163.com b9a1178fbe 111 2021-09-24 02:04:36 +08:00
as2252258 318fe08eb5 改名 2021-09-23 10:37:39 +08:00
as2252258@163.com 42edba6bc6 111 2021-09-23 01:07:56 +08:00
as2252258@163.com 3b2654013b 111 2021-09-23 01:06:59 +08:00
as2252258@163.com ea6e1310f2 111 2021-09-23 01:04:15 +08:00
as2252258@163.com 6ea90dd62f 111 2021-09-23 01:03:36 +08:00
as2252258@163.com 51719203ed 111 2021-09-23 00:56:59 +08:00
as2252258@163.com e97d79fe03 111 2021-09-23 00:54:37 +08:00
as2252258 62811200d8 改名 2021-09-22 18:17:54 +08:00
as2252258 ea201f3b86 改名 2021-09-22 18:16:35 +08:00
as2252258 9e50cad232 改名 2021-09-22 11:48:45 +08:00
as2252258 e3bf41c7c5 改名 2021-09-22 11:36:29 +08:00
as2252258 07e919a2d5 改名 2021-09-22 10:17:03 +08:00
as2252258@163.com a171b3d081 111 2021-09-21 02:55:15 +08:00
as2252258@163.com 0e2b578b6b 111 2021-09-21 02:51:09 +08:00
as2252258@163.com 3e10de58ed 111 2021-09-21 02:50:38 +08:00
as2252258@163.com 1825a677b8 111 2021-09-21 02:48:17 +08:00
as2252258@163.com 907942b01a 111 2021-09-21 02:46:21 +08:00
as2252258@163.com 0c4af841dd 111 2021-09-21 02:05:47 +08:00
as2252258@163.com 1bd3936db0 111 2021-09-21 01:10:16 +08:00
as2252258@163.com 1ba07aeb5f 111 2021-09-21 00:50:15 +08:00
as2252258@163.com cfbed0396e 111 2021-09-21 00:49:10 +08:00
as2252258@163.com b9e0493980 111 2021-09-21 00:45:30 +08:00
as2252258@163.com 404b367cc2 111 2021-09-21 00:43:45 +08:00
as2252258@163.com 4830ada35d 111 2021-09-20 17:10:52 +08:00
as2252258@163.com e6cf4ec493 111 2021-09-20 17:07:04 +08:00
as2252258@163.com 3f3556070d 111 2021-09-20 04:52:57 +08:00
as2252258@163.com 265825ae84 111 2021-09-20 03:37:39 +08:00
as2252258@163.com e19aa6843e 111 2021-09-20 03:29:00 +08:00
as2252258@163.com 259507567a 111 2021-09-20 03:20:10 +08:00
as2252258@163.com 3039df31c2 111 2021-09-20 03:14:08 +08:00
as2252258@163.com ca554c4f5f 111 2021-09-20 03:09:00 +08:00
as2252258@163.com 621179c7d6 111 2021-09-20 02:58:23 +08:00
as2252258@163.com 1ae7eb3d78 111 2021-09-20 01:28:47 +08:00
as2252258@163.com 270283dff0 111 2021-09-20 01:25:11 +08:00
as2252258@163.com da71345f1e 111 2021-09-20 01:24:32 +08:00
as2252258@163.com 3a596f34f8 111 2021-09-20 01:21:18 +08:00
as2252258@163.com 557bda6115 111 2021-09-20 01:20:07 +08:00
as2252258@163.com 13272ace8c 111 2021-09-20 00:56:10 +08:00
as2252258@163.com cac822603b 111 2021-09-20 00:55:23 +08:00
as2252258@163.com 6dd2be22a2 111 2021-09-20 00:54:58 +08:00
as2252258@163.com 8734941ba6 111 2021-09-20 00:52:44 +08:00
as2252258@163.com 37aa5519ac 111 2021-09-19 16:48:14 +08:00
as2252258@163.com d4d9f4e634 111 2021-09-19 16:44:27 +08:00
as2252258@163.com ff58d0faef 111 2021-09-19 16:42:29 +08:00
as2252258 d77f5b16c3 改名 2021-09-18 18:03:47 +08:00
as2252258 8b943076a1 改名 2021-09-18 17:23:30 +08:00
as2252258 a6b95adc9b 改名 2021-09-18 17:10:13 +08:00
as2252258 f880ebc4e4 改名 2021-09-18 17:07:52 +08:00
as2252258 4fee7253de 改名 2021-09-18 17:05:27 +08:00
as2252258 e0a30eea69 改名 2021-09-18 17:02:03 +08:00
as2252258 c2dccc68b9 改名 2021-09-18 17:00:21 +08:00
as2252258 d8685786c6 改名 2021-09-18 16:56:13 +08:00
as2252258 8f3b856bd6 改名 2021-09-18 16:54:39 +08:00
as2252258 a6f056b8c8 改名 2021-09-18 13:45:33 +08:00
as2252258 c5afc4647e 改名 2021-09-18 11:46:12 +08:00
as2252258 9249ad3039 改名 2021-09-18 11:45:41 +08:00
as2252258 badfcf5c06 改名 2021-09-18 11:45:03 +08:00
as2252258 454b99a360 改名 2021-09-18 11:44:42 +08:00
as2252258 12ecfecf3e 改名 2021-09-18 11:39:28 +08:00
as2252258 9e790feeae 改名 2021-09-18 11:28:56 +08:00
as2252258 b059bb2d1a 改名 2021-09-18 11:23:10 +08:00
as2252258 1e2770a94a 改名 2021-09-18 11:21:45 +08:00
as2252258 7beef23040 改名 2021-09-18 11:20:58 +08:00
as2252258 3389d234d5 改名 2021-09-18 11:19:14 +08:00
as2252258 2f465109fb 改名 2021-09-18 11:17:22 +08:00
as2252258 f6f985d833 改名 2021-09-18 11:16:20 +08:00
as2252258 b7f69bed7e 改名 2021-09-18 11:13:29 +08:00
as2252258 640999e627 改名 2021-09-18 11:11:35 +08:00
as2252258 a5f506b463 改名 2021-09-18 11:09:15 +08:00
as2252258 37a341dd1b 改名 2021-09-18 11:03:45 +08:00
as2252258 5f4af41551 改名 2021-09-18 10:54:46 +08:00
as2252258 0b172ed567 改名 2021-09-18 10:52:46 +08:00
as2252258 c2243b780c 改名 2021-09-18 10:51:58 +08:00
as2252258 6ffebb0950 改名 2021-09-18 10:50:59 +08:00
as2252258 e71d8e94d7 改名 2021-09-18 10:49:23 +08:00
as2252258 1956cc64ae 改名 2021-09-18 10:48:25 +08:00
as2252258 13fadb5ffc 改名 2021-09-18 10:43:49 +08:00
as2252258 77a3819272 改名 2021-09-18 10:42:34 +08:00
as2252258 bdad67cf6c 改名 2021-09-18 10:41:59 +08:00
as2252258 002b3a59ec 改名 2021-09-18 10:40:57 +08:00
as2252258 1f34eb6675 改名 2021-09-18 10:38:38 +08:00
as2252258@163.com d0e9f834d4 111 2021-09-18 01:37:49 +08:00
as2252258 1aabda2074 改名 2021-09-17 18:55:08 +08:00
as2252258 fc41341e3b 改名 2021-09-17 18:54:42 +08:00
as2252258 41a6158fd0 改名 2021-09-16 14:53:36 +08:00
as2252258 8c5b6f674c 改名 2021-09-16 14:48:54 +08:00
as2252258 e0b72c4f74 改名 2021-09-16 14:45:59 +08:00
as2252258 7e7239be87 改名 2021-09-16 14:40:25 +08:00
as2252258 9bdb01799b 改名 2021-09-16 14:26:18 +08:00
as2252258 7d31929283 改名 2021-09-16 14:20:10 +08:00
as2252258 ad6aa3e7b5 改名 2021-09-16 14:19:05 +08:00
as2252258 b94efaa63a 改名 2021-09-16 14:07:17 +08:00
as2252258 8c5d10dc3e 改名 2021-09-16 14:04:14 +08:00
as2252258 364e937aa4 改名 2021-09-16 11:53:32 +08:00
as2252258 f738099c66 改名 2021-09-16 11:51:20 +08:00
as2252258@163.com f5aeab0daf 111 2021-09-12 04:18:31 +08:00
as2252258@163.com 532f517109 111 2021-09-12 04:17:19 +08:00
as2252258@163.com bb077b5467 111 2021-09-12 03:53:54 +08:00
as2252258@163.com dd71782fcd 111 2021-09-12 03:52:16 +08:00
as2252258@163.com b91199671a 111 2021-09-12 03:46:24 +08:00
as2252258@163.com 989158bc3d 111 2021-09-12 01:16:20 +08:00
as2252258 cde1704866 改名 2021-09-10 18:04:57 +08:00
as2252258 5b33d09da0 改名 2021-09-10 17:49:44 +08:00
as2252258 f3827a1a83 改名 2021-09-10 16:04:51 +08:00
as2252258 d682b72735 改名 2021-09-10 14:23:52 +08:00
as2252258 1fc596fd1e 改名 2021-09-10 14:22:54 +08:00
as2252258 90b75a008c 改名 2021-09-10 14:22:42 +08:00
as2252258 c3d95eed7d 改名 2021-09-10 14:21:47 +08:00
as2252258 87dd1bafa7 改名 2021-09-10 14:18:52 +08:00
as2252258 74ac9cff0c 改名 2021-09-10 14:09:38 +08:00
as2252258 af83bfda42 改名 2021-09-10 14:08:25 +08:00
as2252258 5c1ceb7e97 改名 2021-09-10 14:07:19 +08:00
as2252258 af88f79f02 改名 2021-09-10 14:06:38 +08:00
as2252258 4feecd49f4 改名 2021-09-10 14:03:01 +08:00
as2252258 c7ac95c807 改名 2021-09-10 14:01:38 +08:00
as2252258 e1223f38cd 改名 2021-09-10 14:00:38 +08:00
as2252258 7954345cc4 改名 2021-09-10 13:59:38 +08:00
as2252258 4d670018f2 改名 2021-09-10 13:58:29 +08:00
as2252258 6bbd25d132 改名 2021-09-10 13:57:27 +08:00
as2252258 15fc47b4eb 改名 2021-09-10 13:47:51 +08:00
as2252258 93d38814f3 改名 2021-09-10 13:46:59 +08:00
as2252258 40db648d81 改名 2021-09-10 13:44:49 +08:00
as2252258 ab7c5090f1 改名 2021-09-10 11:58:01 +08:00
as2252258 5dd75fba7f 改名 2021-09-10 11:48:45 +08:00
as2252258 c22994f545 改名 2021-09-10 11:42:05 +08:00
as2252258 d65e395b22 改名 2021-09-10 11:37:42 +08:00
as2252258 b497164f39 改名 2021-09-10 11:35:23 +08:00
as2252258 4753aee9c3 改名 2021-09-10 11:17:32 +08:00
as2252258 8fcdfc5fe3 改名 2021-09-10 11:16:23 +08:00
as2252258 3cb94db156 改名 2021-09-10 11:15:04 +08:00
as2252258 bf531d4022 改名 2021-09-10 11:10:49 +08:00
as2252258 16ad6757d4 改名 2021-09-10 11:09:33 +08:00
as2252258 efbf2075f4 改名 2021-09-10 11:07:59 +08:00
as2252258 8e928c9c24 改名 2021-09-10 11:01:11 +08:00
as2252258 79e5907765 改名 2021-09-10 10:57:48 +08:00
as2252258 abb9508c36 改名 2021-09-10 10:53:54 +08:00
as2252258 1db221c771 改名 2021-09-10 10:50:56 +08:00
as2252258 f217a14f23 改名 2021-09-10 10:45:24 +08:00
as2252258 dca5d3e6ec 改名 2021-09-10 10:24:11 +08:00
as2252258 c02da89654 改名 2021-09-10 10:20:46 +08:00
as2252258 ce07230cc6 改名 2021-09-10 10:19:19 +08:00
as2252258 bb34789f8f 改名 2021-09-10 10:17:03 +08:00
as2252258 8c0050c036 改名 2021-09-10 10:16:10 +08:00
as2252258 073402ff9a 改名 2021-09-10 10:14:23 +08:00
as2252258 23d17a609e e 2021-09-10 10:11:23 +08:00
as2252258 7bd1a47843 改名 2021-09-10 10:08:38 +08:00
as2252258 024e5b746c 改名 2021-09-10 10:07:20 +08:00
as2252258 337315f004 e 2021-09-10 10:06:30 +08:00
as2252258 3de92094b3 改名 2021-09-10 10:06:02 +08:00
as2252258 61f242e006 改名 2021-09-10 10:04:25 +08:00
as2252258 dbeb44f19a 改名 2021-09-10 10:02:03 +08:00
as2252258@163.com 8bd3148d70 111 2021-09-10 03:54:16 +08:00
as2252258@163.com 51d0921483 111 2021-09-10 03:51:47 +08:00
as2252258@163.com 2cf472082f 111 2021-09-10 03:50:45 +08:00
as2252258@163.com a61e663cf0 111 2021-09-10 03:33:45 +08:00
as2252258 9915452311 改名 2021-09-09 19:23:21 +08:00
as2252258 e53b060022 改名 2021-09-09 17:33:43 +08:00
as2252258 6c133983fb 改名 2021-09-09 17:25:52 +08:00
as2252258 9a5aebcfd2 改名 2021-09-09 17:17:44 +08:00
as2252258 9ca2d6634d 改名 2021-09-09 17:08:51 +08:00
as2252258 8ddd368c65 改名 2021-09-09 17:05:18 +08:00
as2252258 edf5fdb7fc 改名 2021-09-09 17:03:29 +08:00
as2252258 46822da6d7 改名 2021-09-09 17:01:52 +08:00
as2252258 3a0f2f2882 改名 2021-09-09 16:58:15 +08:00
as2252258 9b566d0bf7 改名 2021-09-09 16:55:16 +08:00
as2252258 7e2431cb6d 改名 2021-09-09 16:50:52 +08:00
as2252258 d5b65f0d89 改名 2021-09-09 16:38:54 +08:00
as2252258 aacda0bef9 改名 2021-09-09 15:38:30 +08:00
as2252258 d23b0379cc 改名 2021-09-08 15:50:54 +08:00
as2252258 42756c6586 改名 2021-09-08 15:46:54 +08:00
as2252258 b7d9f3187c 改名 2021-09-08 15:34:04 +08:00
as2252258 6836a8672e 改名 2021-09-08 15:31:24 +08:00
as2252258 3499d65104 改名 2021-09-08 15:28:10 +08:00
as2252258 f00b6fa588 改名 2021-09-08 15:25:27 +08:00
as2252258@163.com b7719e3b41 111 2021-09-08 02:06:24 +08:00
as2252258@163.com b71ccf7a58 111 2021-09-08 00:37:58 +08:00
as2252258@163.com c07cfca3ae 111 2021-09-08 00:28:06 +08:00
as2252258@163.com eafca6a25f 111 2021-09-08 00:26:18 +08:00
as2252258 7ce537a76f 改名 2021-09-07 17:23:45 +08:00
as2252258 217597e3d5 改名 2021-09-07 17:06:01 +08:00
as2252258 15ffef7d1a 改名 2021-09-07 17:04:50 +08:00
as2252258 7d9f29d626 改名 2021-09-07 17:02:42 +08:00
as2252258 6bbc1e7d58 改名 2021-09-07 16:44:50 +08:00
as2252258 e412f0681f 改名 2021-09-07 16:14:44 +08:00
as2252258 968814bd57 改名 2021-09-07 15:45:48 +08:00
as2252258 57531e1899 改名 2021-09-07 15:44:12 +08:00
as2252258 181250be29 改名 2021-09-07 15:35:56 +08:00
as2252258 56ea84d109 改名 2021-09-07 15:33:25 +08:00
as2252258 e0bbe3491a 改名 2021-09-07 15:32:23 +08:00
as2252258 a34ece03fe 改名 2021-09-07 15:29:59 +08:00
as2252258 916ca4b4db 改名 2021-09-07 15:24:42 +08:00
as2252258 86b432961e 改名 2021-09-07 14:55:21 +08:00
as2252258 3b2c0a2654 改名 2021-09-07 14:49:07 +08:00
as2252258 0c631c5ea8 改名 2021-09-07 14:48:18 +08:00
as2252258 72578e46b5 改名 2021-09-07 14:47:44 +08:00
as2252258 8844131a0b 改名 2021-09-07 14:45:10 +08:00
as2252258 25f36fc3da 改名 2021-09-07 14:14:46 +08:00
as2252258 175b315526 改名 2021-09-07 14:11:34 +08:00
as2252258 ccf84cd3d1 改名 2021-09-07 14:01:50 +08:00
as2252258 b149e6147a 改名 2021-09-07 14:00:46 +08:00
as2252258 86880f8b1f 改名 2021-09-07 11:44:12 +08:00
as2252258@163.com 0cdb8c5b20 111 2021-09-07 00:52:12 +08:00
as2252258@163.com 05a058bdd7 111 2021-09-07 00:51:16 +08:00
as2252258@163.com 25c2c9660a 111 2021-09-07 00:32:00 +08:00
as2252258 517cbee900 改名 2021-09-06 19:03:38 +08:00
as2252258 9581386e84 改名 2021-09-06 19:00:14 +08:00
as2252258 7732be0faf 改名 2021-09-06 18:57:41 +08:00
as2252258 3e6d11f76f 改名 2021-09-06 18:54:14 +08:00
as2252258 74222ea346 改名 2021-09-06 18:48:51 +08:00
as2252258 26e5ad4b07 改名 2021-09-06 18:47:14 +08:00
as2252258 bf7ba23ba9 改名 2021-09-06 18:46:28 +08:00
as2252258 f6e8d102ec 改名 2021-09-06 18:29:04 +08:00
as2252258 c8d915b5e8 改名 2021-09-06 18:05:49 +08:00
as2252258 21c7f383bb 改名 2021-09-06 17:59:12 +08:00
as2252258 42f057bc8a 改名 2021-09-06 17:47:19 +08:00
as2252258 c4e60ede3d 改名 2021-09-06 17:46:03 +08:00
as2252258 93c0fc88d5 改名 2021-09-06 17:43:40 +08:00
as2252258 de140e50e1 改名 2021-09-06 17:42:14 +08:00
as2252258 a8e34443b4 改名 2021-09-06 17:41:30 +08:00
as2252258 76c425cf22 改名 2021-09-06 17:39:13 +08:00
as2252258 730b840409 改名 2021-09-06 17:33:05 +08:00
as2252258 fff8e37e4e 改名 2021-09-06 17:28:22 +08:00
as2252258 ae9ca671d1 改名 2021-09-06 17:23:06 +08:00
as2252258 b985985a99 改名 2021-09-06 17:04:16 +08:00
as2252258 e56c823c0f 改名 2021-09-06 16:51:21 +08:00
as2252258 613d559fe2 改名 2021-09-06 16:48:35 +08:00
as2252258 731b89a756 改名 2021-09-06 16:45:37 +08:00
as2252258 8900ba4566 改名 2021-09-06 16:44:33 +08:00
as2252258 6dc183a357 改名 2021-09-06 16:25:45 +08:00
as2252258 51bd623a85 改名 2021-09-06 16:24:59 +08:00
as2252258 27cd78653d 改名 2021-09-06 16:22:24 +08:00
as2252258 4275decc05 改名 2021-09-06 16:22:15 +08:00
as2252258 ada8a9ed67 改名 2021-09-06 16:08:24 +08:00
as2252258 c1552a4c88 改名 2021-09-06 16:04:51 +08:00
as2252258 b1f9ac335d 改名 2021-09-06 15:57:03 +08:00
as2252258 12369a5cbd 改名 2021-09-06 15:50:09 +08:00
as2252258 2e7c63e012 改名 2021-09-06 15:49:23 +08:00
as2252258 95185d3a93 改名 2021-09-06 14:31:40 +08:00
as2252258 aa95de08ae 改名 2021-09-06 14:31:09 +08:00
as2252258 9556e5d2bb 改名 2021-09-06 14:30:57 +08:00
as2252258 e5dc0b7836 改名 2021-09-06 14:30:20 +08:00
as2252258 728f95492f 改名 2021-09-06 14:20:04 +08:00
as2252258 3eeca0315a 改名 2021-09-06 11:50:57 +08:00
as2252258 bca71c3a16 改名 2021-09-06 11:49:51 +08:00
as2252258 0d910ea6a5 改名 2021-09-06 11:47:47 +08:00
as2252258 27b628827f 改名 2021-09-06 11:38:08 +08:00
as2252258 8c7fe30509 改名 2021-09-06 11:36:27 +08:00
as2252258 93068ab224 改名 2021-09-06 11:28:59 +08:00
as2252258 3088530d9d 改名 2021-09-06 11:26:22 +08:00
as2252258 4fac0621e7 改名 2021-09-06 11:18:13 +08:00
as2252258 ca24835df8 改名 2021-09-06 11:12:52 +08:00
as2252258@163.com 53e0163388 111 2021-09-06 02:28:06 +08:00
as2252258@163.com 23a86b901d 111 2021-09-06 02:24:39 +08:00
as2252258@163.com 7ae222268e 111 2021-09-06 02:21:56 +08:00
as2252258@163.com 6386b2c8a9 111 2021-09-06 02:11:24 +08:00
as2252258@163.com fa0f77d26e 111 2021-09-06 02:05:20 +08:00
as2252258@163.com 33dab9dd5e 111 2021-09-06 02:03:19 +08:00
as2252258@163.com 95340d6d37 111 2021-09-06 02:01:48 +08:00
as2252258@163.com 5bd3d98250 111 2021-09-06 01:57:01 +08:00
as2252258@163.com 05adb043f2 111 2021-09-06 01:42:26 +08:00
as2252258@163.com 9ecbb09b45 111 2021-09-06 01:41:57 +08:00
as2252258@163.com 5c68659e64 111 2021-09-06 01:36:34 +08:00
as2252258@163.com 896f4e08f6 111 2021-09-06 01:36:03 +08:00
as2252258@163.com 0116fb2e51 111 2021-09-05 15:49:25 +08:00
as2252258@163.com cec0404b1f 111 2021-09-05 04:56:56 +08:00
as2252258@163.com 0b7485e9da 111 2021-09-05 04:45:11 +08:00
as2252258@163.com 6481d69a25 111 2021-09-05 04:44:02 +08:00
as2252258@163.com 00a8645ec7 111 2021-09-05 04:31:27 +08:00
as2252258@163.com 8bb0fe1e68 111 2021-09-05 04:22:43 +08:00
as2252258@163.com 92110de1a8 111 2021-09-05 04:21:05 +08:00
as2252258@163.com 3c181b4d60 111 2021-09-05 04:11:10 +08:00
as2252258@163.com 765dccee26 111 2021-09-05 04:10:24 +08:00
as2252258@163.com 532a3cf0e8 111 2021-09-05 04:03:07 +08:00
as2252258@163.com 247fc51a69 111 2021-09-05 03:59:24 +08:00
as2252258@163.com 91bb128a15 111 2021-09-05 03:59:00 +08:00
as2252258@163.com 11a2167a2c 111 2021-09-05 03:58:17 +08:00
as2252258@163.com ba059c379d 111 2021-09-05 03:56:44 +08:00
as2252258@163.com 9497909749 111 2021-09-05 03:56:04 +08:00
as2252258@163.com 8735203573 111 2021-09-05 02:51:53 +08:00
as2252258@163.com f19f0c0e81 111 2021-09-04 17:24:23 +08:00
as2252258@163.com 7d26617092 111 2021-09-04 17:06:05 +08:00
as2252258@163.com 8f919ffa1b 111 2021-09-04 00:12:44 +08:00
as2252258@163.com 78bfeb6e29 111 2021-09-04 00:11:53 +08:00
as2252258@163.com abd043ee15 111 2021-09-04 00:08:34 +08:00
as2252258 991095ae50 改名 2021-09-03 19:03:48 +08:00
as2252258 de24a92118 改名 2021-09-03 18:51:40 +08:00
as2252258 52b4db46d3 改名 2021-09-02 14:58:08 +08:00
as2252258 6e7ed8e7a2 改名 2021-09-02 14:55:40 +08:00
as2252258 1aeb698c76 改名 2021-09-02 14:32:01 +08:00
as2252258 bc7c5ad13b 改名 2021-09-02 14:29:55 +08:00
as2252258 7ae96a0521 改名 2021-09-02 14:14:21 +08:00
as2252258 9add6a51e7 改名 2021-09-02 14:13:06 +08:00
as2252258 a8315038b9 改名 2021-09-02 14:11:05 +08:00
as2252258 059898848a 改名 2021-09-02 14:10:28 +08:00
as2252258 260cf02457 改名 2021-09-02 14:09:19 +08:00
as2252258 8a2193d986 改名 2021-09-02 14:08:44 +08:00
as2252258 c5b370dabc 改名 2021-09-02 13:59:00 +08:00
as2252258 648e698d9e 改名 2021-09-02 13:48:57 +08:00
as2252258 dfd7ead466 改名 2021-09-02 12:02:26 +08:00
as2252258 cdb3b5b0ad 改名 2021-09-02 12:00:26 +08:00
as2252258 7556cb259a 改名 2021-09-02 11:58:53 +08:00
as2252258 ef1d542814 改名 2021-09-02 11:27:59 +08:00
as2252258 428987406c 改名 2021-09-02 11:26:11 +08:00
as2252258 4e2bb41358 改名 2021-09-02 11:13:11 +08:00
as2252258 d605b4b218 改名 2021-08-31 18:05:46 +08:00
as2252258 9d5f4782b0 改名 2021-08-31 17:18:21 +08:00
as2252258 675d62b47a 改名 2021-08-31 16:54:16 +08:00
as2252258 4568378314 改名 2021-08-31 14:31:58 +08:00
as2252258 60d50d8ba5 改名 2021-08-31 14:25:36 +08:00
as2252258 ba6ed131db 改名 2021-08-31 14:21:26 +08:00
as2252258 e8f6c583e0 改名 2021-08-31 14:15:10 +08:00
as2252258 218b4a3137 改名 2021-08-31 14:10:50 +08:00
as2252258 1fb9ef08bb 改名 2021-08-31 14:10:21 +08:00
as2252258 be34d78454 改名 2021-08-31 14:07:06 +08:00
as2252258 e691cc0bc2 改名 2021-08-31 14:03:26 +08:00
as2252258 b60e38dd92 改名 2021-08-31 14:01:18 +08:00
as2252258 9d394fa0ff 改名 2021-08-31 13:51:21 +08:00
as2252258@163.com a0bf0d3e66 111 2021-08-31 01:58:05 +08:00
as2252258@163.com 742867e2f9 111 2021-08-31 01:48:34 +08:00
as2252258@163.com 6be3eb6499 111 2021-08-31 01:46:13 +08:00
as2252258@163.com 748d88bb87 111 2021-08-31 01:45:02 +08:00
as2252258@163.com fb2e7943c7 111 2021-08-31 01:14:17 +08:00
as2252258 aa18b438d4 改名 2021-08-30 19:09:25 +08:00
as2252258 99c9e4b2d9 改名 2021-08-30 19:02:28 +08:00
as2252258 4d1eb83019 改名 2021-08-30 18:53:26 +08:00
as2252258 faa4890fb3 改名 2021-08-30 18:46:50 +08:00
as2252258 b0120a2ed2 改名 2021-08-30 18:44:24 +08:00
as2252258 680480b9dc 改名 2021-08-30 18:22:11 +08:00
as2252258 a0e5eb03d2 改名 2021-08-30 18:17:37 +08:00
as2252258 4015bf30e6 改名 2021-08-30 17:43:07 +08:00
as2252258 70539e9f51 改名 2021-08-30 17:40:17 +08:00
as2252258 defcaec071 改名 2021-08-30 17:34:57 +08:00
as2252258 767545935a 改名 2021-08-30 17:27:39 +08:00
as2252258 4967f84ef3 改名 2021-08-30 17:23:54 +08:00
as2252258 5727c4edf8 改名 2021-08-30 17:20:22 +08:00
as2252258 3d4c4bcd54 改名 2021-08-30 17:11:37 +08:00
as2252258 15185405fb 改名 2021-08-30 17:10:58 +08:00
as2252258 92d3c32172 改名 2021-08-30 17:09:32 +08:00
as2252258 d37141b035 改名 2021-08-30 16:45:44 +08:00
as2252258 216363d8a7 改名 2021-08-30 15:24:31 +08:00
as2252258 574ad26ced 改名 2021-08-30 15:05:15 +08:00
as2252258 25803e3814 改名 2021-08-30 15:03:59 +08:00
as2252258 ddf2caaccc 改名 2021-08-30 15:01:15 +08:00
as2252258 f63d66fbda 改名 2021-08-30 14:58:00 +08:00
as2252258 c843b47425 改名 2021-08-30 14:10:37 +08:00
as2252258 d8b4ed58c7 改名 2021-08-30 14:08:42 +08:00
as2252258 d8035412c0 改名 2021-08-30 14:05:24 +08:00
as2252258 895a83b094 改名 2021-08-30 14:01:22 +08:00
as2252258@163.com 6b58f95127 111 2021-08-29 06:04:22 +08:00
as2252258@163.com dc09566ea3 111 2021-08-29 05:59:50 +08:00
as2252258@163.com edaf29f5c3 111 2021-08-29 05:59:10 +08:00
as2252258@163.com 0456469c60 111 2021-08-29 05:57:03 +08:00
as2252258@163.com eee07bbc46 111 2021-08-29 05:55:19 +08:00
as2252258@163.com c06f25fcf5 111 2021-08-29 05:53:47 +08:00
as2252258@163.com 1cb1b0b9cb 111 2021-08-29 05:36:58 +08:00
as2252258@163.com 35ea34eb4a 111 2021-08-29 05:30:48 +08:00
as2252258@163.com 91436fdb58 111 2021-08-29 05:12:39 +08:00
as2252258@163.com ea46eeb09b 111 2021-08-29 04:59:47 +08:00
as2252258@163.com ad2beb841c 111 2021-08-29 04:58:19 +08:00
as2252258@163.com ff99cdbf61 111 2021-08-29 04:57:50 +08:00
as2252258@163.com 5b2e91b1ed 111 2021-08-29 04:48:41 +08:00
as2252258@163.com 6893452022 111 2021-08-29 04:44:33 +08:00
as2252258@163.com 751bc7cc4a 111 2021-08-29 04:31:14 +08:00
as2252258@163.com 8c088c3384 111 2021-08-29 04:24:06 +08:00
as2252258@163.com 2108ec7613 111 2021-08-29 04:12:07 +08:00
as2252258@163.com 3fcd90f551 111 2021-08-29 04:09:59 +08:00
as2252258@163.com 133ca2c273 111 2021-08-29 04:06:49 +08:00
as2252258@163.com 9da50baed0 111 2021-08-29 01:18:42 +08:00
as2252258@163.com e3f02b51bc 111 2021-08-29 00:58:54 +08:00
as2252258@163.com 300ebfec7d 111 2021-08-29 00:33:59 +08:00
as2252258@163.com 8a5d079a8a 111 2021-08-28 19:48:15 +08:00
as2252258@163.com 8d53c9e0f7 111 2021-08-28 19:35:38 +08:00
as2252258@163.com de45170f2c 111 2021-08-28 03:06:34 +08:00
as2252258@163.com d5193add08 111 2021-08-28 02:53:47 +08:00
as2252258@163.com 992bc2cc16 111 2021-08-28 02:52:25 +08:00
as2252258@163.com 107d452fcf 111 2021-08-28 02:46:12 +08:00
as2252258@163.com 2dbcff013d 111 2021-08-28 02:40:44 +08:00
as2252258@163.com 961d350e04 111 2021-08-28 02:39:16 +08:00
as2252258@163.com fc2f13b519 111 2021-08-28 02:38:01 +08:00
as2252258@163.com 240996c13c 111 2021-08-28 02:34:59 +08:00
as2252258@163.com 8da9cf58a4 111 2021-08-28 02:31:05 +08:00
as2252258@163.com b67f2a304f 111 2021-08-28 02:26:27 +08:00
as2252258@163.com 3d2912af01 111 2021-08-28 02:22:44 +08:00
as2252258@163.com 55d3368eab 111 2021-08-28 02:21:13 +08:00
as2252258@163.com 7954d31728 111 2021-08-28 02:20:54 +08:00
as2252258@163.com 5e32d9a020 111 2021-08-28 02:14:11 +08:00
as2252258@163.com e1c27e492b 111 2021-08-28 02:10:48 +08:00
as2252258@163.com 316a44f59c 111 2021-08-28 02:09:08 +08:00
as2252258@163.com 5e1a3f7148 111 2021-08-28 02:08:20 +08:00
as2252258@163.com 567d440dcd 111 2021-08-28 01:57:33 +08:00
as2252258@163.com c898292ebe 111 2021-08-28 01:49:06 +08:00
as2252258@163.com 30e639fe69 111 2021-08-28 01:40:33 +08:00
as2252258@163.com fc634c94ed 111 2021-08-28 01:37:47 +08:00
as2252258@163.com a4823d5d41 111 2021-08-28 01:31:52 +08:00
as2252258@163.com b79b55d8b0 111 2021-08-28 01:26:06 +08:00
as2252258@163.com dd79069cc5 111 2021-08-28 01:25:24 +08:00
as2252258@163.com 30dae81e7e 111 2021-08-28 01:21:23 +08:00
as2252258 e4a583f8dc Merge remote-tracking branch 'origin/master' 2021-08-28 00:52:25 +08:00
as2252258 8be7975d54 改名 2021-08-28 00:52:20 +08:00
as2252258@163.com f052cf1fbf 111 2021-08-28 00:51:27 +08:00
as2252258@163.com c4144f2913 Merge branch 'master' of https://gitee.com/dreamwithouttrace/kiri-core 2021-08-28 00:46:55 +08:00
as2252258 a29ed02053 改名 2021-08-27 18:42:43 +08:00
as2252258 55d564066e 改名 2021-08-27 18:09:57 +08:00
as2252258 4d537ad9fd 改名 2021-08-27 18:00:03 +08:00
as2252258 1b09df691f 改名 2021-08-27 17:55:13 +08:00
as2252258 151ac4ac0e 改名 2021-08-27 17:46:40 +08:00
as2252258 79c8f1f799 改名 2021-08-27 17:36:51 +08:00
as2252258 cbf299955f 改名 2021-08-27 17:31:29 +08:00
as2252258 dbae08e7af 改名 2021-08-27 17:24:38 +08:00
as2252258 24bf2405a3 改名 2021-08-27 17:22:08 +08:00
as2252258 daef261403 改名 2021-08-27 17:06:17 +08:00
as2252258 2f76d86069 改名 2021-08-27 16:54:29 +08:00
as2252258 0792dc8006 改名 2021-08-27 16:51:19 +08:00
as2252258 98b7048db7 改名 2021-08-27 16:49:17 +08:00
as2252258 5f199ccb19 改名 2021-08-27 12:24:52 +08:00
as2252258 0fcf75f468 改名 2021-08-27 11:39:11 +08:00
as2252258@163.com 70b38affd1 111 2021-08-27 00:24:54 +08:00
as2252258 6bb25e0ffd 改名 2021-08-26 18:27:20 +08:00
as2252258 0444627e09 改名 2021-08-26 18:21:12 +08:00
as2252258 bdaae065bb delete http-message 2021-08-26 16:38:12 +08:00
as2252258 45379c7bf9 改名 2021-08-26 16:03:31 +08:00
as2252258 4a540e87f1 改名 2021-08-26 15:43:00 +08:00
as2252258 374c41002b delete kafka 2021-08-26 15:03:46 +08:00
as2252258 8bf0941f2b delete kafka 2021-08-26 15:03:19 +08:00
as2252258 835300e3c6 改名 2021-08-26 15:01:43 +08:00
as2252258 bd1f60623e 改名 2021-08-25 19:11:15 +08:00
as2252258 84703373a2 改名 2021-08-25 16:00:11 +08:00
as2252258 bcfc1dbb28 改名 2021-08-25 15:58:52 +08:00
as2252258 55630e22a3 改名 2021-08-25 13:50:40 +08:00
as2252258 bee11f3d82 改名 2021-08-25 11:29:43 +08:00
as2252258 441ce5fd45 改名 2021-08-25 11:26:57 +08:00
as2252258 c995bb7e51 改名 2021-08-25 11:25:49 +08:00
as2252258 86863ec30e 改名 2021-08-25 11:25:02 +08:00
as2252258 83cf04b31b 改名 2021-08-25 11:22:46 +08:00
as2252258 848e55cc93 改名 2021-08-25 11:21:39 +08:00
as2252258 51014591b3 改名 2021-08-25 11:07:46 +08:00
as2252258 449236ee12 改名 2021-08-25 10:05:50 +08:00
as2252258@163.com fa94b803e1 modify 2021-08-25 02:01:49 +08:00
as2252258@163.com 3336f3a184 modify 2021-08-25 01:56:24 +08:00
as2252258@163.com c590cb1c92 modify 2021-08-25 01:54:43 +08:00
as2252258@163.com 4d2fc8af52 modify 2021-08-25 01:50:38 +08:00
as2252258 57d8e44fef 改名 2021-08-24 19:12:59 +08:00
as2252258 1ef28546b9 改名 2021-08-24 19:11:14 +08:00
as2252258 24c93edf2b 改名 2021-08-24 18:24:46 +08:00
as2252258 575f4b8520 改名 2021-08-24 18:10:07 +08:00
as2252258 2db271dab3 改名 2021-08-24 15:50:04 +08:00
as2252258 16d8d44437 改名 2021-08-24 15:47:31 +08:00
as2252258 386e855939 改名 2021-08-24 11:12:28 +08:00
as2252258 7c6af25309 改名 2021-08-24 10:53:00 +08:00
as2252258@163.com 945b1b315c modify 2021-08-24 01:07:15 +08:00
as2252258@163.com 6bdc50a29e modify 2021-08-24 01:06:10 +08:00
as2252258 489d34cbfa 改名 2021-08-23 19:12:15 +08:00
as2252258 18c6b9cf8d 改名 2021-08-23 19:11:31 +08:00
as2252258 ebb23807cf 改名 2021-08-23 19:10:44 +08:00
as2252258 0744a4fac8 改名 2021-08-23 18:58:22 +08:00
as2252258 81227b9371 改名 2021-08-23 15:44:52 +08:00
as2252258 0e0376ce67 改名 2021-08-23 11:08:40 +08:00
as2252258 c1c0d862b9 改名 2021-08-23 10:53:20 +08:00
as2252258 59b994f0d8 改名 2021-08-20 19:07:10 +08:00
as2252258 b63436d325 改名 2021-08-20 16:55:44 +08:00
as2252258 62f709868e 改名 2021-08-20 14:36:50 +08:00
as2252258 24e4cdc555 改名 2021-08-20 14:34:10 +08:00
as2252258 280d2341df 改名 2021-08-20 13:59:15 +08:00
as2252258 e979c5ad5e 改名 2021-08-20 13:54:12 +08:00
as2252258 95719adc40 改名 2021-08-20 10:40:37 +08:00
as2252258 c3900b0259 改名 2021-08-20 10:19:58 +08:00
as2252258 0dbf4ebc08 改名 2021-08-20 10:19:05 +08:00
as2252258 145f6e0bb6 改名 2021-08-20 10:16:13 +08:00
as2252258 01ed2f1f48 改名 2021-08-20 09:48:05 +08:00
as2252258 5a0e147c2b 改名 2021-08-19 19:18:28 +08:00
as2252258 53b68579af 改名 2021-08-19 19:17:08 +08:00
as2252258 1b9647da65 改名 2021-08-19 18:56:38 +08:00
as2252258 2b4929fa97 改名 2021-08-19 18:49:14 +08:00
as2252258 11568decb4 改名 2021-08-19 18:46:28 +08:00
as2252258 63fd1e8e13 改名 2021-08-19 18:28:21 +08:00
as2252258 ccba377f13 改名 2021-08-19 18:27:19 +08:00
as2252258 fedef53f93 改名 2021-08-19 18:10:15 +08:00
as2252258 619cf164a6 改名 2021-08-19 17:53:11 +08:00
as2252258 1bea0ae66e 改名 2021-08-19 17:52:34 +08:00
as2252258 633d1fce44 改名 2021-08-19 17:41:10 +08:00
as2252258 99b4aee754 改名 2021-08-19 16:15:28 +08:00
as2252258 fb453f674d 改名 2021-08-19 16:01:07 +08:00
as2252258 6fa51c2fe3 改名 2021-08-19 15:47:12 +08:00
as2252258 75714dab64 改名 2021-08-19 15:42:47 +08:00
as2252258 5792ac3e22 改名 2021-08-19 15:41:30 +08:00
as2252258 c2a46396ff 改名 2021-08-19 15:40:28 +08:00
as2252258 f371589935 改名 2021-08-19 15:36:59 +08:00
as2252258 8d6364f1ac 改名 2021-08-19 15:22:48 +08:00
as2252258 d263484e91 改名 2021-08-19 12:02:06 +08:00
as2252258 1ded86021a 改名 2021-08-19 11:00:04 +08:00
as2252258 32d4d0f820 改名 2021-08-19 10:57:45 +08:00
as2252258 d2731aa8b9 改名 2021-08-18 19:11:19 +08:00
as2252258 7a2f8e0e00 改名 2021-08-18 14:06:44 +08:00
as2252258 af398ca8b6 改名 2021-08-18 14:05:04 +08:00
as2252258 79ae112c5b 改名 2021-08-18 13:56:51 +08:00
as2252258 6d4e21d006 改名 2021-08-18 13:48:34 +08:00
as2252258 be67fdf155 改名 2021-08-18 13:42:59 +08:00
as2252258 02357b0650 改名 2021-08-18 13:38:45 +08:00
as2252258 ea8d9b22cd 改名 2021-08-18 13:37:27 +08:00
as2252258 6e01b437e2 改名 2021-08-18 13:35:58 +08:00
as2252258 1c4020810f 改名 2021-08-18 13:32:37 +08:00
as2252258 99e2f36794 改名 2021-08-18 11:56:19 +08:00
as2252258 f375eec0a0 改名 2021-08-18 11:23:30 +08:00
as2252258 effee75d57 改名 2021-08-18 11:20:42 +08:00
as2252258 d5c31fab74 改名 2021-08-18 11:16:12 +08:00
as2252258 5bac261b33 改名 2021-08-17 19:20:16 +08:00
as2252258 0dc5586348 改名 2021-08-17 19:17:01 +08:00
as2252258 c8da2da9e7 改名 2021-08-17 19:16:07 +08:00
as2252258 801b19154c 改名 2021-08-17 19:05:50 +08:00
as2252258 e77a66700d 改名 2021-08-17 19:04:44 +08:00
as2252258 cfd8f6fa94 改名 2021-08-17 19:01:37 +08:00
as2252258 51860d34c7 改名 2021-08-17 18:55:49 +08:00
as2252258 fe442681b7 改名 2021-08-17 18:53:51 +08:00
as2252258 3e256e5093 改名 2021-08-17 18:53:37 +08:00
as2252258 14b83e418d 改名 2021-08-17 18:48:02 +08:00
as2252258 5ba5c930a0 改名 2021-08-17 18:46:56 +08:00
as2252258 a943a6ca25 改名 2021-08-17 18:45:22 +08:00
as2252258 97c5d94a64 改名 2021-08-17 18:41:11 +08:00
as2252258 1e4e9f7e49 改名 2021-08-17 18:40:35 +08:00
as2252258 4ab955d399 改名 2021-08-17 18:38:38 +08:00
as2252258 1cb36c8707 改名 2021-08-17 18:35:11 +08:00
as2252258 aab596d14d 改名 2021-08-17 18:19:52 +08:00
as2252258 6d92ca5b56 改名 2021-08-17 18:19:26 +08:00
as2252258 b441c07ef5 改名 2021-08-17 18:14:28 +08:00
as2252258 151c1ccdd6 改名 2021-08-17 16:54:01 +08:00
as2252258 1f85ff1d65 改名 2021-08-17 16:52:50 +08:00
as2252258 5b1e28c323 e 2021-08-17 16:43:50 +08:00
as2252258 539ba488e9 改名 2021-08-17 16:38:58 +08:00
as2252258 36856814b0 改名 2021-08-17 16:33:57 +08:00
as2252258 b808417359 改名 2021-08-17 16:24:05 +08:00
as2252258 7cbf6e3bdf 改名 2021-08-17 16:23:49 +08:00
as2252258 1a89c6c8be 改名 2021-08-16 18:43:37 +08:00
as2252258 cb9e7e8775 改名 2021-08-16 18:31:41 +08:00
as2252258 51b0212527 改名 2021-08-16 18:24:32 +08:00
as2252258 863ef72c00 改名 2021-08-16 18:11:18 +08:00
as2252258 01f6491421 改名 2021-08-16 17:23:21 +08:00
as2252258 93aa4bd23f 改名 2021-08-16 17:01:45 +08:00
as2252258 2219c81975 改名 2021-08-13 17:10:10 +08:00
as2252258 d30c36264e 改名 2021-08-13 17:07:39 +08:00
as2252258 36f0e45e7e 改名 2021-08-13 17:06:52 +08:00
as2252258 fe67cad896 改名 2021-08-13 17:00:48 +08:00
as2252258 ee46ba2474 改名 2021-08-13 16:59:24 +08:00
as2252258 4ca59d62c4 改名 2021-08-13 16:57:51 +08:00
as2252258 491099d963 改名 2021-08-13 16:57:12 +08:00
as2252258 b795c1ae4a 改名 2021-08-13 16:55:02 +08:00
as2252258 ae9700da16 改名 2021-08-13 16:53:24 +08:00
as2252258 531d7c8a78 改名 2021-08-13 16:41:15 +08:00
as2252258 c54e600d6f 改名 2021-08-13 16:39:44 +08:00
as2252258 7d54e103f9 改名 2021-08-13 16:37:37 +08:00
as2252258 1ca45f8215 改名 2021-08-13 15:50:01 +08:00
as2252258 c06506d487 改名 2021-08-13 15:48:38 +08:00
as2252258 2360eeba61 改名 2021-08-13 15:35:24 +08:00
as2252258 0e000f3427 改名 2021-08-13 15:34:31 +08:00
as2252258 cf0cae7c87 改名 2021-08-13 15:32:35 +08:00
as2252258 759307050a 改名 2021-08-13 15:31:15 +08:00
as2252258 68bbc90920 改名 2021-08-13 15:29:41 +08:00
as2252258 22c11fca68 改名 2021-08-13 15:22:49 +08:00
as2252258 695c24b79f 改名 2021-08-13 15:22:11 +08:00
as2252258 c95cc8d799 改名 2021-08-13 15:20:33 +08:00
as2252258 fda57cd6cc 改名 2021-08-13 15:19:35 +08:00
as2252258 62145acb8c 改名 2021-08-13 15:19:07 +08:00
as2252258 3198d66753 改名 2021-08-13 15:11:58 +08:00
as2252258 2432b98be5 改名 2021-08-13 14:58:58 +08:00
as2252258 15851ba97c 改名 2021-08-13 14:37:46 +08:00
as2252258 de4e63d7f9 改名 2021-08-13 14:23:18 +08:00
as2252258 1e8dbecbf5 改名 2021-08-13 14:13:56 +08:00
as2252258 1f45c2c218 改名 2021-08-12 17:29:26 +08:00
as2252258 4e534051b7 改名 2021-08-12 17:28:25 +08:00
as2252258 11ab2f1e2f 改名 2021-08-12 17:27:19 +08:00
as2252258 62b2d038dc 改名 2021-08-12 17:25:03 +08:00
as2252258 d67b32795a 改名 2021-08-12 17:24:29 +08:00
as2252258 7b79b98571 改名 2021-08-12 17:23:25 +08:00
as2252258 76fa5b89c9 改名 2021-08-12 17:21:34 +08:00
as2252258 782d4a6a77 改名 2021-08-12 17:20:20 +08:00
as2252258 223f67065a 改名 2021-08-12 16:33:03 +08:00
as2252258 b94e3f6629 改名 2021-08-12 16:16:25 +08:00
as2252258 968d500f11 改名 2021-08-12 16:13:46 +08:00
as2252258 1eef6a7303 改名 2021-08-12 15:53:31 +08:00
as2252258 bb3fd6988e 改名 2021-08-12 15:45:30 +08:00
as2252258 37fc82d7e1 改名 2021-08-12 15:41:50 +08:00
as2252258 b9ab9a869d 改名 2021-08-12 15:39:33 +08:00
as2252258 45f2aa7406 改名 2021-08-12 15:25:06 +08:00
as2252258 f226c9ba3b 改名 2021-08-12 15:24:30 +08:00
as2252258 c2109e1760 改名 2021-08-12 15:19:51 +08:00
as2252258 07312d25fe 改名 2021-08-12 15:09:25 +08:00
as2252258 2ad860180e 改名 2021-08-12 15:08:46 +08:00
as2252258 c9d2edd7d5 改名 2021-08-12 15:07:24 +08:00
as2252258 0d6176e4e2 改名 2021-08-12 15:07:12 +08:00
as2252258 6ea406251c 改名 2021-08-12 14:43:16 +08:00
as2252258 cb1e59cdcf 改名 2021-08-12 14:35:28 +08:00
as2252258 d814603118 改名 2021-08-12 14:28:27 +08:00
as2252258 799d6bb815 改名 2021-08-12 14:14:34 +08:00
as2252258 14cb8a45d3 改名 2021-08-12 14:08:40 +08:00
as2252258 3bd3a39642 改名 2021-08-12 14:00:44 +08:00
as2252258 a4056c8341 改名 2021-08-12 13:48:06 +08:00
as2252258 e794517876 改名 2021-08-12 12:51:53 +08:00
as2252258 22819d5ee2 改名 2021-08-12 12:51:21 +08:00
as2252258 3dd722d46f 改名 2021-08-12 12:50:42 +08:00
as2252258 b4a0b60c71 改名 2021-08-12 12:47:20 +08:00
as2252258 598c2bd2ad 改名 2021-08-12 12:46:12 +08:00
as2252258 399fcee0af 改名 2021-08-12 12:43:20 +08:00
as2252258 9a6c7b835b 改名 2021-08-12 12:40:06 +08:00
as2252258 39af292171 改名 2021-08-11 19:14:26 +08:00
as2252258 3ce7315250 改名 2021-08-11 15:29:23 +08:00
as2252258 c4ba48c59a 改名 2021-08-11 15:22:55 +08:00
as2252258 f68d62ddb7 改名 2021-08-11 15:15:34 +08:00
as2252258 dcc1389878 改名 2021-08-11 15:06:02 +08:00
as2252258 cdfcec981c 改名 2021-08-11 14:41:43 +08:00
as2252258 7f42f0bef5 改名 2021-08-11 14:40:08 +08:00
as2252258 13f7b93659 改名 2021-08-11 14:36:07 +08:00
as2252258 bf8849aff8 改名 2021-08-11 14:19:59 +08:00
as2252258 54de278a83 改名 2021-08-11 14:14:22 +08:00
as2252258 9371d47587 改名 2021-08-11 14:13:22 +08:00
as2252258 ffc9c15324 改名 2021-08-11 14:10:36 +08:00
as2252258 b55d8fedce 改名 2021-08-11 14:09:49 +08:00
as2252258 505f7985ab 改名 2021-08-11 14:07:58 +08:00
as2252258 bd17e8a713 改名 2021-08-11 14:06:42 +08:00
as2252258 d6f0abf28d 改名 2021-08-11 11:31:15 +08:00
as2252258 83ae20e295 改名 2021-08-11 11:19:32 +08:00
as2252258 669f248797 改名 2021-08-11 11:16:02 +08:00
as2252258 23f8a55fff 改名 2021-08-11 10:53:35 +08:00
as2252258 eace30919c 改名 2021-08-11 10:52:25 +08:00
as2252258 fbd8ecadac 改名 2021-08-11 10:28:47 +08:00
as2252258 806bf80764 改名 2021-08-11 10:27:39 +08:00
as2252258@163.com 3cea2e392e modify 2021-08-11 01:16:39 +08:00
as2252258@163.com 682246df28 modify 2021-08-11 01:04:57 +08:00
as2252258 63d8eaa4a5 改名 2021-08-10 17:52:07 +08:00
as2252258 cc83805fd6 改名 2021-08-10 17:49:46 +08:00
as2252258 69a623f2a4 改名 2021-08-10 17:35:27 +08:00
as2252258 15cbf0c236 改名 2021-08-10 17:08:33 +08:00
as2252258 9557989011 改名 2021-08-10 17:04:27 +08:00
as2252258 2e0a56dd27 改名 2021-08-10 16:51:53 +08:00
as2252258 224ae55b18 改名 2021-08-10 16:50:12 +08:00
as2252258 abdc68627f 改名 2021-08-10 16:47:55 +08:00
as2252258 41f1447a0b 改名 2021-08-10 16:40:01 +08:00
as2252258 218738906e 改名 2021-08-10 14:00:51 +08:00
as2252258 b5e79cd126 改名 2021-08-10 11:42:44 +08:00
as2252258 c03a93ee98 改名 2021-08-10 10:52:05 +08:00
as2252258 81132af603 改名 2021-08-10 10:50:33 +08:00
as2252258 98c45b8ca4 改名 2021-08-10 10:38:39 +08:00
as2252258 0d185b77f3 改名 2021-08-10 10:31:56 +08:00
as2252258 dbf4a018ef 改名 2021-08-10 10:30:59 +08:00
as2252258 a83ab33799 改名 2021-08-10 10:29:26 +08:00
as2252258 b55b20f37b 改名 2021-08-10 10:28:33 +08:00
as2252258 0377550b6f 改名 2021-08-09 18:56:09 +08:00
as2252258 415abed013 改名 2021-08-09 18:51:49 +08:00
as2252258 df9e8eb0c5 改名 2021-08-09 18:36:56 +08:00
as2252258 1f913041b7 改名 2021-08-09 18:17:17 +08:00
as2252258 f3f023268a 改名 2021-08-09 17:14:55 +08:00
as2252258 e2092648bc 改名 2021-08-09 17:02:20 +08:00
as2252258 2b96155ec7 改名 2021-08-09 16:59:28 +08:00
as2252258 a29e54630b 改名 2021-08-09 15:14:33 +08:00
as2252258 6851a2f432 改名 2021-08-09 11:41:36 +08:00
as2252258 cfa31ff677 改名 2021-08-09 11:39:32 +08:00
as2252258 370d758768 改名 2021-08-09 11:36:50 +08:00
as2252258 23cf0e56a7 改名 2021-08-09 11:13:04 +08:00
as2252258 eaccb88e46 改名 2021-08-09 11:12:01 +08:00
as2252258 27297e29fd 改名 2021-08-09 11:06:47 +08:00
as2252258@163.com b486686474 modify 2021-08-09 02:53:49 +08:00
as2252258@163.com b7ab941d98 modify 2021-08-09 02:48:55 +08:00
as2252258@163.com 9121e9272b modify 2021-08-09 02:46:26 +08:00
as2252258@163.com dd9966016b modify 2021-08-09 02:45:52 +08:00
as2252258@163.com 203a594bb1 modify 2021-08-09 02:45:09 +08:00
as2252258@163.com ee31554bb4 modify 2021-08-09 02:16:08 +08:00
as2252258@163.com 3366556ffe modify 2021-08-09 02:14:36 +08:00
as2252258@163.com 7d9b45446d modify 2021-08-09 02:13:54 +08:00
as2252258@163.com a616d27c72 modify 2021-08-09 02:13:00 +08:00
as2252258@163.com 606250ec74 modify 2021-08-09 02:02:56 +08:00
as2252258@163.com 37680e63f5 modify 2021-08-09 02:02:12 +08:00
as2252258@163.com b42be92f19 modify 2021-08-09 02:01:16 +08:00
as2252258@163.com 64c818d6e8 modify 2021-08-09 01:59:15 +08:00
as2252258@163.com 94a9184bf0 modify 2021-08-09 00:15:03 +08:00
as2252258@163.com 8c74ed4d00 modify 2021-08-08 02:42:55 +08:00
as2252258 b471ea3f5e 改名 2021-08-06 18:14:27 +08:00
as2252258 99ddfe268e 改名 2021-08-06 18:05:50 +08:00
as2252258 26fc318af5 改名 2021-08-06 18:03:31 +08:00
as2252258 c2ebe4c670 改名 2021-08-06 17:46:35 +08:00
as2252258 587433f112 改名 2021-08-06 17:41:04 +08:00
as2252258 2d2866d9ed 改名 2021-08-06 17:12:36 +08:00
as2252258 efd2122038 改名 2021-08-06 17:11:30 +08:00
as2252258 73c6cc5637 改名 2021-08-06 17:10:19 +08:00
as2252258 f27628c8f6 改名 2021-08-06 17:06:57 +08:00
as2252258 cc47889993 改名 2021-08-06 17:02:33 +08:00
as2252258 c1bc93fb4c 改名 2021-08-06 16:54:17 +08:00
as2252258 1ac6c00a79 改名 2021-08-06 16:13:16 +08:00
as2252258 68b7b1c020 改名 2021-08-06 15:19:35 +08:00
as2252258 fc253b52bf 改名 2021-08-06 15:18:00 +08:00
as2252258 776a251123 改名 2021-08-06 14:24:02 +08:00
as2252258 41fa50246e 改名 2021-08-06 13:49:28 +08:00
as2252258 0d03334891 改名 2021-08-06 11:03:49 +08:00
as2252258 86d6f5a346 改名 2021-08-06 11:00:31 +08:00
as2252258 1dcace00ef 改名 2021-08-06 10:50:07 +08:00
as2252258@163.com 857d5c0e13 modify 2021-08-06 02:03:01 +08:00
as2252258@163.com f4acafe8de modify 2021-08-06 01:02:22 +08:00
as2252258@163.com e11d8304b7 modify 2021-08-06 01:01:39 +08:00
as2252258@163.com abe586ff0a modify 2021-08-06 00:59:27 +08:00
as2252258@163.com 192e496ba5 modify 2021-08-06 00:57:41 +08:00
as2252258@163.com 4a130e6eed modify 2021-08-06 00:50:50 +08:00
as2252258@163.com d8cec79b3e modify 2021-08-06 00:50:25 +08:00
as2252258@163.com 7e84d06c57 modify 2021-08-06 00:44:29 +08:00
as2252258@163.com 3f4325175f modify 2021-08-05 23:04:34 +08:00
as2252258@163.com 75841054e1 modify 2021-08-05 23:03:46 +08:00
as2252258@163.com e2a2341fd7 modify 2021-08-05 22:57:49 +08:00
as2252258@163.com b13d1d44bd modify 2021-08-05 22:55:23 +08:00
as2252258@163.com 4ee97bc737 modify 2021-08-05 22:50:31 +08:00
as2252258@163.com 993815f327 modify 2021-08-05 22:49:20 +08:00
as2252258@163.com 9df12dfe3c modify 2021-08-05 22:48:06 +08:00
as2252258@163.com 92164057aa modify 2021-08-05 22:47:10 +08:00
as2252258@163.com 733d4fbc88 modify 2021-08-05 22:38:51 +08:00
as2252258@163.com a443364928 modify 2021-08-05 22:38:37 +08:00
as2252258@163.com d900b28a70 modify 2021-08-05 22:37:02 +08:00
as2252258@163.com bdfdc38331 modify 2021-08-05 22:36:05 +08:00
as2252258@163.com 0fabbe3988 modify 2021-08-05 22:34:52 +08:00
as2252258@163.com 3e05205618 modify 2021-08-05 22:32:19 +08:00
as2252258@163.com 2a70e61742 modify 2021-08-05 22:25:20 +08:00
as2252258 6de5fa2019 改名 2021-08-05 19:15:39 +08:00
as2252258 7f9ae9556b 改名 2021-08-05 19:14:08 +08:00
as2252258 f7ec2b6b98 改名 2021-08-05 18:52:37 +08:00
as2252258 4d6cb53bf2 改名 2021-08-05 18:44:01 +08:00
as2252258 6c33df603e 改名 2021-08-05 18:00:22 +08:00
as2252258 9bb0181bd2 改名 2021-08-05 17:59:38 +08:00
as2252258 c329d87fb5 改名 2021-08-05 17:58:50 +08:00
as2252258 6ed54f3d8c 改名 2021-08-05 17:57:15 +08:00
as2252258 1d585313bc 改名 2021-08-05 17:55:15 +08:00
as2252258 73c148e1a1 改名 2021-08-05 17:41:21 +08:00
as2252258 c373e75ce5 改名 2021-08-05 17:33:57 +08:00
as2252258 8c09041896 改名 2021-08-05 17:33:21 +08:00
as2252258 c95753523f 改名 2021-08-05 17:31:25 +08:00
as2252258 9ee9008019 改名 2021-08-05 17:27:08 +08:00
as2252258 efe5a71124 改名 2021-08-05 17:22:25 +08:00
as2252258 c1e8393705 改名 2021-08-05 17:21:40 +08:00
as2252258 1ad8449a69 改名 2021-08-05 17:18:43 +08:00
as2252258 ba7156770e 改名 2021-08-05 17:11:41 +08:00
as2252258 e6da017bc1 改名 2021-08-05 17:09:22 +08:00
as2252258 ad34011d1b 改名 2021-08-05 17:08:54 +08:00
as2252258 395be286f8 改名 2021-08-05 17:06:38 +08:00
as2252258 f0eb29fbd5 改名 2021-08-05 17:02:12 +08:00
as2252258 6d4b352c30 改名 2021-08-05 16:56:42 +08:00
as2252258 859e2c7717 改名 2021-08-05 16:48:14 +08:00
as2252258 d8e7b88811 改名 2021-08-05 16:47:59 +08:00
as2252258 c75ac94d68 改名 2021-08-05 16:39:50 +08:00
as2252258 c4d1669d50 改名 2021-08-05 16:37:48 +08:00
as2252258 2402ead3e7 改名 2021-08-05 16:37:05 +08:00
as2252258 def8aa7cdc 改名 2021-08-05 16:31:26 +08:00
as2252258 73a452fdf1 改名 2021-08-05 16:30:45 +08:00
as2252258 b2e3f7442a 改名 2021-08-05 16:27:53 +08:00
as2252258 e3f1eeda55 改名 2021-08-05 16:27:19 +08:00
as2252258 6f9d48f779 改名 2021-08-05 16:26:51 +08:00
as2252258 64df33b1f2 改名 2021-08-05 16:25:17 +08:00
as2252258 7647c55283 改名 2021-08-05 16:23:25 +08:00
as2252258 35cf073f0b 改名 2021-08-05 16:21:31 +08:00
as2252258 4b16d82bb9 改名 2021-08-05 16:15:42 +08:00
as2252258 dca2948371 改名 2021-08-05 16:10:12 +08:00
as2252258 ab2aed3387 改名 2021-08-05 16:08:10 +08:00
as2252258 18ad158655 改名 2021-08-05 16:07:02 +08:00
as2252258 e03f8427ed 改名 2021-08-05 16:04:59 +08:00
as2252258 300a016dd2 改名 2021-08-05 16:01:51 +08:00
as2252258 c17a1cfcc6 改名 2021-08-05 15:56:43 +08:00
as2252258 6b9ef31df8 改名 2021-08-05 15:55:27 +08:00
as2252258 a9e172b975 改名 2021-08-05 15:34:53 +08:00
as2252258 277e3cc13e 改名 2021-08-05 15:30:23 +08:00
as2252258 ad5d636937 改名 2021-08-05 15:26:58 +08:00
as2252258 e71fc2e809 改名 2021-08-05 15:24:27 +08:00
as2252258 cbab515ad7 改名 2021-08-05 15:21:44 +08:00
as2252258 ba00de55cf 改名 2021-08-05 15:15:42 +08:00
as2252258 5f57b77a53 改名 2021-08-05 14:54:32 +08:00
as2252258 6e968a6fbd 改名 2021-08-05 14:14:08 +08:00
as2252258 93f4941821 改名 2021-08-05 14:13:06 +08:00
as2252258 0ccad9bbff 改名 2021-08-05 14:12:03 +08:00
as2252258 517fb75637 改名 2021-08-05 14:10:52 +08:00
as2252258 110f02dbf8 改名 2021-08-05 13:55:40 +08:00
as2252258 4753a99824 改名 2021-08-05 13:54:33 +08:00
as2252258 10e4c6ce95 改名 2021-08-05 13:52:43 +08:00
as2252258 15716e903f 改名 2021-08-05 13:52:09 +08:00
as2252258 d1ef94d81a 改名 2021-08-05 13:50:51 +08:00
as2252258 b69d54c827 改名 2021-08-05 13:49:28 +08:00
as2252258 747b83aa4e 改名 2021-08-05 13:48:34 +08:00
as2252258 7062f625d3 改名 2021-08-05 13:48:21 +08:00
as2252258 a9510ee353 改名 2021-08-05 13:47:47 +08:00
as2252258 fa34e2eec0 改名 2021-08-05 11:46:54 +08:00
as2252258 8035e95184 改名 2021-08-05 11:45:47 +08:00
as2252258 deae5457aa 改名 2021-08-05 11:45:14 +08:00
as2252258 b0a585ac3e 改名 2021-08-05 11:42:27 +08:00
as2252258 ae246a42d1 改名 2021-08-05 11:41:18 +08:00
as2252258 d2c1d130c9 改名 2021-08-05 11:40:29 +08:00
as2252258 40a7d8f123 改名 2021-08-05 11:39:04 +08:00
as2252258 1fc24197af 改名 2021-08-05 11:34:37 +08:00
as2252258 3375db806e 改名 2021-08-05 11:34:10 +08:00
as2252258 dae8e52d07 改名 2021-08-05 11:33:23 +08:00
as2252258 9162b02766 改名 2021-08-05 11:23:31 +08:00
as2252258 78d1d4f279 改名 2021-08-05 11:21:11 +08:00
as2252258 1985bf4e38 改名 2021-08-05 11:19:12 +08:00
as2252258 a79997e6cc 改名 2021-08-05 10:21:15 +08:00
as2252258@163.com 2e8f58615e modify 2021-08-05 00:59:19 +08:00
as2252258@163.com 8b638abf13 modify 2021-08-05 00:57:45 +08:00
as2252258 1d68177cb9 改名 2021-08-04 18:23:13 +08:00
as2252258 23154fc83e 改名 2021-08-04 18:22:00 +08:00
as2252258 6a8107a879 改名 2021-08-04 18:20:59 +08:00
as2252258 b7ae11104e 改名 2021-08-04 18:16:52 +08:00
as2252258 2449b15fc8 改名 2021-08-04 18:15:19 +08:00
as2252258 3fd86129c2 改名 2021-08-04 18:13:45 +08:00
as2252258 6b7e307948 改名 2021-08-04 18:09:37 +08:00
as2252258 d43bc87268 改名 2021-08-04 17:51:33 +08:00
as2252258 3516a8bae0 改名 2021-08-04 17:49:45 +08:00
as2252258 6c21c597cc 改名 2021-08-04 17:32:14 +08:00
as2252258 a7695a2dbd 改名 2021-08-04 17:17:22 +08:00
as2252258 819e96abf3 改名 2021-08-04 17:13:26 +08:00
as2252258 6ccd53562b 改名 2021-08-04 17:02:02 +08:00
as2252258 52f97eaf4c 改名 2021-08-04 17:01:17 +08:00
as2252258 f591fda712 改名 2021-08-04 17:00:49 +08:00
as2252258 b71bdb6ca8 改名 2021-08-04 16:59:20 +08:00
as2252258 a04b4447b2 改名 2021-08-04 16:58:10 +08:00
as2252258 49ffb1386e 改名 2021-08-04 16:57:28 +08:00
as2252258 2bbf422bb2 改名 2021-08-04 16:57:14 +08:00
as2252258 3ccc313fe5 改名 2021-08-04 16:55:03 +08:00
as2252258 c011c39bbc 改名 2021-08-04 16:54:37 +08:00
as2252258 1a5759448e 改名 2021-08-04 16:53:37 +08:00
as2252258 113684c7db 改名 2021-08-04 16:53:14 +08:00
as2252258 bfacb6333e 改名 2021-08-04 16:52:23 +08:00
as2252258 4756e44cdb 改名 2021-08-04 16:49:47 +08:00
as2252258 e353fbc41e 改名 2021-08-04 16:39:39 +08:00
as2252258 98ada1938e 改名 2021-08-04 16:38:48 +08:00
as2252258 1b0df626c4 改名 2021-08-04 16:35:20 +08:00
as2252258 0367ac2c6c 改名 2021-08-04 16:32:28 +08:00
as2252258 2507c49e67 改名 2021-08-04 16:27:23 +08:00
as2252258 7f14a5ed4d 改名 2021-08-04 16:02:13 +08:00
as2252258 4fe0728551 改名 2021-08-04 15:57:18 +08:00
as2252258 8d95f88112 改名 2021-08-04 15:56:27 +08:00
as2252258 1bd06a4350 改名 2021-08-04 15:55:42 +08:00
as2252258 4a861f18e8 改名 2021-08-04 15:54:38 +08:00
as2252258 d5591b8d42 改名 2021-08-04 15:53:13 +08:00
as2252258 c361c03ae5 改名 2021-08-04 15:52:01 +08:00
as2252258 11686389da 改名 2021-08-04 15:50:55 +08:00
as2252258 a32e8b6024 改名 2021-08-04 15:48:46 +08:00
as2252258 b2bfe5781e 改名 2021-08-04 15:45:37 +08:00
as2252258 9589a394eb 改名 2021-08-04 15:39:06 +08:00
as2252258 9f9d19415d 改名 2021-08-04 15:33:42 +08:00
as2252258 3c0e687a6d 改名 2021-08-04 15:32:48 +08:00
as2252258 5366629e26 改名 2021-08-04 15:32:15 +08:00
as2252258 c2a974a58e 改名 2021-08-04 15:17:25 +08:00
as2252258 e227fd0729 改名 2021-08-04 15:02:46 +08:00
as2252258 55213b7624 改名 2021-08-04 15:00:49 +08:00
as2252258 6850b3af2e 改名 2021-08-04 14:58:10 +08:00
as2252258 fe2bf5a1d9 改名 2021-08-04 14:56:48 +08:00
as2252258 07e3f3f1e3 改名 2021-08-04 14:45:50 +08:00
as2252258 f112b19d8f 改名 2021-08-04 14:44:15 +08:00
as2252258 3ed3abeda2 改名 2021-08-04 14:38:20 +08:00
as2252258 31e741aa43 改名 2021-08-04 14:37:12 +08:00
as2252258 864c62c345 改名 2021-08-04 14:33:39 +08:00
as2252258 e479529347 改名 2021-08-04 14:05:00 +08:00
as2252258 24b0f8d944 改名 2021-08-04 11:25:01 +08:00
as2252258 0ec677106e 改名 2021-08-04 11:15:46 +08:00
as2252258 f77ce9878b 改名 2021-08-04 10:16:03 +08:00
as2252258 d688ca175b 改名 2021-08-04 10:15:18 +08:00
as2252258@163.com fa09277f1f modify 2021-08-04 03:00:23 +08:00
as2252258@163.com 9922f0ad60 modify 2021-08-04 02:57:46 +08:00
as2252258@163.com b58ac08dd0 modify 2021-08-04 02:55:38 +08:00
as2252258@163.com f5b53a653b modify 2021-08-04 02:53:35 +08:00
as2252258@163.com bb20446250 modify 2021-08-04 02:49:04 +08:00
as2252258@163.com d82cd47c01 modify 2021-08-04 02:46:50 +08:00
as2252258@163.com 29403b63b1 modify 2021-08-04 02:45:52 +08:00
as2252258@163.com 97c972b545 modify 2021-08-04 02:44:10 +08:00
as2252258@163.com ae5fd2b587 modify 2021-08-04 02:43:28 +08:00
as2252258@163.com 4f19878dd6 modify 2021-08-04 02:22:14 +08:00
as2252258@163.com 71af7bcfbd modify 2021-08-04 02:21:10 +08:00
as2252258@163.com 2e97b91c13 modify 2021-08-04 02:19:17 +08:00
as2252258@163.com 9e65b23120 modify 2021-08-04 02:17:20 +08:00
as2252258@163.com 54cff0fb5d modify 2021-08-04 02:03:20 +08:00
as2252258@163.com 72b5975bc8 modify 2021-08-04 02:02:21 +08:00
as2252258@163.com d5732c83b5 modify 2021-08-04 01:48:12 +08:00
as2252258@163.com 76e3308edd modify 2021-08-04 01:47:26 +08:00
as2252258@163.com e3f81d83b1 modify 2021-08-04 01:30:02 +08:00
as2252258@163.com da977a547a modify 2021-08-04 01:28:00 +08:00
as2252258@163.com 0d8b51507d modify 2021-08-04 01:26:11 +08:00
as2252258@163.com 8106600dd7 modify 2021-08-04 01:23:55 +08:00
as2252258@163.com 3f3027f09c modify 2021-08-04 01:18:30 +08:00
as2252258@163.com 99e27e964b modify 2021-08-04 01:16:25 +08:00
as2252258@163.com 14dc411096 modify 2021-08-04 01:14:18 +08:00
as2252258@163.com 724f3504d0 modify 2021-08-04 01:09:58 +08:00
as2252258@163.com fa4b1197c6 modify 2021-08-04 01:09:14 +08:00
as2252258@163.com f5204f01e6 modify 2021-08-04 01:07:45 +08:00
as2252258@163.com a2d8691d8c modify 2021-08-04 00:36:21 +08:00
as2252258@163.com 00a967d9fc modify 2021-08-04 00:35:07 +08:00
as2252258 46fdbace15 改名 2021-08-03 18:31:44 +08:00
as2252258 dcf5ac2a38 改名 2021-08-03 18:30:49 +08:00
as2252258 6f4664623b 改名 2021-08-03 18:28:32 +08:00
as2252258 633c20fdcd 改名 2021-08-03 18:27:28 +08:00
as2252258 b62bdceaf3 改名 2021-08-03 18:27:17 +08:00
as2252258 e787bb2351 改名 2021-08-03 18:26:11 +08:00
as2252258 432169fdea 改名 2021-08-03 18:22:36 +08:00
as2252258 7e3ca6da9c 改名 2021-08-03 18:21:56 +08:00
as2252258 157795fad4 改名 2021-08-03 18:20:44 +08:00
as2252258 5b28c52a10 改名 2021-08-03 18:18:09 +08:00
as2252258 324db2fa3f 改名 2021-08-03 15:27:06 +08:00
as2252258 f2cfae0583 改名 2021-08-03 15:20:09 +08:00
as2252258 c143995fbd 改名 2021-08-03 15:19:23 +08:00
as2252258 fed06d7728 改名 2021-08-03 15:13:12 +08:00
as2252258 e07d8ca163 改名 2021-08-03 14:15:54 +08:00
as2252258 a16f1004be 改名 2021-08-03 14:15:06 +08:00
as2252258 645fae72ae 改名 2021-08-03 14:13:39 +08:00
as2252258 2ebb787b74 改名 2021-08-03 14:06:47 +08:00
as2252258 5fc88d3076 改名 2021-08-03 13:49:47 +08:00
as2252258 ec6d706aeb 改名 2021-08-03 13:47:36 +08:00
as2252258 75bdfedc77 改名 2021-08-03 13:46:13 +08:00
as2252258 a1ee256cf5 改名 2021-08-03 12:39:48 +08:00
as2252258 c1c4f6c928 改名 2021-08-03 12:38:30 +08:00
as2252258 34b4c42873 改名 2021-08-03 11:57:27 +08:00
as2252258 e5d97e5a29 改名 2021-08-03 11:55:12 +08:00
as2252258 ffd685d8b4 改名 2021-08-03 11:45:39 +08:00
as2252258 72b8da4c7f 改名 2021-08-03 11:44:58 +08:00
as2252258 3f9b8d8e8c 改名 2021-08-03 11:08:56 +08:00
as2252258 03137da76e 改名 2021-08-03 11:08:43 +08:00
as2252258 4b7f8bd9bc 改名 2021-08-03 11:05:26 +08:00
as2252258 d0f2460e0c 改名 2021-08-03 11:04:09 +08:00
as2252258 39cfe4dc79 改名 2021-08-03 11:03:15 +08:00
as2252258 271ef211a9 改名 2021-08-03 11:02:28 +08:00
as2252258 537cb2dcf3 改名 2021-08-03 11:00:18 +08:00
as2252258 cb056899e6 改名 2021-08-03 10:59:18 +08:00
as2252258 a32d321f27 改名 2021-08-03 10:58:51 +08:00
as2252258 89ef862606 改名 2021-08-03 10:56:15 +08:00
as2252258 710a388123 改名 2021-08-03 10:54:59 +08:00
as2252258 7a28085378 改名 2021-08-03 10:54:19 +08:00
as2252258 3354756933 改名 2021-08-03 10:51:30 +08:00
as2252258 489ba0917f 改名 2021-08-03 10:50:07 +08:00
as2252258 1dfd429211 改名 2021-08-03 10:47:29 +08:00
as2252258 9a43c1990f 改名 2021-08-03 10:43:02 +08:00
as2252258 20bae71fd7 改名 2021-08-03 10:39:09 +08:00
as2252258 7a6104c735 改名 2021-08-03 10:37:52 +08:00
as2252258 a85382f92a 改名 2021-08-03 10:37:31 +08:00
as2252258 5059a87784 改名 2021-08-03 10:30:26 +08:00
as2252258 501c259580 改名 2021-08-03 10:25:22 +08:00
as2252258 1f20e88cdd 改名 2021-08-03 10:25:12 +08:00
as2252258@163.com 804011a5ea modify 2021-08-03 02:50:11 +08:00
as2252258@163.com 929ffc2113 modify 2021-08-03 02:49:57 +08:00
as2252258@163.com 9cd7241196 modify 2021-08-03 02:43:40 +08:00
as2252258@163.com 82b54a9069 modify 2021-08-03 02:41:56 +08:00
as2252258@163.com 1de1f50b1f modify 2021-08-03 02:40:36 +08:00
as2252258@163.com 3c3bfb7f0b modify 2021-08-03 02:40:00 +08:00
as2252258@163.com 261c91f33d modify 2021-08-03 02:36:42 +08:00
as2252258@163.com e3b9b6f81b modify 2021-08-03 02:35:54 +08:00
as2252258@163.com 61308c5b41 modify 2021-08-03 02:33:56 +08:00
as2252258@163.com ee46d1e941 modify 2021-08-03 02:32:59 +08:00
as2252258@163.com 0d415dac54 modify 2021-08-03 02:28:55 +08:00
as2252258@163.com 0eec5cb298 modify 2021-08-03 02:26:15 +08:00
as2252258@163.com d9d68c9491 modify 2021-08-03 02:25:20 +08:00
as2252258@163.com 1b98b0aa8c modify 2021-08-03 02:24:05 +08:00
as2252258@163.com c4ca8f1e4b modify 2021-08-03 01:39:19 +08:00
as2252258@163.com 9697c7783a modify 2021-08-03 01:37:33 +08:00
as2252258@163.com 6f09f68dbb modify 2021-08-03 01:35:56 +08:00
as2252258@163.com d245ac394c modify 2021-08-03 01:26:56 +08:00
as2252258@163.com f032388d38 modify 2021-08-03 01:24:03 +08:00
as2252258@163.com 3a1f15d9f0 modify 2021-08-03 00:57:02 +08:00
as2252258@163.com e0ebeb8974 modify 2021-08-03 00:47:55 +08:00
as2252258@163.com 5ead904ccc modify 2021-08-03 00:45:08 +08:00
as2252258@163.com 74d9766be2 modify 2021-08-03 00:42:56 +08:00
as2252258 6bbd153c6a 改名 2021-08-02 19:06:44 +08:00
as2252258 8a4c5dab54 改名 2021-08-02 18:51:13 +08:00
as2252258 a5240de569 改名 2021-08-02 18:47:37 +08:00
as2252258 7fd9d62581 改名 2021-08-02 18:46:40 +08:00
as2252258 4a52c2b590 改名 2021-08-02 18:45:24 +08:00
as2252258 8a84804416 改名 2021-08-02 18:44:51 +08:00
as2252258 ce1952d796 改名 2021-08-02 18:43:12 +08:00
as2252258 5b473b2d5a 改名 2021-08-02 18:37:22 +08:00
as2252258 12f8c0d723 改名 2021-08-02 18:36:53 +08:00
as2252258 b4d39f465f 改名 2021-08-02 18:36:19 +08:00
as2252258 290286e1a9 改名 2021-08-02 18:29:42 +08:00
as2252258 b1081dd079 改名 2021-08-02 18:20:02 +08:00
as2252258 d23b9384b0 改名 2021-08-02 18:18:22 +08:00
as2252258 7c4dd74609 改名 2021-08-02 18:15:00 +08:00
as2252258 f1a7928192 改名 2021-08-02 18:12:32 +08:00
as2252258 3fb79847ce 改名 2021-08-02 17:32:51 +08:00
as2252258 9ad35eb88a 改名 2021-08-02 17:31:24 +08:00
as2252258 a095c94e21 改名 2021-08-02 16:38:50 +08:00
as2252258 fd7415b7f1 改名 2021-08-02 11:20:41 +08:00
as2252258 2150dcab44 改名 2021-08-02 11:18:03 +08:00
as2252258 8907e1cb69 改名 2021-08-02 11:15:38 +08:00
as2252258 0de470d446 改名 2021-08-02 11:15:06 +08:00
as2252258 6182a6922a 改名 2021-08-02 11:13:11 +08:00
as2252258 ab27ae6a6d 改名 2021-08-02 11:10:07 +08:00
as2252258 e148c425fa 改名 2021-08-02 11:09:39 +08:00
as2252258 9ffb1e5057 改名 2021-08-02 11:07:15 +08:00
as2252258 f9cf3640ff 改名 2021-08-02 10:30:13 +08:00
as2252258 68db46e4cc 改名 2021-08-02 10:29:55 +08:00
as2252258 be3ce48e92 改名 2021-08-02 10:28:12 +08:00
as2252258 b71b45c5c8 改名 2021-08-01 19:04:34 +08:00
as2252258 822f7a7f36 改名 2021-08-01 16:35:07 +08:00
as2252258 149cdd7d96 改名 2021-08-01 16:31:46 +08:00
as2252258 08a5361321 改名 2021-08-01 16:08:32 +08:00
as2252258 3d190ae839 改名 2021-08-01 16:05:55 +08:00
as2252258 c33a5af377 改名 2021-08-01 15:32:28 +08:00
as2252258 3ecc305238 改名 2021-08-01 15:27:47 +08:00
as2252258 0eea1d7963 改名 2021-08-01 15:25:59 +08:00
as2252258 c2aa3ae44a 改名 2021-08-01 15:19:01 +08:00
as2252258 e91dd1aa12 改名 2021-08-01 15:18:27 +08:00
as2252258 ea4e6e9651 改名 2021-08-01 15:16:50 +08:00
as2252258 ff1f891ec3 改名 2021-08-01 15:14:29 +08:00
as2252258 5269fd2679 改名 2021-08-01 15:11:38 +08:00
as2252258 355b1bce2b 改名 2021-08-01 15:10:42 +08:00
as2252258 803532a14e 改名 2021-08-01 15:09:15 +08:00
as2252258 7fdd2f4e9f 改名 2021-08-01 15:08:30 +08:00
as2252258 f1a3b7a8ca 改名 2021-08-01 15:07:55 +08:00
as2252258 91f9be1443 改名 2021-08-01 15:06:57 +08:00
as2252258 761fa4653b 改名 2021-08-01 15:06:02 +08:00
as2252258 a1e1021b3b 改名 2021-08-01 15:05:28 +08:00
as2252258 3d314cc76f 改名 2021-08-01 15:03:49 +08:00
as2252258 57e5bd000a 改名 2021-08-01 14:08:41 +08:00
as2252258 7700c16b56 改名 2021-08-01 11:24:52 +08:00
as2252258 a0f1d7d933 改名 2021-08-01 11:18:09 +08:00
as2252258 eb08fbaa0b 改名 2021-07-30 17:53:15 +08:00
as2252258 b13ab488cc 改名 2021-07-30 17:52:09 +08:00
as2252258 677f771b3b 改名 2021-07-29 13:51:54 +08:00
as2252258 2bd3dd6bb6 改名 2021-07-29 11:50:33 +08:00
as2252258 ec8fa8381b 改名 2021-07-28 19:20:16 +08:00
as2252258 b7cc3f9158 改名 2021-07-28 14:11:33 +08:00
as2252258 aaada7e5ab 改名 2021-07-28 14:10:24 +08:00
as2252258 312c17bbe2 改名 2021-07-28 14:09:39 +08:00
as2252258 e5f1ed5f56 改名 2021-07-28 14:00:38 +08:00
as2252258 0ff1a4fcc4 改名 2021-07-28 13:59:06 +08:00
as2252258 849a326d4b 改名 2021-07-28 13:51:28 +08:00
as2252258 27a03777c3 改名 2021-07-28 11:46:26 +08:00
as2252258 377ff2ed5b 改名 2021-07-28 11:45:20 +08:00
as2252258 6994c109d2 改名 2021-07-28 11:04:08 +08:00
as2252258@163.com a6731f4a03 modify 2021-07-28 02:07:52 +08:00
as2252258@163.com 17ea843ddf modify 2021-07-28 01:49:52 +08:00
as2252258@163.com bab9f9d6f7 modify 2021-07-28 01:45:49 +08:00
as2252258@163.com bc5eeeac25 modify 2021-07-28 01:43:17 +08:00
as2252258@163.com 8c59fc3856 modify 2021-07-28 01:41:51 +08:00
as2252258@163.com 88501d3b35 modify 2021-07-28 01:40:55 +08:00
as2252258@163.com 5ae926a415 modify 2021-07-28 01:35:08 +08:00
as2252258@163.com 3f0e116fb2 modify 2021-07-28 01:33:45 +08:00
as2252258 d2580b69ec 改名 2021-07-27 19:38:36 +08:00
as2252258 e6d51ce85c 改名 2021-07-27 19:17:12 +08:00
as2252258 3c15820e78 改名 2021-07-27 19:14:46 +08:00
as2252258 59498620a0 改名 2021-07-27 18:51:11 +08:00
as2252258 e1547e58f8 改名 2021-07-27 18:50:24 +08:00
as2252258 a4160b78f2 改名 2021-07-27 18:37:08 +08:00
as2252258 0510c1af41 改名 2021-07-27 18:34:57 +08:00
as2252258 2beaa726cd 改名 2021-07-27 18:32:24 +08:00
as2252258 d7f068fdbf 改名 2021-07-27 18:26:55 +08:00
as2252258 6143eb68a8 改名 2021-07-27 18:25:48 +08:00
as2252258 be4128e359 改名 2021-07-27 18:22:32 +08:00
as2252258 bd37881db7 改名 2021-07-27 18:21:30 +08:00
as2252258 74532d2509 改名 2021-07-27 17:27:56 +08:00
as2252258 6bb24e5b42 改名 2021-07-27 17:13:32 +08:00
as2252258 d0cecaddb6 改名 2021-07-27 17:04:44 +08:00
as2252258 50e1abbc65 改名 2021-07-27 17:02:01 +08:00
as2252258 d556fb11c4 改名 2021-07-27 16:41:51 +08:00
as2252258 1991550f49 改名 2021-07-27 16:33:29 +08:00
as2252258 7d967d2762 改名 2021-07-27 16:29:47 +08:00
as2252258 65aaebef0b 改名 2021-07-27 16:22:49 +08:00
as2252258 4b15596d37 改名 2021-07-27 16:18:19 +08:00
as2252258 887209cfaa 改名 2021-07-27 16:15:28 +08:00
as2252258 a36f876792 改名 2021-07-27 16:08:16 +08:00
as2252258 ef423dc1b8 改名 2021-07-27 14:24:24 +08:00
as2252258 f0b44d28a9 改名 2021-07-27 14:20:38 +08:00
as2252258 c251fa7bec 改名 2021-07-27 14:19:56 +08:00
as2252258 8ee27b9b14 改名 2021-07-27 14:15:08 +08:00
as2252258 dcb588e02d 改名 2021-07-27 14:11:04 +08:00
as2252258 b0362ea68f 改名 2021-07-27 14:10:54 +08:00
as2252258 9e36ea7983 改名 2021-07-27 14:08:55 +08:00
as2252258@163.com d9a279ba2b modify 2021-07-27 04:22:53 +08:00
as2252258@163.com c22eba6217 modify 2021-07-27 04:21:09 +08:00
as2252258@163.com 4183ded30c modify 2021-07-27 04:17:57 +08:00
as2252258@163.com 903f70fc8f modify 2021-07-27 04:16:42 +08:00
as2252258@163.com 2e0b436e73 modify 2021-07-27 03:38:59 +08:00
as2252258@163.com a347b88c7c modify 2021-07-27 03:37:33 +08:00
as2252258@163.com fae8c48fa7 modify 2021-07-27 03:36:21 +08:00
as2252258@163.com 1a0cc394f3 modify 2021-07-27 03:34:36 +08:00
as2252258@163.com fdbca3d7ad modify 2021-07-27 03:33:49 +08:00
as2252258@163.com c147816549 modify 2021-07-27 03:32:21 +08:00
as2252258@163.com ce70af484d modify 2021-07-27 03:31:18 +08:00
as2252258@163.com 4e3b41331d modify 2021-07-27 03:30:55 +08:00
as2252258@163.com 22fa0d292c modify 2021-07-27 00:42:16 +08:00
as2252258@163.com 5bc3f7c648 modify 2021-07-27 00:41:00 +08:00
as2252258@163.com 55e3e94b52 modify 2021-07-27 00:37:02 +08:00
as2252258@163.com b89554b6c6 modify 2021-07-27 00:35:50 +08:00
as2252258@163.com 170de0b822 modify 2021-07-26 17:05:41 +08:00
as2252258@163.com 7e701fa7cb modify 2021-07-26 16:08:26 +08:00
as2252258@163.com 159aa4adf3 modify 2021-07-26 12:51:13 +08:00
as2252258@163.com 6e64f102b9 modify 2021-07-26 12:50:35 +08:00
as2252258@163.com 95c9e878a5 modify 2021-07-26 12:48:31 +08:00
as2252258@163.com 60382f2b97 modify 2021-07-26 12:37:01 +08:00
as2252258@163.com cf5557694e modify 2021-07-26 12:31:30 +08:00
as2252258@163.com 826b3b2102 modify 2021-07-26 04:59:03 +08:00
as2252258@163.com abdaeb3e08 modify 2021-07-26 04:22:23 +08:00
as2252258@163.com 6c78b4ee3b modify 2021-07-26 04:15:21 +08:00
as2252258@163.com c91a4534f0 modify 2021-07-26 04:14:03 +08:00
as2252258@163.com c9b16cd4db modify 2021-07-26 04:12:09 +08:00
as2252258@163.com 4a80ba1351 modify 2021-07-26 03:56:44 +08:00
as2252258@163.com 47bf22324b modify 2021-07-26 03:48:22 +08:00
as2252258@163.com 7b1c9b2816 modify 2021-07-26 03:46:55 +08:00
as2252258@163.com c812f9c110 modify 2021-07-26 03:45:46 +08:00
as2252258@163.com d56c2bba9e modify 2021-07-26 03:18:09 +08:00
as2252258@163.com b8f8d9162c modify 2021-07-26 02:58:45 +08:00
as2252258@163.com 2e4e79cef2 modify 2021-07-26 02:55:55 +08:00
as2252258@163.com 5fa407d697 modify 2021-07-26 02:50:04 +08:00
as2252258@163.com 633cd1b140 modify 2021-07-26 02:11:12 +08:00
as2252258@163.com 6d49bffcfe modify 2021-07-26 01:30:50 +08:00
as2252258@163.com 82350f3c81 modify 2021-07-26 01:22:57 +08:00
as2252258@163.com f1e2fc3b42 modify 2021-07-26 01:19:34 +08:00
as2252258@163.com dd4f460e57 modify 2021-07-25 13:30:08 +08:00
as2252258 81a316377b 改名 2021-07-23 18:19:12 +08:00
as2252258 4a3b74950e 改名 2021-07-23 18:13:44 +08:00
as2252258 0b846865c9 改名 2021-07-23 18:12:46 +08:00
as2252258 cfa2d8f8fb 改名 2021-07-23 18:09:52 +08:00
as2252258 f9a85d69f4 改名 2021-07-23 18:08:10 +08:00
as2252258 80ecf1c3da 改名 2021-07-23 18:02:48 +08:00
as2252258 7106b114f1 改名 2021-07-23 18:00:18 +08:00
as2252258 cb04fccbd2 改名 2021-07-23 17:58:24 +08:00
as2252258 b7d0b0c3d6 改名 2021-07-23 17:54:08 +08:00
as2252258 e57e600945 改名 2021-07-23 17:38:09 +08:00
as2252258 b12ebb9c7e 改名 2021-07-23 17:17:58 +08:00
as2252258 d1877d78a7 改名 2021-07-23 17:12:20 +08:00
as2252258 93519c3c57 改名 2021-07-23 11:55:02 +08:00
as2252258 4fbbfb37e4 改名 2021-07-23 10:59:41 +08:00
as2252258 41b8969b02 改名 2021-07-23 10:55:18 +08:00
as2252258 793eddad32 改名 2021-07-23 10:54:53 +08:00
as2252258 7ab08af442 改名 2021-07-23 10:48:18 +08:00
as2252258 5bf0607460 改名 2021-07-23 10:42:13 +08:00
as2252258 102bc35016 改名 2021-07-23 10:38:03 +08:00
as2252258 7b085c67c6 Merge remote-tracking branch 'origin/master' 2021-07-23 10:36:14 +08:00
as2252258 a3caaafd69 改名 2021-07-23 10:36:11 +08:00
as2252258@163.com 9b92aa46e6 modify 2021-07-23 02:03:47 +08:00
as2252258 c8b7476b5d 改名 2021-07-22 18:22:29 +08:00
as2252258 65af1f2933 改名 2021-07-22 18:20:27 +08:00
as2252258 7265ef854a 改名 2021-07-22 17:53:39 +08:00
as2252258 0b05eb1a27 改名 2021-07-22 17:53:19 +08:00
as2252258 decb85b493 改名 2021-07-22 16:04:47 +08:00
as2252258 2edeacdd16 改名 2021-07-22 16:02:18 +08:00
as2252258 4102c309de 改名 2021-07-22 16:01:54 +08:00
as2252258 6331e1fd5a 改名 2021-07-22 16:00:05 +08:00
as2252258 7293c70dca 改名 2021-07-22 15:57:17 +08:00
as2252258 de937ace09 改名 2021-07-21 19:05:11 +08:00
as2252258 7dd1322ea4 改名 2021-07-21 18:58:34 +08:00
as2252258 52fdb0e89c 改名 2021-07-21 18:56:05 +08:00
as2252258 68c8850922 改名 2021-07-21 18:52:25 +08:00
as2252258 718ad85313 改名 2021-07-21 18:52:04 +08:00
as2252258 1e6333a18e 改名 2021-07-21 18:50:40 +08:00
as2252258 b99551e326 改名 2021-07-21 17:57:11 +08:00
as2252258 ad43351306 改名 2021-07-21 17:55:34 +08:00
as2252258 503a188dd7 改名 2021-07-21 17:02:50 +08:00
as2252258 3f61f5423e 改名 2021-07-21 16:26:30 +08:00
as2252258 43794de52b 改名 2021-07-21 16:08:49 +08:00
as2252258 cbb3deda1f 改名 2021-07-21 16:08:05 +08:00
as2252258 fd2e76944e 改名 2021-07-21 16:07:04 +08:00
as2252258 a81338cbe3 改名 2021-07-21 16:03:48 +08:00
as2252258 b57ada8703 改名 2021-07-21 15:58:50 +08:00
as2252258 ee0111ad0c 改名 2021-07-21 15:58:33 +08:00
as2252258 0c20f975de 改名 2021-07-21 15:40:11 +08:00
as2252258 8c221e9e0e 改名 2021-07-21 15:37:33 +08:00
as2252258 8093c6ab3b 改名 2021-07-21 15:35:40 +08:00
as2252258 db3e6aadc7 改名 2021-07-21 15:18:31 +08:00
as2252258 452f2e8766 改名 2021-07-21 15:13:38 +08:00
as2252258 271dd20c16 改名 2021-07-21 14:46:48 +08:00
as2252258 cb70c7f885 改名 2021-07-21 14:43:51 +08:00
as2252258 8d83dedd2b 改名 2021-07-21 14:30:34 +08:00
as2252258 270a7ca961 改名 2021-07-21 14:27:31 +08:00
as2252258 98cf8ff17d 改名 2021-07-21 14:11:20 +08:00
as2252258 fd51902c31 改名 2021-07-21 14:07:55 +08:00
as2252258 f809bba0f4 改名 2021-07-21 13:59:31 +08:00
as2252258 a0d576ed91 改名 2021-07-21 13:54:28 +08:00
as2252258 cf052cb46b 改名 2021-07-21 13:51:52 +08:00
as2252258 d7302ceba5 改名 2021-07-21 13:49:55 +08:00
as2252258 088745109f 改名 2021-07-21 11:46:43 +08:00
as2252258 37b9731c24 改名 2021-07-21 11:38:32 +08:00
as2252258 2520407b44 改名 2021-07-21 11:37:43 +08:00
as2252258 2b865ef222 改名 2021-07-21 11:32:14 +08:00
as2252258 2214c634b4 改名 2021-07-21 11:29:35 +08:00
as2252258 226094f844 改名 2021-07-21 11:28:57 +08:00
as2252258 8f6079b040 改名 2021-07-21 11:25:31 +08:00
as2252258 3b05c856ef 改名 2021-07-20 18:20:57 +08:00
as2252258 4fb0b9b0e9 改名 2021-07-20 16:38:51 +08:00
as2252258 2d2be272ff 改名 2021-07-20 16:12:20 +08:00
as2252258 67060012cc 改名 2021-07-20 11:50:55 +08:00
as2252258 f87c437d60 改名 2021-07-20 11:48:41 +08:00
as2252258 4164104918 改名 2021-07-20 11:44:47 +08:00
as2252258 808e91a38b 改名 2021-07-20 11:43:14 +08:00
as2252258 c38c406cde 改名 2021-07-20 11:42:50 +08:00
as2252258 939ceba776 改名 2021-07-20 11:41:00 +08:00
as2252258 1897254498 改名 2021-07-20 11:37:17 +08:00
as2252258 e864df5129 改名 2021-07-20 11:35:17 +08:00
as2252258 7c88c486d8 改名 2021-07-20 11:31:09 +08:00
as2252258 02c6dd37d7 改名 2021-07-20 11:29:18 +08:00
as2252258 ea48a33b33 改名 2021-07-20 11:28:19 +08:00
as2252258 9a1a55471b 改名 2021-07-20 11:24:15 +08:00
as2252258 7cb402d2bc 改名 2021-07-20 11:22:08 +08:00
as2252258@163.com 43d0596c12 modify 2021-07-20 01:57:37 +08:00
as2252258@163.com 46bcbb4f4b modify 2021-07-20 01:56:04 +08:00
as2252258@163.com d5cc4c2d64 modify 2021-07-20 01:40:55 +08:00
as2252258@163.com b0f2b1077e modify 2021-07-20 01:37:16 +08:00
as2252258 b369e5c492 改名 2021-07-19 19:04:13 +08:00
as2252258@163.com 5aa94c1a25 modify 2021-07-18 12:06:56 +08:00
as2252258@163.com 6f4ed54579 modify 2021-07-18 12:01:09 +08:00
as2252258@163.com a5b2445ec2 modify 2021-07-18 01:01:29 +08:00
as2252258 51c3637ed2 改名 2021-07-17 02:16:49 +08:00
as2252258@163.com 878b167d95 modify 2021-07-16 01:25:19 +08:00
as2252258 5690f5a5bc 改名 2021-07-15 19:04:00 +08:00
as2252258 68e331a960 改名 2021-07-13 18:03:08 +08:00
as2252258 3009c3fcf0 改名 2021-07-13 17:15:07 +08:00
as2252258 250b5b0928 改名 2021-07-13 17:06:08 +08:00
as2252258 661fc54ba2 改名 2021-07-13 16:57:57 +08:00
as2252258 52bc8eef02 改名 2021-07-13 16:35:57 +08:00
as2252258 71503fbdcc 改名 2021-07-13 16:20:09 +08:00
as2252258 6b3be1b0f9 改名 2021-07-13 11:28:12 +08:00
as2252258 e42c2b442f 改名 2021-07-13 10:53:31 +08:00
as2252258 ce1f7f34e5 改名 2021-07-12 18:59:04 +08:00
as2252258 522fb3201a 改名 2021-07-12 18:56:16 +08:00
as2252258 69e41f4597 改名 2021-07-12 18:54:52 +08:00
as2252258 49f358fa93 改名 2021-07-12 18:51:41 +08:00
as2252258 16b300b139 改名 2021-07-12 18:15:58 +08:00
as2252258 98a39dff91 改名 2021-07-12 17:48:05 +08:00
as2252258 6a4d1ec3da 改名 2021-07-12 17:46:21 +08:00
as2252258 4736478ddf 改名 2021-07-12 17:45:04 +08:00
as2252258 25c00ea088 改名 2021-07-12 17:41:23 +08:00
as2252258 e8c2bec566 改名 2021-07-12 17:39:09 +08:00
as2252258 a7dfb571eb 改名 2021-07-12 17:22:57 +08:00
as2252258 857ec53870 改名 2021-07-12 17:17:36 +08:00
as2252258 f2083f1eaf 改名 2021-07-12 11:42:33 +08:00
as2252258 99f7ebd712 改名 2021-07-12 11:24:33 +08:00
as2252258 20fbbeb666 改名 2021-07-12 10:13:53 +08:00
as2252258@163.com efb231a765 modify 2021-07-11 14:16:12 +08:00
as2252258@163.com bfb71139a5 modify 2021-07-11 14:14:16 +08:00
as2252258@163.com b30abb50d5 modify 2021-07-11 04:52:28 +08:00
as2252258@163.com bd1a34985b modify 2021-07-11 04:48:14 +08:00
as2252258@163.com 338d244560 modify 2021-07-11 04:47:15 +08:00
as2252258@163.com c48c8b622f modify 2021-07-11 04:46:18 +08:00
as2252258@163.com 1d1196207a modify 2021-07-11 04:45:16 +08:00
as2252258@163.com 6b6801bfcd modify 2021-07-11 04:35:47 +08:00
as2252258@163.com 3a50245ddf modify 2021-07-11 04:33:28 +08:00
as2252258@163.com 0fcffb5da5 modify 2021-07-11 04:32:29 +08:00
as2252258@163.com c222176bc1 modify 2021-07-11 04:31:36 +08:00
as2252258@163.com 22b9593de9 modify 2021-07-11 04:31:15 +08:00
as2252258@163.com 6ac65948db modify 2021-07-11 04:30:06 +08:00
as2252258@163.com d2d93054c8 modify 2021-07-11 04:27:56 +08:00
as2252258@163.com f09624f769 modify 2021-07-11 04:26:52 +08:00
as2252258@163.com 6df5cb10ef modify 2021-07-11 04:26:10 +08:00
as2252258@163.com 98850e5157 modify 2021-07-11 04:20:42 +08:00
as2252258@163.com f1baed32b6 modify 2021-07-11 04:20:28 +08:00
as2252258@163.com a142c1e951 modify 2021-07-11 04:19:00 +08:00
as2252258@163.com b688ec789e modify 2021-07-11 04:18:08 +08:00
as2252258@163.com 9fae1ed0e1 modify 2021-07-11 04:14:26 +08:00
as2252258@163.com b35b3862fd modify 2021-07-11 04:13:25 +08:00
as2252258@163.com 27c7878647 modify 2021-07-11 04:10:50 +08:00
as2252258@163.com f8abead728 modify 2021-07-11 04:06:38 +08:00
as2252258@163.com ca50c16f88 modify 2021-07-11 04:05:15 +08:00
as2252258@163.com 6d0b6f887d modify 2021-07-11 04:03:00 +08:00
as2252258@163.com cda768b721 modify 2021-07-11 03:59:52 +08:00
as2252258@163.com 12d547c1a2 modify 2021-07-11 03:57:25 +08:00
as2252258@163.com 27dc21e24e modify 2021-07-11 02:09:50 +08:00
as2252258@163.com 712e6b8f2a modify 2021-07-11 02:05:56 +08:00
as2252258 ec37380175 改名 2021-07-09 15:02:08 +08:00
as2252258 73cb94f657 改名 2021-07-09 14:38:49 +08:00
as2252258 b3ea8978b1 改名 2021-07-09 14:24:23 +08:00
as2252258 008a0914eb 改名 2021-07-09 13:55:52 +08:00
as2252258 01f8e16b38 改名 2021-07-09 13:41:06 +08:00
as2252258 c095b69f67 改名 2021-07-09 10:41:31 +08:00
as2252258 4c8c5ac239 改名 2021-07-09 10:36:45 +08:00
as2252258 cfc847133e 改名 2021-07-09 10:34:27 +08:00
as2252258 30b430f1cf 改名 2021-07-08 19:16:27 +08:00
as2252258 516c7612a5 改名 2021-07-08 18:02:21 +08:00
as2252258 3bb3d5a1d7 改名 2021-07-08 17:36:28 +08:00
as2252258 fb48a0b508 改名 2021-07-07 18:44:29 +08:00
as2252258 a3964faa72 改名 2021-07-07 18:39:03 +08:00
as2252258 0fea7ac770 改名 2021-07-07 18:37:43 +08:00
as2252258 7eccee5d16 改名 2021-07-07 18:36:20 +08:00
as2252258 565943b76f 改名 2021-07-07 17:51:02 +08:00
as2252258 adb95af124 改名 2021-07-07 14:11:17 +08:00
as2252258 b554b53cfd 改名 2021-07-07 14:07:27 +08:00
as2252258 0e0caaf8a9 改名 2021-07-07 14:04:05 +08:00
295 changed files with 5032 additions and 31555 deletions
+9 -9
View File
@@ -1,9 +1,9 @@
### 該問題是如何引起的?
### 重現步驟
### 報錯信息
### 該問題是如何引起的?
### 重現步驟
### 報錯信息
+12 -12
View File
@@ -1,12 +1,12 @@
### 該Pull Request關聯的Issue
### 修改描述
### 測試用例
### 修復效果的截屏
### 該Pull Request關聯的Issue
### 修改描述
### 測試用例
### 修復效果的截屏
+36 -34
View File
@@ -1,34 +1,36 @@
# Created by .ignore support plugin (hsz.mobi)
### Yii template
assets/*
!assets/.gitignore
protected/runtime/*
!protected/runtime/.gitignore
protected/data/*.db
themes/classic/views/
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen
composer.lock
*.log
commands/result
config/setting.php
tests/
vendor/
runtime/
*.xml
*.lock
oot
d
composer.lock
# Created by .ignore support plugin (hsz.mobi)
### Yii template
assets/*
!assets/.gitignore
protected/runtime/*
!protected/runtime/.gitignore
protected/data/*.db
themes/classic/views/
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen
db/
async-queue/
composer.lock
*.log
commands/result
config/setting.php
tests/
vendor/
runtime/
*.xml
*.lock
oot
d
composer.lock
+22
View File
@@ -0,0 +1,22 @@
<?php
namespace PHPSTORM_META {
// Reflect
use Kiri\Di\Container;
use Psr\Container\ContainerInterface;
use Psr\Container\ContainerInterface as SC;
use Psr\Http\Message\ServerRequestInterface;
override(ContainerInterface::get(0), map('@'));
override(SC::get(0), map('@'));
override(Container::get(0), map('@'));
override(Container::make(0), map('@'));
override(Container::create(0), map('@'));
// override(\Hyperf\Utils\Context::get(0), map('@'));
override(\make(0), map('@'));
override(\di(0), map('@'));
override(\duplicate(0), map('@'));
override(ServerRequestInterface::getAttribute(0), map('@'));
}
-206
View File
@@ -1,206 +0,0 @@
<?php
namespace Annotation;
use DirectoryIterator;
use Exception;
use Snowflake\Abstracts\Component;
/**
* Class Annotation
* @package Annotation
*/
class Annotation extends Component
{
private Loader $_loader;
private array $_model_sets = [];
private array $_model_gets = [];
private array $_model_relate = [];
/**
* @param string $class
* @param string $setName
* @param string $method
*/
public function addSets(string $class, string $setName, string $method)
{
$this->_model_sets[$class][$setName] = $method;
}
/**
* @param string $class
* @param string $setName
* @param string $method
*/
public function addGets(string $class, string $setName, string $method)
{
$this->_model_gets[$class][$setName] = $method;
}
/**
* @param string $class
* @param string $setName
* @param string $method
*/
public function addRelate(string $class, string $setName, string $method)
{
$this->_model_relate[$class][$setName] = $method;
}
/**
* @param $class
* @return array
*/
public function getGets($class): array
{
return $this->_model_gets[$class] ?? [];
}
/**
* @param $class
* @return array
*/
public function getSets($class): array
{
return $this->_model_gets[$class] ?? [];
}
/**
* @param string $class
* @param string|null $setName
* @return array|string|null
*/
public function getGetMethodName(string $class, string $setName = null): array|null|string
{
$gets = $this->_model_gets[$class] ?? null;
if ($gets == null) {
return null;
}
if (empty($setName)) return $gets;
return $gets[$setName] ?? null;
}
/**
* @param string $class
* @param string|null $method
* @return array|string|null
*/
public function getRelateMethods(string $class, string $method = null): array|null|string
{
$gets = $this->_model_relate[$class] ?? null;
if ($gets == null) {
return null;
}
if (empty($method)) return $gets;
return $gets[$method] ?? null;
}
/**
* @param string $class
* @param string $setName
* @return mixed|null
*/
public function getSetMethodName(string $class, string $setName): ?string
{
if (!isset($this->_model_sets[$class])) {
return null;
}
$lists = $this->_model_sets[$class];
if (isset($lists[$setName])) {
return $lists[$setName];
}
return null;
}
public function init(): void
{
$this->_loader = new Loader();
}
/**
* @return Loader
*/
public function getLoader(): Loader
{
return $this->_loader;
}
/**
* @param Loader $loader
* @return Loader
*/
public function setLoader(Loader $loader): Loader
{
return $this->_loader = $loader;
}
/**
* @param string $className
* @param string $method
* @return array 根据类名获取注解
* 根据类名获取注解
*/
public function getMethods(string $className, string $method = ''): mixed
{
return $this->_loader->getMethod($className, $method);
}
/**
* @param object $class
*/
public function injectProperty(object $class)
{
$this->_loader->injectProperty($class::class, $class);
}
/**
* @param string $path
* @param string $namespace
* @param string $alias
* @return void
* @throws Exception
*/
public function read(string $path, string $namespace = 'App', string $alias = 'root'): void
{
$this->_loader->_scanDir(new DirectoryIterator($path), $namespace);
}
/**
* @param string $dir
* @param string|array $outPath
* @throws Exception
*/
public function runtime(string $dir, string|array $outPath = '')
{
if (empty($outPath)) {
$outPath = [];
} else if (is_string($outPath)) {
$outPath = [$outPath];
}
$this->_loader->loadByDirectory($dir, $outPath);
}
}
-48
View File
@@ -1,48 +0,0 @@
<?php
namespace Annotation;
use Exception;
use Snowflake\Aop;
use Snowflake\IAspect;
use Snowflake\Snowflake;
defined('ASPECT_ERROR') or define('ASPECT_ERROR', 'Aspect annotation must implement ');
/**
* Class Aspect
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Aspect extends Attribute
{
/**
* Aspect constructor.
* @param string $aspect
*/
public function __construct(public string $aspect)
{
}
public function execute(mixed $class, mixed $method = ''): mixed
{
// TODO: Change the autogenerated stub
if (!in_array(IAspect::class, class_implements($this->aspect))) {
throw new Exception(ASPECT_ERROR . IAspect::class);
}
/** @var Aop $aop */
$aop = Snowflake::app()->get('aop');
$aop->aop_add([$class, $method], $this->aspect);
return true;
}
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace Annotation;
use Exception;
use HttpServer\IInterface\Task;
use Snowflake\Snowflake;
/**
* Class Asynchronous
* @package Annotation
* Task任务
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class Asynchronous extends Attribute
{
/**
* Asynchronous constructor.
* @param string $name
*/
public function __construct(public string $name)
{
}
/**
* @param array $handler
* @return bool
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): mixed
{
$async = Snowflake::app()->getAsync();
$async->addAsync($this->name, $class);
return true;
}
}
-32
View File
@@ -1,32 +0,0 @@
<?php
namespace Annotation;
use Annotation\Route\After;
use Annotation\Route\Interceptor;
use Annotation\Route\Limits;
use Annotation\Route\Middleware as RMiddleware;
use HttpServer\Route\Node;
use ReflectionException;
use Snowflake\Exception\ComponentException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Class Attribute
* @package Annotation
*/
abstract class Attribute implements IAnnotation
{
public function execute(mixed $class, mixed $method = ''): mixed
{
// TODO: Implement execute() method.
return true;
}
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace Annotation;
use Exception;
use Snowflake\Exception\ComponentException;
use Snowflake\Snowflake;
use Snowflake\Event as SEvent;
/**
* Class Event
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Event extends Attribute
{
/**
* Event constructor.
* @param string $name
* @param array $params
*/
public function __construct(public string $name, public array $params = [])
{
}
/**
* @param array $handler
* @return bool
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): mixed
{
// TODO: Implement execute() method.
SEvent::on($this->name, [$class, $method], $this->params);
return true;
}
}
-19
View File
@@ -1,19 +0,0 @@
<?php
namespace Annotation;
use Closure;
interface IAnnotation
{
/**
* @param array $handler
* @return mixed
*/
public function execute(mixed $class, mixed $method = ''): mixed;
}
-74
View File
@@ -1,74 +0,0 @@
<?php
namespace Annotation;
use Exception;
use ReflectionProperty;
use Snowflake\Snowflake;
/**
* Class Inject
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_PROPERTY)] class Inject extends Attribute
{
/**
* Inject constructor.
* @param string $className
* @param array $args
*/
public function __construct(private string $className, private array $args = [])
{
}
/**
* @param array $handler
* @return mixed
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): mixed
{
$injectValue = $this->parseInjectValue();
if (!($method instanceof ReflectionProperty)) {
$method = new ReflectionProperty($class, $method);
}
/** @var ReflectionProperty $class */
if ($method->isPrivate() || $method->isProtected()) {
$method = 'set' . ucfirst($class->getName());
if (!method_exists($class, $method)) {
return false;
}
$class->$method($injectValue);
} else {
$class->{$method->getName()} = $injectValue;
}
return true;
}
/**
* @return mixed
* @throws Exception
*/
private function parseInjectValue(): mixed
{
if (class_exists($this->className)) {
$injectValue = Snowflake::createObject($this->className, $this->args);
} else if (Snowflake::app()->has($this->className)) {
$injectValue = Snowflake::app()->get($this->className);
} else {
$injectValue = $this->className;
}
// if (!empty($this->args) && is_object($injectValue)) {
// Snowflake::configure($injectValue, $this->args);
// }
return $injectValue;
}
}
-47
View File
@@ -1,47 +0,0 @@
<?php
namespace Annotation;
use Kafka\ConsumerInterface;
use Kafka\TaskContainer;
use Snowflake\Snowflake;
/**
* Class Kafka
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class Kafka extends Attribute
{
/**
* Kafka constructor.
* @param string $topic
*/
public function __construct(public string $topic)
{
}
/**
* @param array $handler
* @return mixed
*/
public function execute(mixed $class, mixed $method = null): mixed
{
if (!($class instanceof ConsumerInterface)) {
return false;
}
/** @var TaskContainer $container */
$container = Snowflake::app()->get('kafka-container');
$container->addConsumer($this->topic, [$class, 'onHandler']);
return true;
}
}
-354
View File
@@ -1,354 +0,0 @@
<?php
namespace Annotation;
use Annotation\Model\Get;
use Annotation\Model\Relation;
use Annotation\Model\Set;
use Attribute;
use DirectoryIterator;
use Exception;
use ReflectionMethod;
use Snowflake\Abstracts\BaseObject;
use Snowflake\Snowflake;
use Throwable;
/**
* Class Loader
* @package Annotation
*/
class Loader extends BaseObject
{
private array $_classes = [];
private array $_directory = [];
/**
* @return array
*/
public function getDirectory(): array
{
return $this->_directory;
}
/**
* @param $path
* @param $namespace
* @throws Exception
*/
public function loader($path, $namespace)
{
$this->_scanDir(new DirectoryIterator($path), $namespace);
}
/**
* @return array
*/
public function getClasses(): array
{
return $this->_classes;
}
/**
* @param string $class
* @param string $property
* @return mixed
*/
public function getProperty(string $class, string $property = ''): mixed
{
if (!isset($this->_classes[$class])) {
return null;
}
$properties = $this->_classes[$class]['property'];
if (!empty($property) && isset($properties[$property])) {
return $properties[$property];
}
return $properties;
}
/**
* @param string $class
* @param mixed $handler
* @return Loader
*/
public function injectProperty(string $class, object $handler): static
{
$properties = $this->getProperty($class);
if (empty($properties)) {
return $this;
}
foreach ($properties as $property => $attributes) {
foreach ($attributes as $attribute) {
$attribute->execute($handler, $property);
}
}
return $this;
}
/**
* @param string $class
* @param string $method
* @return mixed
*/
public function getMethod(string $class, string $method = ''): array
{
if (!isset($this->_classes[$class])) {
return [];
}
$properties = $this->_classes[$class]['methods'];
if (!empty($method) && isset($properties[$method])) {
return $properties[$method];
}
return $properties;
}
/**
* @param string $class
* @return array
*/
public function getTarget(string $class): array
{
return $this->_classes[$class] ?? [];
}
/**
* @param DirectoryIterator $paths
* @param $namespace
* @throws Exception
*/
public function _scanDir(DirectoryIterator $paths, $namespace)
{
foreach ($paths as $path) {
if ($path->isDot() || str_starts_with($path->getFilename(), '.')) {
continue;
}
if ($path->isDir()) {
$iterator = new DirectoryIterator($path->getRealPath());
$directory = rtrim($path->getRealPath(), '/');
if (!isset($this->_directory[$directory])) {
$this->_directory[$directory] = [];
}
$this->_scanDir($iterator, $namespace);
} else {
$this->readFile($path, $namespace);
}
}
}
/**
* @param DirectoryIterator $path
* @param $namespace
* @throws Exception
*/
private function readFile(DirectoryIterator $path, $namespace)
{
try {
if ($path->getExtension() !== 'php') {
return;
}
$replace = $this->getReflect($path, $namespace);
if (empty($replace) || count($replace->getAttributes(Target::class)) < 1) {
return;
}
$this->appendFileToDirectory($path->getRealPath(), $replace->getName());
$_array['handler'] = $replace->newInstance();
$_array['target'] = [];
$_array['methods'] = [];
$_array['property'] = [];
$_array = $this->_targets($replace, $_array);
$_array = $this->_methods($replace, $_array);
$_array = $this->_properties($replace, $_array);
$this->_classes[$replace->getName()] = $_array;
} catch (Throwable $throwable) {
$this->addError($throwable, 'throwable');
}
}
/**
* @param string $path
* @param string $namespace
* @return \ReflectionClass|null
* @throws \ReflectionException
* @throws \Snowflake\Exception\NotFindClassException
*/
private function getReflect(DirectoryIterator $path, string $namespace): ?\ReflectionClass
{
return Snowflake::getDi()->getReflect($this->explodeFileName($path, $namespace));
}
/**
* @param \ReflectionClass $replace
* @param array $_array
* @return array
*/
private function _targets(\ReflectionClass $replace, array $_array): array
{
foreach ($replace->getAttributes() as $attribute) {
if ($attribute->getName() == Attribute::class) {
continue;
}
if ($attribute->getName() == Target::class) {
continue;
}
$_array['target'][] = $attribute->newInstance();
}
return $_array;
}
/**
* @param \ReflectionClass $replace
* @param array $_array
* @return array
*/
private function _methods(\ReflectionClass $replace, array $_array): array
{
$methods = $replace->getMethods(ReflectionMethod::IS_PUBLIC);
foreach ($methods as $method) {
$_method = [];
foreach ($method->getAttributes() as $attribute) {
if (!class_exists($attribute->getName())) {
continue;
}
$_method[] = $attribute->newInstance();
}
$_array['methods'][$method->getName()] = $_method;
}
return $_array;
}
/**
* @param \ReflectionClass $replace
* @param array $_array
* @return array
*/
private function _properties(\ReflectionClass $replace, array $_array): array
{
$methods = $replace->getProperties();
foreach ($methods as $method) {
$_property = [];
if ($method->isStatic()) continue;
foreach ($method->getAttributes() as $attribute) {
if (!class_exists($attribute->getName())) {
continue;
}
$_property[] = $attribute->newInstance();
}
$_array['property'][$method->getName()] = $_property;
}
return $_array;
}
/**
* @param string $path
* @param string|array $outPath
* @throws Exception
*/
public function loadByDirectory(string $path, string|array $outPath = '')
{
try {
$path = '/' . trim($path, '/');
foreach ($this->_directory as $key => $_path) {
$key = '/' . trim($key, '/');
if (!str_starts_with($key, $path) || in_array($key, $outPath)) {
continue;
}
$this->execute($_path);
}
} catch (Throwable $exception) {
$this->addError($exception, 'throwable');
}
}
/**
* @param DirectoryIterator $path
* @param string $namespace
* @return string
*/
private function explodeFileName(DirectoryIterator $path, string $namespace): string
{
$replace = str_replace(APP_PATH . 'app', '', $path->getRealPath());
$replace = str_replace('.php', '', $replace);
$replace = str_replace(DIRECTORY_SEPARATOR, '\\', $replace);
$explode = explode('\\', $replace);
array_shift($explode);
return $namespace . '\\' . implode('\\', $explode);
}
/**
* @param string $filePath
* @param string $className
*/
public function appendFileToDirectory(string $filePath, string $className)
{
$array = explode('/', $filePath);
unset($array[count($array) - 1]);
$array = '/' . trim(implode('/', $array), '/');
$this->_directory[$array][] = $className;
}
/**
* @param array $classes
*/
private function execute(array $classes)
{
if (empty($classes)) {
return;
}
$annotation = Snowflake::getAnnotation();
foreach ($classes as $className) {
$annotations = $this->_classes[$className] ?? null;
if ($annotations === null) {
continue;
}
/** @var \Annotation\Attribute $value */
foreach ($annotations['target'] ?? [] as $value) {
$value->execute($annotations['handler']);
}
foreach ($annotations['methods'] as $name => $attribute) {
foreach ($attribute as $value) {
if ($value instanceof Relation) {
$annotation->addRelate($className, $value->name, $name);
} else if ($value instanceof Get) {
$annotation->addGets($className, $value->name, $name);
} else if ($value instanceof Set) {
$annotation->addSets($className, $value->name, $name);
} else {
$value->execute($annotations['handler'], $name);
}
}
}
}
}
}
-54
View File
@@ -1,54 +0,0 @@
<?php
namespace Annotation;
use Exception;
use Snowflake\Event;
use Snowflake\Snowflake;
/**
* Class LocalService
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class LocalService extends Attribute
{
/**
* LocalService constructor.
* @param string $service
* @param array|null $args
* @param bool $async_reload
* @throws Exception
*/
public function __construct(public string $service, public ?array $args = [], public bool $async_reload = true)
{
if ($this->async_reload !== true) {
return;
}
Event::on(Event::SERVER_WORKER_EXIT, function () {
Snowflake::app()->remove($this->service);
});
}
/**
* @param object $class
* @param string $method
* @return mixed
* @throws \Exception
*/
public function execute(mixed $class, mixed $method = null): mixed
{
$class = ['class' => $class::class];
if (!empty($this->args)) {
$class = array_merge($class, $this->args);
}
Snowflake::set($this->service, $class);
return true; // TODO: Change the autogenerated stub
}
}
-42
View File
@@ -1,42 +0,0 @@
<?php
namespace Annotation\Model;
use Annotation\Annotation;
use Attribute;
use Database\ActiveRecord;
use Snowflake\Snowflake;
/**
* Class Get
* @package Annotation\Model
*/
#[Attribute(Attribute::TARGET_METHOD)] class Get extends \Annotation\Attribute
{
/**
* Get constructor.
* @param string $name
*/
public function __construct(public string $name)
{
}
/**
* @param array $handler
* @return ActiveRecord
*/
public function execute(mixed $class, mixed $method = null): bool
{
$annotation = Snowflake::getAnnotation();
$annotation->addGets($class::class, $this->name, $method);
return true;
}
}
-41
View File
@@ -1,41 +0,0 @@
<?php
namespace Annotation\Model;
use Annotation\Attribute;
use Database\ActiveRecord;
use JetBrains\PhpStorm\Pure;
use Snowflake\Snowflake;
/**
* Class Relation
* @package Annotation\Model
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Relation extends Attribute
{
/**
* Relation constructor.
* @param string $name
*/
public function __construct(public string $name)
{
}
/**
* @param array $handler
* @return bool
*/
public function execute(mixed $class, mixed $method = null): bool
{
$annotation = Snowflake::getAnnotation();
$annotation->addRelate($class::class, $this->name, $method);
return true;
}
}
-38
View File
@@ -1,38 +0,0 @@
<?php
namespace Annotation\Model;
use Annotation\Attribute;
use Database\ActiveRecord;
use Snowflake\Snowflake;
#[\Attribute(\Attribute::TARGET_METHOD)] class Set extends Attribute
{
/**
* Set constructor.
* @param string $name
*/
public function __construct(public string $name)
{
}
/**
* @param mixed $class
* @param mixed|null $method
* @return bool
* @throws \Exception
*/
public function execute(mixed $class, mixed $method = null): bool
{
$annotation = Snowflake::getAnnotation();
$annotation->addSets($class::class, $this->name, $method);
return true;
}
}
-44
View File
@@ -1,44 +0,0 @@
<?php
namespace Annotation;
use Exception;
use Snowflake\Snowflake;
/**
* Class Port
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class Port extends Attribute
{
/**
* Port constructor.
* @param int $port
* @param int $mode
*/
public function __construct(public int $port, public int $mode = SWOOLE_SOCK_TCP)
{
}
/**
* @param array $handler
* @return mixed
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): mixed
{
$router = Snowflake::app()->getRouter();
if (!($class instanceof Porters)) {
return true;
}
$router->addPortListen($this->port, [$class, 'process']);
return true;
}
}
-17
View File
@@ -1,17 +0,0 @@
<?php
namespace Annotation;
interface Porters
{
/**
* @return mixed
*/
public function process(): mixed;
}
-48
View File
@@ -1,48 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Snowflake\Snowflake;
/**
* Class Interceptor
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class After extends Attribute
{
/**
* Interceptor constructor.
* @param \HttpServer\IInterface\After|\HttpServer\IInterface\After[] $after
* @throws
*/
public function __construct(public string|array $after)
{
if (is_string($this->after)) {
$this->after = [$this->after];
}
foreach ($this->after as $key => $value) {
$sn = Snowflake::createObject($value);
if (!($sn instanceof \HttpServer\IInterface\After)) {
continue;
}
$this->after[$key] = [$sn, 'onHandler'];
}
}
/**
* @param mixed $class
* @param mixed|null $method
* @return After
*/
public function execute(mixed $class, mixed $method = null): static
{
return $this;
}
}
-47
View File
@@ -1,47 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
/**
* Class Document
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Document extends Attribute
{
const INTEGER = 'int';
const STRING = 'string';
const BOOLEAN = 'bool';
const FLOAT = 'float';
const ALIAS = [
self::INTEGER => '整数',
self::STRING => '字符串',
self::BOOLEAN => '布尔值',
self::FLOAT => '浮点',
];
public function __construct(
public array $request,
public array $response
)
{
}
/**
* @param array $handler
* @return array
*/
public function execute(mixed $class, mixed $method = null): array
{
// TODO: Implement execute() method.
return [$this->request, $this->response];
}
}
-42
View File
@@ -1,42 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Exception;
use HttpServer\HttpFilter;
use ReflectionException;
use Snowflake\Exception\ComponentException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Class Filter
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Filter extends Attribute
{
/**
* Filter constructor.
* @param array $rules
*/
public function __construct(public array $rules)
{
}
/**
* @param array $handler
* @return bool
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): bool
{
return true;
}
}
-51
View File
@@ -1,51 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use JetBrains\PhpStorm\Pure;
use Snowflake\Snowflake;
/**
* Class Interceptor
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Interceptor extends Attribute
{
/**
* Interceptor constructor.
* @param string|array $interceptor
* @throws
*/
#[Pure] public function __construct(public string|array $interceptor)
{
if (is_string($this->interceptor)) {
$this->interceptor = [$this->interceptor];
}
foreach ($this->interceptor as $key => $value) {
$sn = Snowflake::createObject($value);
if (!($sn instanceof \HttpServer\IInterface\Interceptor)) {
continue;
}
$this->interceptor[$key] = [$sn, 'Interceptor'];
}
}
/**
* @param array $handler
* @return Interceptor
*/
public function execute(mixed $class, mixed $method = null): static
{
return $this;
}
}
-51
View File
@@ -1,51 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Snowflake\Snowflake;
/**
* Class Limits
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Limits extends Attribute
{
/**
* Limits constructor.
* @param string|array $limits
* @throws
*/
public function __construct(public string|array $limits)
{
if (is_string($this->limits)) {
$this->limits = [$this->limits];
}
foreach ($this->limits as $key => $value) {
$sn = Snowflake::createObject($value);
if (!($sn instanceof \HttpServer\IInterface\Limits)) {
continue;
}
$this->limits[$key] = [$sn, 'next'];
}
}
/**
* @param array $handler
* @return Limits
*/
public function execute(mixed $class, mixed $method = null): static
{
return $this;
}
}
-52
View File
@@ -1,52 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Snowflake\Snowflake;
use HttpServer\IInterface\Middleware as IMiddleware;
/**
* Class Middleware
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Middleware extends Attribute
{
/**
* Interceptor constructor.
* @param string|array $middleware
* @throws
*/
public function __construct(public string|array $middleware)
{
if (is_string($this->middleware)) {
$this->middleware = [$this->middleware];
}
$array = [];
foreach ($this->middleware as $key => $value) {
$sn = Snowflake::createObject($value);
if (!($sn instanceof IMiddleware)) {
continue;
}
$array[] = [$sn, 'onHandler'];
}
$this->middleware = $array;
}
/**
* @param array $handler
* @return Middleware
*/
public function execute(mixed $class, mixed $method = null): static
{
return $this;
}
}
-48
View File
@@ -1,48 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Exception;
use HttpServer\Route\Router;
use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake;
#[\Attribute(\Attribute::TARGET_METHOD)] class Route extends Attribute
{
/**
* Route constructor.
* @param string $uri
* @param string $method
* @param string $version
*/
public function __construct(
public string $uri,
public string $method,
public string $version = 'v.1.0'
)
{
}
/**
* @param array $handler
* @return Router
* @throws ConfigException
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): Router
{
// TODO: Implement setHandler() method.
$router = Snowflake::app()->getRouter();
$router->addRoute($this->uri, [$class, $method], $this->method);
return $router;
}
}
-57
View File
@@ -1,57 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Exception;
use HttpServer\Http\Request;
use HttpServer\Route\Router;
use JetBrains\PhpStorm\Pure;
use Snowflake\Snowflake;
/**
* Class RpcProducer
* @package Annotation\Route
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class RpcProducer extends Attribute
{
private string $uri = '';
const PROTOCOL_JSON = 'json';
const PROTOCOL_SERIALIZE = 'serialize';
/**
* Route constructor.
* @param string $cmd
* @param string $protocol
* @param int $port
*/
#[Pure] public function __construct(public string $cmd, public string $protocol = self::PROTOCOL_SERIALIZE, public int $port = 443)
{
$this->uri = 'rpc/p' . $this->port . '/' . ltrim($this->cmd, '/');
}
/**
* @param array $handler
* @return Router
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): Router
{
// TODO: Implement setHandler() method.
$router = Snowflake::app()->getRouter();
$router->addRoute($this->uri, [$class, $method], Request::HTTP_CMD)
->setDataType($this->protocol);
return $router;
}
}
-52
View File
@@ -1,52 +0,0 @@
<?php
namespace Annotation\Route;
use Annotation\Attribute;
use Exception;
use HttpServer\Route\Router;
use Snowflake\Snowflake;
/**
* Class Socket
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Socket extends Attribute
{
const CLOSE = 'CLOSE';
const MESSAGE = 'MESSAGE';
const HANDSHAKE = 'HANDSHAKE';
/**
* Socket constructor.
* @param string $event
* @param string|null $uri
* @param string $version
*/
public function __construct(public string $event, public ?string $uri = null, public string $version = 'v.1.0')
{
}
/**
* @param mixed $class
* @param mixed|null $method
* @return Router
* @throws Exception
*/
public function execute(mixed $class, mixed $method = null): Router
{
// TODO: Implement setHandler() method.
$router = Snowflake::app()->getRouter();
$path = $this->event . '::' . (is_null($this->uri) ? 'event' : $this->uri);
$router->addRoute($path, [$class, $method], 'sw::socket');
return $router;
}
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace Annotation\Rpc;
use Annotation\Attribute;
use Exception;
use Snowflake\Snowflake;
/**
* Class Consumer
* @package Annotation\Rpc
*/
#[\Attribute(\Attribute::TARGET_METHOD)] class Consumer extends Attribute
{
/**
* Consumer constructor.
* @param string $cmd
*/
public function __construct(public string $cmd)
{
}
/**
* @param array $handler
* @return mixed
* @throws Exception
*/
public function execute(mixed $class, mixed $method = ''): mixed
{
$rpc = Snowflake::app()->getRpc();
$rpc->addConsumer($this->cmd, [$class, $method]);
return true; // TODO: Change the autogenerated stub
}
}
-54
View File
@@ -1,54 +0,0 @@
<?php
namespace Annotation\Rpc;
use Annotation\Attribute;
use Exception;
use Snowflake\Snowflake;
/**
* Class RpcClient
* @package Annotation\Rpc
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class RpcClient extends Attribute
{
private array $config;
/**
* RpcClient constructor.
* @param string $cmd
* @param int $port
* @param int $timeout
* @param int $mode
*/
public function __construct(
public string $cmd,
public int $port,
public int $timeout,
public int $mode
)
{
$this->config = ['port' => $port, 'mode' => $mode, 'timeout' => $timeout];
}
/**
* @param array $handler
* @return mixed
* @throws Exception
*/
public function execute(mixed $class, mixed $method = ''): mixed
{
$rpc = Snowflake::app()->getRpc();
$rpc->addProducer($this->cmd, [$class, $method], $this->config);
return true;
}
}
-14
View File
@@ -1,14 +0,0 @@
<?php
namespace Annotation;
/**
* Class Target
* @package Annotation
*/
#[\Attribute(\Attribute::TARGET_CLASS)] class Target extends Attribute
{
}
-155
View File
@@ -1,155 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Exception;
use Snowflake\Abstracts\Component;
use Snowflake\Abstracts\Input;
use Snowflake\Event;
use Snowflake\Snowflake;
/**
* Class AbstractConsole
* @package Console
*/
abstract class AbstractConsole extends Component
{
/**
* @var Command[]
*/
public array $commands = [];
/** @var Input $parameters */
private Input $parameters;
/** @var array */
private array $_config;
/**
* @param array $config
* AbstractConsole constructor.
* @throws Exception
*/
public function __construct(array $config = [])
{
$this->_config = $config;
$this->signCommand(Snowflake::createObject(DefaultCommand::class));
parent::__construct($config);
}
/**
* @param Input $input
* @return $this
*/
public function setParameters(Input $input): static
{
$this->parameters = $input;
return $this;
}
/**
* @param Command $command
* @return mixed
* @throws Exception
*/
public function execCommand(Command $command): mixed
{
fire(Event::BEFORE_COMMAND_EXECUTE);
$data = $command->onHandler($this->parameters);
fire(Event::AFTER_COMMAND_EXECUTE, [$data]);
return $data;
}
/**
* @return Command|null
*/
public function search(): ?Command
{
$name = $this->parameters->getCommandName();
$this->parameters->set('commandList', $this->getCommandList());
$help = 'system:help';
foreach ($this->commands as $command) {
if ($command->command == $help) {
$help = $command;
}
if ($command->command != $name) {
continue;
}
return $command;
}
if (is_object($help)) {
return $help;
}
return null;
}
/**
* @param Command $abstractConsole
*
* 注册命令
*/
public function signCommand(Command $abstractConsole)
{
$this->commands[] = $abstractConsole;
}
/**
* @param $kernel
* @throws Exception
*/
public function batch($kernel)
{
if (is_object($kernel)) {
if (!property_exists($kernel, 'commands')) {
return;
}
$kernel = $kernel->commands;
}
if (!is_array($kernel)) {
return;
}
foreach ($kernel as $command) {
$this->signCommand(Snowflake::createObject($command));
}
}
/**
* @param Command $abstractConsole
* 释放一个命令
*/
public function destroyCommand(Command $abstractConsole)
{
foreach ($this->commands as $index => $command) {
if ($abstractConsole === $command) {
unset($this->commands[$index]);
break;
}
}
}
/**
* @return array
*/
private function getCommandList(): array
{
$_tmp = [];
foreach ($this->commands as $command) {
if ($command->command === 'system:help') {
continue;
}
$_tmp[$command->command] = [$command->description, $command];
}
ksort($_tmp, SORT_ASC);
return $_tmp;
}
}
-86
View File
@@ -1,86 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use ReflectionException;
use Snowflake\Abstracts\BaseObject;
use Snowflake\Abstracts\TraitApplication;
use Snowflake\Exception\ComponentException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Class Command
* @package Console
*/
abstract class Command extends BaseObject implements CommandInterface
{
use TraitApplication;
public string $command = '';
public string $description = '';
/**
* @return string
* 返回执行的命令名称
*/
public function getName(): string
{
return $this->command;
}
/**
* @return string
*
* 返回命令描述
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @param $name
* @return mixed
* @throws ComponentException
* @throws NotFindClassException
* @throws ReflectionException
*/
public function __get($name): mixed
{
if ($this->has($name)) {
return $this->get($name);
}
return parent::__get($name); // TODO: Change the autogenerated stub
}
/**
* @param $name
* @return bool
*/
private function has($name): bool
{
return Snowflake::app()->has($name);
}
/**
* @param $name
* @return mixed
* @throws ReflectionException
* @throws ComponentException
* @throws NotFindClassException
*/
private function get($name): mixed
{
return Snowflake::app()->get($name);
}
}
-18
View File
@@ -1,18 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Snowflake\Abstracts\Input;
/**
* Interface CommandInterface
* @package Console
*/
interface CommandInterface
{
public function onHandler(Input $dtl);
}
-29
View File
@@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Snowflake\Snowflake;
/**
* Class Console
* @package Console
*/
class Console extends AbstractConsole
{
/**
* @param $class
* @throws
*/
public function register($class)
{
if (is_string($class) || is_callable($class, true)) {
$class = Snowflake::createObject($class);
}
$this->signCommand($class);
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Exception;
use Snowflake\Abstracts\Providers;
use Snowflake\Application;
/**
* Class ConsoleProviders
* @package Console
*/
class ConsoleProviders extends Providers
{
/**
* @param Application $application
* @throws Exception
*/
public function onImport(Application $application)
{
/** @var Console $console */
$application->set('console', ['class' => Console::class]);
}
}
-45
View File
@@ -1,45 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Snowflake\Abstracts\Input;
/**
* Class DefaultCommand
* @package Console
*/
class DefaultCommand extends Command
{
public string $command = 'system:help';
public string $description = 'command lists';
/**
* @param Input $dtl
* @return string
*/
public function onHandler(Input $dtl): string
{
$param = $dtl->get('commandList');
$last = '';
$lists = ["Commands\t" . '注释'];
foreach ($param as $key => $val) {
$split = explode(':', $key);
if (empty($last) && isset($split[0])) {
$lists[] = "\033[32;40;1;1m" . $split[0] . " \033[0m\t";
} else if (isset($split[0]) && $last != $split[0]) {
$lists[] = "\033[32;40;1;1m" . $split[0] . " \033[0m\t";
}
$last = $split[0] ?? '';
list($method, $ts) = $val;
$lists[] = "\033[32;40;1;1m " . $key . " \033[0m\t\t" . $method."\t";
}
return implode(PHP_EOL, $lists);
}
}
-14
View File
@@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
namespace Console;
use Snowflake\Abstracts\Input;
interface ICommand
{
public function onHandler(Input $dtl);
}
-327
View File
@@ -1,327 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 14:42
*/
declare(strict_types=1);
namespace Database;
use Database\Traits\QueryTrait;
use Exception;
use Snowflake\Abstracts\Component;
use Snowflake\Snowflake;
/**
* Class ActiveQuery
* @package Database
*/
class ActiveQuery extends Component implements ISqlBuilder
{
use QueryTrait;
/** @var array */
public array $with = [];
/** @var bool */
public bool $asArray = FALSE;
/** @var bool */
public bool $useCache = FALSE;
/**
* @var Connection|null
*/
public ?Connection $db = NULL;
/**
* @var array
* 参数绑定
*/
public array $attributes = [];
private SqlBuilder $builder;
/**
* Comply constructor.
* @param $model
* @param array $config
* @throws
*/
public function __construct($model, $config = [])
{
$this->modelClass = $model;
$this->builder = SqlBuilder::builder($this);
parent::__construct($config);
}
/**
* 清除不完整数据
*/
public function clear()
{
$this->db = null;
$this->useCache = false;
$this->with = [];
}
/**
* @param $key
* @param $value
* @return $this
*/
public function addParam($key, $value): static
{
$this->attributes[$key] = $value;
return $this;
}
/**
* @param array $values
* @return $this
*/
public function addParams(array $values): static
{
foreach ($values as $key => $val) {
$this->addParam($key, $val);
}
return $this;
}
/**
* @param $name
* @return $this
*/
public function with($name): static
{
if (empty($name)) {
return $this;
}
if (is_string($name)) {
$name = explode(',', $name);
}
foreach ($name as $key => $val) {
array_push($this->with, $val);
}
return $this;
}
/**
* @param bool $isArray
* @return $this
*/
public function asArray($isArray = TRUE): static
{
$this->asArray = $isArray;
return $this;
}
/**
* @param $sql
* @param array $params
* @return mixed
* @throws Exception
*/
public function execute($sql, $params = []): Command
{
return $this->modelClass::getDb()->createCommand($sql, $this->modelClass::getDbName(), $params);
}
/**
* @return ActiveRecord|array|null
* @throws Exception
*/
public function first(): ActiveRecord|array|null
{
$data = $this->execute($this->builder->one())->one();
if (empty($data)) {
return NULL;
}
$newModel = $this->modelClass::populate($data);
if ($this->asArray) {
return $newModel->toArray();
}
return $newModel;
}
/**
* @return string
* @throws Exception
*/
public function toSql(): string
{
return $this->builder->get();
}
/**
* @return array|Collection
*/
public function get(): Collection|array
{
return $this->all();
}
/**
* @throws Exception
*/
public function flush(): array|bool|int|string|null
{
return $this->execute($this->builder->truncate())->exec();
}
/**
* @param int $size
* @param callable $callback
* @return Pagination
* @throws Exception
*/
public function page(int $size, callable $callback): Pagination
{
$pagination = new Pagination($this);
$pagination->setOffset(0);
$pagination->setLimit($size);
$pagination->setCallback($callback);
return $pagination;
}
/**
* @param string $field
* @param string $setKey
*
* @return array|null
* @throws Exception
*/
public function column(string $field, $setKey = ''): ?array
{
return $this->all()->column($field, $setKey);
}
/**
* @return array|Collection
* @throws
*/
public function all(): Collection|array
{
$data = $this->execute($this->builder->all())->all();
$collect = new Collection($this, $data, $this->modelClass);
if ($this->asArray) {
return $collect->toArray();
}
return $collect;
}
/**
* @param ActiveRecord $model
* @param $data
* @return ActiveRecord
* @throws Exception
*/
public function populate(ActiveRecord $model, $data): ActiveRecord
{
return $this->getWith($model::populate($data));
}
/**
* @param ActiveRecord $model
* @return ActiveRecord
*/
public function getWith(ActiveRecord $model): ActiveRecord
{
if (empty($this->with) || !is_array($this->with)) {
return $model;
}
return $model->setWith($this->with);
}
/**
* @return int
* @throws Exception
*/
public function count(): int
{
$this->select = ['COUNT(*)'];
$data = $this->execute($this->builder->count())->one();
if ($data && is_array($data)) {
return (int)array_shift($data);
}
return 0;
}
/**
* @param array $data
* @return array|Command|bool|int|string
* @throws Exception
*/
public function batchUpdate(array $data): Command|array|bool|int|string
{
$generate = $this->builder->update($data);
if (is_bool($generate)) {
return $generate;
}
return $this->execute(...$generate)->exec();
}
/**
* @param array $data
* @return bool
* @throws Exception
*/
public function batchInsert(array $data): bool
{
[$sql, $params] = $this->builder->insert($data, true);
return $this->execute($sql, $params)->exec();
}
/**
* @param $filed
*
* @return null
* @throws Exception
*/
public function value($filed)
{
return $this->first()[$filed] ?? null;
}
/**
* @return bool
* @throws Exception
*/
public function exists(): bool
{
return !empty($this->execute($this->builder->one())->fetchColumn());
}
/**
* @param bool $getSql
* @return string|bool
* @throws Exception
*/
public function delete($getSql = false): string|bool
{
$sql = $this->builder->delete();
if ($getSql === false) {
return $this->execute($sql)->delete();
}
return $sql;
}
}
-442
View File
@@ -1,442 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 14:39
*/
declare(strict_types=1);
namespace Database;
use Database\Base\BaseActiveRecord;
use Database\Traits\HasBase;
use Exception;
use ReflectionException;
use Snowflake\Channel;
use Snowflake\Event;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
defined('SAVE_FAIL') or define('SAVE_FAIL', 3227);
defined('FIND_OR_CREATE_MESSAGE') or define('FIND_OR_CREATE_MESSAGE', 'Create a new model, but the data cannot be empty.');
/**
* Class Orm
* @package Database
*
* @property $attributes
* @property-read $oldAttributes
* @method beforeSearch($model)
*/
class ActiveRecord extends BaseActiveRecord
{
const DECR = 'decr';
const INCR = 'incr';
/**
* @return array
*/
public function rules(): array
{
return [];
}
/**
* @param string $column
* @param int $value
* @return ActiveRecord|false
* @throws Exception
*/
public function increment(string $column, int $value): bool|ActiveRecord
{
if (!$this->mathematics([$column => $value], '+')) {
return false;
}
$this->{$column} += $value;
return $this->refresh();
}
/**
* @param string $column
* @param int $value
* @return ActiveRecord|false
* @throws Exception
*/
public function decrement(string $column, int $value): bool|ActiveRecord
{
if (!$this->mathematics([$column => $value], '-')) {
return false;
}
$this->{$column} -= $value;
return $this->refresh();
}
/**
* @param array $columns
* @return ActiveRecord|false
* @throws Exception
*/
public function increments(array $columns): bool|static
{
if (!$this->mathematics($columns, '+')) {
return false;
}
foreach ($columns as $key => $attribute) {
$this->$key += $attribute;
}
return $this;
}
/**
* @param array $columns
* @return ActiveRecord|false
* @throws Exception
*/
public function decrements(array $columns): bool|static
{
if (!$this->mathematics($columns, '-')) {
return false;
}
foreach ($columns as $key => $attribute) {
$this->$key -= $attribute;
}
return $this;
}
/**
* @param array $condition
* @param array $attributes
* @return bool|ActiveRecord
* @throws ReflectionException
* @throws NotFindClassException
* @throws Exception
*/
public static function findOrCreate(array $condition, array $attributes = []): bool|static
{
$logger = Snowflake::app()->getLogger();
/** @var static $select */
$select = static::find()->where($condition)->first();
if (!empty($select)) {
return $select;
}
if (empty($attributes)) {
return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql');
}
$select = self::getModelClass();
$select->attributes = $attributes;
if (!$select->save()) {
return $logger->addError($select->getLastError(), 'mysql');
}
return $select;
}
/**
* @param array $condition
* @param array $attributes
* @return bool|static
* @throws Exception
*/
public static function createOrUpdate(array $condition, array $attributes = []): bool|static
{
$logger = Snowflake::app()->getLogger();
if (empty($attributes)) {
return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql');
}
/** @var static $select */
$select = static::find()->where($condition)->first();
if (empty($select)) {
$select = self::getModelClass();
}
$select->attributes = $attributes;
if (!$select->save()) {
return $logger->addError($select->getLastError(), 'mysql');
}
return $select;
}
/**
* @return static
* @throws Exception
*/
private static function getModelClass(): static
{
/** @var Channel $channel */
$channel = Snowflake::app()->get('channel');
return $channel->pop(static::class, function () {
return new static();
});
}
/**
* @param $action
* @param $columns
* @param array $condition
* @return array|bool|int|string|null
* @throws Exception
*/
private function mathematics($columns, $action, $condition = []): int|bool|array|string|null
{
if (empty($condition)) {
$condition = [$this->getPrimary() => $this->getPrimaryValue()];
}
$activeQuery = static::find()->where($condition);
$create = SqlBuilder::builder($activeQuery)->mathematics($columns, $action);
if (is_bool($create)) {
return false;
}
return static::getDb()->createCommand($create[0], static::getDbName(), $create[1])->exec();
}
/**
* @param array $fields
* @return ActiveRecord|bool
* @throws Exception
*/
public function update(array $fields): static|bool
{
return $this->save($fields);
}
/**
* @param array $data
* @return bool
* @throws Exception
*/
public static function inserts(array $data): bool
{
/** @var static $class */
$class = Snowflake::createObject(['class' => static::class]);
if (empty($data)) {
return $class->addError('Insert data empty.', 'mysql');
}
return $class::find()->batchInsert($data);
}
/**
* @return bool
* @throws Exception
*/
public function delete(): bool
{
$conditions = $this->_oldAttributes;
if (empty($conditions)) {
return $this->addError("Delete condition do not empty.", 'mysql');
}
$primary = $this->getPrimary();
if (!empty($primary)) {
$conditions = [$primary => $this->getAttribute($primary)];
}
return static::deleteByCondition($conditions);
}
/**
* @param $condition
* @param array $attributes
*
* @return bool
* @throws Exception
*/
public static function updateAll(mixed $condition, $attributes = []): bool
{
$condition = static::find()->where($condition);
return $condition->batchUpdate($attributes);
}
/**
* @param $condition
* @param array $attributes
*
* @return array|Collection
* @throws Exception
*/
public static function findAll($condition, $attributes = []): array|Collection
{
$query = static::find()->where($condition);
if (!empty($attributes)) {
$query->bindParams($attributes);
}
return $query->all();
}
/**
* @param $method
* @return mixed
* @throws Exception
*/
private function resolveObject($method): mixed
{
$resolve = $this->{$this->getRelate($method)}();
if ($resolve instanceof HasBase) {
$resolve = $resolve->get();
}
if ($resolve instanceof Collection) {
return $resolve->toArray();
} else if ($resolve instanceof ActiveRecord) {
return $resolve->toArray();
} else if (is_object($resolve)) {
return get_object_vars($resolve);
} else {
return $resolve;
}
}
/**
* @return array
* @throws Exception
*/
public function toArray(): array
{
$data = $this->_attributes;
$lists = Snowflake::getAnnotation()->getGets(static::class);
foreach ($lists as $key => $item) {
$data[$key] = $this->{$item}($data[$key] ?? null);
}
$data = array_merge($data, $this->runRelate());
$class = Snowflake::app()->getChannel();
$class->push($this, static::class);
return $data;
}
/**
* @return array
* @throws Exception
*/
private function runRelate(): array
{
$relates = [];
if (empty($with = $this->getWith())) {
return $relates;
}
foreach ($with as $val) {
$relates[$val] = $this->resolveObject($val);
}
return $relates;
}
/**
* @param string $modelName
* @param $foreignKey
* @param $localKey
* @return HasOne|ActiveQuery
* @throws Exception
*/
public function hasOne(string $modelName, $foreignKey, $localKey): HasOne|ActiveQuery
{
if (($value = $this->getAttribute($localKey)) === null) {
throw new Exception("Need join table primary key.");
}
$relation = $this->getRelation();
return new HasOne($modelName, $foreignKey, $value, $relation);
}
/**
* @param $modelName
* @param $foreignKey
* @param $localKey
* @return ActiveQuery
* @throws Exception
*/
public function hasCount($modelName, $foreignKey, $localKey): mixed
{
if (($value = $this->getAttribute($localKey)) === null) {
throw new Exception("Need join table primary key.");
}
$relation = $this->getRelation();
return new HasCount($modelName, $foreignKey, $value, $relation);
}
/**
* @param $modelName
* @param $foreignKey
* @param $localKey
* @return ActiveQuery
* @throws Exception
*/
public function hasMany($modelName, $foreignKey, $localKey): mixed
{
if (($value = $this->getAttribute($localKey)) === null) {
throw new Exception("Need join table primary key.");
}
$relation = $this->getRelation();
return new HasMany($modelName, $foreignKey, $value, $relation);
}
/**
* @param $modelName
* @param $foreignKey
* @param $localKey
* @return ActiveQuery
* @throws Exception
*/
public function hasIn($modelName, $foreignKey, $localKey): mixed
{
if (($value = $this->getAttribute($localKey)) === null) {
throw new Exception("Need join table primary key.");
}
$relation = $this->getRelation();
return new HasMany($modelName, $foreignKey, $value, $relation);
}
/**
* @return bool
* @throws Exception
*/
public function afterDelete(): bool
{
if (!$this->hasPrimary()) {
return TRUE;
}
$value = $this->getPrimaryValue();
if (empty($value)) {
return TRUE;
}
return TRUE;
}
/**
* @return bool
* @throws Exception
*/
public function beforeDelete(): bool
{
if (!$this->hasPrimary()) {
return TRUE;
}
$value = $this->getPrimaryValue();
if (empty($value)) {
return TRUE;
}
return TRUE;
}
}
-167
View File
@@ -1,167 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/9 0009
* Time: 9:44
*/
declare(strict_types=1);
namespace Database\Base;
use ArrayIterator;
use Database\ActiveQuery;
use Database\ActiveRecord;
use Exception;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\Component;
use Snowflake\Snowflake;
use Traversable;
/**
* Class AbstractCollection
* @package Database\Base
*/
abstract class AbstractCollection extends Component implements \IteratorAggregate, \ArrayAccess
{
/**
* @var ActiveRecord[]
*/
protected array $_item = [];
protected ActiveRecord|string|null $model;
protected ActiveQuery $query;
public function clean()
{
unset($this->query, $this->model, $this->_item);
}
/**
* Collection constructor.
*
* @param $query
* @param array $array
* @param null|string|ActiveRecord $model
* @throws Exception
*/
public function __construct($query, array $array = [], $model = null)
{
$this->_item = $array;
$this->query = $query;
$this->model = $model;
parent::__construct([]);
}
/**
* @return int
*/
#[Pure] public function getLength(): int
{
return count($this->_item);
}
/**
* @param $item
*/
public function setItems($item)
{
$this->_item = $item;
}
/**
* @param $model
*/
public function setModel($model)
{
$this->model = $model;
}
/**
* @param $item
*/
public function addItem($item)
{
array_push($this->_item, $item);
}
/**
* @return Traversable|CollectionIterator|ArrayIterator
* @throws Exception
*/
public function getIterator(): Traversable|CollectionIterator|ArrayIterator
{
return new CollectionIterator($this->model, $this->query, $this->_item);
}
/**
* @return mixed
* @throws Exception
*/
public function getModel(): ActiveRecord
{
if (!is_object($this->model)) {
$this->model = $this->model::populate([]);
$this->model->setIsCreate(false);
}
return $this->model;
}
/**
* @param mixed $offset
* @return bool
*/
public function offsetExists(mixed $offset): bool
{
return !empty($this->_item) && isset($this->_item[$offset]);
}
/**
* @param mixed $offset
* @return ActiveRecord|null
* @throws Exception
*/
public function offsetGet(mixed $offset): ?ActiveRecord
{
if (!$this->offsetExists($offset)) {
return NULL;
}
if ($this->_item[$offset] instanceof ActiveRecord) {
return $this->_item[$offset];
}
return $this->model::populate($this->_item[$offset]);
}
/**
* @param mixed $offset
* @param mixed $value
*/
public function offsetSet(mixed $offset, mixed $value)
{
$this->_item[$offset] = $value;
}
/**
* @param mixed $offset
*/
public function offsetUnset(mixed $offset)
{
if ($this->offsetExists($offset)) {
unset($this->_item[$offset]);
}
}
}
File diff suppressed because it is too large Load Diff
-75
View File
@@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Base;
use Database\ActiveQuery;
use Database\ActiveRecord;
use Exception;
/**
* Class CollectionIterator
* @package Database\Base
*/
class CollectionIterator extends \ArrayIterator
{
private ActiveRecord|string $model;
/** @var ActiveQuery */
private ActiveQuery $query;
private ?ActiveRecord $_clone = null;
public function clean()
{
unset($this->query);
}
/**
* CollectionIterator constructor.
* @param $model
* @param $query
* @param array $array
* @param int $flags
* @throws Exception
*/
public function __construct($model, $query, $array = array(), $flags = 0)
{
$this->model = $model;
$this->query = $query;
parent::__construct($array, $flags);
}
/**
* @param $current
* @return ActiveRecord
* @throws Exception
*/
protected function newModel($current): ActiveRecord
{
return $this->model::populate($current);
}
/**
* @throws Exception
*/
public function current(): ActiveRecord
{
if (is_array($current = parent::current())) {
$current = $this->newModel($current);
}
return $this->query->getWith($current);
}
}
-71
View File
@@ -1,71 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Base;
use Database\Condition\BetweenCondition;
use Database\Condition\InCondition;
use Database\Condition\LikeCondition;
use Database\Condition\LLikeCondition;
use Database\Condition\MathematicsCondition;
use Database\Condition\NotBetweenCondition;
use Database\Condition\NotInCondition;
use Database\Condition\NotLikeCondition;
use Database\Condition\RLikeCondition;
/**
* Class ConditionClassMap
* @package Database\Base
*/
class ConditionClassMap
{
public static array $conditionMap = [
'IN' => [
'class' => InCondition::class
],
'NOT IN' => [
'class' => NotInCondition::class
],
'LIKE' => [
'class' => LikeCondition::class
],
'NOT LIKE' => [
'class' => NotLikeCondition::class
],
'LLike' => [
'class' => LLikeCondition::class
],
'RLike' => [
'class' => RLikeCondition::class
],
'EQ' => [
'class' => MathematicsCondition::class,
'type' => 'EQ'
],
'NEQ' => [
'class' => MathematicsCondition::class,
'type' => 'NEQ'
],
'GT' => [
'class' => MathematicsCondition::class,
'type' => 'GT'
],
'EGT' => [
'class' => MathematicsCondition::class,
'type' => 'EGT'
],
'LT' => [
'class' => MathematicsCondition::class,
'type' => 'LT'
],
'ELT' => [
'class' => MathematicsCondition::class,
'type' => 'ELT'
],
'BETWEEN' => BetweenCondition::class,
'NOT BETWEEN' => NotBetweenCondition::class,
];
}
-242
View File
@@ -1,242 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 13:38
*/
declare(strict_types=1);
namespace Database;
use Database\Base\AbstractCollection;
use Exception;
use JetBrains\PhpStorm\Pure;
/**
* Class Collection
* @package Database
* @property-read $length
*/
class Collection extends AbstractCollection
{
/**
* @return array
*/
public function getItems(): array
{
// TODO: Change the autogenerated stub
return $this->_item;
}
/**
* @param $field
*
* @return array|null
* @throws Exception
*/
public function values($field): ?array
{
if (empty($field) || !is_string($field)) {
return NULL;
}
$_tmp = [];
$data = $this->toArray();
foreach ($data as $val) {
/** @var ActiveRecord $val */
$_tmp[] = $val[$field];
}
return $_tmp;
}
/**
* @param string $field
* @return array|null
*/
public function keyBy(string $field): ?array
{
$array = $this->toArray();
$column = array_flip(array_column($array, $field));
foreach ($column as $key => $value) {
$column[$key] = $array[$value];
}
return $column;
}
/**
* @return $this
*/
public function orderRand(): static
{
shuffle($this->_item);
return $this;
}
/**
* @param int $start
* @param int $length
*
* @return array
*/
#[Pure] public function slice($start = 0, $length = 20): array
{
if (empty($this->_item) || !is_array($this->_item)) {
return [];
}
if (count($this->_item) < $length) {
return $this->_item;
} else {
return array_slice($this->_item, $start, $length);
}
}
/**
* @param $field
* @param string $setKey
*
* @return array|null
*/
public function column($field, $setKey = ''): ?array
{
$data = $this->toArray();
if (empty($data)) {
return [];
}
if (!empty($setKey) && is_string($setKey)) {
return array_column($data, $field, $setKey);
} else {
return array_column($data, $field);
}
}
/**
* @param $field
*
* @return float|int|null
*/
public function sum($field): float|int|null
{
$array = $this->column($field);
if (empty($array)) {
return NULL;
}
return array_sum($array);
}
/**
* @return ActiveRecord|array
*/
#[Pure] public function current(): ActiveRecord|array
{
return current($this->_item);
}
/**
* @return int
*/
#[Pure] public function size(): int
{
return (int)count($this->_item);
}
/**
* @return array
* @throws
*/
public function toArray(): array
{
$array = [];
foreach ($this as $value) {
if (!is_object($value)) {
continue;
}
$array[] = $value->toArray();
}
$this->_item = [];
return $array;
}
/**
* @throws Exception
* 批量删除
*/
public function delete(): bool
{
$model = $this->getModel();
if (!$model->hasPrimary()) return false;
$ids = [];
foreach ($this as $item) {
$id = $item->getPrimaryValue();
if (!empty($id)) {
$ids[] = $id;
}
}
return $model::find()->in($model->getPrimary(), $ids)->delete();
}
/**
* @param array $condition
* @return Collection
* @throws
*/
public function filter(array $condition): Collection|static
{
$_filters = [];
if (empty($condition)) {
return $this;
}
foreach ($this as $value) {
if (!$this->filterCheck($value, $condition)) {
continue;
}
$_filters[] = $value;
}
return new Collection($this->query, $_filters, $this->model);
}
/**
* @param $value
* @param $condition
* @return bool
* @throws Exception
*/
private function filterCheck($value, $condition): bool
{
$_value = $value;
if ($_value instanceof ActiveRecord) {
$_value = $_value->toArray();
}
$_tmp = array_intersect_key($_value, $condition);
if (count(array_diff_assoc($_tmp, $condition)) > 0) {
return false;
}
return true;
}
/**
* @param $key
* @param $value
* @return mixed
*/
public function exists($key, $value): mixed
{
foreach ($this as $item) {
if ($item->$key === $value) {
return $item;
}
}
return null;
}
/**
* @return bool
*/
#[Pure] public function isEmpty(): bool
{
return $this->size() < 1;
}
}
-316
View File
@@ -1,316 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 15:23
*/
declare(strict_types=1);
namespace Database;
use Exception;
use PDO;
use PDOStatement;
use Snowflake\Abstracts\Component;
use Snowflake\Core\Json;
/**
* Class Command
* @package Database
*/
class Command extends Component
{
const ROW_COUNT = 'ROW_COUNT';
const FETCH = 'FETCH';
const FETCH_ALL = 'FETCH_ALL';
const EXECUTE = 'EXECUTE';
const FETCH_COLUMN = 'FETCH_COLUMN';
const DB_ERROR_MESSAGE = 'The system is busy, please try again later.';
/** @var Connection */
public Connection $db;
/** @var ?string */
public ?string $sql = '';
/** @var array */
public array $params = [];
/** @var string */
private string $_modelName;
private ?PDOStatement $prepare = null;
/**
* @return array|bool|int|string|PDOStatement|null
* @throws Exception
*/
public function incrOrDecr(): array|bool|int|string|PDOStatement|null
{
return $this->execute(static::EXECUTE);
}
/**
* @param bool $isInsert
* @param mixed $hasAutoIncrement
* @return int|bool|array|string|null
* @throws Exception
*/
public function save(bool $isInsert = TRUE, mixed $hasAutoIncrement = null): int|bool|array|string|null
{
return $this->execute(static::EXECUTE, $isInsert, $hasAutoIncrement);
}
/**
* @return int|bool|array|string|null
* @throws Exception
*/
public function all(): int|bool|array|string|null
{
return $this->execute(static::FETCH_ALL);
}
/**
* @return array|bool|int|string|null
* @throws Exception
*/
public function one(): null|array|bool|int|string
{
return $this->execute(static::FETCH);
}
/**
* @return int|bool|array|string|null
* @throws Exception
*/
public function fetchColumn(): int|bool|array|string|null
{
return $this->execute(static::FETCH_COLUMN);
}
/**
* @return int|bool|array|string|null
* @throws Exception
*/
public function rowCount(): int|bool|array|string|null
{
return $this->execute(static::ROW_COUNT);
}
/**
* @return int|bool|array|string|null
* @throws Exception
*/
public function flush(): int|bool|array|string|null
{
return $this->execute(static::EXECUTE);
}
/**
* @param $type
* @param null $isInsert
* @param bool|null $hasAutoIncrement
* @return int|bool|array|string|null
* @throws Exception
*/
private function execute($type, $isInsert = null, mixed $hasAutoIncrement = null): int|bool|array|string|null
{
try {
$time = microtime(true);
if ($type === static::EXECUTE) {
$result = $this->insert_or_change($isInsert, $hasAutoIncrement);
} else {
$result = $this->search($type);
}
if (microtime(true) - $time >= 0.02) {
$this->warning('Mysql:' . Json::encode([$this->sql, $this->params]) . (microtime(true) - $time));
}
if ($this->prepare) {
$this->prepare->closeCursor();
}
return $result;
} catch (\Throwable $exception) {
return $this->addError($this->sql . '. error: ' . $exception->getMessage(), 'mysql');
}
}
/**
* @param $type
* @return mixed
* @throws Exception
*/
private function search($type): mixed
{
if (($prepare = $this->prepare()) == false) {
return false;
}
if ($type === static::FETCH_COLUMN) {
$data = $prepare->fetchAll(PDO::FETCH_ASSOC);
} else if ($type === static::ROW_COUNT) {
$data = $prepare->rowCount();
} else if ($type === static::FETCH_ALL) {
$data = $prepare->fetchAll(PDO::FETCH_ASSOC);
} else {
$data = $prepare->fetch(PDO::FETCH_ASSOC);
}
$prepare->closeCursor();
return $data;
}
/**
* @param $isInsert
* @param $hasAutoIncrement
* @return bool|string|int
* @throws Exception
*/
private function insert_or_change($isInsert, $hasAutoIncrement): bool|string|int
{
if (($result = $this->getPdoStatement()) === false) {
return $result;
}
if ($isInsert === false || !$hasAutoIncrement) {
return true;
}
if ($result == 0 && $hasAutoIncrement->isAutoIncrement()) {
return $this->addError(static::DB_ERROR_MESSAGE, 'mysql');
}
return $result == 0 ? true : $result;
}
/**
* 重新构建
* @throws
*/
private function getPdoStatement(): bool|int
{
if (empty($this->sql)) {
return $this->addError('no sql.', 'mysql');
}
if (!(($connect = $this->db->getConnect($this->sql)) instanceof PDO)) {
return $this->addError('get client error.', 'mysql');
}
if (!(($prepare = $connect->prepare($this->sql)) instanceof PDOStatement)) {
return $this->addError($this->errorMessage($prepare), 'mysql');
}
$result = $this->checkResponse($prepare, $connect);
$prepare->closeCursor();
return $result;
}
/**
* @param $prepare
* @return string
*/
private function errorMessage($prepare): string
{
return $this->sql . ':' . ($prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE);
}
/**
* @return bool|\PDOStatement
* @throws \Exception
*/
private function prepare(): bool|PDOStatement
{
if (!(($connect = $this->db->getConnect($this->sql)) instanceof PDO)) {
return $this->addError('get client error.', 'mysql');
}
if (!(($prepare = $connect->query($this->sql)) instanceof PDOStatement)) {
$error = $prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE;
return $this->addError($this->sql . ':' . $error, 'mysql');
}
return $prepare;
}
/**
* @param $prepare
* @param $connect
* @return bool|int
* @throws \Exception
*/
private function checkResponse($prepare, $connect): bool|int
{
$result = $prepare->execute($this->params);
if ($result === false) {
return $this->addError($connect->errorInfo()[2], 'mysql');
}
return (int)$connect->lastInsertId();
}
/**
* @param $modelName
* @return $this
*/
public function setModelName($modelName): static
{
$this->_modelName = $modelName;
return $this;
}
/**
* @return string
*/
public function getModelName(): string
{
return $this->_modelName;
}
/**
* @return int|bool|array|string|null
* @throws Exception
*/
public function delete(): int|bool|array|string|null
{
return $this->execute(static::EXECUTE);
}
/**
* @param null $scope
* @param bool $insert
* @return int|bool|array|string|null
* @throws Exception
*/
public function exec($scope = null, bool $insert = false): int|bool|array|string|null
{
return $this->execute(static::EXECUTE, $insert, $scope);
}
/**
* @param array $data
* @return $this
*/
public function bindValues(array $data = []): static
{
if (!is_array($this->params)) {
$this->params = [];
}
if (!empty($data)) {
$this->params = array_merge($this->params, $data);
}
return $this;
}
/**
* @param $sql
* @return $this
* @throws Exception
*/
public function setSql($sql): static
{
$this->sql = $sql;
return $this;
}
}
-23
View File
@@ -1,23 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
/**
* Class BetweenCondition
* @package Database\Condition
*/
class BetweenCondition extends Condition
{
/**
* @return string
*/
public function builder(): string
{
return $this->column . ' BETWEEN ' . (int)$this->value[0] . ' AND ' . (int)$this->value[1];
}
}
-22
View File
@@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
/**
* Class ChildCondition
* @package Database\Condition
*/
class ChildCondition extends Condition
{
/**
* @return string
*/
public function builder(): string
{
return $this->column . ' ' . $this->opera . ' (' . $this->value . ')';
}
}
-83
View File
@@ -1,83 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\BaseObject;
use Snowflake\Core\Str;
/**
* Class Condition
* @package Database\Condition
*/
abstract class Condition extends BaseObject
{
protected string $column = '';
protected string $opera = '=';
/** @var array|mixed */
protected $value;
const INT_TYPE = ['bit', 'bool', 'tinyint', 'smallint', 'mediumint', 'int', 'bigint', 'float', 'double', 'decimal', 'timestamp'];
protected array $attributes = [];
abstract public function builder();
/**
* @param string $column
*/
public function setColumn(string $column): void
{
$this->column = $column;
}
/**
* @param string $opera
*/
public function setOpera(string $opera): void
{
$this->opera = $opera;
}
/**
* @param $params
*/
public function setValue($params): void
{
if (is_array($params)) {
$values = [];
foreach ($params as $item => $value) {
$values[$item] = is_numeric($value) ? $value : '\'' . $value . '\'';
}
$this->value = $values;
} else {
$this->value = $this->checkIsSqlString($params);
}
}
/**
* @param $params
* @return int|string
*/
#[Pure] private function checkIsSqlString($params): int|string
{
if (is_numeric($params)) {
return $params;
}
$check = ltrim($params, '(');
$check = strtolower(substr($check, 0, 6));
if (in_array($check, ['update', 'select', 'insert', 'delete'])) {
return $params;
} else {
return sprintf('\'%s\'', $params);
}
}
}
-24
View File
@@ -1,24 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use JetBrains\PhpStorm\Pure;
/**
* Class DefaultCondition
* @package Database\Condition
*/
class DefaultCondition extends Condition
{
/**
* @return string
*/
#[Pure] public function builder(): string
{
return sprintf('%s %s %s', $this->column, $this->opera, addslashes($this->value));
}
}
-31
View File
@@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
/**
* Class HashCondition
* @package Yoc\db\condition
*/
class HashCondition extends Condition
{
/**
* @return string
*/
public function builder(): string
{
$array = [];
if (empty($this->value)) {
return '';
}
foreach ($this->value as $key => $value) {
if ($value === null) {
continue;
}
$array[] = sprintf("%s = '%s'", $key, addslashes($value));
}
return implode(' AND ', $array);
}
}
-31
View File
@@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use Database\ActiveQuery;
use Exception;
use JetBrains\PhpStorm\Pure;
/**
* Class InCondition
* @package Database\Condition
*/
class InCondition extends Condition
{
/**
* @return string
* @throws Exception
*/
#[Pure] public function builder(): string
{
if (is_array($this->value)) {
return sprintf('%s IN (%s)', $this->column, implode(',', $this->value));
} else {
return sprintf('%s IN (%s)', $this->column, $this->value);
}
}
}
-20
View File
@@ -1,20 +0,0 @@
<?php
namespace Database\Condition;
/**
* Class JsonCondition
* @package Database\Condition
*/
class JsonCondition extends Condition
{
public function builder()
{
// TODO: Implement builder() method.
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use Snowflake\Core\Str;
/**
* Class LLikeCondition
* @package Database\Condition
*/
class LLikeCondition extends Condition
{
public string $pos = '';
/**
* @return string
*/
public function builder(): string
{
if (!is_string($this->value)) {
$this->value = array_shift($this->value);
}
return $this->column . ' LIKE \'%' . addslashes($this->value) . '\'';
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use Snowflake\Core\Str;
/**
* Class LikeCondition
* @package Database\Condition
*/
class LikeCondition extends Condition
{
public string $pos = '';
/**
* @return string
*/
public function builder(): string
{
if (!is_string($this->value)) {
$this->value = array_shift($this->value);
}
return $this->column . ' LIKE \'%' . addslashes($this->value) . '%\'';
}
}
@@ -1,78 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
/**
* Class MathematicsCondition
* @package Database\Condition
*/
class MathematicsCondition extends Condition
{
public string $type = '';
/**
* @return mixed
*/
public function builder(): mixed
{
return $this->{strtolower($this->type)}((float)$this->value);
}
/**
* @param $value
* @return string
*/
public function eq($value): string
{
return $this->column . ' = ' . $value;
}
/**
* @param $value
* @return string
*/
public function neq($value): string
{
return $this->column . ' <> ' . $value;
}
/**
* @param $value
* @return string
*/
public function gt($value): string
{
return $this->column . ' > ' . $value;
}
/**
* @param $value
* @return string
*/
public function egt($value): string
{
return $this->column . ' >= ' . $value;
}
/**
* @param $value
* @return string
*/
public function lt($value): string
{
return $this->column . ' < ' . $value;
}
/**
* @param $value
* @return string
*/
public function elt($value): string
{
return $this->column . ' <= ' . $value;
}
}
@@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
/**
* Class NotBetweenCondition
* @package Database\Condition
*/
class NotBetweenCondition extends Condition
{
/**
* @return string
*/
public function builder(): string
{
return $this->column . ' NOT BETWEEN ' . (int)$this->value[0] . ' AND ' . (int)$this->value[1];
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use JetBrains\PhpStorm\Pure;
/**
* Class NotInCondition
* @package Database\Condition
*/
class NotInCondition extends Condition
{
/**
* @return string|null
*/
#[Pure] public function builder(): ?string
{
if (!is_array($this->value)) {
return null;
}
$value = '\'' . implode('\',\'', $this->value) . '\'';
return '`' . $this->column . '` not in(' . $value . ')';
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use Snowflake\Core\Str;
/**
* Class NotLikeCondition
* @package Database\Condition
*/
class NotLikeCondition extends Condition
{
public string $pos = '';
/**
* @return string
*/
public function builder(): string
{
if (!is_string($this->value)) {
$this->value = array_shift($this->value);
}
return $this->column . ' NOT LIKE \'%' . addslashes($this->value) . '%\'';
}
}
-27
View File
@@ -1,27 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use JetBrains\PhpStorm\Pure;
/**
* Class OrCondition
* @package Database\Condition
*/
class OrCondition extends Condition
{
public array $oldParams = [];
/**
* @return string
*/
#[Pure] public function builder(): string
{
return sprintf('(%s) OR %s', implode(' AND ', $this->oldParams), addslashes($this->value));
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Condition;
use Snowflake\Core\Str;
/**
* Class RLikeCondition
* @package Database\Condition
*/
class RLikeCondition extends Condition
{
public string $pos = '';
/**
* @return string
*/
public function builder(): string
{
if (!is_string($this->value)) {
$this->value = array_shift($this->value);
}
return sprintf('%s LIKE \'%s\'', $this->column, addslashes($this->value));
}
}
-329
View File
@@ -1,329 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 14:09
*/
declare(strict_types=1);
namespace Database;
use Database\Mysql\Schema;
use Exception;
use JetBrains\PhpStorm\Pure;
use PDO;
use ReflectionException;
use Snowflake\Abstracts\Component;
use Snowflake\Abstracts\Config;
use Snowflake\Event;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Class Connection
* @package Database
*/
class Connection extends Component
{
const TRANSACTION_COMMIT = 'transaction::commit';
const TRANSACTION_ROLLBACK = 'transaction::rollback';
public string $id = 'db';
public string $cds = '';
public string $password = '';
public string $username = '';
public string $charset = 'utf-8';
public string $tablePrefix = '';
public string $database = '';
public int $timeout = 1900;
public int $maxNumber = 30;
public int $minNumber = 10;
/**
* @var bool
* enable database cache
*/
public bool $enableCache = false;
public string $cacheDriver = 'redis';
/**
* @var array
*
* @example [
* 'cds' => 'mysql:dbname=dbname;host=127.0.0.1',
* 'username' => 'root',
* 'password' => 'root'
* ]
*/
public array $slaveConfig = [];
private ?Schema $_schema = null;
/**
* @throws Exception
*/
public function init()
{
Event::on(Event::SYSTEM_RESOURCE_CLEAN, [$this, 'disconnect']);
Event::on(Event::SYSTEM_RESOURCE_RELEASES, [$this, 'clear_connection']);
}
/**
* @throws Exception
*/
public function enablingTransactions()
{
if (!Db::transactionsActive()) {
return;
}
$this->beginTransaction();
Event::on(Connection::TRANSACTION_COMMIT, [$this, 'commit'], false, true);
Event::on(Connection::TRANSACTION_ROLLBACK, [$this, 'rollback'], false, true);
}
/**
* @param null $sql
* @return PDO
* @throws Exception
*/
public function getConnect($sql = NULL): PDO
{
return $this->getPdo($sql);
}
/**
* @throws Exception
*/
public function fill()
{
$connections = $this->connections();
$pool = Config::get('databases.pool.max', 10);
$connections->initConnections('Mysql:' . $this->cds, true, $pool);
if (!empty($this->slaveConfig) && $this->cds != $this->slaveConfig['cds']) {
$connections->initConnections('Mysql:' . $this->slaveConfig['cds'], false, $pool);
}
}
/**
* @param $sql
* @return PDO
* @throws Exception
*/
private function getPdo($sql): PDO
{
if ($this->isWrite($sql)) {
return $this->masterInstance();
} else {
return $this->slaveInstance();
}
}
/**
* @return mixed
* @throws ReflectionException
* @throws NotFindClassException
*/
public function getSchema(): Schema
{
if ($this->_schema === null) {
$this->_schema = Snowflake::createObject([
'class' => Schema::class,
'db' => $this
]);
}
return $this->_schema;
}
/**
* @param $sql
* @return bool
*/
#[Pure] public function isWrite($sql): bool
{
if (empty($sql)) return false;
if (str_starts_with(strtolower($sql), 'select')) {
return false;
}
return true;
}
/**
* @return mixed
* @throws Exception
*/
public function getCacheDriver(): mixed
{
if (!$this->enableCache) {
return null;
}
return Snowflake::app()->get($this->cacheDriver);
}
/**
* @return PDO
* @throws Exception
*/
public function masterInstance(): PDO
{
return $this->connections()->get([
'cds' => $this->cds,
'username' => $this->username,
'password' => $this->password,
'database' => $this->database
], true);
}
/**
* @return PDO
* @throws Exception
*/
public function slaveInstance(): PDO
{
if (empty($this->slaveConfig) || Db::transactionsActive()) {
return $this->masterInstance();
}
if ($this->slaveConfig['cds'] == $this->cds) {
return $this->masterInstance();
}
return $this->connections()->get($this->slaveConfig, false);
}
/**
* @return \Snowflake\Pool\Connection
* @throws Exception
*/
private function connections(): \Snowflake\Pool\Connection
{
return Snowflake::app()->getMysqlFromPool();
}
/**
* @return $this
* @throws Exception
*/
public function beginTransaction(): static
{
$this->connections()->beginTransaction($this->cds);
return $this;
}
/**
* @return $this|bool
* @throws Exception
*/
public function inTransaction(): bool|static
{
return $this->connections()->inTransaction($this->cds);
}
/**
* @throws Exception
* 事务回滚
*/
public function rollback()
{
$this->connections()->rollback($this->cds);
}
/**
* @throws Exception
* 事务提交
*/
public function commit()
{
$this->connections()->commit($this->cds);
}
/**
* @param $sql
* @return PDO
* @throws Exception
*/
public function refresh($sql): PDO
{
if ($this->isWrite($sql)) {
$instance = $this->masterInstance();
} else {
$instance = $this->slaveInstance();
}
return $instance;
}
/**
* @param null $sql
* @param string $dbname
* @param array $attributes
* @return Command
* @throws Exception
*/
public function createCommand($sql = null, string $dbname = '', array $attributes = []): Command
{
$command = new Command(['db' => $this, 'sql' => $sql]);
return $command->bindValues($attributes);
}
/**
*
* 回收链接
* @throws
*/
public function release()
{
$connections = $this->connections();
$connections->release($this->cds, true);
$connections->release($this->slaveConfig['cds'], false);
}
/**
* @throws Exception
*/
public function recovery()
{
$connections = $this->connections();
$connections->release($this->cds, true);
$connections->release($this->slaveConfig['cds'], false);
}
/**
*
* 回收链接
* @throws
*/
public function clear_connection()
{
$connections = $this->connections();
$connections->release($this->cds, true);
$connections->release($this->slaveConfig['cds'], false);
}
/**
* @throws Exception
*/
public function disconnect()
{
$connections = $this->connections();
$connections->disconnect($this->cds, true);
$connections->disconnect($this->slaveConfig['cds'], false);
}
}
-116
View File
@@ -1,116 +0,0 @@
<?php
declare(strict_types=1);
namespace Database;
use Annotation\IAnnotation;
use Exception;
use ReflectionException;
use Snowflake\Abstracts\Providers;
use Snowflake\Application;
use Snowflake\Event;
use Snowflake\Exception\ComponentException;
use Snowflake\Exception\ConfigException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Exception\NotFindPropertyException;
use Snowflake\Snowflake;
use Snowflake\Abstracts\Config;
/**
* Class DatabasesProviders
* @package Database
*/
class DatabasesProviders extends Providers
{
/**
* @param Application $application
* @throws Exception
*/
public function onImport(Application $application)
{
$application->set('db', $this);
Event::on(Event::SERVER_TASK_START, [$this, 'createPool']);
Event::on(Event::SERVER_WORKER_START, [$this, 'createPool']);
}
/**
* @param $name
* @return Connection
* @throws ConfigException
* @throws Exception
*/
public function get($name): Connection
{
$application = Snowflake::app();
if ($application->has('databases.' . $name)) {
return $application->get('databases.' . $name);
}
$config = $this->getConfig($name);
$max = Config::get('databases.pool.max', 30);
return $application->set('databases.' . $name, [
'class' => Connection::class,
'id' => $config['id'],
'cds' => $config['cds'],
'username' => $config['username'],
'password' => $config['password'],
'tablePrefix' => $config['tablePrefix'],
'maxNumber' => $max,
'database' => $config['database'],
'charset' => $config['charset'] ?? 'utf8mb4',
'slaveConfig' => $config['slaveConfig']
]);
}
/**
* @throws ConfigException
* @throws Exception
*/
public function createPool()
{
$databases = Config::get('databases.connections', []);
if (empty($databases)) {
return;
}
$max = Config::get('databases.pool', ['max' => 10, 'min' => 10]);
$application = Snowflake::app();
foreach ($databases as $name => $database) {
/** @var Connection $connection */
$connection = $application->set('databases.' . $name, [
'class' => Connection::class,
'id' => $database['id'],
'cds' => $database['cds'],
'username' => $database['username'],
'password' => $database['password'],
'tablePrefix' => $database['tablePrefix'],
'database' => $database['database'],
'maxNumber' => $max['max'],
'minNumber' => $max['min'],
'charset' => $database['charset'] ?? 'utf8mb4',
'slaveConfig' => $database['slaveConfig']
]);
$connection->fill();
}
}
/**
* @param $name
* @return mixed
* @throws ConfigException
*/
public function getConfig($name): mixed
{
return Config::get('databases.connections.' . $name, null, true);
}
}
-329
View File
@@ -1,329 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 15:40
*/
declare(strict_types=1);
namespace Database;
use Database\Traits\QueryTrait;
use Exception;
use HttpServer\Http\Context;
use Snowflake\Event;
use Snowflake\Snowflake;
/**
* Class Db
* @package Database
*/
class Db implements ISqlBuilder
{
use QueryTrait;
private static bool $_inTransaction = false;
/**
* @return bool
*/
public static function transactionsActive(): bool
{
return static::$_inTransaction === true;
}
/**
* @throws Exception
*/
public static function beginTransaction()
{
static::$_inTransaction = true;
}
/**
* @throws Exception
*/
public static function commit()
{
if (!static::transactionsActive()) {
return;
}
Event::trigger(Connection::TRANSACTION_COMMIT);
Event::offName(Connection::TRANSACTION_COMMIT);
static::$_inTransaction = false;
}
/**
* @throws Exception
*/
public static function rollback()
{
if (!static::transactionsActive()) {
return;
}
Event::trigger(Connection::TRANSACTION_ROLLBACK);
Event::offName(Connection::TRANSACTION_ROLLBACK);
static::$_inTransaction = false;
}
/**
* @param $table
*
* @return static
*/
public static function table($table): Db|static
{
$db = new Db();
$db->from($table);
return $db;
}
/**
* @param string $column
* @param string $alias
* @return string
*/
public static function any_value(string $column, string $alias = ''): string
{
if (empty($alias)) {
$alias = $column . '_any_value';
}
return 'ANY_VALUE(' . $column . ') as ' . $alias;
}
/**
* @param Connection|null $db
* @return mixed
* @throws Exception
*/
public function get(Connection $db = NULL): mixed
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand(SqlBuilder::builder($this)->one())
->all();
}
/**
* @param $column
* @return string
*/
public static function raw($column): string
{
return '`' . $column . '`';
}
/**
* @param Connection|null $db
* @return mixed
* @throws Exception
*/
public function find(Connection $db = NULL): mixed
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand(SqlBuilder::builder($this)->all())
->one();
}
/**
* @param Connection|NULL $db
* @return bool|int
* @throws Exception
*/
public function count(Connection $db = NULL): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand(SqlBuilder::builder($this)->count())
->exec();
}
/**
* @param Connection|NULL $db
* @return bool|int
* @throws Exception
*/
public function exists(Connection $db = NULL): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand(SqlBuilder::builder($this)->one())
->fetchColumn();
}
/**
* @param string $sql
* @param array $attributes
* @param Connection|null $db
* @return array|bool|int|string|null
* @throws Exception
*/
public static function findAllBySql(string $sql, array $attributes = [], Connection $db = NULL): int|bool|array|string|null
{
return $db->createCommand($sql, $attributes)->all();
}
/**
* @param string $sql
* @param array $attributes
* @param Connection|NULL $db
* @return array|mixed
* @throws Exception
*/
public static function findBySql(string $sql, array $attributes = [], Connection $db = NULL): mixed
{
return $db->createCommand($sql, $attributes)->one();
}
/**
* @param string $field
* @return array|null
* @throws Exception
*/
public function values(string $field): ?array
{
$data = $this->get();
if (empty($data) || empty($field)) {
return NULL;
}
$first = current($data);
if (!isset($first[$field])) {
return NULL;
}
return array_column($data, $field);
}
/**
* @param $field
* @return mixed
* @throws Exception
*/
public function value($field): mixed
{
$data = $this->find();
if (!empty($field) && isset($data[$field])) {
return $data[$field];
}
return $data;
}
/**
* @param null $db
* @return bool|int
* @throws Exception
*/
public function delete($db = null): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
$query = $db->getBuild()->builder($this);
return $db->createCommand($query)->delete();
}
/**
* @param $table
* @param null $db
* @return bool|int
* @throws Exception
*/
public static function drop($table, $db = null): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand('DROP TABLE ' . $table)->delete();
}
/**
* @param $table
* @param null $db
* @return bool|int
* @throws Exception
*/
public static function truncate($table, $db = null): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
return $db->createCommand('TRUNCATE ' . $table)->exec();
}
/**
* @param $table
* @param Connection|NULL $db
* @return mixed
* @throws Exception
*/
public static function showCreateSql($table, Connection $db = NULL): mixed
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
if (empty($table)) {
return null;
}
return $db->createCommand('SHOW CREATE TABLE ' . $table)->one();
}
/**
* @param $table
* @param Connection|NULL $db
* @return bool|int|null
* @throws Exception
*/
public static function desc($table, Connection $db = NULL): bool|int|null
{
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
if (empty($table)) {
return null;
}
return $db->createCommand('SHOW FULL FIELDS FROM ' . $table)->all();
}
/**
* @param string $table
* @param Connection|NULL $db
* @return mixed
* @throws Exception
*/
public static function show(string $table, Connection $db = NULL): mixed
{
if (empty($table)) {
return null;
}
if (empty($db)) {
$db = Snowflake::app()->get('db');
}
$table = [' const TABLE = \'select * from %s where REFERENCED_TABLE_NAME=%s\';'];
return $db->createCommand((new Query())
->select('*')
->from('INFORMATION_SCHEMA.KEY_COLUMN_USAGE')
->where(['REFERENCED_TABLE_NAME' => $table])
->getSql())->one();
}
}
-39
View File
@@ -1,39 +0,0 @@
<?php
declare(strict_types=1);
namespace Database;
use Exception;
use Database\Traits\HasBase;
/**
* Class HasCount
* @package Database
*/
class HasCount extends HasBase
{
/**
* @param $name
* @param $arguments
* @return ActiveQuery
* @throws Exception
*/
public function __call($name, $arguments): mixed
{
if (method_exists($this, $name)) {
return call_user_func([$this, $name], ...$arguments);
}
return $this->_relation->getQuery($this->model::className())->$name(...$arguments);
}
/**
* @return array|null|ActiveRecord
* @throws Exception
*/
public function get(): array|ActiveRecord|null
{
return $this->_relation->count($this->model::className(), $this->value);
}
}
-44
View File
@@ -1,44 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 13:58
*/
declare(strict_types=1);
namespace Database;
use Exception;
use Database\Traits\HasBase;
/**
* Class HasMany
* @package Database
*
* @method with($name)
*/
class HasMany extends HasBase
{
/**
* @param $name
* @param $arguments
* @return ActiveQuery
*/
public function __call($name, $arguments): mixed
{
if (method_exists($this, $name)) {
return call_user_func([$this, $name], ...$arguments);
}
return $this->_relation->getQuery($this->model::className())->$name(...$arguments);
}
/**
* @return array|null|ActiveRecord
* @throws Exception
*/
public function get(): array|ActiveRecord|null
{
return $this->_relation->get($this->model::className(), $this->value);
}
}
-45
View File
@@ -1,45 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 13:47
*/
declare(strict_types=1);
namespace Database;
use Exception;
use Database\Traits\HasBase;
/**
* Class HasOne
* @package Database
* @internal Query
*/
class HasOne extends HasBase
{
/**
* @param $name
* @param $arguments
* @return ActiveQuery
*/
public function __call($name, $arguments): mixed
{
if (method_exists($this, $name)) {
return call_user_func([$this, $name], ...$arguments);
}
$this->_relation->getQuery($this->model::className())->$name(...$arguments);
return $this;
}
/**
* @return array|null|ActiveRecord
* @throws Exception
*/
public function get(): array|ActiveRecord|null
{
return $this->_relation->first($this->model::className(), $this->value);
}
}
-50
View File
@@ -1,50 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 14:39
*/
declare(strict_types=1);
namespace Database;
/**
* Interface IOrm
* @package Database
*/
interface IOrm
{
/**
* @param $param
* @param null $db
* @return ActiveRecord
*/
public static function findOne($param, $db = NULL): mixed;
/**
* @return string
*/
public static function className(): string;
/**
* @return ActiveQuery
* return a sql queryBuilder
*/
public static function find(): ActiveQuery;
/**
* @param $dbName
* @return Connection
*/
public static function setDatabaseConnect($dbName): Connection;
// public static function deleteAll($condition, $attributes);
// public static function updateAll($condition, $attributes);
}
-10
View File
@@ -1,10 +0,0 @@
<?php
namespace Database;
interface ISqlBuilder
{
}
-406
View File
@@ -1,406 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2019-03-18
* Time: 17:22
*/
declare(strict_types=1);
namespace Database\Mysql;
use Database\Connection;
use Database\SqlBuilder;
use Exception;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\Component;
use Snowflake\Core\Json;
/**
* Class Columns
* @package Database\Mysql
*/
class Columns extends Component
{
/**
* @var array
* field types
*/
private array $columns = [];
/**
* @var Connection
* Mysql client
*/
public Connection $db;
/**
* @var string
* tableName
*/
public string $table = '';
/**
* @var array
* field primary key
*/
private array $_primary = [];
/**
* @var array
* by mysql field auto_increment
*/
private array $_auto_increment = [];
private array $_fields = [];
/**
* @param string $table
* @return $this
* @throws Exception
*/
public function table(string $table): static
{
$this->structure($this->table = $table);
return $this;
}
/**
* @return string
*/
public function getTable(): string
{
return $this->table;
}
/**
* @param $key
* @param $val
* @return mixed
* @throws Exception
*/
public function fieldFormat($key, $val): mixed
{
return $this->encode($val, $this->get_fields($key));
}
/**
* @param $data
* @return array
* @throws
*/
public function populate($data): array
{
$column = $this->get_fields();
foreach ($data as $key => $val) {
if (!isset($column[$key])) {
continue;
}
$data[$key] = $this->decode($val, $column[$key]);
}
return $data;
}
/**
* @param $val
* @param null $format
* @return mixed
*/
public function decode($val, $format = null): mixed
{
if (empty($format) || $val === null) {
return $val;
}
$format = strtolower($format);
if ($this->isInt($format)) {
return (int)$val;
} else if ($this->isJson($format)) {
return Json::decode($val, true);
} else if ($this->isFloat($format)) {
return (float)$val;
} else {
return stripslashes($val);
}
}
/**
* @param string $name
* @param $value
* @return mixed
* @throws Exception
*/
public function _decode(string $name, $value): mixed
{
return $this->decode($value, $this->get_fields($name));
}
/**
* @param $val
* @param null $format
* @return float|bool|int|string
* @throws Exception
*/
public function encode($val, $format = null): float|bool|int|string
{
if (empty($format)) {
return $val;
}
$format = strtolower($format);
if ($this->isInt($format)) {
return (int)$val;
} else if ($this->isJson($format)) {
return Json::encode($val);
} else if ($this->isFloat($format)) {
return (float)$val;
} else {
return addslashes($val);
}
}
/**
* @param $format
* @return bool
*/
#[Pure] public function isInt($format): bool
{
return in_array($format, ['int', 'bigint', 'tinyint', 'smallint', 'mediumint']);
}
/**
* @param $format
* @return bool
*/
#[Pure] public function isFloat($format): bool
{
return in_array($format, ['float', 'double', 'decimal']);
}
/**
* @param $format
* @return bool
*/
#[Pure] public function isJson($format): bool
{
return in_array($format, ['json']);
}
/**
* @param $format
* @return bool
*/
#[Pure] public function isString($format): bool
{
return in_array($format, ['varchar', 'char', 'text', 'longtext', 'tinytext', 'mediumtext']);
}
/**
* @return array
* @throws
*/
public function format(): array
{
return $this->columns('Default', 'Field');
}
/**
* @return mixed
* @throws Exception
*/
public function getFields(): array
{
if (empty($this->_fields)) {
$this->structure($this->table);
}
return $this->_fields[$this->table];
}
/**
* @param string $name
* @return bool
* @throws Exception
*/
public function hasField(string $name): bool
{
return array_key_exists($name, $this->getFields());
}
/**
* @return int|string|null
* @throws Exception
*/
public function getAutoIncrement(): int|string|null
{
return $this->_auto_increment[$this->table] ?? null;
}
/**
* @return array|null|string
*
* @throws Exception
*/
public function getPrimaryKeys(): array|string|null
{
if (isset($this->_auto_increment[$this->table])) {
return $this->_auto_increment[$this->table];
}
return $this->_primary[$this->table] ?? null;
}
/**
* @return array|null|string
*
* @throws Exception
*/
#[Pure] public function getFirstPrimary(): array|string|null
{
if (isset($this->_auto_increment[$this->table])) {
return $this->_auto_increment[$this->table];
}
if (isset($this->_primary[$this->table])) {
return current($this->_primary[$this->table]);
}
return null;
}
/**
* @param $name
* @param null $index
* @return array
* @throws Exception
*/
private function columns($name, $index = null): array
{
if (empty($index)) {
return array_column($this->getColumns(), $name);
} else {
return array_column($this->getColumns(), $name, $index);
}
}
/**
* @return array|static
* @throws Exception
*/
private function getColumns(): array|static
{
return $this->structure($this->getTable());
}
/**
* @param $table
* @return array|Columns
* @throws Exception
*/
private function structure($table): array|static
{
if (!isset($this->columns[$table]) || empty($this->columns[$table])) {
$column = $this->db->createCommand(SqlBuilder::builder(null)->columns($table))->all();
if (empty($column)) {
throw new Exception("The table " . $table . " not exists.");
}
return $this->columns[$table] = $this->resolve($column, $table);
}
return $this->columns[$table];
}
/**
* @param $column
* @param $table
* @return array
*/
private function resolve(array $column, $table): array
{
foreach ($column as $key => $item) {
$this->addPrimary($item, $table);
$column[$key]['Type'] = $this->clean($item['Type']);
}
$this->_fields[$table] = array_column($column, 'Default', 'Field');
return $column;
}
/**
* @param $item
* @param $table
*/
private function addPrimary($item, $table)
{
if (!isset($this->_primary[$table])) {
$this->_primary[$table] = [];
}
if ($item['Key'] === 'PRI') {
$this->_primary[$table][] = $item['Field'];
}
$this->addIncrement($item, $table);
}
/**
* @param $item
* @param $table
*/
private function addIncrement($item, $table)
{
if ($item['Extra'] !== 'auto_increment') {
return;
}
$this->_auto_increment[$table] = $item['Field'];
}
/**
* @param $type
* @return string
*/
public function clean($type): string
{
if (!str_contains($type, ')')) {
return $type;
}
$replace = preg_replace('/\(\d+(,\d+)?\)(\s+\w+)*/', '', $type);
if (str_contains($replace, ' ')) {
$replace = explode(' ', $replace)[1];
}
return $replace;
}
/**
* @param null $field
* @return array|string|null
* @throws Exception
*/
public function get_fields($field = null): array|string|null
{
$fields = $this->getAllField();
if (empty($field)) {
return $fields;
}
if (isset($fields[$field])) {
return strtolower($fields[$field]);
}
return null;
}
/**
* @return array
* @throws Exception
*/
public function getAllField(): array
{
return $this->columns('Type', 'Field');
}
}
-36
View File
@@ -1,36 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Mysql;
use Exception;
use Snowflake\Abstracts\Component;
use Database\Connection;
/**
* Class Schema
* @package Database\Mysql
*/
class Schema extends Component
{
/** @var ?Connection */
public ?Connection $db;
/** @var ?Columns $_column*/
private ?Columns $_column = null;
/**
* @return Columns|null
* @throws Exception
*/
public function getColumns(): ?Columns
{
if ($this->_column === null) {
$this->_column = new Columns(['db' => $this->db]);
}
return $this->_column;
}
}
-29
View File
@@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Orm;
use Database\Traits\Builder;
use Exception;
/**
* Trait Condition
* @package Database\Orm
*/
trait Condition
{
use Builder;
/**
* @param $query
* @return string
* @throws Exception
*/
public function getWhere($query): string
{
return $this->where($query);
}
}
-200
View File
@@ -1,200 +0,0 @@
<?php
declare(strict_types=1);
namespace Database;
use Closure;
use Exception;
use Snowflake\Abstracts\Component;
/**
* Class Pagination
* @package Database
*/
class Pagination extends Component
{
/** @var ActiveQuery */
private ActiveQuery $activeQuery;
/** @var int 从第几个开始查 */
private int $_offset = 0;
/** @var int 每页数量 */
private int $_limit = 100;
/** @var int 最大查询数量 */
private int $_max = 0;
/** @var int 当前已查询数量 */
private int $_length = 0;
/** @var Closure */
private Closure $_callback;
/**
* PaginationIteration constructor.
* @param ActiveQuery $activeQuery
* @param array $config
* @throws Exception
*/
public function __construct(ActiveQuery $activeQuery, array $config = [])
{
parent::__construct($config);
$this->activeQuery = $activeQuery;
}
public function clean()
{
unset($this->activeQuery, $this->_callback, $this->_group);
$this->_offset = 0;
$this->_limit = 100;
$this->_max = 0;
$this->_length = 0;;
}
/**
* recover class by clone
*/
public function __clone()
{
$this->clean();
}
/**
* @param array|Closure $callback
* @throws Exception
*/
public function setCallback(array|Closure $callback)
{
if (!is_callable($callback, true)) {
throw new Exception('非法回调函数~');
}
$this->_callback = $callback;
}
/**
* @param int $number
* @return Pagination
*/
public function setOffset(int $number): static
{
if ($number < 0) {
$number = 0;
}
$this->_offset = $number;
return $this;
}
/**
* @param int $number
* @return Pagination
*/
public function setLimit(int $number): static
{
if ($number < 1) {
$number = 100;
} else if ($number > 5000) {
$number = 5000;
}
$this->_limit = $number;
return $this;
}
/**
* @param int $number
* @return Pagination
*/
public function setMax(int $number): static
{
if ($number < 0) {
return $this;
}
$this->_max = $number;
return $this;
}
/**
* @param array $param
* @return void
* @throws Exception
*/
public function plunk($param = [])
{
$this->loop($param);
}
/**
* 轮训
* @param $param
* @return array
* @throws Exception
*/
public function loop($param): array
{
if ($this->_max > 0 && $this->_length >= $this->_max) {
return $this->output();
}
[$length, $data] = $this->get();
$this->executed($data, $param);
unset($data);
if ($length < $this->_limit) {
return $this->output();
}
return $this->loop($param);
}
/**
* @return array
*/
public function output(): array
{
return [];
}
/**
* @param $data
* @param $param
* @throws Exception
*/
private function executed($data, $param): void
{
try {
call_user_func($this->_callback, $data, $param);
} catch (\Throwable $exception) {
$this->addError($exception, 'throwable');
} finally {
logger()->insert();
}
}
/**
* @return array|Collection
*/
private function get(): Collection|array
{
if ($this->_max > 0 && $this->_length + $this->_limit > $this->_max) {
$this->_limit = $this->_length + $this->_limit - $this->_max;
}
$data = $this->activeQuery->limit($this->_offset, $this->_limit)->get();
$this->_offset += $this->_limit;
$this->_length += $data->size();
return [$data->size(), $data];
}
}
-45
View File
@@ -1,45 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/6/27 0027
* Time: 17:49
*/
declare(strict_types=1);
namespace Database;
use Database\Traits\QueryTrait;
use Exception;
/**
* Class Query
* @package Database
*/
class Query implements ISqlBuilder
{
use QueryTrait;
/**
* @return string
* @throws Exception
*/
public function getSql(): string
{
return SqlBuilder::builder($this)->get();
}
/**
* @return string
* @throws Exception
*/
public function getCondition(): string
{
return SqlBuilder::builder($this)->getCondition();
}
}
-111
View File
@@ -1,111 +0,0 @@
<?php
declare(strict_types=1);
namespace Database;
use Exception;
use Snowflake\Abstracts\Component;
/**
* Class Relation
* @package Snowflake\db
*/
class Relation extends Component
{
private array $_relations = [];
/** @var ActiveQuery[] $_query */
private array $_query = [];
/**
* @param string $identification
* @param ActiveQuery $query
* @return $this
*/
public function bindIdentification(string $identification, ActiveQuery $query): static
{
$this->_query[$identification] = $query;
return $this;
}
/**
* @param $name
* @return ActiveQuery|null
*/
public function getQuery(string $name): ?ActiveQuery
{
return $this->_query[$name] ?? null;
}
/**
* @param string $identification
* @param $localValue
* @return mixed
* @throws Exception
*/
public function first(string $identification, $localValue): mixed
{
$_identification = $identification . '_first_' . $localValue;
if (isset($this->_relations[$_identification]) && $this->_relations[$_identification] !== null) {
return $this->_relations[$_identification];
}
$activeModel = $this->_query[$identification]->first();
if (empty($activeModel)) {
return null;
}
return $this->_relations[$_identification] = $activeModel;
}
/**
* @param string $identification
* @param $localValue
* @return mixed
* @throws Exception
*/
public function count(string $identification, $localValue): mixed
{
$_identification = $identification . '_count_' . $localValue;
if (isset($this->_relations[$_identification]) && $this->_relations[$_identification] !== null) {
return $this->_relations[$_identification];
}
$activeModel = $this->_query[$identification]->count();
if (empty($activeModel)) {
return null;
}
return $this->_relations[$_identification] = $activeModel;
}
/**
* @param string $identification
* @param $localValue
* @return mixed
*/
public function get(string $identification, $localValue): mixed
{
if (is_array($localValue)) {
$_identification = $identification . '_get_' . implode('_', $localValue);
} else {
$_identification = $identification . '_get_' . $localValue;
}
if (isset($this->_relations[$_identification]) && $this->_relations[$_identification] !== null) {
return $this->_relations[$_identification];
}
$activeModel = $this->_query[$identification]->get();
if (empty($activeModel)) {
return null;
}
return $this->_relations[$_identification] = $activeModel;
}
}
-359
View File
@@ -1,359 +0,0 @@
<?php
namespace Database;
use Database\Traits\Builder;
use Exception;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\Component;
/**
* Class SqlBuilder
* @package Database
*/
class SqlBuilder extends Component
{
use Builder;
public ActiveQuery|Query|null $query;
/**
* @param $query
* @return $this
* @throws Exception
*/
public static function builder(ISqlBuilder|null $query): static
{
return new static(['query' => $query]);
}
/**
* @return string
* @throws Exception
*/
public function getCondition(): string
{
return $this->conditionToString();
}
/**
* @param array $attributes
* @return bool|array
* @throws Exception
*/
public function update(array $attributes): bool|array
{
[$string, $array] = $this->builderParams($attributes);
if (empty($string) || empty($array)) {
return $this->addError('None data update.');
}
$condition = $this->conditionToString();
if (!empty($condition)) {
$condition = ' WHERE ' . $condition;
}
$update = 'UPDATE ' . $this->tableName() . ' SET ' . implode(',', $string) . $condition;
$update .= $this->builderLimit($this->query);
return [$update, $array];
}
/**
* @param array $attributes
* @param string $opera
* @return bool|array
* @throws Exception
*/
public function mathematics(array $attributes, string $opera = '+'): bool|array
{
$string = $array = [];
foreach ($attributes as $attribute => $value) {
$string[] = $attribute . '=' . $attribute . $opera . $value;
}
if (empty($string)) {
return $this->addError('None data update.');
}
$condition = $this->conditionToString();
if (!empty($condition)) {
$condition = ' WHERE ' . $condition;
}
$update = 'UPDATE ' . $this->tableName() . ' SET ' . implode(',', $string) . $condition;
$update .= $this->builderLimit($this->query);
return [$update, []];
}
/**
* @param array $attributes
* @param false $isBatch
* @return array
* @throws Exception
*/
public function insert(array $attributes, bool $isBatch = false): array
{
$update = sprintf('INSERT INTO %s', $this->tableName());
if ($isBatch === false) {
$attributes = [$attributes];
}
$update .= '(' . implode(',', $this->getFields($attributes)) . ') VALUES ';
$order = 0;
$keys = $params = [];
foreach ($attributes as $attribute) {
[$_keys, $params] = $this->builderParams($attribute, true, $params, $order);
$keys[] = implode(',', $_keys);
$order++;
}
return [$update . '(' . implode('),(', $keys) . ')', $params];
}
/**
* @return string
* @throws Exception
*/
public function delete(): string
{
$delete = sprintf('DELETE FROM %s ', $this->query->modelClass::getTable());
$this->query->from = null;
return $delete . ' WHERE ' . $this->_prefix(true);
}
/**
* @param $attributes
* @return array
*/
#[Pure] private function getFields($attributes): array
{
return array_keys(current($attributes));
}
/**
* @param array $attributes
* @param bool $isInsert
* @param array $params
* @param int $order
* @return array[]
* a=:b,
*/
#[Pure] private function builderParams(array $attributes, bool $isInsert = false, array $params = [], int $order = 0): array
{
$keys = [];
foreach ($attributes as $key => $value) {
if ($isInsert === true) {
$keys[] = ':' . $key . $order;
$params[$key . $order] = $value;
} else {
[$keys, $params] = $this->resolveParams($key, $value, $order, $params, $keys);
}
}
return [$keys, $params];
}
/**
* @param string $key
* @param mixed $value
* @param int $order
* @param array $params
* @param array $keys
* @return array
*/
private function resolveParams(string $key, mixed $value, int $order, array $params, array $keys): array
{
if (
str_starts_with($value, '+ ') ||
str_starts_with($value, '- ')
) {
$keys[] = $key . '=' . $key . $value;
} else {
$params[$key . $order] = $value;
$keys[] = $key . '=:' . $key . $order;
}
return [$keys, $params];
}
/**
* @return string
* @throws Exception
*/
public function one(): string
{
$this->query->limit(0, 1);
if (empty($this->query->from) && !empty($this->query->modelClass)) {
$this->query->from($this->query->getTable());
}
return $this->_prefix(true);
}
/**
* @return string
* @throws Exception
*/
public function all(): string
{
if (empty($this->query->from) && !empty($this->query->modelClass)) {
$this->query->from($this->query->getTable());
}
return $this->_prefix(true);
}
/**
* @return string
* @throws Exception
*/
public function count(): string
{
if (empty($this->query->from) && !empty($this->query->modelClass)) {
$this->query->from($this->query->getTable());
}
return $this->_prefix();
}
/**
* @param $table
* @return string
*/
public function columns($table): string
{
return 'SHOW FULL FIELDS FROM ' . $table;
}
/**
* @param bool $hasOrder
* @return string
* @throws Exception
*/
private function _prefix(bool $hasOrder = false): string
{
$select = '';
if (!empty($this->query->from)) {
$select = $this->_selectPrefix();
}
$select = $this->_wherePrefix($select);
if (!empty($this->query->attributes) && is_array($this->query->attributes)) {
$select = strtr($select, $this->query->attributes);
}
if (!empty($this->query->group)) {
$select .= $this->builderGroup($this->query->group);
}
if ($hasOrder === true && !empty($this->query->order)) {
$select .= $this->builderOrder($this->query->order);
}
return $select . $this->builderLimit($this->query);
}
/**
* @param $select
* @return string
* @throws Exception
*/
private function _wherePrefix($select): string
{
$condition = $this->conditionToString();
if (empty($condition)) {
return $select;
} else if (empty($select)) {
return $condition;
}
return sprintf('%s WHERE %s', $select, $condition);
}
/**
* @return string
* @throws Exception
*/
private function _selectPrefix(): string
{
$select = $this->builderSelect($this->query->select) . ' FROM ' . $this->tableName();
if (!empty($this->query->alias)) {
$select .= $this->builderAlias($this->query->alias);
}
if (!empty($this->query->join)) {
$select .= $this->builderJoin($this->query->join);
}
return $select;
}
/**
* @param false $isCount
* @return string
* @throws Exception
*/
public function get(bool $isCount = false): string
{
if ($isCount === false) {
return $this->all();
}
return $this->count();
}
/**
* @return string
* @throws Exception
*/
public function truncate(): string
{
return sprintf('TRUNCATE %s', $this->tableName());
}
/**
* @return string
* @throws Exception
*/
private function conditionToString(): string
{
return $this->where($this->query->where);
}
/**
* @return string
* @throws Exception
*/
public function tableName(): string
{
if ($this->query->from instanceof \Closure) {
$this->query->from = sprintf('(%s)', $this->query->makeClosureFunction($this->query->from));
}
if ($this->query->from instanceof ActiveQuery) {
$this->query->from = sprintf('%s', SqlBuilder::builder($this->query->from)->get($this->query->from));
}
if (empty($this->query->from)) {
return $this->query->modelClass::getTable();
}
return $this->query->from;
}
}
-217
View File
@@ -1,217 +0,0 @@
<?php
namespace Database\Traits;
use Database\ActiveQuery;
use Database\Base\ConditionClassMap;
use Database\Condition\HashCondition;
use Database\Condition\OrCondition;
use Database\Query;
use Database\SqlBuilder;
use Exception;
use JetBrains\PhpStorm\Pure;
use ReflectionException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Trait Builder
* @package Database\Traits
*/
trait Builder
{
/**
* @param $alias
* @return string
*/
private function builderAlias($alias): string
{
return " AS " . $alias;
}
/**
* @param $table
* @return string
* @throws Exception
*/
private function builderFrom($table): string
{
if ($table instanceof ActiveQuery) {
$table = '(' . $table->toSql() . ')';
}
return " FROM " . $table;
}
/**
* @param $join
* @return string
*/
#[Pure] private function builderJoin($join): string
{
if (!empty($join)) {
return ' ' . implode(' ', $join);
}
return '';
}
/**
* @param null $select
* @return string
*/
#[Pure] private function builderSelect($select = NULL): string
{
if (empty($select)) {
return "SELECT *";
}
if (is_array($select)) {
return "SELECT " . implode(',', $select);
} else {
return "SELECT " . $select;
}
}
/**
* @param $group
* @return string
*/
private function builderGroup($group): string
{
if (empty($group)) {
return '';
}
return ' GROUP BY ' . $group;
}
/**
* @param $order
* @return string
*/
#[Pure] private function builderOrder($order): string
{
if (!empty($order)) {
return ' ORDER BY ' . implode(',', $order);
} else {
return '';
}
}
/**
* @param ActiveQuery|Query $query
* @return string
*/
#[Pure] private function builderLimit(ActiveQuery|Query $query): string
{
if (!is_numeric($query->limit) || $query->limit < 1) {
return "";
}
if ($query->offset !== null) {
return ' LIMIT ' . $query->offset . ',' . $query->limit;
}
return ' LIMIT ' . $query->limit;
}
/**
* @param $where
* @return string
* @throws Exception
*/
private function where($where): string
{
$_tmp = [];
if (empty($where)) return '';
if (is_string($where)) return $where;
foreach ($where as $key => $value) {
$_value = $this->resolveCondition($key, $value, $_tmp);
if (empty($_value)) continue;
$_tmp[] = $_value;
}
if (!empty($_tmp)) {
return implode(' AND ', $_tmp);
}
return '';
}
/**
* @param $field
* @param $condition
* @param $_tmp
* @return string
* @throws NotFindClassException
* @throws ReflectionException
*/
private function resolveCondition($field, $condition, $_tmp): string
{
if (is_string($field)) {
$_value = sprintf('%s = \'%s\'', $field, $condition);
} else if (is_string($condition)) {
$_value = $condition;
} else {
$_value = $this->_arrayMap($condition, $_tmp);
}
return $_value;
}
/**
* @param $condition
* @param $array
* @return string
* @throws NotFindClassException
* @throws ReflectionException
* @throws ReflectionException
*/
private function _arrayMap($condition, $array): string
{
if (!isset($condition[0])) {
return implode(' AND ', $this->_hashMap($condition));
}
$stroppier = strtoupper($condition[0]);
if (str_contains($stroppier, 'OR')) {
if (!is_string($condition[2])) {
$condition[2] = $this->_hashMap($condition[2]);
}
$builder = Snowflake::createObject(['class' => OrCondition::class, 'value' => $condition[2], 'column' => $condition[1], 'oldParams' => $array]);
} else if (isset(ConditionClassMap::$conditionMap[$stroppier])) {
$defaultConfig = ConditionClassMap::$conditionMap[$stroppier];
$create = array_merge($defaultConfig, ['column' => $condition[1], 'value' => $condition[2]]);
$builder = Snowflake::createObject($create);
} else {
$builder = Snowflake::createObject(['class' => HashCondition::class, 'value' => $condition]);
}
$array[] = $builder->builder();
return implode(' AND ', $array);
}
/**
* @param $condition
* @return array
*/
private function _hashMap($condition): array
{
$_array = [];
foreach ($condition as $key => $value) {
$value = is_numeric($value) ? $value : '\'' . $value . '\'';
if (!is_numeric($key)) {
$_array[] = sprintf('%s = %s', $key, $value);
} else {
$_array[] = $value;
}
}
return $_array;
}
}
-83
View File
@@ -1,83 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/4/4 0004
* Time: 15:47
*/
declare(strict_types=1);
namespace Database\Traits;
use Database\ActiveRecord;
use Database\Collection;
use Database\IOrm;
use Database\Relation;
use Exception;
/**
* Class HasBase
* @package Database
*
* @include Query
*/
abstract class HasBase
{
/** @var ActiveRecord|Collection */
protected Collection|ActiveRecord $data;
/**
* @var IOrm|ActiveRecord
*/
protected mixed $model;
protected mixed $value = [];
/** @var Relation $_relation */
protected Relation $_relation;
/**
* HasBase constructor.
* @param IOrm $model
* @param $primaryId
* @param $value
* @param Relation $relation
* @throws Exception
*/
public function __construct(mixed $model, $primaryId, $value, Relation $relation)
{
if (!class_exists($model)) {
throw new Exception('Model must implement ' . ActiveRecord::class);
}
if (!in_array(IOrm::class, class_implements($model))) {
throw new Exception('Model must implement ' . ActiveRecord::class);
}
if (is_array($value)) {
if (empty($value)) $value = [];
$_model = $model::find()->in($primaryId, $value);
} else {
$_model = $model::find()->where(['t1.' . $primaryId => $value]);
}
$this->_relation = $relation->bindIdentification($model, $_model);
$this->model = $model;
$this->value = $value;
}
abstract public function get();
/**
* @param $name
* @return mixed
*/
public function __get($name): mixed
{
if (empty($this->value)) {
return null;
}
return $this->get();
}
}
-871
View File
@@ -1,871 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 14:56
*/
declare(strict_types=1);
namespace Database\Traits;
use Closure;
use Database\ActiveQuery;
use Database\ActiveRecord;
use Database\Condition\MathematicsCondition;
use Database\Query;
use Exception;
use ReflectionException;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
/**
* Trait QueryTrait
* @package Database\Traits
*/
trait QueryTrait
{
public array $where = [];
public array $select = [];
public array $join = [];
public array $order = [];
public ?int $offset = NULL;
public ?int $limit = NULL;
public string $group = '';
public string|Closure|ActiveQuery|null $from = '';
public string $alias = 't1';
public array $filter = [];
public bool $ifNotWhere = false;
/**
* @var ActiveRecord|string|null
*/
public ActiveRecord|string|null $modelClass;
/**
* clear
*/
public function clear()
{
$this->where = [];
$this->select = [];
$this->join = [];
$this->order = [];
$this->offset = NULL;
$this->limit = NULL;
$this->group = '';
$this->from = '';
$this->alias = 't1';
$this->filter = [];
}
/**
* @param string $column
* @param callable $callable
* @return $this
*/
public function case(string $column, callable $callable): static
{
$caseWhen = new When($column, $this);
call_user_func($callable, $caseWhen);
$this->where[] = $caseWhen->end();
return $this;
}
/**
* @param $condition
* @param $condition1
* @param $condition2
* @return $this
* @throws Exception
*/
public function if(string|array $condition, string|array|Closure $condition1, string|array|Closure $condition2): static
{
if (!is_string($condition)) {
$condition = $this->makeClosureFunction($condition, true);
}
if (!is_string($condition1)) {
$condition1 = $this->makeClosureFunction($condition1, true);
}
if (!is_string($condition2)) {
$condition2 = $this->makeClosureFunction($condition2, true);
}
$this->where[] = 'IF(' . $condition . ', ' . $condition1 . ', ' . $condition2 . ')';
return $this;
}
/**
* @param $condition
* @return string
* @throws NotFindClassException
* @throws ReflectionException
* @throws Exception
*/
private function conditionToString($condition): string
{
$newSql = $this->makeNewSqlGenerate();
if ($condition instanceof Closure) {
call_user_func($condition, $newSql);
} else {
$newSql->where($condition);
}
return $newSql->getCondition();
}
/**
* @param $bool
* @return $this
*/
public function ifNotWhere($bool): static
{
$this->ifNotWhere = $bool;
return $this;
}
/**
* @return string
* @throws Exception
*/
public function getTable(): string
{
return $this->modelClass::getTable();
}
/**
* @param string $column
* @param string $value
* @return $this
*/
public function locate(string $column, string $value): static
{
$this->where[] = 'LOCATE(' . $column . ',\'' . addslashes($value) . '\') > 0';
return $this;
}
/**
* @param $column
* @return $this
*/
public function isNull($column): static
{
$this->where[] = $column . ' IS NULL';
return $this;
}
/**
* @param $column
* @return $this
*/
public function isEmpty($column): static
{
$this->where[] = $column . ' = \'\'';
return $this;
}
/**
* @param $column
* @return $this
*/
public function isNotEmpty($column): static
{
$this->where[] = $column . ' <> \'\'';
return $this;
}
/**
* @param $column
* @return $this
*/
public function isNotNull($column): static
{
$this->where[] = $column . ' IS NOT NULL';
return $this;
}
/**
* @param $columns
* @return $this
* @throws Exception
*/
public function filter($columns): static
{
if (!$columns) {
return $this;
}
if (is_callable($columns, TRUE)) {
return call_user_func($columns, $this);
}
if (is_string($columns)) {
$columns = explode(',', $columns);
}
if (!is_array($columns)) {
return $this;
}
$this->filter = $columns;
return $this;
}
/**
* @param string $alias
*
* @return $this
*
* select * from tableName as t1
*/
public function alias($alias = 't1'): static
{
$this->alias = $alias;
return $this;
}
/**
* @param string|Closure $tableName
*
* @return $this
*/
public function from(string|Closure $tableName): static
{
$this->from = $tableName;
return $this;
}
/**
* @param string $tableName
* @param string $alias
* @param null $on
* @param array|null $param
* @return $this
* $query->join([$tableName, ['userId'=>'uuvOd']], $param)
* $query->join([$tableName, ['userId'=>'uuvOd'], $param])
* $query->join($tableName, ['userId'=>'uuvOd',$param])
*/
private function join(string $tableName, string $alias, $on = NULL, array $param = NULL): static
{
if (empty($on)) {
return $this;
}
$join[] = $tableName . ' AS ' . $alias;
$join[] = 'ON ' . $this->onCondition($alias, $on);
if (empty($join)) {
return $this;
}
$this->join[] = implode(' ', $join);
if (!empty($param)) {
$this->addParams($param);
}
return $this;
}
/**
* @param $alias
* @param $on
* @return string
*/
private function onCondition($alias, $on): string
{
$array = [];
foreach ($on as $key => $item) {
if (!str_contains($item, '.')) {
$this->addParam($key, $item);
} else {
$explode = explode('.', $item);
if (isset($explode[1]) && ($explode[0] == $alias || $this->alias == $explode[0])) {
$array[] = $key . '=' . $item;
} else {
$this->addParam($key, $item);
}
}
}
return implode(' AND ', $array);
}
/**
* @param $tableName
* @param $alias
* @param $onCondition
* @param null $param
* @return $this
* @throws Exception
*/
public function leftJoin(string $tableName, string $alias, $onCondition, $param = NULL): static
{
if (class_exists($tableName)) {
if (!in_array(ActiveRecord::class, class_implements($tableName))) {
throw new Exception('Model must implement ' . $tableName);
}
$tableName = $tableName::getTable();
}
return $this->join(...["LEFT JOIN " . $tableName, $alias, $onCondition, $param]);
}
/**
* @param $tableName
* @param $alias
* @param $onCondition
* @param null $param
* @return $this
* @throws Exception
*/
public function rightJoin($tableName, $alias, $onCondition, $param = NULL): static
{
if (class_exists($tableName)) {
if (!in_array(ActiveRecord::class, class_implements($tableName))) {
throw new Exception('Model must implement ' . $tableName);
}
$tableName = $tableName::getTable();
}
return $this->join(...["RIGHT JOIN " . $tableName, $alias, $onCondition, $param]);
}
/**
* @param $tableName
* @param $alias
* @param $onCondition
* @param null $param
* @return $this
* @throws Exception
*/
public function innerJoin($tableName, $alias, $onCondition, $param = NULL): static
{
if (class_exists($tableName)) {
if (!in_array(ActiveRecord::class, class_implements($tableName))) {
throw new Exception('Model must implement ' . $tableName);
}
$tableName = $tableName::getTable();
}
return $this->join(...["INNER JOIN " . $tableName, $alias, $onCondition, $param]);
}
/**
* @param $array
*
* @return string
*/
private function toString($array): string
{
$tmp = [];
if (!is_array($array)) {
return $array;
}
foreach ($array as $key => $val) {
if (is_array($val)) {
$tmp[] = $this->toString($array);
} else {
$tmp[] = $key . '=:' . $key;
$this->attributes[':' . $key] = $val;
}
}
return implode(' AND ', $tmp);
}
/**
* @param $field
*
* @return $this
*/
public function sum($field): static
{
$this->select[] = 'SUM(' . $field . ') AS ' . $field;
return $this;
}
/**
* @param $field
* @return $this
*/
public function max($field): static
{
$this->select[] = 'MAX(' . $field . ') AS ' . $field;
return $this;
}
/**
* @param string $lngField
* @param string $latField
* @param int $lng1
* @param int $lat1
*
* @return $this
*/
public function distance(string $lngField, string $latField, int $lng1, int $lat1): static
{
$sql = "ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN(($lat1 * PI() / 180 - $lat1 * PI() / 180) / 2),2) + COS($lat1 * PI() / 180) * COS($latField * PI() / 180) * POW(SIN(($lng1 * PI() / 180 - $lngField * PI() / 180) / 2),2))) * 1000) AS distance";
$this->select[] = $sql;
return $this;
}
/**
* @param $column
* @param string $sort
*
* @return $this
*
* [
* 'addTime',
* 'descTime desc'
* ]
*/
public function orderBy($column, $sort = 'DESC'): static
{
if (empty($column)) {
return $this;
}
if (is_string($column)) {
return $this->addOrder(...func_get_args());
}
foreach ($column as $key => $val) {
$this->addOrder($val);
}
return $this;
}
/**
* @param $column
* @param string $sort
*
* @return $this
*
*/
private function addOrder($column, $sort = 'DESC'): static
{
$column = trim($column);
if (func_num_args() == 1 || str_contains($column, ' ')) {
$this->order[] = $column;
} else {
$this->order[] = "$column $sort";
}
return $this;
}
/**
* @param array|string $column
*
* @return $this
*/
public function select($column = '*'): static
{
if ($column == '*') {
$this->select = $column;
} else {
if (!is_array($column)) {
$column = explode(',', $column);
}
foreach ($column as $key => $val) {
$this->select[] = $val;
}
}
return $this;
}
/**
* @return $this
*/
public function orderRand(): static
{
$this->order[] = 'RAND()';
return $this;
}
/**
* @param array $conditionArray
*
* @return QueryTrait
*/
public function or(array $conditionArray = []): static
{
$this->where = ['or', $conditionArray];
return $this;
}
/**
* @param string $columns
* @param string|int|bool|null $value
*
* @param string $opera
* @return QueryTrait
*/
public function and(string $columns, string|int|null|bool $value = NULL, $opera = '='): static
{
if (!is_numeric($value) && !is_bool($value)) {
$value = '\'' . $value . '\'';
}
$this->where[] = $columns . $opera . $value;
return $this;
}
/**
* @param $columns
* @param string $value
* @return $this
* @throws Exception
*/
public function like($columns, string $value): static
{
if (empty($columns) || empty($value)) {
return $this;
}
if (is_array($columns)) {
$columns = 'CONCAT(' . implode(',^,', $columns) . ')';
}
$this->where[] = $columns . ' LIKE \'%' . addslashes($value) . '%\'';
return $this;
}
/**
* @param $columns
* @param string $value
* @return $this
* @throws Exception
*/
public function lLike($columns, string $value): static
{
if (empty($columns) || empty($value)) {
return $this;
}
if (is_array($columns)) {
$columns = 'CONCAT(' . implode(',^,', $columns) . ')';
}
$this->where[] = $columns . ' LLike \'%' . addslashes($value) . '\'';
return $this;
}
/**
* @param $columns
* @param string $value
* @return $this
* @throws Exception
*/
public function rLike($columns, string $value): static
{
if (empty($columns) || empty($value)) {
return $this;
}
if (is_array($columns)) {
$columns = 'CONCAT(' . implode(',^,', $columns) . ')';
}
$this->where[] = $columns . ' RLike \'' . addslashes($value) . '%\'';
return $this;
}
/**
* @param $columns
* @param string $value
* @return $this
* @throws Exception
*/
public function notLike($columns, string $value): static
{
if (empty($columns) || empty($value)) {
return $this;
}
if (is_array($columns)) {
$columns = 'CONCAT(' . implode(',^,', $columns) . ')';
}
$this->where[] = $columns . ' NOT LIKE \'%' . addslashes($value) . '%\'';
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function eq(string $column, int $value): static
{
$this->where[] = ['EQ', $column, $value];
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function neq(string $column, int $value): static
{
$this->where[] = ['NEQ', $column, $value];
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function gt(string $column, int $value): static
{
$this->where[] = ['GT', $column, $value];
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function egt(string $column, int $value): static
{
$this->where[] = ['EGT', $column, $value];
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function lt(string $column, int $value): static
{
$this->where[] = ['LT', $column, $value];
return $this;
}
/**
* @param string $column
* @param int $value
* @return $this
* @throws Exception
* @see MathematicsCondition
*/
public function elt(string $column, int $value): static
{
$this->where[] = ['ELT', $column, $value];
return $this;
}
/**
* @param $columns
* @param $value
* @return $this
* @throws Exception
*/
public function in($columns, $value): static
{
if ($value instanceof Closure) {
$value = $this->makeClosureFunction($value);
}
if (empty($value)) {
$value = [-1];
}
$this->where[] = ['IN', $columns, $value];
return $this;
}
/**
* @param $value
* @return ActiveQuery
* @throws Exception
*/
public function makeNewQuery($value): ActiveQuery
{
$activeQuery = new ActiveQuery($this->modelClass);
call_user_func($value, $activeQuery);
if (empty($activeQuery->from)) {
$activeQuery->from($activeQuery->modelClass::getTable());
}
return $activeQuery;
}
/**
* @return Query
* @throws ReflectionException
* @throws NotFindClassException
*/
public function makeNewSqlGenerate(): Query
{
return Snowflake::createObject(Query::class);
}
/**
* @param $columns
* @param $value
* @return $this
* @throws Exception
*/
public function notIn($columns, $value): static
{
if (empty($value) || !is_array($value)) {
$value = [-1];
}
$this->where[] = ['NOT IN', $columns, $value];
return $this;
}
/**
* @param string $column
* @param int $start
* @param int $end
* @return $this
*/
public function between(string $column, int $start, int $end): static
{
if (empty($column) || empty($start) || empty($end)) {
return $this;
}
$this->where[] = $column . ' BETWEEN ' . $start . ' AND ' . $end;
return $this;
}
/**
* @param string $column
* @param int $start
* @param int $end
* @return $this
*/
public function notBetween(string $column, int $start, int $end): static
{
if (empty($column) || empty($start) || empty($end)) {
return $this;
}
$this->where[] = $column . 'NOT BETWEEN' . $start . ' AND ' . $end;
return $this;
}
/**
* @param array $params
*
* @return $this
*/
public function bindParams(array $params = []): static
{
if (empty($params)) {
return $this;
}
$this->attributes = $params;
return $this;
}
/**
* @param callable|array|string $conditions
* @return $this
* @throws NotFindClassException
* @throws ReflectionException
* @throws Exception
*/
public function where(callable|array|string $conditions): static
{
if ($conditions instanceof Closure) {
$conditions = $this->makeClosureFunction($conditions);
}
$this->where[] = $conditions;
return $this;
}
/**
* @param Closure|array $closure
* @param bool $onlyWhere
* @return string
* @throws NotFindClassException
* @throws ReflectionException
* @throws Exception
*/
public function makeClosureFunction(Closure|array $closure, $onlyWhere = false): string
{
$generate = $this->makeNewSqlGenerate();
if ($closure instanceof Closure) {
call_user_func($closure, $generate);
} else {
$generate->where($closure);
}
return $onlyWhere ? $generate->getCondition() : $generate->getSql();
}
/**
* @param string $name
* @param string|null $having
*
* @return $this
*/
public function groupBy(string $name, string $having = NULL): static
{
$this->group = $name;
if (empty($having)) {
return $this;
}
$this->group .= ' HAVING ' . $having;
return $this;
}
/**
* @param int $offset
* @param int $limit
*
* @return $this
*/
public function limit(int $offset, int $limit = 20): static
{
$this->offset = $offset;
$this->limit = $limit;
return $this;
}
/**
* @return $this
*/
public function oneLimit(): static
{
$this->limit = 1;
return $this;
}
}
-79
View File
@@ -1,79 +0,0 @@
<?php
namespace Database\Traits;
use Database\ActiveQuery;
use Database\Query;
use Exception;
use JetBrains\PhpStorm\Pure;
/**
* Class CaseWhen
* @package Database\Traits
*/
class When
{
public ActiveQuery|QueryTrait $query;
private array $_condition = [];
private string $else = '';
/**
* CaseWhen constructor.
* @param string $column
* @param ActiveQuery|QueryTrait $activeQuery
*/
public function __construct(public string $column, public ActiveQuery|QueryTrait $activeQuery)
{
$this->_condition[] = 'CASE ' . $column;
}
/**
* @param array|string $condition
* @param string $then
* @return $this
* @throws Exception
*/
public function when(array|string $condition, string $then): static
{
$this->_condition[] = sprintf('WHEN %s THEN %s', $this->activeQuery->makeNewSqlGenerate()
->where($condition)
->getCondition(), $then);
return $this;
}
/**
* @param string $alias
*/
public function else(string $alias)
{
$this->else = $alias;
}
/**
* @return string
*/
#[Pure] public function end(): string
{
if (empty($this->_condition)) {
return '';
}
$prefix = implode(' ', $this->_condition);
if (!empty($this->else)) {
$prefix .= ' ELSE ' . $this->else;
}
return $prefix . ' END';
}
}
-48
View File
@@ -1,48 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use Snowflake\Abstracts\Config;
use Snowflake\Abstracts\Input;
use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake;
/**
* Class Command
* @package HttpServer
*/
class Command extends \Console\Command
{
public string $command = 'sw:gii';
public string $description = './snowflake sw:gii make=model|controller|task|interceptor|limits|middleware name=xxxx';
/**
* @param Input $dtl
* @return array
* @throws Exception
*/
public function onHandler(Input $dtl): array
{
/** @var Gii $gii */
$gii = Snowflake::app()->get('gii');
$connections = Snowflake::app()->db;
if ($dtl->exists('databases')) {
return $gii->run($connections->get($dtl->get('databases')), $dtl);
}
$array = [];
foreach (Config::get('databases') as $key => $connection) {
$array[$key] = $gii->run($connections->get($key), $dtl);
}
return $array;
}
}
-362
View File
@@ -1,362 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: 向林
* Date: 2016/8/9 0009
* Time: 17:43
*/
declare(strict_types=1);
namespace Gii;
use Database\Connection;
use Database\Db;
use Exception;
use JetBrains\PhpStorm\ArrayShape;
use Snowflake\Abstracts\Config;
use Snowflake\Abstracts\Input;
use Snowflake\Exception\ComponentException;
use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake;
/**
* Class gii
*
* @package Inter\utility
*/
class Gii
{
private ?string $tableName = NULL;
/** @var Connection */
private Connection $db;
/** @var Input */
private Input $input;
public string $modelPath = APP_PATH . 'app/Models/';
public string $modelNamespace = 'App\\Models\\';
public string $controllerPath = APP_PATH . 'app/Http/Controllers/';
public string $controllerNamespace = 'App\\Http\\Controllers\\';
public array $keyword = [
'ADD', 'ALL', 'ALTER', 'AND', 'AS', 'ASC', 'ASENSITIVE', 'BEFORE', 'BETWEEN', 'BIGINT', 'BINARY', 'BLOB', 'BOTH', 'BY', 'CALL', 'CASCADE', 'CASE', 'CHANGE', 'CHAR', 'CHARACTER', 'CHECK', 'COLLATE', 'COLUMN', 'CONDITION', 'CONNECTION', 'CONSTRAINT', 'CONTINUE', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR', 'DATABASE', 'DATABASES', 'DAY_HOUR', 'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT', 'DISTINCTROW', 'DIV', 'DOUBLE', 'DROP', 'DUAL', 'EACH', 'ELSE', 'ELSEIF', 'ENCLOSED', 'ESCAPED', 'EXISTS', 'EXIT', 'EXPLAIN', 'FALSE', 'FETCH', 'FLOAT', 'FLOAT4', 'FLOAT8', 'FOR', 'FORCE', 'FOREIGN', 'FROM', 'FULLTEXT', 'GOTO', 'GRANT', 'GROUP', 'HAVING', 'HIGH_PRIORITY', 'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND', 'IF', 'IGNORE', 'IN', 'INDEX', 'INFILE', 'INNER', 'INOUT', 'INSENSITIVE', 'INSERT', 'INT', 'INT1', 'INT2', 'INT3', 'INT4', 'INT8', 'INTEGER', 'INTERVAL', 'INTO', 'IS', 'ITERATE', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LABEL', 'LEADING', 'LEAVE', 'LEFT', 'LIKE', 'LIMIT', 'LINEAR', 'LINES', 'LOAD', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCK', 'LONG', 'LONGBLOB', 'LONGTEXT', 'LOOP', 'LOW_PRIORITY', 'MATCH', 'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', 'MIDDLEINT', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MOD', 'MODIFIES', 'NATURAL', 'NOT', 'NO_WRITE_TO_BINLOG', 'NULL', 'NUMERIC', 'ON', 'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OUTFILE', 'PRECISION', 'PRIMARY', 'PROCEDURE', 'PURGE', 'RAID0', 'RANGE', 'READ', 'READS', 'REAL', 'REFERENCES', 'REGEXP', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE', 'REQUIRE', 'RESTRICT', 'RETURN', 'REVOKE', 'RIGHT', 'RLIKE', 'SCHEMA', 'SCHEMAS', 'SECOND_MICROSECOND', 'SELECT', 'SENSITIVE', 'SEPARATOR', 'SET', 'SHOW', 'SMALLINT', 'SPATIAL', 'SPECIFIC', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', 'SSL', 'STARTING', 'STRAIGHT_JOIN', 'TABLE', 'TERMINATED', 'THEN', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'TO', 'TRAILING', 'TRIGGER', 'TRUE', 'UNDO', 'UNION', 'UNIQUE', 'UNLOCK', 'UNSIGNED', 'UPDATE', 'USAGE', 'USE', 'USING', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'VALUES', 'VARBINARY', 'VARCHAR', 'VARCHARACTER', 'VARYING', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WRITE', 'X509', 'XOR', 'YEAR_MONTH', 'ZEROFILL'
];
/**
* @param Connection|null $db
*
* @param $input
* @return array
* @throws ComponentException
* @throws ConfigException
* @throws Exception
*/
public function run(?Connection $db, $input): array
{
return $this->gen($input, $db);
}
/**
* @param $input
* @param $db
* @return array
* @throws ComponentException
* @throws ConfigException
* @throws Exception
*/
public function gen($input, $db): array
{
$this->input = $input;
if (!empty($db)) $this->db = $db;
$make = $this->input->get('make', null);
if (empty($make)) {
throw new Exception('构建类型不能为空~');
}
switch (strtolower($make)) {
case 'task':
$task = new GiiTask();
$task->setInput($this->input);
return $task->generate();
case 'interceptor':
$task = new GiiInterceptor();
$task->setInput($this->input);
return $task->generate();
case 'limits':
$task = new GiiLimits();
$task->setInput($this->input);
return $task->generate();
case 'middleware':
$task = new GiiMiddleware();
$task->setInput($this->input);
return $task->generate();
case 'rpc-client':
$task = new GiiRpcClient();
$task->setInput($this->input);
return $task->generate();
case 'rpc-service':
$task = new GiiRpcService();
$task->setInput($this->input);
return $task->generate();
default:
return $this->getModel($make, $input);
}
}
/**
* @param $make
* @param $input
* @return array
* @throws ComponentException
* @throws ConfigException
* @throws Exception
*/
private function getModel($make, $input): array
{
if ($this->db instanceof Connection) {
return $this->makeByDatabases($make, $input);
}
$db = $this->input->get('databases', 'db');
$this->db = Snowflake::app()->db->get($db);
return $this->makeByDatabases($make, $input);
}
/**
* @param $make
* @param $input
* @return array
* @throws ComponentException
* @throws Exception
*/
private function makeByDatabases($make, $input): array
{
$redis = Snowflake::app()->getRedis();
if (!empty($input->get('name'))) {
$this->tableName = $input->get('name');
$redis->del('column:' . $this->tableName);
}
return match ($make) {
'controller' => $this->getTable(1, 0),
'model' => $this->getTable(0, 1),
default => [],
};
}
/**
* @param $controller
* @param $model
* @return array
*
* @throws Exception
*/
private function getTable($controller, $model): array
{
$tables = $this->getFields($this->getTables());
if (empty($tables)) {
return [];
}
$fileList = [];
foreach ($tables as $key => $val) {
$data = $this->createModelFile($key, $val);
if ($controller == 1) {
$fileList[] = $this->generateController($data);
}
if ($model == 1) {
$fileList[] = $this->generateModel($data);
}
}
return $fileList;
}
/**
* @param array $data
* @return string
* @throws Exception
*/
private function generateModel(array $data): string
{
$controller = new GiiModel($data['classFileName'], $data['tableName'], $data['visible'], $data['res'], $data['fields']);
$controller->setConnection($this->db);
$controller->setModelPath($this->modelPath);
$controller->setModelNamespace($this->modelNamespace);
$controller->setInput($this->input);
$controller->setModule($this->input->get('module', null));
$controller->setControllerPath($this->controllerPath);
$controller->setControllerNamespace($this->controllerNamespace);
return $controller->generate();
}
/**
* @param array $data
* @return string
* @throws Exception
*/
private function generateController(array $data): string
{
$controller = new GiiController($data['classFileName'], $data['fields']);
$controller->setConnection($this->db);
$controller->setModelPath($this->modelPath);
$controller->setInput($this->input);
$controller->setModelNamespace($this->modelNamespace);
$controller->setControllerPath($this->controllerPath);
$controller->setModule($this->input->get('module', null));
$controller->setControllerNamespace($this->controllerNamespace);
return $controller->generate();
}
/**
* @return array|string|null
* @throws Exception
*/
private function getTables(): array|string|null
{
if (empty($this->tableName)) {
return $this->showAll();
}
$res = $this->tableName;
if (is_string($res)) {
$res = explode(',', $this->tableName);
}
if (empty($res)) {
return [];
}
return $res;
}
/**
* @return array
* @throws Exception
*/
private function showAll(): array
{
$res = [];
$_tables = Db::findAllBySql('show tables', [], $this->db);
if (empty($_tables)) {
return $res;
}
foreach ($_tables as $key => $val) {
$res[] = array_shift($val);
}
return $res;
}
/**
* @param $table
* @return bool|int|null
* @throws Exception
*/
private function getIndex($table): bool|int|null
{
$data = Db::findAllBySql('SHOW INDEX FROM ' . $table, [], $this->db);
return empty($data) ? NULL : $data[0];
}
/**
* @param $tables
*
* @return array
* @throws
*/
private function getFields($tables): array
{
$res = [];
if (!is_array($tables)) {
$tables = [$tables];
}
foreach ($tables as $key => $val) {
if (empty($val)) continue;
$_tmp = Db::findAllBySql('SHOW FULL FIELDS FROM ' . $val, [], $this->db);
if (empty($_tmp)) {
continue;
}
$res[$val] = $_tmp;
}
return $res;
}
/**
* @param $tableName
* @param $tables
*
* @return array
* @throws Exception
*/
public function createModelFile($tableName, $tables): array
{
$res = $visible = $fields = $keys = [];
foreach ($tables as $_key => $_val) {
$keys = $tableName;
if ($_val['Extra'] == 'auto_increment' || $_val['Key'] == 'PRI') {
$keys = $tableName;
}
if (!isset($keys) && !($index = $this->getIndex($tableName))) {
$keys = $index['Column_name'];
}
if (in_array(strtoupper($_val['Field']), $this->keyword)) {
throw new Exception('You can not use keyword "' . $_val['Field'] . '" as field at table "' . $tableName . '"');
}
array_push($visible, $this->createVisible($_val['Field']));
array_push($fields, $_val);
$res[] = $this->createSetFunc($_val['Field'], $_val['Comment']);
}
$classFileName = $this->getClassName($tableName);
return [
'classFileName' => $classFileName,
'tableName' => $keys,
'visible' => $visible,
'fields' => $fields,
'res' => $res,
];
}
/**
* @param $field
* @return string
* 创建变量注释
*/
private function createVisible($field): string
{
return '
* @property $' . $field;
}
/**
* @param $field
* @param $comment
* @return string
* 暂时不知道干嘛用的
*/
private function createSetFunc($field, $comment): string
{
return '
' . str_pad('\'' . $field . '\'', 20, ' ', STR_PAD_RIGHT) . '=> \'' . (empty($comment) ? ucfirst($field) : $comment) . '\',';
}
/**
* @param $tableName
* @return string
* 构建类名称
*/
private function getClassName($tableName): string
{
$res = [];
foreach (explode('_', $tableName) as $n => $val) {
$res[] = ucfirst($val);
}
return implode('', $res);
}
}
-404
View File
@@ -1,404 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Database\Connection;
use Exception;
use JetBrains\PhpStorm\ArrayShape;
use ReflectionClass;
use ReflectionException;
use Snowflake\Abstracts\Input;
use Snowflake\Core\Json;
/**
* Class GiiBase
* @package Gii
*/
abstract class GiiBase
{
public array $fileList = [];
/** @var Input */
protected Input $input;
public string $modelPath = APP_PATH . 'app/Models/';
public string $modelNamespace = 'App\Models\\';
public string $controllerPath = APP_PATH . 'app/Http/Controllers/';
public string $controllerNamespace = 'App\\Http\\Controllers\\';
public ?string $module = null;
public array $rules = [];
public array $type = [
'int' => ['tinyint', 'smallint', 'mediumint', 'int', 'bigint'],
'string' => ['char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext', 'enum'],
'date' => ['date'],
'time' => ['time'],
'year' => ['year'],
'datetime' => ['datetime'],
'timestamp' => ['timestamp'],
'float' => ['float', 'double', 'decimal',],
];
public ?string $tableName = NULL;
public ?Connection $db = null;
/**
* @param string $modelPath
*/
public function setModelPath(string $modelPath): void
{
$this->modelPath = $modelPath;
}
/**
* @param string $modelNamespace
*/
public function setModelNamespace(string $modelNamespace): void
{
$this->modelNamespace = $modelNamespace;
}
/**
* @param string $controllerPath
*/
public function setControllerPath(string $controllerPath): void
{
$this->controllerPath = $controllerPath;
}
/**
* @param $module
*/
public function setModule($module)
{
$this->module = $module;
}
/**
* @param string $controllerNamespace
*/
public function setControllerNamespace(string $controllerNamespace): void
{
$this->controllerNamespace = $controllerNamespace;
}
/**
* @param Input $input
*/
public function setInput(Input $input)
{
$this->input = $input;
}
/**
* @param ReflectionClass $object
* @param $className
*
* @return string
*/
public function getUseContent(ReflectionClass $object, $className): string
{
if (empty($object)) {
return '';
}
$file = $this->getFilePath($className);
if (!file_exists($file)) {
return '';
}
$content = file_get_contents($file);
$explode = explode(PHP_EOL, $content);
$exists = array_slice($explode, 0, $object->getStartLine());
$_tmp = [];
foreach ($exists as $key => $val) {
if (trim($val) == '/**') {
break;
}
$_tmp[] = $val;
}
return trim(implode(PHP_EOL, $_tmp));
}
/**
* @param string $fileName
* @param ReflectionClass $class
* @return string
*/
protected function getImports(string $fileName, ReflectionClass $class): string
{
$startLine = 1;
$array = [];
$fileOpen = fopen($fileName, 'r');
while (($content = fgets($fileOpen)) !== false) {
if (str_starts_with($content, 'use ')) {
$array[] = $content;
}
if ($startLine == $class->getStartLine()) {
break;
}
++$startLine;
}
return implode($array);
}
/**
* @param ReflectionClass $class
* @return string
* @throws ReflectionException
*/
protected function getClassProperty(ReflectionClass $class): string
{
$html = '';
$rc = $class->getParentClass()->getConstants();
foreach ($class->getConstants() as $key => $val) {
if (isset($rc[$key])) {
continue;
}
if (is_numeric($val)) {
$html .= '
const ' . $key . ' = ' . $val . ';' . "\n";
} else {
$html .= '
const ' . $key . ' = \'' . $val . '\';' . "\n";
}
}
foreach ($class->getDefaultProperties() as $key => $val) {
$property = $class->getProperty($key);
if ($property->class != $class->getName()) continue;
if (is_array($val)) {
$val = '[\'' . implode('\', \'', $val) . '\']';
} else if (!is_numeric($val)) {
$val = '\'' . $val . '\'';
}
if ($property->isProtected()) {
$debug = 'protected';
} else if ($property->isPrivate()) {
$debug = 'private';
} else {
$debug = 'public';
}
if ($property->hasType()) {
$type = ' ' . $property->getType() . ' $' . $key . ' = ' . $val . ';' . "\n";
} else {
$type = ' $' . $key . ' = ' . $val . ';' . "\n";
}
if ($property->isStatic()) {
$html .= '
' . $debug . ' static' . $type;
} else {
if ($key == 'primary') {
continue;
}
$html .= '
' . $debug . $type;
}
}
return $html;
}
/**
* @param ReflectionClass $class
* @param array $filters
* @return string
* @throws Exception
*/
protected function getClassMethods(ReflectionClass $class, array $filters = []): string
{
$methods = $class->getMethods();
$classFileName = str_replace(APP_PATH, '', $class->getFileName());
$content = [];
if (!empty($methods)) foreach ($methods as $key => $val) {
if ($val->class != $class->getName()) continue;
if (in_array($val->name, $filters)) continue;
$over = "
" . $val->getDocComment() . "\n";
$attributes = $val->getAttributes();
if (!empty($attributes)) {
foreach ($attributes as $attribute) {
$explode = explode('\\', $attribute->getName());
$_array = [];
foreach ($attribute->getArguments() as $_key => $argument) {
$argument = $this->resolveArray($argument);
if (is_numeric($_key)) {
$_array[] = $argument;
} else {
$_array[] = $_key . ': ' . $argument . '';
}
}
$over .= " #[" . end($explode) . "(" . implode(',', $_array) . ")]
";
}
}
$func = $this->getFuncLineContent($class, $classFileName, $val->name) . "\n";
$content[] = $over . $func;
}
return implode(PHP_EOL, $content);
}
/**
* @param $argument
* @return string
*/
private function resolveArray($argument): string
{
if (is_array($argument)) {
$__array = [];
foreach ($argument as $key => $value) {
if (is_string($value)) {
if (str_contains($value, '\\') && class_exists($value)) {
$explode_class = explode('\\', $value);
$__array[] = end($explode_class) . '::class';
} else {
$__array[] = '\'' . $value . '\'';
}
} else {
$value = str_replace('{', '[', Json::encode($value));
$value = str_replace('}', ']', Json::encode($value));
$value = str_replace(':', '=>', Json::encode($value));
$value = preg_replace('/"\d+"\=\>/', '', $value);
$__array[] = $value;
}
}
$argument = '[' . implode(', ', $__array) . ']';
} else {
$argument = '\'' . $argument . '\'';
}
return $argument;
}
/**
* @param $fields
* @return mixed 返回表主键
* 返回表主键
*/
public function getPrimaryKey($fields): mixed
{
$condition = ['PRI', 'UNI'];
foreach ($fields as $field) {
if ($field['Extra'] == 'auto_increment') {
return $field['Field'];
}
if (in_array($field['Key'], $condition)) {
return $field['Field'];
}
}
return null;
}
/**
* @param $className
* @return string
*/
private function getFilePath($className): string
{
if (strpos($className, '\\')) {
$className = str_replace('\\', '/', $className);
}
if (strpos($className, '\\')) {
$className = str_replace('\\', '/', $className);
}
return APP_PATH . $className;
}
/**
* @param ReflectionClass $object
* @param $className
* @param $method
* @return string
* @throws Exception
*/
public function getFuncLineContent(ReflectionClass $object, $className, $method): string
{
$fun = $object->getMethod($method);
$content = file_get_contents($this->getFilePath($className));
$explode = explode(PHP_EOL, $content);
$exists = array_slice($explode, $fun->getStartLine() - 1, $fun->getEndLine() - $fun->getStartLine() + 1);
return implode(PHP_EOL, $exists);
}
/**
* @return array
*/
protected function getModelPath(): array
{
$dbName = $this->db->id;
if (empty($dbName) || $dbName == 'db') {
$dbName = '';
}
$modelPath = [
'namespace' => $this->modelNamespace,
'path' => $this->modelPath,
];
if (!is_dir($modelPath['path'])) {
mkdir($modelPath['path']);
}
if (!empty($dbName)) {
$modelPath['namespace'] = $this->modelNamespace . ucfirst($dbName);
$modelPath['path'] = $this->modelPath . ucfirst($dbName);
}
if (!is_dir($modelPath['path'])) {
mkdir($modelPath['path']);
}
return $modelPath;
}
/**
* @param $db
*/
public function setConnection($db)
{
$this->db = $db;
}
/**
* @param $val
* @return string
*/
protected function checkIsRequired($val): string
{
return strtolower($val['Null']) == 'no' && $val['Default'] === NULL ? 'true' : 'false';
}
/**
* @return array
*/
public function getFileLists(): array
{
return $this->fileList;
}
}
-539
View File
@@ -1,539 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use ReflectionException;
use Snowflake\Snowflake;
/**
* Class GiiController
* @package Gii
*/
class GiiController extends GiiBase
{
public string $className = '';
public array $fields = [];
/**
* GiiController constructor.
* @param $className
* @param $fields
*/
public function __construct($className, $fields)
{
$this->className = $className;
$this->fields = $fields;
}
/**
* @return string|bool
* @throws ReflectionException
* @throws Exception
*/
public function generate(): string|bool
{
$path = $this->getControllerPath();
$modelPath = $this->getModelPath();
$managerName = $this->className;
$namespace = rtrim($path['namespace'], '\\');
$model_namespace = rtrim($modelPath['namespace'], '\\');
$prefix = str_replace('_', '', $this->db->tablePrefix);
$managerName = str_replace(ucfirst($prefix), '', $managerName);
$class = '';
$controller = str_replace('\\\\', '\\', "$namespace\\{$managerName}Controller");
$html = "<?php
namespace {$namespace};
";
if (file_exists($path['path'] . '/' . $managerName . 'Controller.php')) {
try {
$class = new \ReflectionClass($controller);
$import = $this->getImports($path['path'] . '/' . $managerName . 'Controller.php', $class);
} catch (\Throwable $Exception) {
exit(logger()->addError($Exception, 'throwable'));
}
} else {
$import = "use Snowflake;
use Exception;
use Annotation\Target;
use Annotation\Route\Middleware;
use Annotation\Route\Route;
use Snowflake\Core\Str;
use Snowflake\Core\Json;
use HttpServer\Http\Request;
use HttpServer\Http\Response;
use HttpServer\Controller;
use JetBrains\PhpStorm\ArrayShape;
use {$model_namespace}\\{$managerName};
";
}
if (!empty($import)) {
$html .= $import;
}
$controllerName = $managerName;
$historyModel = "use {$model_namespace}\\{$managerName};";
if (!str_contains($html, $historyModel)) {
$html .= $historyModel;
}
$html .= "
/**
* Class {$controllerName}Controller
*
* @package controller
*/
#[Target] class {$controllerName}Controller extends Controller
{
";
$funcNames = [];
if (is_object($class)) {
$html .= $this->getClassProperty($class);
$html .= $this->getClassMethods($class);
}
$default = ['loadParam', 'actionAdd', 'actionUpdate', 'actionDetail', 'actionDelete', 'actionBatchDelete', 'actionList'];
foreach ($default as $key => $val) {
if (str_contains($html, ' function ' . $val . '(')) {
continue;
}
$html .= $this->{'controllerMethod' . str_replace('action', '', $val)}($this->fields, $managerName, $managerName, $path) . "\n";
}
$html .= '
}';
$file = $path['path'] . '/' . $controllerName . 'Controller.php';
if (file_exists($file)) {
unlink($file);
}
Snowflake::writeFile($file, $html);
return $controllerName . 'Controller.php';
}
/**
* @return array
*/
private function getControllerPath(): array
{
$dbName = $this->db->id;
if (empty($dbName) || $dbName == 'db') {
$dbName = '';
}
$module = empty($this->module) ? '' : $this->module;
$modelPath['namespace'] = $this->controllerNamespace . $module;
$modelPath['path'] = $this->controllerPath . $module;
if (!is_dir($modelPath['path'])) {
mkdir($modelPath['path']);
}
if (!empty($dbName)) {
$modelPath['namespace'] = $this->controllerNamespace . ucfirst($dbName);
$modelPath['path'] = $this->controllerPath . ucfirst($dbName);
}
$modelPath['namespace'] = rtrim($modelPath['namespace'], '\\');
$modelPath['path'] = rtrim($modelPath['path'], '\\');
if (!is_dir($modelPath['path'])) {
mkdir($modelPath['path']);
}
return $modelPath;
}
/**
* @param $fields
* @param $className
* @param null $object
* @param $path
* @return string
* 新增
*/
public function controllerMethodAdd($fields, $className, $object, $path): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/add", method: "POST")]
#[Middleware(middleware: [])]
public function actionAdd(): string
{
$model = new ' . $className . '();
$model->attributes = $this->loadParam();
if (!$model->save()) {
return JSON::to(500, $model->getLastError());
}
return JSON::to(0, $model->toArray());
}';
}
/**
* @param $fields
* @param $className
* @param null $object
* @return string
* 通用
*/
public function controllerMethodLoadParam($fields, $className, $object = NULL): string
{
return '
/**
* @return array
* @throws Exception
*/
#[ArrayShape([])]
private function loadParam(): array
{
return [' . $this->getData($fields) . '
];
}';
}
/**
* @param $fields
* @param $className
* @param null $object
* @param array $path
* @return string
* 构建更新
*/
public function controllerMethodUpdate($fields, $className, $object = NULL, $path = []): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/update", method: "POST")]
#[Middleware(middleware: [])]
public function actionUpdate(): string
{
$model = ' . $className . '::findOne($this->input->post(\'id\', 0));
if (empty($model)) {
return JSON::to(500, SELECT_IS_NULL);
}
$model->attributes = $this->loadParam();
if (!$model->save()) {
return JSON::to(500, $model->getLastError());
}
return JSON::to(0, $model->toArray());
}';
}
/**
* @param $fields
* @param $className
* @param null $object
* @param array $path
* @return string
* 构建更新
*/
public function controllerMethodBatchDelete($fields, $className, $object = NULL, $path = []): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/batch-delete", method: "POST")]
#[Middleware(middleware: [])]
public function actionBatchDelete(): string
{
$_key = $this->input->array(\'ids\');
if (empty($_key)) {
return JSON::to(500, PARAMS_IS_NULL);
}
$model = ' . $className . '::find()->in(\'id\', $_key);
if (!$model->delete()) {
return JSON::to(500, DB_ERROR_BUSY);
}
return JSON::to(0, $_key);
}';
}
/**
* @param $fields
* @param $className
* @param $managerName
* @param array $path
* @return string
* 构建详情
*/
public function controllerMethodDetail($fields, $className, $managerName, $path = []): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/detail", method: "POST")]
#[Middleware(middleware: [])]
public function actionDetail(): string
{
$model = ' . $managerName . '::findOne($this->input->get(\'id\'));
if (empty($model)) {
return JSON::to(404, SELECT_IS_NULL);
}
return JSON::to(0, $model->toArray());
}';
}
/**
* @param $fields
* @param $className
* @param $managerName
* @param $path
* @return string
* 构建删除操作
*/
public function controllerMethodDelete($fields, $className, $managerName, $path): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/delete", method: "POST")]
#[Middleware(middleware: [])]
public function actionDelete(): string
{
$_key = $this->input->int(\'id\', true);
$model = ' . $managerName . '::findOne($_key);
if (empty($model)) {
return JSON::to(500, SELECT_IS_NULL);
}
if (!$model->delete()) {
return JSON::to(500, $model->getLastError());
}
return JSON::to(0, $model);
}';
}
/**
* @param $fields
* @param $className
* @param $managerName
* @param array $path
* @return string
* 构建查询列表
*/
public function controllerMethodList($fields, $className, $managerName, $path = []): string
{
$_path = str_replace(CONTROLLER_PATH, '', $path['path']);
$_path = lcfirst(rtrim($_path, '/')) . '/' . lcfirst($className);
$_path = ltrim($_path,'/');
return '
/**
* @return string
* @throws Exception
*/
#[Route(uri: "' . $_path . '/list", method: "POST")]
#[Middleware(middleware: [])]
public function actionList(): string
{
//分页处理
$count = $this->input->get(\'count\', -1);
$order = $this->input->get(\'order\', \'id\');
if (!empty($order)) {
$order .= !$this->input->get(\'isDesc\', 0) ? \' asc\' : \' desc\';
} else {
$order = \'id desc\';
}
//列表输出
$model = ' . $managerName . '::find()->where($this->input->gets())->orderBy($order);
$keyword = $this->input->get(\'keyword\', null);
if (!empty($keyword)) {
$model->like(\'keyword\', $keyword);
}
if ((int) $count === 1) {
$count = $model->count();
}
if ($count != -100) {
$model->limit($this->input->offset() ,$this->input->size());
}
$data = $model->all()->toArray();
return JSON::to(0, $data, $count);
}
';
}
private function getData($fields): string
{
$html = '';
$length = $this->getMaxLength($fields);
foreach ($fields as $key => $val) {
preg_match('/\((\d+)(,(\d+))*\)/', $val['Type'], $number);
$type = strtolower(preg_replace('/\(\d+(,\d+)*\)/', '', $val['Type']));
$first = preg_replace('/\s+\w+/', '', $type);
if ($val['Field'] == 'id') continue;
if ($type == 'timestamp') continue;
$_field = [];
$_field['required'] = $this->checkIsRequired($val);
foreach ($this->type as $_key => $value) {
if (!in_array(strtolower($first), $value)) continue;
$comment = '//' . $val['Comment'];
$_field['type'] = $_key;
if ($type == 'date' || $type == 'datetime' || $type == 'time') {
$_tps = match ($type) {
'date' => '$this->input->' . $_key . '(\'' . $val['Field'] . '\', date(\'Y-m-d\'))',
'time' => '$this->input->' . $_key . '(\'' . $val['Field'] . '\', date(\'H:i:s\'))',
default => '$this->input->' . $_key . '(\'' . $val['Field'] . '\', date(\'Y-m-d H:i:s\'))',
};
$html .= '
\'' . str_pad($val['Field'] . '\'', $length, ' ', STR_PAD_RIGHT) . ' => ' . str_pad($_tps . ',', 60, ' ', STR_PAD_RIGHT) . $comment;
} else {
$tmp = 'null';
if (isset($number[0])) {
if (strpos(',', $number[0])) {
$tmp = '[' . $number[1] . ',' . $number[3] . ']';
$_field['min'] = $number[1];
$_field['max'] = $number[3];
} else {
$tmp = '[0,' . $number[1] . ']';
$_field['min'] = 0;
$_field['max'] = $number[1];
}
}
if ($key == 'string') {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', ' . $_field['required'] . ', ' . $tmp . ')';
} else if ($type == 'int') {
if ($number[0] == 10) {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', time())';
} else {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', ' . $_field['required'] . ')';
}
} else if ($type == 'float') {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', ' . $_field['required'] . ', ' . ($number[3] ?? '2') . ')';
} else if ($key == 'email') {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', ' . $_field['required'] . ')';
} else if ($key == 'timestamp') {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', time())';
} else {
$_tps = '$this->input->' . $_key . '(\'' . $val['Field'] . '\', ' . $_field['required'] . ')';
}
$html .= '
\'' . str_pad($val['Field'] . '\'', $length, ' ', STR_PAD_RIGHT) . ' => ' . str_pad($_tps . ',', 60, ' ', STR_PAD_RIGHT) . $comment;
}
}
$this->rules[$val['Field']] = $_field;
}
return $html;
}
/**
* @param $fields
* @return int
*/
private function getMaxLength($fields): int
{
$length = 0;
foreach ($fields as $key => $val) {
if (mb_strlen($val['Field'] . ' >=') > $length) $length = mb_strlen($val['Field'] . ' >=');
}
return $length;
}
/**
* @param $fields
* @return string
*/
private function getWhere($fields): string
{
$html = '';
$length = $this->getMaxLength($fields);
foreach ($fields as $key => $val) {
preg_match('/\d+/', $val['Type'], $number);
$type = strtolower(preg_replace('/\(\d+\)/', '', $val['Type']));
$first = preg_replace('/\s+\w+/', '', $type);
if ($type == 'timestamp') continue;
if ($type == 'json') continue;
foreach ($this->type as $_key => $value) {
if (!in_array(strtolower($first), $value)) continue;
$comment = '//' . $val['Comment'];
if ($type == 'date' || $type == 'datetime' || $type == 'time') {
$_tps = '$this->input->get(\'' . $val['Field'] . '\', null)';
$html .= '
$pWhere[\'' . str_pad($val['Field'] . ' <=\']', $length, ' ', STR_PAD_RIGHT) . ' = ' . str_pad($_tps . ';', 60, ' ', STR_PAD_RIGHT) . $comment;
$html .= '
$pWhere[\'' . str_pad($val['Field'] . ' >=\']', $length, ' ', STR_PAD_RIGHT) . ' = ' . str_pad($_tps . ';', 60, ' ', STR_PAD_RIGHT) . $comment;
} else {
$_tps = '$this->input->get(\'' . $val['Field'] . '\', null)';
$html .= '
$pWhere[\'' . str_pad($val['Field'] . '\']', $length, ' ', STR_PAD_RIGHT) . ' = ' . str_pad($_tps . ';', 60, ' ', STR_PAD_RIGHT) . $comment;
}
}
}
return $html;
}
}
-98
View File
@@ -1,98 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiInterceptor
* @package Gii
*/
class GiiInterceptor extends GiiBase
{
public ?string $tableName = null;
/**
* @return bool|array
* @throws Exception
*/
public function generate(): bool|array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$html = '<?php
namespace App\Http\Interceptor;
';
$file = APP_PATH . 'app/Http/Interceptor/' . $managerName . 'Interceptor.php';
if (file_exists($file)) {
try {
$class = new \ReflectionClass('App\\Http\\Interceptor\\' . $managerName . 'Interceptor');
$html .= $this->getImports($file, $class);
} catch (\Throwable $exception) {
return logger()->addError($exception, 'throwable');
}
} else {
$html .= '
use Closure;
use HttpServer\Http\Request;
use HttpServer\IInterface\Interceptor;
';
}
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . 'Interceptor
* @package App\Http\Interceptor
*/
class ' . $managerName . 'Interceptor implements Interceptor
{';
if (isset($class)) {
$html .= $this->getClassProperty($class);
$html .= $this->getClassMethods($class);
$html .= '
}';
} else {
$html .= '
/**
* @param Request $request
* @param Closure $closure
* @return mixed
*/
public function Interceptor(Request $request, Closure $closure)
{
return $closure($request);
}
}';
}
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . 'Interceptor.php'];
}
}
-75
View File
@@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiLimits
* @package Gii
*/
class GiiLimits extends GiiBase
{
public ?string $tableName = '';
/**
* @return string[]
* @throws Exception
*/
public function generate(): array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$html = '<?php
namespace App\Http\Limits;
use Closure;
use HttpServer\Http\Request;
use HttpServer\IInterface\Limits;
';
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . 'Limits
* @package App\Http\Limits
*/
class ' . $managerName . 'Limits implements Limits
{
/**
* @param Request $request
* @param Closure $closure
* @return mixed
*/
public function next(Request $request, Closure $closure)
{
return $closure($request);
}
}';
$file = APP_PATH . 'app/Http/Limits/' . $managerName . 'Limits.php';
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . 'Limits.php'];
}
}
-72
View File
@@ -1,72 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiMiddleware
* @package Gii
*/
class GiiMiddleware extends GiiBase
{
/**
* @return array
* @throws Exception
*/
public function generate(): array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$html = '<?php
namespace App\Http\Middleware;
use Closure;
use HttpServer\Http\Request;
use HttpServer\IInterface\Middleware;
';
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . 'Middleware
* @package App\Http\Middleware
*/
class ' . $managerName . 'Middleware implements Middleware
{
/**
* @param Request $request
* @param Closure $closure
* @return mixed
*/
public function handler(Request $request, Closure $closure)
{
return $closure($request);
}
}';
$file = APP_PATH . 'app/Http/Middleware/' . $managerName . 'Middleware.php';
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . 'Middleware.php'];
}
}
-426
View File
@@ -1,426 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Database\Db;
use Exception;
use ReflectionException;
use Snowflake\Snowflake;
/**
* Class GiiModel
* @package Gii
*/
class GiiModel extends GiiBase
{
public ?string $classFileName;
public ?array $visible;
public ?array $res;
public ?array $fields;
/**
* ModelFile constructor.
* @param $classFileName
* @param $tableName
* @param $visible
* @param $res
* @param $fields
*/
public function __construct(string $classFileName, string $tableName, array $visible, array $res, array $fields)
{
$this->classFileName = $classFileName;
$this->tableName = $tableName;
$this->visible = $visible;
$this->res = $res;
$this->fields = $fields;
}
/**
* @throws ReflectionException
* @throws Exception
*/
public function generate(): string
{
$class = '';
$modelPath = $this->getModelPath();
$managerName = $this->classFileName;
$namespace = rtrim($modelPath['namespace'], '\\');
$prefix = str_replace('_', '', $this->db->tablePrefix);
$managerName = str_replace(ucfirst($prefix), '', $managerName);
if (file_exists($modelPath['path'] . '/' . $managerName . '.php')) {
try {
$className = str_replace('\\\\', '\\', "{$modelPath['namespace']}\\{$managerName}");
$class = Snowflake::getDi()->getReflect($className);
$html = '<?php
namespace ' . $namespace . ';
';
$imports = $this->getImports($modelPath['path'] . '/' . $managerName . '.php', $class);
if (!empty($imports)) {
$html .= $imports . PHP_EOL;
}
if (!str_contains($imports, 'Annotation\Model\Set')) {
$html .= 'use Annotation\Model\Set;' . PHP_EOL;
}
if (!str_contains($imports, 'Annotation\Model\Get')) {
$html .= 'use Annotation\Model\Get;' . PHP_EOL;
}
} catch (\Throwable $e) {
logger()->addError($e, 'throwable');
}
}
if (!isset($html) || empty($html)) {
$html = '<?php
namespace ' . $namespace . ';
use Exception;
use Annotation\Target;
use Snowflake\Core\Json;
use Database\Connection;
use Annotation\Model\Get;
use Annotation\Model\Set;
use Annotation\Model\Relation;
use Database\ActiveRecord;
' . PHP_EOL;
}
$createSql = $this->setCreateSql($this->tableName);
if (!str_contains($html, $createSql)) {
$html .= '
' . $this->setCreateSql($this->tableName);
}
$html .= '
/**
* Class ' . $managerName . '
* @package Inter\mysql
*' . implode('', $this->visible) . '
* @sql
*/
#[Target] class ' . $managerName . ' extends ActiveRecord
{
';
if (!empty($class)) {
$html .= $this->getClassProperty($class);
}
$primary = $this->createPrimary($this->fields);
if (!empty($primary)) {
$html .= $primary . "\n";
}
$html .= $this->createTableName($this->tableName) . "\n";
$html .= $this->createRules($this->fields);
if (is_object($class)) {
$html .= $this->getClassMethods($class, ['rules', 'tableName', 'attributes']);
} else {
$html .= $this->createDatabaseSource();
$other = $this->generate_json_function($html, $this->fields);
if (!empty($other)) {
$html .= implode($other);
}
}
$html .= '
}';
$file = rtrim($modelPath['path'], '/') . '/' . $managerName . '.php';
if (file_exists($file)) {
unlink($file);
}
Snowflake::writeFile($file, $html);
return $managerName . '.php';
}
/**
* @param $html
* @param $fields
* @return array
*/
private function generate_json_function($html, $fields): array
{
$strings = [];
foreach ($fields as $field) {
if ($field['Type'] === 'json') {
$function = '
/**
* @param $value
* @return int|bool|string
* @throws Exception
*/
public function set' . ucfirst($field['Field']) . 'Attribute($value): int|bool|string
{
if ( !is_string($value) ) {
return JSON::encode($value);
}
return $value;
}
';
$get_function = '
/**
* @param $value
* @return array|null|bool
*/
#[Get(\'' . $field['Field'] . '\')]
public function get' . ucfirst($field['Field']) . 'Attribute($value): array|null|bool
{
$value = stripcslashes($value);
if ( is_string($value) ) {
return JSON::decode($value, true);
}
return $value;
}
';
if (!str_contains($html, 'set' . ucfirst($field['Field']) . 'Attribute')) {
$strings[] = $function;
}
if (!str_contains($html, 'get' . ucfirst($field['Field']) . 'Attribute')) {
$strings[] = $get_function;
}
}
}
return $strings;
}
/**
* @param $field
* @return string
* 创建表名称
*/
private function createTableName($field): string
{
$prefixed = $this->db->tablePrefix;
if (!empty($prefixed)) {
if (str_starts_with($field, $prefixed)) {
$field = str_replace($prefixed, '', $field);
$field = '{{%' . $field . '}}';
}
}
return '
/**
* @inheritdoc
*/
public static function tableName(): string
{
return \'' . $field . '\';
}
';
}
/**
* @param $fields
* @return string
* 创建效验规则
*/
private function createRules($fields): string
{
$data = [];
foreach ($fields as $key => $val) {
if ($val['Extra'] == 'auto_increment') continue;
$type = preg_replace('/\(.*?\)|\s+\w+/', '', $val['Type']);
foreach ($this->type as $_key => $_val) {
if (in_array($type, $_val)) {
$type = lcfirst(str_replace('get', '', $_key));
break;
}
}
$data[$type][] = $val;
}
$_field_one = '';
$required = $this->getRequired($fields);
if (!empty($required)) {
$_field_one .= $required;
}
foreach ($data as $key => $val) {
$field = '[\'' . implode('\', \'', array_column($val, 'Field')) . '\']';
if (count($val) == 1) {
$field = '\'' . current($val)['Field'] . '\'';
}
$_field_one .= '
[' . $field . ', \'' . $key . '\'],';
}
foreach ($data as $key => $val) {
$length = $this->getLength($val);
if (!empty($length)) {
$_field_one .= $length . ',';
}
}
$required = $this->getUnique($fields);
if (!empty($required)) {
$_field_one .= $required;
}
return '
/**
* @return array
*/
public function rules(): array
{
return [' . $_field_one . '
];
}
';
}
/**
* @param $val
* @return string
*/
public function getLength($val): string
{
$data = [];
foreach ($val as $key => $_val) {
$preg = preg_match('/(\w+)\((.*?)\)/', $_val['Type'], $results);
if ($preg && isset($results[2])) {
$results[] = $_val['Field'];
$data[$results[2]][] = $results;
}
}
if (empty($data)) return '';
$string = [];
foreach ($data as $key => $_val) {
if (is_string($key) && str_contains($key, ',')) {
$key = '[' . $key . ']';
}
if (count($_val) == 1) {
[$typeRule, $type, $rule, $field] = current($_val);
$_tmp = '
[\'' . $field . '\', \'' . ($type == 'enum' ? 'enum' : 'maxLength') . '\' => ' . $key . ']';
} else {
$_tmp = '
[[\'' . implode('\', \'', array_column($_val, 3)) . '\'], \'maxLength\' => ' . $key . ']';
}
$string[] = $_tmp;
}
return implode(',', $string);
}
/**
* @param $fields
* @return string
*/
public function getUnique($fields): string
{
$data = [];
foreach ($fields as $_key => $_val) {
if ($_val['Extra'] == 'auto_increment') continue;
if (str_contains($_val['Type'], 'unique')) {
$data[] = $_val['Field'];
}
}
if (empty($data)) {
return '';
}
return '
[[\'' . implode('\', \'', $data) . '\'], \'unique\'],';
}
/**
* @param $val
* @return string
*/
public function getRequired($val): string
{
$data = [];
foreach ($val as $_key => $_val) {
if ($_val['Extra'] == 'auto_increment') continue;
if ($_val['Key'] == 'PRI' || $_val['Key'] == 'UNI' || $this->checkIsRequired($_val) === 'true') {
array_push($data, $_val['Field']);
}
}
if (empty($data)) {
return '';
}
return '
[[\'' . implode('\', \'', $data) . '\'], \'required\'],';
}
/**
* 用来生成文档的
* 格式
* @param $fields
* @return null|string
* array(
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* 'field' ,'字段類型' ,'是否必填' ,'字段长度' , '字段解释',
* )
*/
private function createPrimary($fields): ?string
{
$field = $this->getPrimaryKey($fields);
if (empty($field)) {
return null;
}
return '
public ?string $primary = \'' . $field . '\';';
}
/**
* @return string
*/
private function createDatabaseSource(): string
{
return '
/**
* @return Connection
* @throws Exception
*/
public static function getDb(): Connection
{
return static::setDatabaseConnect(\'' . $this->db->id . '\');
}
';
}
/**
* @param $table
* @return string
* @throws Exception
*/
private function setCreateSql($table): string
{
$text = Db::showCreateSql($table, $this->db)['Create Table'] ?? '';
$_tmp = [];
foreach (explode(PHP_EOL, $text) as $val) {
$_tmp[] = '// ' . $val;
}
return implode(PHP_EOL, $_tmp);
}
}
-33
View File
@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Console\Console;
use Exception;
use Snowflake\Abstracts\Providers;
use Snowflake\Application;
/**
* Class DatabasesProviders
* @package Database
*/
class GiiProviders extends Providers
{
/**
* @param Application $application
* @throws Exception
*/
public function onImport(Application $application)
{
$application->set('gii', ['class' => Gii::class]);
/** @var Console $console */
$console = $application->get('console');
$console->register(Command::class);
}
}
-99
View File
@@ -1,99 +0,0 @@
<?php
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiRpcClient
* @package Gii
*/
class GiiRpcClient extends GiiBase
{
/**
* @return array
* @throws Exception
*/
public function generate(): array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$service = $this->input->get('service', strtolower($managerName));
$port = $this->input->get('port', 443);
$mode = $this->input->get('mode', 'SWOOLE_SOCK_TCP');
$html = '<?php
namespace App\Client\Rpc;
use Annotation\Rpc\Consumer;
use Annotation\Rpc\RpcClient;
use Annotation\Target;
use Exception;
use Rpc\Client;
use Snowflake\Core\Json;
use Snowflake\Snowflake;
';
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . 'Consumer
* @package App\Client\Rpc
*/
#[Target]
#[RpcClient(cmd: \'' . $service . '\', port: ' . $port . ', timeout: 1, mode: ' . $mode . ')]
class ' . $managerName . 'Consumer extends \Rpc\Consumer
{
public array $node = [\'host\' => \'127.0.0.1\', \'port\' => 5377];
/**
* @return Client
* @throws Exception
*/
public function initClient(): Client
{
// TODO: Implement initClient() method.
return $this->client = $this->rpc->getClient(\'' . $service . '\');
}
/**
* @param string $event
* @param array $params
* @throws Exception
*/
#[Consumer(\'default\')]
public function push(string $event, array $params)
{
}
}';
if (!is_dir(APP_PATH . 'app/Client/Rpc/')) {
mkdir(APP_PATH . 'app/Client/Rpc/', 0777, true);
}
$file = APP_PATH . 'app/Client/Rpc/' . $managerName . 'Middleware.php';
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . 'Middleware.php'];
}
}
-81
View File
@@ -1,81 +0,0 @@
<?php
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiRpcClient
* @package Gii
*/
class GiiRpcService extends GiiBase
{
/**
* @return array
* @throws Exception
*/
public function generate(): array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$service = $this->input->get('service', strtolower($managerName));
$port = $this->input->get('port', 443);
$html = '<?php
namespace App\Http\Rpc;
use Annotation\Route\RpcProducer;
use Annotation\Target;
use Exception;
use HttpServer\Controller;
use HttpServer\Exception\RequestException;
use Snowflake\Core\Json;
';
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . 'Consumer
* @package App\Client\Rpc
*/
#[Target]
class ' . $managerName . 'Producer extends Controller
{
/**
* @param array $params
* @throws Exception
*/
#[RpcProducer(cmd: \'default\', port: ' . $port . ')]
public function actionIndex(array $params)
{
}
}';
if (!is_dir(APP_PATH . 'app/Http/Rpc/')) {
mkdir(APP_PATH . 'app/Http/Rpc/', 0777, true);
}
$file = APP_PATH . 'app/Http/Rpc/' . $managerName . 'Producer.php';
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . 'Producer.php'];
}
}
-90
View File
@@ -1,90 +0,0 @@
<?php
declare(strict_types=1);
namespace Gii;
use Exception;
use Snowflake\Snowflake;
/**
* Class GiiModel
* @package Gii
*/
class GiiTask extends GiiBase
{
/**
* @return string[]
* @throws Exception
*/
public function generate(): array
{
$managerName = $this->input->get('name', null);
if (empty($managerName)) {
throw new Exception('文件名称不能为空~');
}
$html = '<?php
namespace App\Async;
use HttpServer\IInterface\Task;
';
$managerName = ucfirst($managerName);
$html .= '
/**
* Class ' . $managerName . '
* @package App\Async
*/
class ' . $managerName . ' implements Task
{
protected $params = [];
/**
* @return mixed|void
*/
public function onHandler()
{
// TODO: Implement handler() method.
}
/**
* @param $params
* @return $this
*/
public function setParams(array $params)
{
$this->params = $params;
return $this;
}
/**
* @return array
*/
public function getParams()
{
return $this->params;
}
}';
$file = APP_PATH . 'app/Async/' . $managerName . '.php';
if (file_exists($file)) {
throw new Exception('File exists.');
}
Snowflake::writeFile($file, $html);
return [$managerName . '.php'];
}
}
-13
View File
@@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Abstracts;
use Swoole\Coroutine;
abstract class BaseContext
{
protected static array $pool = [];
}
-108
View File
@@ -1,108 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Abstracts;
use Database\Connection;
use Exception;
use Snowflake\Abstracts\Config;
use Snowflake\Event;
use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake;
/**
* Class Callback
* @package HttpServer\Abstracts
*/
abstract class Callback extends HttpService
{
const EVENT_ERROR = 'WORKER:ERROR';
const EVENT_STOP = 'WORKER:STOP';
const EVENT_EXIT = 'WORKER:EXIT';
private array $_MESSAGE = [
self::EVENT_ERROR => 'The server error. at No.',
self::EVENT_STOP => 'The server stop. at No.',
self::EVENT_EXIT => 'The server exit. at No.',
];
/**
* @param $messageContent
* @throws Exception
*/
protected function system_mail($messageContent)
{
try {
$email = Config::get('email');
if (empty($email) || !$email['enable']) {
return;
}
$transport = (new \Swift_SmtpTransport($email['host'], $email['465']))
->setUsername($email['username'])
->setPassword($email['password']);
$mailer = new \Swift_Mailer($transport);
// Create a message
$message = (new \Swift_Message('Wonderful Subject'))
->setFrom([$email['send']['address'] => $email['send']['nickname']])
->setBody('Here is the message itself');
foreach ($email['receive'] as $item) {
$message->setTo([$item['address'], $item['address'] => $item['nickname']]);
}
$mailer->send($messageContent);
} catch (\Throwable $e) {
$this->addError($e, 'email');
}
}
/**
* @throws ConfigException
* @throws Exception
*/
protected function clearMysqlClient()
{
$databases = Config::get('databases', []);
if (empty($databases)) {
return;
}
$application = Snowflake::app();
foreach ($databases as $name => $database) {
/** @var Connection $connection */
$connection = $application->get('databases.' . $name, false);
if (empty($connection)) {
continue;
}
$connection->disconnect();
}
}
/**
* @param array $clientInfo
* @param string $event
* @return string
*/
protected function getName(array $clientInfo, string $event): string
{
return 'listen ' . $clientInfo['server_port'] . ' ' . Event::SERVER_CONNECT;
}
/**
* @throws ConfigException
* @throws Exception
*/
protected function clearRedisClient()
{
$redis = Snowflake::app()->getRedis();
$redis->destroy();
}
}
-53
View File
@@ -1,53 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Abstracts;
use Exception;
use Snowflake\Abstracts\Component;
use Snowflake\Snowflake;
/**
* Class HttpService
* @package HttpServer\Abstracts
*/
abstract class HttpService extends Component
{
/**
* @param $message
* @param string $category
* @throws Exception
*/
protected function write($message, $category = 'app')
{
$logger = Snowflake::app()->getLogger();
$logger->write($message, $category);
$logger->insert();
}
/**
* @param $name
* @return mixed
* @throws Exception
*/
public function __get($name): mixed
{
if (method_exists($this, $name)) {
return $this->{$name}();
}
$handler = 'get' . ucfirst($name);
if (method_exists($this, $handler)) {
return $this->{$handler}();
}
if (property_exists($this, $name)) {
return $this->$name;
}
$message = sprintf('method %s::%s not exists.', static::class, $name);
throw new Exception($message);
}
}
-40
View File
@@ -1,40 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/11/8 0008
* Time: 18:37
*/
declare(strict_types=1);
namespace HttpServer\Abstracts;
use Swoole\WebSocket\Server;
/**
* Class ServerBase
* @package Snowflake\Snowflake\Server
*/
abstract class ServerBase extends HttpService
{
/** @var Server */
protected Server $server;
/**
* @return Server
*/
public function getServer(): Server
{
return $this->server;
}
/**
* @param $server
*/
public function setServer($server)
{
$this->server = $server;
}
}
-149
View File
@@ -1,149 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/5/24 0024
* Time: 11:34
*/
declare(strict_types=1);
namespace HttpServer\Client;
use Exception;
use JetBrains\PhpStorm\Pure;
use Swoole\Coroutine\Http\Client as SClient;
/**
* Class Client
* @package Snowflake\Snowflake\Http
*/
class Client extends ClientAbstracts
{
/**
* @param string $method
* @param $path
* @param array $params
* @return array|string|Result
* @throws Exception
*/
public function request(string $method, $path, $params = []): array|string|Result
{
return $this->setMethod($method)
->coroutine(
$this->matchHost($path),
$this->paramEncode($params)
);
}
/**
* @param $url
* @param array $data
* @return array|string|Result
* @throws Exception
* 使用swoole协程方式请求
*/
private function coroutine($url, $data = []): array|string|Result
{
try {
$client = $this->generate_client($data, ...$url);
$this->setData('');
if ($client->statusCode < 0) {
throw new Exception($client->errMsg);
}
$body = $this->resolve($client->getHeaders(), $client->body);
if (in_array($client->getStatusCode(), [200, 201])) {
return $this->structure($body, $data, $client->getHeaders());
}
if (is_string($body)) {
$message = 'Request error code ' . $client->getStatusCode();
} else {
$message = $this->searchMessageByData($body);
}
return $this->fail($client->getStatusCode(), $message, $body, $client->getHeaders());
} catch (\Throwable $exception) {
$this->addError($exception, 'rpc');
return $this->fail(500, $exception->getMessage(), [
'file' => $exception->getFile(),
'line' => $exception->getLine()
], []);
}
}
/**
* @param $data
* @param $host
* @param $isHttps
* @param $path
* @return SClient
*/
private function generate_client($data, $host, $isHttps, $path): SClient
{
if ($isHttps || $this->isSSL()) {
$client = new SClient($host, 443, true);
} else {
$client = new SClient($host, $this->getPort(), false);
}
$client->set($this->settings());
if (!empty($this->getAgent())) {
$this->addHeader('User-Agent', $this->getAgent());
}
$client->setHeaders($this->getHeader());
$client->setMethod(strtoupper($this->getMethod()));
$client->execute($this->setParams($client, $path, $data));
$client->close();
return $client;
}
/**
* @param $client
* @param $path
* @param $data
* @return string
*/
private function setParams(SClient $client, $path, $data): string
{
if ($this->isGet()) {
if (!empty($data)) $path .= '?' . $data;
if (!empty($this->getData())) {
$client->setData($this->getData());
}
} else {
if (!empty($this->getData())) {
$client->setData($this->getData());
} else {
$client->setData($this->mergeParams($data));
}
}
return $path;
}
/**
* @return array
*/
#[Pure] private function settings(): array
{
$sslCert = $this->getSslCertFile();
$sslKey = $this->getSslKeyFile();
$sslCa = $this->getCa();
$params = [];
if ($this->getConnectTimeout() > 0) {
$params['timeout'] = $this->getConnectTimeout();
}
if (empty($sslCert) || empty($sslKey) || empty($sslCa)) {
return $params;
}
$params['ssl_host_name'] = $this->getHost();
$params['ssl_cert_file'] = $this->getSslCertFile();
$params['ssl_key_file'] = $this->getSslKeyFile();
$params['ssl_verify_peer'] = true;
$params['ssl_cafile'] = $sslCa;
return $params;
}
}
-807
View File
@@ -1,807 +0,0 @@
<?php
namespace HttpServer\Client;
use Closure;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\Component;
use Snowflake\Core\Help;
use Swoole\Coroutine\System;
defined('SPLIT_URL') or define('SPLIT_URL', '/(http[s]?:\/\/)?(([\w\-_]+\.)+\w+(:\d+)?)((\/[a-zA-Z0-9\-]+)+[\/]?(\?[a-zA-Z]+=.*)?)?/');
/**
* Class ClientAbstracts
* @package HttpServer\Client
*/
abstract class ClientAbstracts extends Component implements IClient
{
const POST = 'post';
const UPLOAD = 'upload';
const GET = 'get';
const DELETE = 'delete';
const OPTIONS = 'options';
const HEAD = 'head';
const PUT = 'put';
private string $host = '';
private array $header = [];
private int $timeout = 0;
private ?Closure $callback = null;
private string $method = 'get';
private bool $isSSL = false;
private string $agent = '';
private string $errorCodeField = '';
private string $errorMsgField = '';
private bool $use_swoole = false;
private string $ssl_cert_file = '';
private string $ssl_key_file = '';
private string $ca = '';
private int $port = 80;
/** @var string $_message 错误信息 */
private string $_message = '';
private string $_data = '';
private int $connect_timeout = 1;
/**
* @return static
*/
#[Pure] public static function NewRequest(): static
{
return new static();
}
protected function cleanData(): void
{
$this->_data = '';
}
/**
* @param $path
* @param array $params
* @return array|int|string|Result
* @throws
*/
public function post(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::POST, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function put(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::PUT, $path, $params);
}
/**
* @param string $contentType
*/
public function setContentType(string $contentType): void
{
$this->header['Content-Type'] = $contentType;
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function head(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::HEAD, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function get(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::GET, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function option(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::OPTIONS, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function delete(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::DELETE, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function options(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::OPTIONS, $path, $params);
}
/**
* @param string $path
* @param array $params
* @return array|int|string|Result
*/
public function upload(string $path, array $params = []): array|int|string|Result
{
return $this->request(self::UPLOAD, $path, $params);
}
/**
* @return string
*/
public function getHost(): string
{
return $this->host;
}
/**
* @return int
*/
protected function getHostPort(): int
{
if (!empty($this->getPort())) {
return $this->getPort();
}
$port = 80;
if ($this->isSSL()) $port = 443;
return $port;
}
/**
* @param string $host
*/
public function setHost(string $host): void
{
$this->host = $host;
if ($this->use_swoole) {
$this->host = System::gethostbyname($host);
}
$this->addHeader('Host', $host);
}
/**
* @return array
*/
public function getHeader(): array
{
return $this->header;
}
/**
* @param array $header
*/
public function setHeader(array $header): void
{
$this->header = $header;
}
/**
* @param array $header
* @return array
*/
public function setHeaders(array $header): array
{
if (empty($header)) {
return [];
}
foreach ($header as $key => $val) {
$this->header[$key] = $val;
}
return $this->header;
}
/**
* @param $key
* @param $value
*/
public function addHeader($key, $value): void
{
$this->header[$key] = $value;
}
/**
* @return int
*/
public function getTimeout(): int
{
return $this->timeout;
}
/**
* @param int $value
*/
public function setTimeout(int $value): void
{
$this->timeout = $value;
}
/**
* @return Closure|null
*/
public function getCallback(): ?Closure
{
return $this->callback;
}
/**
* @param Closure|null $value
*/
public function setCallback(?Closure $value): void
{
$this->callback = $value;
}
/**
* @return string
*/
public function getMethod(): string
{
return $this->method;
}
/**
* @param string $value
* @return static
*/
public function setMethod(string $value): static
{
$this->method = $value;
return $this;
}
/**
* @return bool
*/
public function isSSL(): bool
{
return $this->isSSL;
}
/**
* @param bool $isSSL
*/
public function setIsSSL(bool $isSSL): void
{
$this->isSSL = $isSSL;
}
/**
* @return string
*/
public function getAgent(): string
{
return $this->agent;
}
/**
* @param string $agent
*/
public function setAgent(string $agent): void
{
$this->agent = $agent;
}
/**
* @return string
*/
public function getErrorCodeField(): string
{
return $this->errorCodeField;
}
/**
* @param string $errorCodeField
*/
public function setErrorCodeField(string $errorCodeField): void
{
$this->errorCodeField = $errorCodeField;
}
/**
* @return string
*/
public function getErrorMsgField(): string
{
return $this->errorMsgField;
}
/**
* @param string $errorMsgField
*/
public function setErrorMsgField(string $errorMsgField): void
{
$this->errorMsgField = $errorMsgField;
}
/**
* @return bool
*/
public function isUseSwoole(): bool
{
return $this->use_swoole;
}
/**
* @param bool $use_swoole
*/
public function setUseSwoole(bool $use_swoole): void
{
$this->use_swoole = $use_swoole;
}
/**
* @return string
*/
public function getSslCertFile(): string
{
return $this->ssl_cert_file;
}
/**
* @param string $ssl_cert_file
*/
public function setSslCertFile(string $ssl_cert_file): void
{
$this->ssl_cert_file = $ssl_cert_file;
}
/**
* @return string
*/
public function getSslKeyFile(): string
{
return $this->ssl_key_file;
}
/**
* @param string $ssl_key_file
*/
public function setSslKeyFile(string $ssl_key_file): void
{
$this->ssl_key_file = $ssl_key_file;
}
/**
* @return string
*/
public function getCa(): string
{
return $this->ca;
}
/**
* @param string $ssl_key_file
*/
public function setCa(string $ssl_key_file): void
{
$this->ca = $ssl_key_file;
}
/**
* @return int
*/
public function getPort(): int
{
if ($this->isSSL()) {
return 443;
}
if (empty($this->port)) {
return 80;
}
return $this->port;
}
/**
* @param int $port
*/
public function setPort(int $port): void
{
$this->port = $port;
}
/**
* @return string
*/
public function getMessage(): string
{
return $this->_message;
}
/**
* @param string $message
*/
public function setMessage(string $message): void
{
$this->_message = $message;
}
/**
* @return string
*/
public function getData(): string
{
return $this->_data;
}
/**
* @param string $data
*/
public function setData(string $data): void
{
$this->_data = $data;
}
/**
* @return int
*/
public function getConnectTimeout(): int
{
return $this->connect_timeout;
}
/**
* @param int $connect_timeout
*/
public function setConnectTimeout(int $connect_timeout): void
{
$this->connect_timeout = $connect_timeout;
}
/**
* @param $host
* @return string|string[]
*/
protected function replaceHost($host): array|string
{
if ($this->isHttp($host)) {
return str_replace('http://', '', $host);
}
if ($this->isHttps($host)) {
return str_replace('https://', '', $host);
}
return $host;
}
/**
* @param $url
* @return false|int
*/
protected function checkIsIp($url): bool|int
{
return preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $url);
}
/**
* @param $url
* @return bool
*/
#[Pure] protected function isHttp($url): bool
{
return str_starts_with($url, 'http://');
}
/**
* @param $url
* @return bool
*/
#[Pure] protected function isHttps($url): bool
{
return str_starts_with($url, 'https://');
}
/**
* @param $newData
* @return string
*/
protected function mergeParams($newData): string
{
if (!is_string($newData)) {
return $this->toRequest($newData);
}
return $newData;
}
/**
* @param $data
* @return string
*/
protected function toRequest($data): string
{
if (is_string($data)) {
return $data;
}
$contentType = 'application/x-www-form-urlencoded';
if (isset($this->header['Content-Type'])) {
$contentType = $this->header['Content-Type'];
} else if (isset($this->header['content-type'])) {
$contentType = $this->header['content-type'];
}
if (str_contains($contentType, 'json')) {
return Help::toJson($data);
} else if (str_contains($contentType, 'xml')) {
return Help::toXml($data);
} else {
return http_build_query($data);
}
}
/**
* @param $data
* @param $body
* @return array|string|null
*/
protected function resolve($data, $body): array|string|null
{
if (is_array($body)) {
return $body;
}
$type = $data['content-type'] ?? $data['Content-Type'] ?? 'text/html';
if (str_contains($type, 'text/html')) {
return $body;
} else if (str_contains($type, 'json')) {
return json_decode($body, true);
} else if (str_contains($type, 'xml')) {
return Help::xmlToArray($body);
} else if (str_contains($type, 'plain')) {
return Help::toArray($body);
}
return $body;
}
/**
* @param $body
* @param $_data
* @param array $header
* @param int $statusCode
* @return mixed 构建返回体
* 构建返回体
*/
protected function structure($body, $_data, $header = [], $statusCode = 200): mixed
{
if ($this->callback instanceof Closure) {
$result = call_user_func($this->callback, $body, $_data, $header);
} else {
$result = $this->parseResult($body, $header, $statusCode);
}
return $result;
}
/**
* @param $body
* @param $header
* @param $statusCode
* @return Result
*/
private function parseResult($body, $header, $statusCode): Result
{
if (is_string($body)) {
$result['code'] = 0;
$result['message'] = '';
} else {
$result['code'] = $body[$this->errorCodeField] ?? 0;
$result['message'] = $this->searchMessageByData($body);
}
$result['data'] = $body;
$result['header'] = $header;
$result['httpStatus'] = $statusCode;
return new Result($result);
}
/**
* @param $body
* @return mixed
*/
protected function searchMessageByData($body): mixed
{
$parent = [];
if (empty($this->errorMsgField)) {
return 'system success.';
}
$explode = explode('.', $this->errorMsgField);
if (!isset($body[$explode[0]])) {
return 'system success.';
}
foreach ($explode as $item) {
if (empty($item)) {
continue;
}
if (empty($parent)) {
$parent = $body[$item];
continue;
}
if (is_string($parent) || !isset($parent[$item])) {
break;
}
$parent = $parent[$item];
}
return !empty($parent) ? $parent : 'system success.';
}
/**
* @return bool
* check isPost Request
*/
#[Pure] public function isPost(): bool
{
return strtolower($this->method) === self::POST;
}
/**
* @return bool
* check isPost Request
*/
#[Pure] public function isUpload(): bool
{
return strtolower($this->method) === self::UPLOAD;
}
/**
* @return bool
*
* check isGet Request
*/
#[Pure] public function isGet(): bool
{
return strtolower($this->method) === self::GET;
}
/**
* @param $arr
*
* @return array|string
* 将请求参数进行编码
*/
#[Pure] protected function paramEncode($arr): array|string
{
if (!is_array($arr)) {
return $arr;
}
$_tmp = [];
foreach ($arr as $Key => $val) {
$_tmp[$Key] = $val;
}
if ($this->isGet()) {
return http_build_query($_tmp);
}
return $_tmp;
}
/**
* @param string $string
* @return array
*/
protected function matchHost(string $string): array
{
if (($parse = isUrl($string, true)) === false) {
return $this->defaultString($string);
}
[$isHttps, $domain, $port, $path] = $parse;
if (str_contains($domain, ':' . $port)) {
$domain = str_replace(':' . $port, '', $domain);
}
$this->port = $isHttps ? 443 : $this->port;
if (isIp($domain)) {
$this->host = $domain;
} else if ($this->isUseSwoole()) {
$this->host = System::gethostbyname($domain) ?? $domain;
} else {
$this->host = $domain;
}
$this->header['Host'] = $domain;
if (strpos($path, '/') !== 0) {
$path = '/' . $path;
}
return [$this->host, $isHttps, $path];
}
/**
* @param $string
* @return array
*/
private function defaultString($string): array
{
$host = $this->getHost();
if ($string == '/') {
$string = '';
} else if (strpos($string, '/') !== 0) {
$string = '/' . $string;
}
return [$host, $this->isSSL(), $string];
}
/**
* @param $path
* @param $params
* @return string
*/
#[Pure] protected function joinGetParams($path, $params): string
{
if (empty($params)) {
return $path;
}
if (!is_string($params)) {
$params = http_build_query($params);
}
if (str_contains($path, '?')) {
[$path, $getParams] = explode('?', $path);
}
if (!isset($getParams) || empty($getParams)) {
return $path . '?' . $params;
}
return $path . '?' . $params . '&' . $getParams;
}
/**
* @param $code
* @param $message
* @param $data
* @param $header
* @return Result
*/
protected function fail($code, $message, $data = [], $header = []): Result
{
return new Result([
'code' => $code,
'message' => $message,
'data' => $data,
'header' => $header,
]);
}
}
-222
View File
@@ -1,222 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Client;
use Exception;
use JetBrains\PhpStorm\Pure;
/**
* Class Curl
* @package HttpServer\Client
*/
class Curl extends ClientAbstracts
{
/**
* @param $method
* @param $path
* @param array $params
* @return Result|array|string
* @throws Exception
*/
public function request($method, $path, $params = []): Result|array|string
{
if ($method == self::GET) {
$path = $this->joinGetParams($path, $params);
}
return $this->execute($this->getCurlHandler($path, $method, $params));
}
/**
* @param $path
* @param $method
* @param $params
* @return mixed
* @throws Exception
*/
private function getCurlHandler($path, $method, $params): mixed
{
[$host, $isHttps, $path] = $this->matchHost($path);
$host = $isHttps ? 'https://' . $host : 'http://' . $host;
if ($this->getPort() != 443 && $this->getPort() != 80) {
$host .= ':' . $this->getPort();
}
$resource = $this->do(curl_init($host . $path), $host . $path, $method);
if ($isHttps !== false) {
$this->curlHandlerSslSet($resource);
}
if (empty($params) && empty($this->getData())) {
return $resource;
}
if (!empty($this->getData())) {
curl_setopt($resource, CURLOPT_POSTFIELDS, $this->getData());
} else if ($method === self::POST) {
curl_setopt($resource, CURLOPT_POSTFIELDS, $this->mergeParams($params));
} else if ($method === self::UPLOAD) {
curl_setopt($resource, CURLOPT_POSTFIELDS, $params);
}
return $resource;
}
/**
* @param $resource
* @return bool
* @throws Exception
*/
private function curlHandlerSslSet($resource): mixed
{
if (!empty($this->ssl_key)) {
if (!file_exists($this->ssl_key)) {
throw new Exception('SSL protocol certificate not found.');
}
curl_setopt($resource, CURLOPT_SSLKEY, $this->getSslKeyFile());
}
if (!empty($this->ssl_cert)) {
if (!!file_exists($this->ssl_cert)) {
throw new Exception('SSL protocol certificate not found.');
}
curl_setopt($resource, CURLOPT_SSLCERT, $this->getSslCertFile());
}
return $resource;
}
/**
* @param $resource
* @param $path
* @param $method
* @return resource
* @throws Exception
*/
private function do($resource, $path, $method)
{
curl_setopt($resource, CURLOPT_URL, $path);
curl_setopt($resource, CURLOPT_TIMEOUT, $this->getTimeout()); // 超时设置
curl_setopt($resource, CURLOPT_CONNECTTIMEOUT, $this->getConnectTimeout()); // 超时设置
curl_setopt($resource, CURLOPT_HEADER, true);
curl_setopt($resource, CURLOPT_FAILONERROR, true);
curl_setopt($resource, CURLOPT_HTTPHEADER, $this->parseHeaderMat());
if (defined('CURLOPT_SSL_FALSESTART')) {
curl_setopt($resource, CURLOPT_SSL_FALSESTART, true);
}
curl_setopt($resource, CURLOPT_FORBID_REUSE, false);
curl_setopt($resource, CURLOPT_FRESH_CONNECT, false);
if (!empty($this->getAgent())) {
curl_setopt($resource, CURLOPT_USERAGENT, $this->getAgent());
}
curl_setopt($resource, CURLOPT_NOBODY, FALSE);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, TRUE);//返回内容
curl_setopt($resource, CURLOPT_FOLLOWLOCATION, TRUE);// 跟踪重定向
curl_setopt($resource, CURLOPT_ENCODING, 'gzip,deflate');
if ($method === self::POST || $method == self::UPLOAD) {
curl_setopt($resource, CURLOPT_POST, 1);
}
curl_setopt($resource, CURLOPT_CUSTOMREQUEST, strtoupper($method));
return $resource;
}
/**
* @param $curl
* @return Result|bool|array|string
* @throws Exception
*/
private function execute($curl): Result|bool|array|string
{
defer(fn() => $this->cleanData());
$output = curl_exec($curl);
if ($output === false) {
return $this->fail(400, curl_error($curl));
}
return $this->parseResponse($curl, $output);
}
/**
* @param $curl
* @param $output
* @param array $params
* @return mixed
* @throws Exception
*/
private function parseResponse($curl, $output, $params = []): mixed
{
curl_close($curl);
if ($output === FALSE) {
return $this->fail(500, $output);
}
[$header, $body, $status] = $this->explode($output);
if ($status != 200 && $status != 201) {
$data = $this->fail($status, $body, [], $header);
} else {
$data = $this->structure($body, $params, $header);
}
return $data;
}
/**
* @param $output
* @return array
* @throws Exception
*/
private function explode($output): array
{
if (empty($output) || !str_contains($output, "\r\n\r\n")) {
throw new Exception('Get data null.');
}
[$header, $body] = explode("\r\n\r\n", $output, 2);
if ($header == 'HTTP/1.1 100 Continue') {
[$header, $body] = explode("\r\n\r\n", $body, 2);
}
$header = explode("\r\n", $header);
$status = (int)explode(' ', trim($header[0]))[1];
$header = $this->headerFormat($header);
return [$header, $this->resolve($header, $body), $status];
}
/**
* @param $headers
* @return array
*/
private function headerFormat($headers): array
{
$_tmp = [];
foreach ($headers as $key => $val) {
$trim = explode(': ', trim($val));
$_tmp[strtolower($trim[0])] = $trim[1] ?? '';
}
return $_tmp;
}
/**
* @return array
*/
#[Pure] private function parseHeaderMat(): array
{
$headers = [];
foreach ($this->getHeader() as $key => $val) {
$headers[$key] = $key . ': ' . $val;
}
return array_values($headers);
}
}
-344
View File
@@ -1,344 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Client;
use Exception;
use HttpServer\Http\Context;
use Snowflake\Abstracts\Component;
use Snowflake\Channel;
use Snowflake\Core\Json;
use Snowflake\Core\Xml;
use Snowflake\Event;
use Snowflake\Snowflake;
use Swoole\Coroutine\Http2\Client as H2Client;
use Swoole\Http2\Request;
use Swoole\Http2\Response;
/**
* Class Http2
* @package HttpServer\Client
*/
class Http2 extends Component
{
private array $_clients = [];
private Channel $channel;
/**
* @throws Exception
*/
public function init()
{
$this->channel = Snowflake::getApp('channel');
Event::on(Event::SYSTEM_RESOURCE_RELEASES, [$this, 'releases']);
Event::on(Event::SYSTEM_RESOURCE_CLEAN, [$this, 'clean']);
}
/**
* @throws Exception
*/
public function releases()
{
foreach ($this->_clients as $name => $client) {
/** @var H2Client $client */
$client->close();
$this->channel->push($client, 'http2.' . $name);
}
$this->_clients = [];
}
/**
* 清空
*/
public function clean()
{
foreach ($this->_clients as $client) {
/** @var H2Client $client */
$client->close();
}
$this->_clients = [];
}
/**
* @param bool $isRecv
* @return Http2
*/
public function setIsRecv(bool $isRecv): static
{
Context::setContext('http2isRecv', $isRecv);
return $this;
}
/**
* @param int $timeout
* @return Http2
*/
public function setTimeout(int $timeout): static
{
Context::setContext('http2timeout', $timeout);
return $this;
}
/**
* @param array $headers
* @return Http2
*/
public function setHeader(array $headers): static
{
Context::setContext('http2Headers', $headers);
return $this;
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function get($domain, $path, $params = [], $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'GET', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function post($domain, $path, $params = [], $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'POST', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function upload($domain, $path, $params = [], $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'POST', $params, $timeout, true);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function delete($domain, $path, $params = [], $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'DELETE', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param $method
* @param array $params
* @param int $timeout
* @param bool $isUpload
* @return mixed
* @throws Exception
*/
private function dispatch($domain, $path, $method, $params = [], $timeout = -1, $isUpload = false): mixed
{
[$domain, $isSsl] = $this->clear($domain);
$request = $this->getRequest($path, $method, $params, $isUpload);
$request->headers = array_merge($request->headers, [
'Host' => $domain
]);
defer(fn() => $this->channel->push($request, 'request.' . $method . $path));
return $this->doRequest($request, $domain, $isSsl, $timeout);
}
/**
* @param $domain
* @return array
*/
private function clear($domain): array
{
if (str_starts_with($domain, 'https://')) {
return [str_replace('https://', '', $domain), true];
} else {
return [str_replace('http://', '', $domain), false];
}
}
/**
* @param Request $request
* @param $domain
* @param $ssl
* @param $timeout
* @return mixed
* @throws Exception
*/
private function doRequest(Request $request, $domain, $ssl, $timeout): mixed
{
$client = $this->getClient($domain, $ssl, $timeout);
defer(fn() => $this->channel->push($client, 'http2.' . $domain));
$client->send($request);
if (Context::getContext('http2isRecv') === false) {
return null;
}
return $this->recv($client);
}
/**
* @param $client
* @return mixed
* @throws Exception
*/
private function recv($client): mixed
{
/** @var Response $response */
if (!Context::hasContext('http2timeout')) {
$response = $client->recv();
} else {
$response = $client->recv((int)Context::getContext('http2timeout'));
}
if ($response === false || $response->statusCode > 200) {
throw new Exception($client->errMsg, $client->errCode);
}
$header = $response->headers['content-type'];
if (str_starts_with($header, 'application/json;')) {
return Json::decode($response->data);
} else if (str_starts_with($header, 'application/xml;')) {
return Xml::toArray($response->data);
} else {
return $response->data;
}
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return mixed
* @throws Exception
*/
public function put($domain, $path, $params = [], $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'PUT', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $path
* @param $method
* @param $params
* @param bool $isUpload
* @return Request
* @throws Exception
*/
public function getRequest($path, $method, $params, $isUpload = false): Request
{
if (!str_starts_with($path, '/')) {
$path = '/' . $path;
}
$channel = Snowflake::app()->getChannel();
$request = $channel->pop('request.' . $method . $path, function () use ($path, $method) {
$request = new Request();
$request->method = $method;
$request->path = $path;
return $request;
});
if ($method === 'GET') {
$request->path .= '?' . http_build_query($params);
} else {
$request->data = !is_string($params) && !$isUpload ? Json::encode($params) : $params;
}
$request->headers = Context::getContext('http2Headers');
return $request;
}
/**
* @param $domain
* @param bool $isSsl
* @param int $timeout
* @return H2Client
* @throws Exception
*/
private function getClient($domain, $isSsl = false, $timeout = -1): H2Client
{
if (isset($this->_clients[$domain])) {
return $this->_clients[$domain];
}
$pool = Snowflake::app()->getChannel();
/** @var H2Client $client */
$client = $pool->pop('http2.' . $domain, function () use ($domain, $isSsl, $timeout) {
return $this->newRequest($domain, $isSsl, $timeout);
});
if ((!$client->connected || !$client->ping()) && !$client->connect()) {
throw new Exception($client->errMsg, $client->errCode);
}
return $this->_clients[$domain] = $client;
}
/**
* @param $domain
* @param $isSsl
* @param $timeout
* @return H2Client
*/
public function newRequest($domain, $isSsl, $timeout): H2Client
{
$domain = rtrim($domain, '/');
if (str_contains($domain, ':')) {
[$domain, $port] = explode(':', $domain);
} else {
$port = $isSsl === true ? 443 : 80;
}
$client = new H2Client($domain, (int)$port, $isSsl);
$client->set(['timeout' => $timeout, 'ssl_host_name' => $domain]);
return $client;
}
}

Some files were not shown because too many files have changed in this diff Show More