Skip to content

Commit 33730fa

Browse files
committed
update to v2 framework
1 parent f885015 commit 33730fa

File tree

6 files changed

+170
-60
lines changed

6 files changed

+170
-60
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# zhamao-framework-starter
22
炸毛框架的快速开始模板,是炸毛框架开箱即用的项目。
33

4-
注意:本快速模板分为 1.x 和 2.x 两个版本,目前默认拉取的都是 1.x 版本的,等炸毛框架 v2 正式发布后切换为 v2 版本的模板
4+
注意:本快速模板目前拉取的都是 v2 的版本,如果想使用 v1 的版本,请使用版本号后缀 `^1.4`
55

66
## 用法
77
```bash

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"description": "composer project of zhamao-framework-starter",
44
"minimum-stability": "stable",
55
"license": "Apache-2.0",
6-
"version": "1.4",
6+
"version": "2.0",
77
"type": "project",
88
"prefer-stable": true,
99
"require": {
1010
"php": ">=7.2",
11-
"zhamao/framework": "^1.5"
11+
"zhamao/framework": "^2.0"
1212
},
1313
"scripts": {
1414
"server": "vendor/bin/start server",

config/console_color.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"default": {
3+
"success": "green",
4+
"info": "lightblue",
5+
"warning": "yellow",
6+
"error": "red",
7+
"verbose": "blue",
8+
"debug": "gray",
9+
"trace": "gray"
10+
},
11+
"white-term": {
12+
"success": "green",
13+
"info": "",
14+
"warning": "yellow",
15+
"error": "red",
16+
"verbose": "blue",
17+
"debug": "gray",
18+
"trace": "gray"
19+
},
20+
"no-color": {
21+
"success": "",
22+
"info": "",
23+
"warning": "",
24+
"error": "",
25+
"verbose": "",
26+
"debug": "",
27+
"trace": ""
28+
}
29+
}

config/global.php

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<?php
2+
/** @noinspection PhpFullyQualifiedNameUsageInspection */
3+
/** @noinspection PhpComposerExtensionStubsInspection */
24
global $config;
35

46
/** bind host */
@@ -25,31 +27,48 @@
2527
/** 对应swoole的server->set参数 */
2628
$config['swoole'] = [
2729
'log_file' => $config['crash_dir'] . 'swoole_error.log',
28-
'worker_num' => 1,
29-
'dispatch_mode' => 2,
30-
//'task_worker_num' => 1,
30+
'worker_num' => swoole_cpu_num(), //如果你只有一个 OneBot 实例连接到框架并且代码没有复杂的CPU密集计算,则可把这里改为1使用全局变量
31+
'dispatch_mode' => 2, //包分配原则,见 https://wiki.swoole.com/#/server/setting?id=dispatch_mode
32+
'max_coroutine' => 300000,
33+
//'task_worker_num' => 4,
3134
//'task_enable_coroutine' => true
3235
];
3336

37+
/** 轻量字符串缓存,默认开启 */
38+
$config['light_cache'] = [
39+
'size' => 1024, //最多允许储存的条数(需要2的倍数)
40+
'max_strlen' => 16384, //单行字符串最大长度(需要2的倍数)
41+
'hash_conflict_proportion' => 0.6, //Hash冲突率(越大越好,但是需要的内存更多)
42+
'persistence_path' => $config['zm_data'].'_cache.json',
43+
'auto_save_interval' => 900
44+
];
45+
3446
/** MySQL数据库连接信息,host留空则启动时不创建sql连接池 */
3547
$config['sql_config'] = [
3648
'sql_host' => '',
3749
'sql_port' => 3306,
3850
'sql_username' => 'name',
3951
'sql_database' => 'db_name',
4052
'sql_password' => '',
41-
'sql_enable_cache' => true,
42-
'sql_reset_cache' => '0300',
4353
'sql_options' => [
4454
PDO::ATTR_STRINGIFY_FETCHES => false,
4555
PDO::ATTR_EMULATE_PREPARES => false
4656
],
4757
'sql_no_exception' => false,
48-
'sql_default_fetch_mode' => PDO::FETCH_BOTH // added in 1.5.6
58+
'sql_default_fetch_mode' => PDO::FETCH_ASSOC // added in 1.5.6
59+
];
60+
61+
/** Redis连接信息,host留空则启动时不创建Redis连接池 */
62+
$config['redis_config'] = [
63+
'host' => '',
64+
'port' => 6379,
65+
'timeout' => 1,
66+
'db_index' => 0,
67+
'auth' => ''
4968
];
5069

51-
/** CQHTTP连接约定的token */
52-
$config["access_token"] = "";
70+
/** onebot连接约定的token */
71+
$config["access_token"] = '';
5372

5473
/** HTTP服务器固定请求头的返回 */
5574
$config['http_header'] = [
@@ -64,15 +83,11 @@
6483

6584
/** zhamao-framework在框架启动时初始化的atomic们 */
6685
$config['init_atomics'] = [
67-
'in_count' => 0, //消息接收message的统计数量
68-
'out_count' => 0, //消息发送(调用send_*_msg的统计数量)
69-
'reload_time' => 0, //调用reload功能统计数量
70-
'wait_msg_id' => 0, //协程挂起id自增
71-
'info_level' => 2, //终端显示的log等级
86+
//'custom_atomic_name' => 0, //自定义添加的Atomic
7287
];
7388

74-
/** 自动保存的缓存保存时间(秒) */
75-
$config['auto_save_interval'] = 900;
89+
/** 终端日志显示等级(0-4) */
90+
$config["info_level"] = 2;
7691

7792
/** 上下文接口类 implemented from ContextInterface */
7893
$config['context_class'] = \ZM\Context\Context::class;
@@ -88,7 +103,15 @@
88103

89104
/** 注册 Swoole Server 事件注解的类列表 */
90105
$config['server_event_handler_class'] = [
91-
\Framework\ServerEventHandler::class,
106+
\ZM\Event\ServerEventHandler::class,
107+
];
108+
109+
/** 服务器启用的外部第三方和内部插件 */
110+
$config['modules'] = [
111+
'onebot' => [
112+
'status' => true,
113+
'single_bot_mode' => false
114+
], // QQ机器人事件解析器,如果取消此项则默认为 true 开启状态,否则你手动填写 false 才会关闭
92115
];
93116

94117
return $config;

src/Module/Example/Hello.php

Lines changed: 85 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,89 @@
11
<?php
22

3-
43
namespace Module\Example;
54

6-
7-
use Framework\Console;
8-
use ZM\Annotation\CQ\CQCommand;
95
use ZM\Annotation\Http\Middleware;
6+
use ZM\Annotation\Swoole\OnSwooleEvent;
7+
use ZM\ConnectionManager\ConnectionObject;
8+
use ZM\Console\Console;
9+
use ZM\Annotation\CQ\CQCommand;
1010
use ZM\Annotation\Http\RequestMapping;
11-
use ZM\Annotation\Swoole\SwooleEventAt;
12-
use ZM\Connection\CQConnection;
11+
use ZM\Event\EventDispatcher;
12+
use ZM\Store\Redis\ZMRedis;
1313
use ZM\Utils\ZMUtil;
1414

1515
/**
1616
* Class Hello
1717
* @package Module\Example
18-
* @since 1.0
18+
* @since 2.0
1919
*/
2020
class Hello
2121
{
2222
/**
23-
* 在机器人连接后向终端输出信息
24-
* @SwooleEventAt("open",rule="connectType:qq")
25-
* @param $conn
23+
* 一个简单的redis连接池使用demo,将下方user_id改为你自己的QQ号即可(为了不被不法分子利用)
24+
* @CQCommand("redis_test",user_id=627577391)
2625
*/
27-
public function onConnect(CQConnection $conn) {
28-
Console::info("机器人 " . $conn->getQQ() . " 已连接!");
26+
public function testCase() {
27+
$a = new ZMRedis();
28+
$redis = $a->get();
29+
$r1 = ctx()->getArgs(ZM_MATCH_FIRST, "请说出你想设置的操作[r/w]");
30+
switch ($r1) {
31+
case "r":
32+
$k = ctx()->getArgs(ZM_MATCH_FIRST, "请说出你想读取的键名");
33+
$result = $redis->get($k);
34+
ctx()->reply("结果:" . $result);
35+
break;
36+
case "w":
37+
$k = ctx()->getArgs(ZM_MATCH_FIRST, "请说出你想写入的键名");
38+
$v = ctx()->getArgs(ZM_MATCH_FIRST, "请说出你想写入的字符串");
39+
$result = $redis->set($k, $v);
40+
ctx()->reply("结果:" . ($result ? "成功" : "失败"));
41+
break;
42+
}
2943
}
3044

3145
/**
32-
* 在机器人连接后向终端输出信息
33-
* @SwooleEventAt("close",rule="connectType:qq")
46+
* 使用命令 .reload 发给机器人远程重载,注意将 user_id 换成你自己的 QQ
47+
* @CQCommand(".reload",user_id=627577391)
3448
*/
35-
public function onDisconnect() {
36-
$conn = ctx()->getConnection();
37-
Console::info("机器人 " . $conn->getQQ() . " 已断开连接!");
49+
public function reload() {
50+
ctx()->reply("重启中...");
51+
ZMUtil::reload();
3852
}
3953

4054
/**
41-
* 向机器人发送"你好",即可回复这句话
42-
* @CQCommand(match="你好",alias={"你好啊","你是谁"})
55+
* @CQCommand("我是谁")
4356
*/
44-
public function hello() {
45-
return "你好啊,我是由炸毛框架构建的机器人!";
57+
public function whoami() {
58+
$user = ctx()->getRobot()->getLoginInfo();
59+
return "你是" . $user["data"]["nickname"] . ",QQ号是" . $user["data"]["user_id"];
4660
}
4761

4862
/**
49-
* @CQCommand(".reload")
63+
* 向机器人发送"你好啊",也可回复这句话
64+
* @CQCommand(match="你好",alias={"你好啊","你是谁"})
5065
*/
51-
public function reload() {
52-
context()->reply("reloading...");
53-
ZMUtil::reload();
66+
public function hello() {
67+
return "你好啊,我是由炸毛框架构建的机器人!";
5468
}
5569

5670
/**
71+
* 一个简单随机数的功能demo
72+
* 问法1:随机数 1 20
73+
* 问法2:从1到20的随机数
5774
* @CQCommand("随机数")
58-
* @CQCommand(regexMatch="*从*到*的随机数")
59-
* @param $arg
75+
* @CQCommand(pattern="*从*到*的随机数")
76+
* @return string
6077
*/
61-
public function randNum($arg) {
78+
public function randNum() {
6279
// 获取第一个数字类型的参数
63-
$num1 = context()->getArgs($arg, ZM_MATCH_NUMBER, "请输入第一个数字");
80+
$num1 = ctx()->getArgs(ZM_MATCH_NUMBER, "请输入第一个数字");
6481
// 获取第二个数字类型的参数
65-
$num2 = context()->getArgs($arg, ZM_MATCH_NUMBER, "请输入第二个数字");
82+
$num2 = ctx()->getArgs(ZM_MATCH_NUMBER, "请输入第二个数字");
6683
$a = min(intval($num1), intval($num2));
6784
$b = max(intval($num1), intval($num2));
6885
// 回复用户结果
69-
context()->reply("随机数是:".mt_rand($a, $b));
86+
return "随机数是:" . mt_rand($a, $b);
7087
}
7188

7289
/**
@@ -87,13 +104,48 @@ public function index() {
87104
return "Hello Zhamao!";
88105
}
89106

107+
/**
108+
* 使用自定义参数的路由参数
109+
* @RequestMapping("/whoami/{name}")
110+
* @param $param
111+
* @return string
112+
*/
113+
public function paramGet($param) {
114+
return "Your name: {$param["name"]}";
115+
}
116+
117+
/**
118+
* 在机器人连接后向终端输出信息
119+
* @OnSwooleEvent("open",rule="connectIsQQ()")
120+
* @param $conn
121+
*/
122+
public function onConnect(ConnectionObject $conn) {
123+
Console::info("机器人 " . $conn->getOption("connect_id") . " 已连接!");
124+
}
125+
126+
/**
127+
* 在机器人断开连接后向终端输出信息
128+
* @OnSwooleEvent("close",rule="connectIsQQ()")
129+
* @param ConnectionObject $conn
130+
*/
131+
public function onDisconnect(ConnectionObject $conn) {
132+
Console::info("机器人 " . $conn->getOption("connect_id") . " 已断开连接!");
133+
}
134+
135+
/**
136+
* 阻止 Chrome 自动请求 /favicon.ico 导致的多条请求并发和干扰
137+
* @OnSwooleEvent("request",rule="ctx()->getRequest()->server['request_uri'] == '/favicon.ico'",level=200)
138+
*/
139+
public function onRequest() {
140+
EventDispatcher::interrupt();
141+
}
90142

91143
/**
92144
* 框架会默认关闭未知的WebSocket链接,因为这个绑定的事件,你可以根据你自己的需求进行修改
93-
* @SwooleEventAt(type="open",rule="connectType:unknown")
145+
* @OnSwooleEvent(type="open",rule="connectIsDefault()")
94146
*/
95147
public function closeUnknownConn() {
96148
Console::info("Unknown connection , I will close it.");
97-
context()->getConnection()->close();
149+
server()->close(ctx()->getConnection()->getFd());
98150
}
99151
}

src/Module/Middleware/TimerMiddleware.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,25 @@
22

33
namespace Module\Middleware;
44

5-
use Framework\Console;
6-
use ZM\Annotation\Http\After;
7-
use ZM\Annotation\Http\Before;
5+
use ZM\Annotation\Http\HandleAfter;
6+
use ZM\Annotation\Http\HandleBefore;
7+
use ZM\Annotation\Http\HandleException;
88
use ZM\Annotation\Http\MiddlewareClass;
9+
use ZM\Console\Console;
910
use ZM\Http\MiddlewareInterface;
1011

1112
/**
12-
* Class AuthMiddleware
13+
* Class TimerMiddleware
1314
* 示例中间件:用于统计路由函数运行时间用的
1415
* @package Module\Middleware
15-
* @MiddlewareClass()
16+
* @MiddlewareClass("timer")
1617
*/
1718
class TimerMiddleware implements MiddlewareInterface
1819
{
1920
private $starttime;
2021

2122
/**
22-
* @Before()
23+
* @HandleBefore()
2324
* @return bool
2425
*/
2526
public function onBefore() {
@@ -28,11 +29,16 @@ public function onBefore() {
2829
}
2930

3031
/**
31-
* @After()
32+
* @HandleAfter()
3233
*/
3334
public function onAfter() {
3435
Console::info("Using " . round((microtime(true) - $this->starttime) * 1000, 2) . " ms.");
3536
}
3637

37-
public function getName() { return "timer"; }
38+
/**
39+
* @HandleException(\Exception::class)
40+
*/
41+
public function onException() {
42+
Console::error("Using " . round((microtime(true) - $this->starttime) * 1000, 2) . " ms but an Exception occurred.");
43+
}
3844
}

0 commit comments

Comments
 (0)