0%

node-coolq-robot

作者:草梅友仁

本项目基于cq-robot、coolq-http-api、cq-websocket ,按照官方SDK风格重新封装了事件函数和api函数

项目特色

  1. 仿官方SDK风格,熟悉易语言版的很快就可以上手。

  2. 仿酷Q目录设计,可以像原生酷Q插件那样载入插件,也便于插件的开发

  3. 可以使用JavaScript和TypeScript进行开发,具有一定的跨平台性

项目目录

  • /src 源代码
    • /app 插件存放的位置
      • /com.example.demo 应用根目录
        • /data 应用数据存放目录
        • index.json/index.jsonc 插件配置项
        • index.ts/index.ts 插件入口文件
    • /conf
      • setting.json/setting.jsonc CQWebSocket 连接配置,用于和coolq-http-api建立连接
    • /utils 一些工具类
    • index.ts 项目运行入口
  • /dist 最终需要运行的文件

快速开始

  1. clone本项目

    1
    git clone https://github.com/CaoMeiYouRen/node-coolq-robot.git
  2. 修改src/conf/setting.jsonc中的accessToken【重要】,其他参数可以默认(关于该配置,详见CoolQ HTTP API配置

  3. 酷Q安装coolq-http-api,修改 酷Q Pro\data\app\io.github.richardchien.coolqhttpapi\config 下的相关配置,其中access_token与上方accessToken保持一致(关于该配置,详见CQWebSocketOption

  4. 酷Q启动coolq-http-api,注意,如果修改access_token时插件已启用,请重载应用或重启酷Q

  5. 执行 npm run build 生成dist文件

  6. 执行dist/index.js,开发环境下可以使用nodemon,生产环境可以使用pm2等

  7. 在控制台查看效果(如果出现 [WebSocket] 连接成功 即为成功)

  8. 演示效果

    image

image

安装插件

  1. 所有插件放在src/app目录下,新建一个由appId命名的文件夹(下称为应用根目录),入口文件必须为index.js/index.ts(编译后均为index.js),配置项为index.json或index.jsonc【关于jsonc需要特别解释下,就是支持注释的json,即VScode中的JSON with Comments格式】

  2. 应用所有数据需存放在 [appId]/data/ 目录下,以免给用户造成困扰

  3. 考虑到插件可能会有自己的node_modules依赖,将依赖也装在 项目根目录 下即可(注意,如果安装在项目根目录有问题,也可安装在 应用根目录 ,只不过src和dist目录下均需安装)

  4. 注意:最终执行的文件为dist目录下的内容,因此如果有除了json/jsonc格式以外的文件需要从src目录下复制,请修改gulpfile.js文件

插件开发

对于开发者,本人也提供了demo,建议使用TypeScript进行开发,当然也支持用JavaScript开发

以下是一个空的demo示例,更详细内容请查看本项目的src/app/下面的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class App extends CQApp {
constructor() {
super('com.example.demo', __dirname)
//每一个CQApp对象身上都挂载着一个属性:CQ,里面封装了所有api相关操作,是核心操作类,更多内容请直接查看注释
this.CQ.setDebug(false)//为了方便调试,本人提供了CQ.setDebug()方法来设置插件的运行环境,在debug模式下将不会执行具体的api操作,可以在不影响其他插件的情况下进行逻辑调试;同时也提供了CQ.getDebug()来获取当前的运行环境,开发者可以针对此做一些操作
this.isEnable = true//注意,只有isEnable为true的插件才会载入,可以将isEnable置为false不载入某插件
}
}
const app = new App()//类名可以随意
export { app }//导出模块的名称必须为app
/**
*仅在debug模式下执行,若不需要也可注释掉
*请注意,因为debug的内容在此处就会执行,因此是最先执行的内容!
*/
if (app.CQ.getDebug()) {
app.debug()
}
  1. 关于应用加载:符合以下条件之一的应用不会载入

    1. AppID与其根文件夹名称不同
    2. CQ_API版本不为9
    3. HTTP_API版本不为4
    4. 应用未启用(isEnable=false)
  2. api权限:在应用根目录的index.json中配置,对于没有权限的api调用不会执行

  3. 插件事件优先级:在应用根目录的index.json中配置,数值越低优先级越高,高优先级的可以截断消息。注意:本项目中并未对插件事件优先级做限制,而且也不限制优先级为10000时就不能截断消息,但为了与官方要求一致,建议不要使用10000、20000、30000、40000、50000以外的优先级,并且不得在优先级为10000时截断消息

  4. 日志:日志文件会在同级运行目录生成log文件夹。在log文件夹下有app和debug两个文件夹,分别是生产环境和开发环境的日志,会记录下api的调用和应用接收到的事件信息。当插件处于debug模式时,所有日志都在debug文件夹下;生产环境下,所有日志都在app目录下

项目依赖

node-cq-websocket : https://github.com/momocow/node-cq-websocket

coolq-http-api : https://github.com/richardchien/coolq-http-api

项目参考

JCQ-CoolQ : https://github.com/Meowya/JCQ-CoolQ

(本项目在开发中很大程度上借鉴了JCQ的思路,在此表示感谢)

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/5e4e9fe0.html
版权声明:转载请注明出处!

三分钟搭建一个web服务器

by草梅友仁

项目地址https://github.com/CaoMeiYouRen/simple-web-server

上面的打不开可以访问这个地址https://gitee.com/caomeiyouren/simple-web-server

使用

新建一个目录,然后切换到该目录

运行以下命令即可,前提是已经安装了git

1
2
3
4
git clone https://github.com/CaoMeiYouRen/simple-web-server.git
# github有点卡,如果上不去的话也可以换成下面这个链接
git clone https://gitee.com/caomeiyouren/simple-web-server.git
# 注意以上命令只要运行一个即可

然后继续运行

1
2
npm i #下载依赖
npm run server #运行脚本

运行后可通过 http://127.0.0.1:80 来访问

运行效果

image


如果不会使用git的也可以参考下面的文件目录自己建一个

文件目录

  • src/ 源代码
    • app.js web服务脚本
    • public/ web服务器根目录
      • index.html
  • package.json npm包配置文件

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "simple-web-server",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"server": "node ./src/app.js"
},
"author": "CaoMeiYouRen",
"license": "MIT",
"dependencies": {
"express": "^4.16.4"
}
}

