# 数据库操作

数据库持久化用了 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 用户 id
  • savePath 保存路径
/**
 * 数据库创建
 * @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 端上进行!

基本步骤如下:

  1. 创建数据库
  2. 初始化数据库
  3. 获取表模型
  4. 通过方法直接对数据库进行增删改查操作

示例代码如下(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: "条件",
  });
});