.. _app-models: 模型介绍 ========== 此部分文档主要介绍顶点云应用程序服务器使用的数据库格式和模型。 .. _app-models-database: 数据库 ---------- 顶点云默认配置使用 SQLITE ,您可以修改配置文件以选择适合您机器的数据库。顶点云的源码目录中提供了一个默认的 ``work.db`` 数据库文件,如果您选择使用默认配置,该文件足以满足您的需求。 顶点云的数据库包含 5 张表: * *cuser* :用户模型表 * *ufile* :用户资源记录表 * *cfile* :服务器存储实体文件记录表 * *cmessages* :用户聊天消息记录表 * *coperations* :用户操作记录表,此表默认未使用,仅作扩充用 .. _app-models-database-cuser: 表 cuser >>>>>>>>>>>> 此表用于存储用户信息,表格式如下: +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | uid | email | password_hash | created | confirmed | nickname | avatar_hash | +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | INTEGER | VARCHAR(64) | VARCHAR(32) | DATE | BOOLEAN | VARCHAR(64) | VARCHAR(32) | | PRIMARY | | | | | | | | KEY | | | | | | | | AUTOINCREMENT | | | | | | | +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | 用户编号 | 用户邮箱 | 用户密钥 md5 | 用户创建日期 | 是否激活 | 用户昵称 | 头像链接 | +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | about_me | last_seen | member_since | score | role_id | used | maxm | +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | VARCHAR(256) | DATE | DATE | INTEGER | INTEGER | INTEGER | INTEGER | +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ | 用户介绍 | 上次登录日期| 用户注册时间 | 用户积分 | 用户角色 | 已使用容量 | 帐号最大容量| +---------------+-------------+---------------+--------------+-----------+-------------+-------------+ .. _app-models-database-ufile: 表 ufile >>>>>>>>>>>> 此表用于存储用户资源信息,表格式如下: +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | uid | ownerid | cfileid | path | perlink | created | shared | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | INTEGER | INTEGER | INTEGER | VARCHAR(256) | VARCHAR(128) | DATE | INTEGER | | PRIMARY | | | | | | | | KEY | | | | | | | | AUTOINCREMENT | | | | | | | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | 资源编号 | 资源所有者编号 | 引用实体文件编号 | 资源路径 | 资源外链 | 创建时间 | 资源分享数 | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | downloaded | filename | private | linkpass | isdir | description | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | INTEGER | VARCHAR(128) | BOOLEAN | VARCHAR(4) | BOOLEAN | VARCHAR(256) | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ | 资源下载数量 | 资源名称 | 资源是否为私有 | 文件提取码 | 是否为目录 | 资源描述 | +-----------------+----------------+------------------+--------------+--------------+-------------+-------------+ .. _app-models-database-cfile: 表 cfile >>>>>>>>>>>>> 此表用于存储服务器上实体文件记录,表格式如下: +-----------------+----------------+------------------+--------------+--------------+ | uid | md5 | size | ref | created | +-----------------+----------------+------------------+--------------+--------------+ | INTEGER | VARCHAR(32) | INTEGER | INTEGER | DATE | | PRIMARY | | | | | | KEY | | | | | | AUTOINCREMENT | | | | | +-----------------+----------------+------------------+--------------+--------------+ | 实体文件编号 | 文件的 md5 值 | 文件大小 |文件被引用数量| 创建时间 | +-----------------+----------------+------------------+--------------+--------------+ .. _app-models-database-cmessages: 表 cmessage >>>>>>>>>>>>>>>> 此表用于存储用户之间互相发送的消息记录,表格式如下: +-----------------+----------------+------------------+-----------------+--------------+ | mesid | targetid | sendid | message | created | +-----------------+----------------+------------------+-----------------+--------------+ | INTEGER | INTEGER | INTEGER | VARCHAR(512) | DATE | | PRIMARY | | | | | | KEY | | | | | | AUTOINCREMENT | | | | | +-----------------+----------------+------------------+-----------------+--------------+ | 消息编号 | 消息接收者编号 | 消息发送者编号 | 消息内容 | 创建时间 | +-----------------+----------------+------------------+-----------------+--------------+ | sended | viewed | send_delete | recv_delete | | +-----------------+----------------+------------------+-----------------+ | | BOOLEAN | BOOLEAN | BOOLEAN | BOOLEAN | | +-----------------+----------------+------------------+-----------------+ | | 消息是否已发送 | 接收者是否已读 | 发送方是否已删除 | 接收方是否已删除| | +-----------------+----------------+------------------+-----------------+--------------+ .. _app-models-database-coperations: 表 coperations >>>>>>>>>>>>>> 此表用于存储用户删除操作记录。默认的顶点云未使用此表,该表仅在扩展提供找回用户已删除文件的功能时启用。表格式如下: +-----------------+----------------+------------------+------------------+-----------------+-------------+ | oprid | deletedUFileId | deletedUFileName | deletedUFilePath | relatedCFileId | time | +-----------------+----------------+------------------+------------------+-----------------+-------------+ | INTEGER | INTEGER | VARCHAR(128) | VARCHAR(256) | INTEGER | DATE | | PRIMARY | | | | | | | KEY | | | | | | | AUTOINCREMENT | | | | | | +-----------------+----------------+------------------+------------------+-----------------+-------------+ | 操作记录编号 | 删除资源编号 | 删除资源名称 | 删除资源路径 | 引用实体文件编号| 操作时间 | +-----------------+----------------+------------------+------------------+-----------------+-------------+ .. _app-models-class: 内置自定义类 ---------------- 此部分文档主要介绍顶点云应用程序服务器封装的几个自定义类(虽然 Go 语言不是 OOP 语言,但其结构提和 OOP 中的类相似,因此此处用 *类* 代替 *结构* ),包括: * *server* :服务器类 * *client* :测试客户端类 * *cuser* :用户代理类 * *ufile* :资源类(自定义资源结构,默认使用数据库查询代替此类型,仅为拓展功能设计) * *cfile* :文件实体类(自定义资源结构,默认使用数据库查询代替此类型,仅为拓展功能设计) * *transmitter* :传输器 下面将主要介绍 *server* 、 *cuser* 以及 *transmitter* 。 .. _app-models-server: server >>>>>>>>>>>> *server* 封装了一个可执行的服务器实例类,结构元素定义如下: .. code-block:: go type Server struct { listener net.Listener // 请求监听线程 loginUserList []cs.User // 已登陆用户列表 db *sql.DB // 数据库句柄 } *server* 类具有以下几个主要方法,API 的详细介绍请查看 :ref:`app-api-server` : * *InitDB* :初始化数据库函数,在创建服务器实例后调用以修复不存在的表。 * *CheckBroadCast* :消息转发函数,此函数通常在一个独立的协程中执行,负责用户通讯。 * *Run* :启动函数,将服务器实例开放在指定 IP 地址和端口。 * *Communicate* :用户代理函数,每个在线用户均有一个对应的 *Communicate* 函数运行在独立协程中提供服务。 * *Login* :连接认证函数,负责新连接的认证和转发。 .. _app-models-cuser: cuser >>>>>>>>> *cuser* 封装了用户代理类,每个 *cuser* 实例负责处理服务器转发的请求并按业务逻辑处理用户各类命令,同时也维护了用户的一部分资料。 *cuser* 类的结构元素定义如下: .. code-block:: go type cuser struct { id int64 // 用户编号 used int64 // 用户已使用的云盘容量 maxm int64 // 用户可使用的最大云盘容量 listen trans.Transmitable // 与客户端交互命令的连接 infos trans.Transmitable // 向客户端推送消息的连接 username string // 用户邮箱 nickname string // 用户昵称 token string // 用户本次在线使用的 token curpath string // 用户当前所在的虚拟路径 avatar_hash string // 用户头像链接 pass_hash string // 用户密码哈希值 worklist []trans.Transmitable // 用户当前活动连接池 } *cuser* 类只能通过工厂方法构造,其工厂方法为 :ref:`app-api-cuser-factory` ,其开放的接口为 :ref:`app-api-cuser` 。 *cuser* 类具有如下几个主要方法,API 的详细介绍请查看 :ref:`app-api-cuser` 。 * *SetListener* :设置用户命令交互线程 * *SetInfos* :设置用户被动监听线程 * *AddTransmit* :添加一个活动连接到工作池 * *RemoveTransmit* :移除当前用户某个活动连接 * *DealWithRequests* :处理用户命令交互请求 * *DealWithTransmission* :处理用户长数据流传输请求 * *Logout* :登出当前用户 .. _app-models-transmitter: 传输器 >>>>>>>>>> *transmitter* 封装了顶点云的传输过程,每个 *transmitter* 实例负责维护一个活动的 Socket 连接,并以顶点云的协议格式化消息、维持消息边界。 *transmitter* 类的结构元素定义如下: .. code-block:: go type transmitter struct { conn net.Conn // Socket 连接 block cipher.Block // 加密模块 buf []byte // 缓冲区指针 recvLen int64 // 当前缓冲区内缓存数据长度 buflen int64 // 缓冲区总长度 } *transmitter* 类只能通过工厂方法构造,其工厂方法为 :ref:`app-api-transmitter-factory` ,其开放的接口为 :ref:`app-api-transmitable` 。 *transmitter* 类具有如下几个主要方法,API 的详细介绍请查看 :ref:`app-api-transmitter` 。 * *GetConn* :获取传输器封装的 Socket 连接 * *GetBuf* :获取传输器内部的缓冲区指针 * *GetBuflen* :获取传输器内部的缓冲区长度 * *GetBlock* :获取传输器内部的加密模块 * *SetBuflen* :设置传输器使用的缓冲区长度 * *SendBytes* :使用此传输器按协议格式发送字节流,可维持边界 * *SendFromReader* :使用此传输器从可读结构发送字节流 * *RecvUntil* :使用此传输器接收数据直到达到设定数量 * *RecvBytes* :使用此传输器按协议格式接收字节流,维持边界 * *RecvToWriter* :使用此传输器按协议格式接收字节流并写入可写结构 * *Destroy* :销毁此传输器 可扩展自定义类 >>>>>>>>>>>>>>>>>>> *ufile* 和 *cfile* 类可在扩展功能时使用,这两个类默认只提供了基本的元素设置、获取方法,以及相关的列表操作。如果您需要使用到这两个类,请在 ``cstruct/ufile.go`` 和 ``cstruct/cfile.go`` 中添加自定义方法。 接下来请您阅读 :ref:`app-protocal` 。