app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var express = require("express");
var app = express();//使用express框架
var path = require("path");//这个是node.js自带的路径处理模块
/**
* app.use("/", express.static(path.join(__dirname, "public")));
* app.use("访问路径",express.static("要公开的目录"))
* 下面这段的意思是通过 域名/xxx 能够访问到 public/xxx 的内容
* 即将public目录作为静态目录公开
* path.join(__dirname, "public")能够获取到public的绝对目录
* 使用绝对目录作为根域名有一个好处就是能够保证找到这个目录,相对目录可能会出错
*/
app.use("/", express.static(path.join(__dirname, "public")));
var http = require("http");//导入http模块
app.get("/", (req, res) => {//当以get方式访问根目录时,返回index.html
res.sendFile(__dirname + "/public/index.html");
});
let port = 80;//脚本运行端口为80
http.createServer(app).listen(port, () => {
console.log("HTTP运行端口为 http://127.0.0.1:" + port);
});


index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="zh-CN">

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>simple-web-server</title>
<style>

</style>
<script>

</script>
</head>

<body>
<h1>HelloWorld</h1>
</body>

</html>

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/fd373c4f.html
版权声明:转载请注明出处!

c#安装MySQL驱动以及实现简单的MySQL操作

by草梅友仁

一、驱动下载

首先前往MySql官网下载驱动。下载地址:https://dev.mysql.com/downloads/connector/net/

image

注意驱动版本即可。注意:要下载.zip版本,解压后会看到几个dll,那个就是需要的驱动

最新的8.0.16版本驱动要求.net版本在4.5以上,如果需要4.0版本的则需要6.8.8版本,选择4.0版本驱动即可

