# 数据库
数据库持久化用了 sqlite3,数据库操作使用了 sequelize
方法说明中并非所有的方法都会写在文档中,具体请前往相关文件查看代码逻辑。
# 文件位置
TIP
文件位于 src\modules\database
该文件夹中,用到的代码和功能如下(也就是目前我暴露给 WEB 端的方法):
入口:
src\modules\database\database.js程序的入口,也就是通过ZxDesktop.require("DB")引入方法的入口。
方法:
src\modules\database\DatabaseInit.js旧表初始化,这个是用来初始化旧表的src\modules\database\DatabaseInitNew.jssrc\modules\database\GeneralMethod.js
# 在 WEB 端调用
在 WEB 端中引用方式:
const DB = ZxDesktop.require("DB");
DB.对应方法();
# 表结构说明
# 旧表结构
每个表下的字段,及字段格式可以进 DatabaseInit.js 了解,因为新版本客户端中旧表已经不再维护了。
| 表名 | 功能 |
|---|---|
| OaMsg | OA 消息 |
| OaRecentlyMsg | 最近 OA 消息列表 |
| UcRecentlyMsg | 最近聊天消息列表 |
| UcChatMsgInfo | 最近聊天消息 |
| UcGroupMsgInfo | 最近群组消息 |
| UcNotificationMsg | 通知消息 |
| UcGroupFile | 群文件 |
| BroadcastMsg | 小广播? |
# 新表结构
每个表下的字段,及字段格式可以进 DatabaseInitNew.js 了解,不一定全部都写在文档中了,这儿做一下大概介绍。更多信息可以在 致信消息结构变更与数据库改造的说明.docx 中了解
| 表名 | 功能 |
|---|---|
| ConversationList | 会话列表 |
| ChatMessage | 聊天消息 |
| GroupFile | 群文件 |
# 会话列表表字段说明
| 字段 | 功能 |
|---|---|
| targetId | 会话目标 ID |
| conversationTitle | 会话名称 |
| conversationType | 会话类型 |
| unreadMessageCount | 会话未读数 |
| draft | 会话草稿 |
| isHidden | 是否隐藏 |
| isTop | 是否置顶 |
| readTime | 最后一次查看消息的时间 |
| latestMessage | 最后一条消息 |
| latestMessageId | 最后一条消息 ID |
| messageStatus | 最后一条消息的收发状态 |
| receivedTime | 最后一条消息接收时间 |
| sentTime | 最后一条消息发送时间 |
| hasUnreadMention | 会话中是否有人@我 |
| mentionedMsg | 会话中最后一条未读的@我的消息 |
| notificationStatus | 消息免打扰状态 |
| senderPortraitUri | 发送者头像 uri |
| senderUserId | 发送者 ID |
| senderUserName | 发送者姓名 |
# 聊天消息表字段说明
| 字段 | 功能 |
|---|---|
| content | 消息内容 |
| conversationType | 会话类型 |
| extra | 扩展字段 |
| isLocalMessage | 是否本地消息 |
| messageDirection | 是发送的还是接收的 |
| messageId | 消息的本地 ID |
| messageType | 消息的本地类型 |
| messageUId | 消息的服务器 ID |
| objectName | 消息的服务器类型 |
| offLineMessage | 是否离线消息 |
| receivedTime | 消息接收时间 |
| senderUserId | 消息发送者 ID |
| sentTime | 消息发送时间 |
| messageStatus | 消息收发状态 |
| readStatus | 消息的已读未读状态 |
| targetId | 消息目标会话 ID |
| targetName | 消息目标会话名 |
# 方法说明
# Sequelize
直接引出的 Sequelize 原生的功能,相关文档:https://sequelize.org/
# databaseCreate(userId, folderPath)
数据库创建
userId用户 idsavePath保存路径
/**
* 数据库创建
* @param {*} userId 用户id
* @param {*} savePath 保存路径
*/
function databaseCreate(userId, savePath) {
return new Sequelize(Config.DB_NAME, Config.DB_USER, Config.DB_PASSWORD, {
logging: false,
dialect: "sqlite",
define: {
freezeTableName: true,
underscored: true,
timestamps: false,
},
storage: path.resolve(savePath, userId + "@localhost.sqlite"),
});
}
返回:new Sequelize() 模型
# databaseInit(data)
初始化旧表结构的数据库
data创建数据库后返回的new Sequelize()模型
# databaseInitNew(data)
初始化新表结构的数据库
data创建数据库后返回的new Sequelize()模型
# getModel(data)
获取某个表的模型,比如新表结构数据库中的 ConversationList 这个表的模型,进行操作。
data表模型名称
可用的表模型名称壳参考上方新表结构、旧表结构中的表名
# 如何操作数据库
现在对数据库增删改查的方法均已移植到 WEB 端,客户端只进行数据库创建,初始化,提供表模型。数据库的增删改查等逻辑,均在 WEB 端上进行!
基本步骤如下:
- 创建数据库
- 初始化数据库
- 获取表模型
- 通过方法直接对数据库进行增删改查操作
示例代码如下(WEB 端):
// 引入数据库方法
const DB = ZxDesktop.require("DB");
// 初始化信息
let userId = "123456";
let folderPath = "/zhixin";
// 创建数据库
let sequelize = DB.databaseCreate(userId, folderPath);
// 初始化数据库
let databaseInitNew = new DB.databaseInitNew(sequelize);
databaseInitNew.init(() => {
// 数据库初始化完成执行下面的代码
// 获取模型
let ChatMessage = databaseInitNew.getModel("ChatMessage");
let ConversationList = databaseInitNew.getModel("ConversationList");
let GroupFile = databaseInitNew.getModel("GroupFile");
// 过 500ms 表示初始化完成,因为部分电脑性能不好。
setTimeout(() => {
callback && callback("finish");
}, 500);
// 写入消息
ChatMessage.bulkCreate(["消息1", "消息2"]);
// 获取所有的会话列表
ConversationList.findAll();
// 更新某条消息
ChatMessage.update("消息体", {
where: "条件",
});
// 删除某个消息
ChatMessage.destroy({
where: "条件",
});
});