在Xiuno BBS中创建你自己的数据类型
# 在Xiuno BBS中创建你自己的数据类型
我本来没打算给你写这个教程的,但现在已经写出来了,总不能失去我辛辛苦苦劳动的成果吧!
## 0. 前言
是不是觉得Xiuno BBS只有“帖子”一种数据类型太无聊啦?那就来参考这篇文章吧,创造出属于你自己的特色数据类型,存放你想要的各种各样的数据哦!
## 1. 你要**做个什么东西**出来
在开始造你自己的数据类型之前,**确定一下你需要的数据类型和用途**,这会影响你的数据库设计和存储方式的选择。
- 轻量数据:类似菜单结构那种
- 中度数据:介于两者之间的东西
- 重度数据:类似“结构化帖子”插件的效果,但不满足于只有20个栏位,且不希望与帖子高度绑定,希望灵活运用
在本例中,我们要创建的是个**中度数据类型**。
假设我们想要创建一个名为"音乐播放列表"的数据类型(网易注册了歌单®商标,所以我得换种说法),用于存储用户的音乐播放列表信息。
## 2. 设计数据库
知道你想做什么后,下一步就是开始考虑数据库要怎么存储这些数据了。
### 2.1. 定义数据库表和字段
假设用一个叫做"mydata”的表来存储"音乐播放列表"的信息。表中可以包含下面这些字段:
- id:播放列表的唯一标识符
- name:播放列表的名称
- uid:创建这个播放列表的用户ID
- songs:包含在播放列表中的歌曲信息
- created_time:播放列表的创建时间
- updated_time:播放列表的更新时间
通过定义这些字段,我们可以在数据库中存储和检索用户的音乐播放列表信息。
> 实际的数据库设计应**根据具体需求**进行调整和优化。你的数据库表千万别真的叫“mydata”。
### 2.2. 使用哪种数据存储方式?
#### 2.2.1. KV存储(Key/Value)
这是Xiuno BBS内置的存储方式之一,适合存放轻量数据(数据量较少的数据)。好用是好用,可能就是不太灵活。
#### 2.2.2. 设置存储(Setting)
这也是Xiuno BBS内置的存储方式之一,整插件设置的时候可以用。也是有点不灵活。
#### 2.2.3. 创建新的数据库表
虽然创建新的数据库表不太方便,但它最灵活。所有的数据都可以完美契合自己的需求,你可以随便操控。
Xiuno BBS提供一些用于数据库交互的函数,可以不需要亲自写SQL即可对表进行CURD操作。
## 3. 付诸实践
在开始创建自己的数据类型之前,确保你拥有基本的编程知识和技能。
这包括熟悉PHP、SQL、HTML、CSS、JS等相关技术,还要看看Xiuno BBS开发手册。
如果你对这些技术不熟悉,建议去找别人帮忙或者多学学相关知识。
**只有**具备这些先决条件,你才能更好地理解并继续下面的内容。
### 3.1. 后端
#### 插件文件结构:
```
yourname_playlist/
hook/
index_route_case_end.php # 给路由表增加一个路由
model_inc_file.php # 导入modal文件夹里的业务函数
modal/
playlist.func.php # 业务函数都在这里
route/
playlist.php # 进入路由后,剩下的操作都在这里完成
view/
htm/
playlist-list.htm # 所有播放列表
playlist-single.htm # 单个播放列表
playlist-add.htm # 添加新的播放列表
playlist-edit.htm # 编辑播放列表
conf.json # 插件信息
icon.png # 插件图标
install.php # 安装插件所用的文件
```
#### conf.json
注意别把双斜杠注释带进去!JSON不能写注释!
```json
{
"name": "播放列表插件", // 插件名称
"brief": "教程专用示范插件", // 插件简介
"version": "1.0.0", // 插件版本号,使用Semver (Semantic Versioning) 语义化版本号规则
"bbs_version": "4.0", // 最低兼容的Xiuno BBS版本,鉴于4.0.x是最后一版,这里不用改
"installed": 0, // 插件是否安装;**务必注意**在发布插件的时候,此处必须是0,否则用户会找你麻烦!
"enable": 0, // 插件是否启用;**务必注意**在发布插件的时候,此处必须是0,否则用户会找你麻烦!
"hooks_rank": [], // 用于调整Hook先后顺序,如果有东西,请换成花括号,如果没有东西,保持方括号
"overwrites_rank": [], // 用于调整插件覆盖先后顺序,如果有东西,请换成花括号,如果没有东西,保持方括号
"dependencies": [] // 如果插件依赖其他插件,需要在此处写出来,如果有东西,请换成花括号,如果没有东西,保持方括号
}
```
#### icon.png
图标文件。必须是PNG格式(不建议直接改文件后缀名,比如“.jpg”改成“.png”),推荐大小512×512像素。
#### install.php
```php
CREATE TABLE IF NOT EXISTS mydata (
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(255),
uid INT,
songs TEXT,
created_time INT UNSIGNED,
updated_time INT UNSIGNED
);
```
#### playlist.func.php
```php
$id), $update);
return $r;
}
function mydata_read($id) {
$r = db_find_one('mydata', array('id'=>$id));
return $r;
}
function mydata_delete($id) {
$r = db_delete('mydata', array('id'=>$id));
return $r;
}
function mydata_find($cond = array(), $orderby = array(), $page = 1, $pagesize = 20) {
$arrlist = db_find('mydata', $cond, $orderby, $page, $pagesize);
return $arrlist;
}
?>
```
在这段代码中,我们定义了五个函数,用于处理 mydata 表的 CRUD(创建、读取、更新、删除)和查找操作。
这是最低限度的必要函数。
让我们一一解释每个函数的作用:
1. `mydata_create($arr)` 这个函数是用来在 mydata 表中插入新数据的。
它接受一个数组 `$arr`,这个数组包含了要插入的数据的键值对。函数通过调用 db_insert 函数,把数据插入到 mydata 表中,然后返回插入操作的结果。
2. `mydata_update($id, $update)` 这个函数是用来更新 mydata 表中的数据的。
它接受两个参数:$id 和 $update。`$id` 是我们要更新的数据的 id ,`$update` 是一个数组,包含了要更新的值。函数通过调用 db_update 函数,根据 `$id` 找到 mydata 表中对应的数据,然后更新它,最后返回更新操作的结果。
3. `mydata_read($id)` 这个函数是用来读取 mydata 表中的数据的。
它接受一个参数 `$id`,这是我们要查找的数据的 id 。函数通过调用 db_find_one 函数,根据 `$id` 找到 mydata 表中对应的数据,然后返回这个数据。
4. `mydata_delete($id)` 这个函数是用来删除 mydata 表中的数据的。
它接受一个参数 `$id`,这是我们要删除的数据的 id 。函数通过调用 db_delete 函数,根据 `$id` 找到 mydata 表中对应的数据,然后删除它,最后返回删除操作的结果。
5. `mydata_find($cond = array(), $orderby = array(), $page = 1, $pagesize = 20)` 这个函数是用来查找 mydata 表中的数据的。
它接受四个参数:`$cond`,`$orderby`,`$page` 和 `$pagesize`。
`$cond` 参数是一个关联数组,用于定义查找条件。在这个数组中,键代表要查找的列,值代表要查找的值。如果值是数组,则该数组的键应为以下之一:“大于`>`”、“小于`<`”、“大于等于`>=`”、“小于等于`<=`”或“`like`”,数组的值则为相应的值。
`$orderby` 参数也是一个关联数组,用于定义排序方式。在这个数组中,键代表要排序的列,值则决定了排序的方式:0 代表升序,1 代表降序。
`$page` 参数指定了要查找的页数,而 `$pagesize` 参数则定义了每一页的数据量。
函数通过调用 db_find 函数,根据这些条件查找 mydata 表中的数据,然后返回这些数据的列表。
### 3.2. 前端
你自己想明白该怎么做,我不管了。
## 4. 最后的吐槽
我就打开天窗说亮话了:这个论坛真是toxic。
我每天登录这里,就看到新增好多条消息,每条都是没有营养的"灌水"。
这里的人每天都在提问题,可是很憾,愿意回答这些问题的人越来越少了,为什么呢?
1. 灌水泛滥:只要是个帖子,就少不了灌水评论
2. **没有经验的**新手站长越来越多,有经验的人越来越少:我们都是从没有经验走过来的,我表示理解,但我真的希望新站长至少能对Web有个基本的了解。论坛里最常见的就是这样的情景:插件安装得不对,导致网站挂了(因为插件冲突、或是没使用正确的安装方式——在后台安装等等)、SMTP邮件发送失败(对此有篇文章很明确告知该如何做)。这两种情况,在得知解决方式后,由于站长经验不足,仍是不知所措。在这种情况下,我真的强烈建议他们可以从WordPress、Flarum开始自己的建站之旅。
本站的QQ群是真的toxic,toxic大到我都咋述,至少两个老鸟都被惹生气了。
我也快被气走了……