image

image

由于本人安装的Visual Studio 2010最高只支持.net4.0,因此只能使用旧版驱动。不管哪个版本,MySQL的核心驱动都是MySql.Data.dll,使用的时候只需要引入这个即可

image

二、驱动引入

  1. 新建一个项目,名称随意。

image

  1. 找到项目位置,在项目根目录下新建lib文件夹

image

  1. 将MySql.Data.dll复制到该目录下

image

  1. 回到Visual Studio 2010中,右键添加添加引用

    image

  2. 选择浏览,找到MySql.Data.dll,选中并点击确定![1559820770276]

三、连接数据库

  1. 新建一个Database.cs类,并引用MySql.Data.MySqlClient类。注意类名前添加public,否则无法在其他类中调用这个类

image

  1. 写一个初始化方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Database
{
static MySqlConnection conn;//MySql连接
const String server = "localhost";//服务器地址
const String uid = "test";//用户名
const String pw = "123456";//密码
const String db = "test";//库名
/// <summary>
/// 初始化程序,连接数据库
/// </summary>
public static Boolean Init()
{
try
{
if (conn == null)
{
conn = new MySqlConnection("server=" + server + ";user id=" + uid + ";password=" + pw + ";database=" + db);
conn.Open();
Console.WriteLine("数据库连接成功");
}
return true;
}
catch (Exception e)//异常处理
{
Console.WriteLine("Exception caught: {0}", e);
return false;
}
}
}

​ 3. 在主程序中调用该方法,观察控制台是否有输出,如果显示“数据库连接成功”则表明数据库连接已成功,操作正确。

image

image

四、编写数据库操作辅助类

对数据库的操作有很多重复的内容,因此这些可以像初始化方法这样提取出来。

  1. 查询操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /// <summary>
    /// 查询操作,成功返回MySqlDataReader,具体的数据可以从该对象中获取;失败返回null
    /// </summary>
    public static MySqlDataReader Select(String sql)
    {
    try
    {
    Init();
    MySqlCommand command = new MySqlCommand(sql, conn);
    MySqlDataReader data = command.ExecuteReader();//这里返回从数据库获取的数据
    return data;
    }
    catch (Exception e)//注意了,对数据库的操作尤为要注意异常处理,因此直接写在这里即可
    {
    Console.WriteLine("Exception caught: {0}", e);
    return null;
    }
    }
  2. 增删改操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /// <summary>
    /// 执行一条sql指令,成功返回true,失败返回fasle
    /// 事实上
    /// </summary>
    public static Boolean DbOp(String sql)
    {
    try
    {
    Init();
    MySqlCommand command = new MySqlCommand(sql, conn);
    int result = command.ExecuteNonQuery();//这里返回的是受影响的数据条数,如果不为零则表明操作成功
    return result != 0;
    }
    catch (Exception e)
    {
    Console.WriteLine("Exception caught: {0}", e);
    return false;
    }
    }
  3. 实现字符串的转义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /// <summary>
    /// 转义字符串 例如 abc 转为 'abc'
    /// </summary>
    public static String Escape(Object str)
    {
    if (str.GetType() == "".GetType())
    {//是字符串的进行防注入
    return "'" + MySqlHelper.EscapeString(str.ToString()) + "'";//注意,MySQL中表示字符串时一定需要单引号或反引号
    }
    return str.ToString();
    }

五、实现简单的增删查改功能

  1. 数据表名称:user

    字段:id,类型int;name,类型text;pw,类型text

    image

