Skip to content
wxa edited this page Jun 8, 2017 · 5 revisions

需求

  1. 站点页面存储服务,需支持gitlab,github等多种类型存储服务
  2. 单个站点可单独配置存储服务
  3. 站点页面需维护版本信息,可以回滚之前任意版本
  4. 站点页面可以私有化,禁止没有权限用户读取和查看
  5. 单个站点页面可以多用户协同编辑

基本思路

  1. 使用现有gitlab,github服务做为存储服务器实现方式,并以其提供的api接口编写客户端实现. 若其它存储类需求可编写相应的服务端和客户端实现,解决多类型存储服务器需求
  2. gitlab,github仓库和站点一一对应可实现站点单独配置需求
  3. gitlab, github文件拥有版本信息,支持内容回退
  4. gitlab, github支持私有化
  5. gitlab, github支持多用户协同

问题

  1. 第三方gitlab, github服务提供api存在请求频率限制,具体参考官方相应文档
  2. gitlab, github等类型不同服务提供api的不同,客户端需分别对应实现
  3. gitlab, github等服务api的请求存在权限问题,需先认证. 存在用户名密码和token两种认证方式选择

详细实现

简写

数据源 => 存储服务器 站点数据源 => 单个站点配置的数据源

表设计

-- 用户数据源表
function data_source:ctor()
    self:addfield("username", "string")            -- 用户名 
    self:addfield("name", "string")                -- 数据源名
    self:addfield("type", "string")                -- 类型 gitlab  github
    self:addfield("dataSourceUserId", "number")    -- 数据源UserID 
    self:addfield("dataSourceUsername", "string")  -- 数据源用户名
    self:addfield("dataSourceToken", "string")     -- 数据源Token  采用token认证
    self:addfield("apiBaseUrl", "string")          -- api url prefix
    self:addfield("rawBaseUrl", "string")          -- raw url prefix
end

-- 用户站点数据源表
function site_data_source:ctor()
    self:addfield("username", "string")            -- 用户名 
    self:addfield("sitename", "string")            -- 站点名
    self:addfield("dataSourceName", "number")      -- 数据源名  关联 data_source表
    self:addfield("visibility", "string")          -- 是否为私有项目 private - 是 public - 否
    self:addfield("projectName", "string")         -- 项目名
    self:addfield("projectId", "number")           -- 项目id
    self:addfield("rootPath", "string")            -- 项目根路径
    self:addfield("lastCommitId", "string")            -- 最后一次提交id cdn加速
    self:addfield("lastCommitIdUpdateTime", "number")  -- 最后一次提交id更新时间 cdn加速
    self:addfield("updateFlag", "string")              -- 谁做了最后的更新
end

表分析

数据源表:鉴于用户可配置多个数据源(文件存储服务器),故建立数据源表与之对应
表字段type: 表明数据类型
表字段dataSourceToken表明采用Oauth2的认证方式,避免用户配置账号信息
表字段name为数据源名称用做用户可识别的key,有助于用户对数据源的增删改
其余api辅助字段

站点数据源表: 单站点的可配置性该表的诞生,此表基于数据源表之上做进一步配置. 简言之: 数据源表决定服务器的选择, 站点数据源表决定服务器上仓库对象选择.
表字段dataSourceName: 关联data_source表name字段, 决定选择哪个具体的服务器
表字段visibility: 站点私有化实现
表字段rootPath: 存储的根目录
表字段lastCommitId: 用commitId代替master获取文件内容, 便于cdn长期缓存
表字段lastCommitIdUpdateTime,updateFlag: 由于lastCommitId通过存储推送获得,存在伪造,延迟等问题,且api请求不易过于频繁, lastCommitIdUpdateTime控制更新间隔解决推送延迟导致lastCommitId, updateFlag解决位置伪造推送事件问题
其它字段辅助实现

Clone this wiki locally