# 数据库操作
数据库持久化用了 sqlite3
,数据库操作使用了 sequelize
方法说明中并非所有的方法都会写在文档中,具体请前往相关文件查看代码逻辑。
# 文件位置
TIP
文件位于 src\modules\database
该文件夹中,用到的代码和功能如下(也就是目前我暴露给 WEB 端的方法):
入口:
src\modules\database\database.js
程序的入口,也就是通过ZxDesktop.require("DB")
引入方法的入口。
方法:
src\modules\database\DatabaseInit.js
旧表初始化,这个是用来初始化旧表的src\modules\database\DatabaseInitNew.js
src\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: "条件",
});
});