如果要用sql语句创建,可参考如下,也可以用可视化工具创建

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `user`(
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` TEXT NOT NULL,
`pw` TEXT NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. 在项目中新建一个User.cs类,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;

namespace MySqlTest
{
class User
{
public int id;//编号
public String name;//用户名
public String pw;//密码
public User()
{
}
public User(MySqlDataReader data)
{
this.id = data.GetInt16("id");
this.name = data.GetString("name");
this.pw = data.GetString("pw");
}
public User(String name, String pw)//注册时需要创建无id的新用户
{
this.name = name;
this.pw = pw;
}
public User(int id, String name, String pw)
{
this.id = id;
this.name = name;
this.pw = pw;
}
}
}

  1. 实现user的查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 /// <summary>
/// 根据id查找指定用户
/// </summary>
public static User SelectUser(int id)
{
string sql = "SELECT * from user WHERE id = " + id;
MySqlDataReader data = Select(sql);//如果出现异常会返回null,需要注意!!
if (data != null && data.Read())
{
User user = new User(data);//由于上面已经在User的的构造函数中写了相关方法,所以这里直接调用即可
data.Close();
return user;
}
else
{
if (data != null) //如果不为空则需要关闭!
{
data.Close();
}
return null;
}
}

3.实现user的增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 /// <summary>
/// 创建新用户
/// </summary>
public static User AddUser(User user)
{
String sql = "INSERT into user(id,name,pw) values(0," + Escape(user.name) + "," + Escape(user.pw) + ")";
if (DbOp(sql))
{
return SelectUser(user.name);
}
else
{
return null;
}
}

4.实现user的更新

1
2
3
4
5
6
7
8
/// <summary>
/// 修改用户
/// </summary>
public static Boolean UpdateUser(User user)
{
String sql = "UPDATE user SET name = " + Escape(user.name) + ",pw = " + Escape(user.pw) + " WHERE id = " + user.id;
return DbOp(sql);
}

5.实现user的删除

1
2
3
4
5
6
7
8
/// <summary>
/// 删除用户
/// </summary>
public static Boolean DeleteUser(int id)
{
String sql = "DELETE from user WHERE id = " + id;
return DbOp(sql);
}

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/44a0df8f.html
版权声明:转载请注明出处!

三分钟搭建一个vue-webpack项目

by草梅友仁

项目地址https://github.com/CaoMeiYouRen/simple-vue-webpack

上面的打不开可以访问这个地址https://gitee.com/caomeiyouren/simple-vue-webpack

使用

新建一个目录,然后切换到该目录

运行以下命令即可,前提是已经安装了git

1
2
3
4
git clone https://github.com/CaoMeiYouRen/simple-vue-webpack.git
# github有点卡,如果上不去的话也可以换成下面这个链接
git clone https://gitee.com/caomeiyouren/simple-vue-webpack.git
# 注意以上命令只要运行一个即可

然后继续运行

1
2
3
4
5
6
npm i #下载依赖
npm run dev #开发模式,可通过http://127.0.0.1:3000 来访问
npm run build #生产模式,生成的文件在dist目录下
npm run server #启用http服务器,可通过http://127.0.0.1:80 来访问
npm run lint:fix #使用eslint修正风格
npm run uninstall #移除所有node_modules

运行效果

image

最后

由于本项目还是有些复杂的,因此建议直接看项目的readme.md文件,里面有详细解释

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/377812f1.html
版权声明:转载请注明出处!

npm的使用

by草梅友仁

参考链接https://www.runoob.com/nodejs/nodejs-npm.html

安装

由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 “npm -v” 来测试是否成功安装。命令如下,出现版本提示表示安装成功:

1
npm -v

image

如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:

1
2
3
4
#Linux
sudo npm install npm -g
#Windows
npm install npm -g

使用 npm 命令安装模块

npm 安装 Node.js 模块语法格式如下:

1
npm install <Module Name>

全局安装与本地安装

1
2
npm install express      # 本地安装
npm install express -g # 全局安装

卸载模块

我们可以使用以下命令来卸载 Node.js 模块。

1
npm uninstall express

更新模块

我们可以使用以下命令更新模块:

1
npm update express

搜索模块

使用以下来搜索模块:

1
npm search express

使用淘宝 NPM 镜像

你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了:

1
cnpm install [name]

更多信息可以查阅:http://npm.taobao.org/

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/bddd47ac.html
版权声明:转载请注明出处!