功能

此扩展组件提供 WebdavDocument 实体,可以用在数据模型中,表示通过 WebDAV 开放的文件。

用例

下面是 WebDAV 组件基本功能的示例。

  1. 创建一个 Contract(合同) 实体,其中 number 属性用于保存合同编号。

  2. 现在我们创建一个属性表示关联的合同文件。打开实体设计器,创建 document 属性,类型为多对一的 ASSOCIATION,关联实体 WebdavDocument

    webdav document

    Contract 实体类代码如下:

    @JmixEntity
    @Table(name = "SAMPLE_CONTRACT", indexes = {
            @Index(name = "IDX_CONTRACT_DOCUMENT_ID", columnList = "DOCUMENT_ID")
    })
    @Entity(name = "sample_Contract")
    public class Contract {
    
        @JmixGeneratedValue
        @Column(name = "ID", nullable = false)
        @Id
        private UUID id;
    
        @InstanceName
        @NotNull
        @Column(name = "NUMBER_", nullable = false)
        private String number;
    
        @JoinColumn(name = "DOCUMENT_ID", nullable = false)
        @ManyToOne(fetch = FetchType.LAZY, optional = false)
        private WebdavDocument document;
  3. 在编辑界面中,添加 xmlns:webdav="http://jmix.io/schema/webdav/ui" 命名空间:

    <window xmlns="http://jmix.io/schema/ui/window"
            xmlns:webdav="http://jmix.io/schema/webdav/ui"
            caption="msg://contractEdit.caption"
            focusComponent="form">

    以及由 WebDAV 扩展组件提供的上传控件:

    <webdav:webdavDocumentUpload id="documentField"
                                 property="document"/>

    下图展示 Document 控件:

    webdav document field

WebDAV 文档浏览界面

Document browser(文档浏览) 界面可以通过主菜单项 Administration(管理) → WebDAV document browser(WebDAV 文档浏览) 打开,该界面支持查看和管理文档:

document browser

界面中包含一个文档列表,支持下列操作:

Upload(上传) 按钮支持选择文件本地文件上传至系统。Download(下载) 按钮支持下载最新或之前版本的文档。

Manage versions(版本管理) 按钮打开 WebDAV 文档版本 界面。

Enable versioning(启用版本)Disable versioning(禁用版本) 按钮控制特定文档的版本管理功能。

如需删除一个文档,首先需要使用 Lock(锁定) 按钮对文档加锁。

lock document

锁定后,如果其他用户尝试保存对此文档的修改,他们会收到警告文档已经被锁定。

lock document message

锁定的时限可以通过 jmix.webdav.lock-timeout 应用程序属性配置。

集合

WebdavDocument 的集合(collection)可以通过 Document browser(文档浏览) 界面的 Create collection(新建集合) 按钮创建。

WebdavDocument 集合是特殊类型的 WebdavDocument,作为其他文档的容器。 父集合通过 parent 属性指定。如果某个文档未指定该属性,则认为该文档属于根集合。

默认情况下,用户可以上传同名文件至同一个集合下(例如,根集合可以包含两个名为 Contract1.docx 的独立文件)。如果希望文档的 URI 具有类似文件系统的唯一性,设置 jmix.webdav.auto-generate-unique-resource-urifalse。此时,如果新上传的文件 URI 指向一个已经存在的文件,则会发生唯一性约束错误。

可以用 Rename(重命名)Remove(删除) 按钮对集合进行重命名或者删除操作。

版本控制

WebDAV 文档版本

WebDAV document versions(WebDAV 文档版本) 界面支持对启用了版本的文件进行版本管理。

有两种打开 WebDAV document versions(WebDAV 文档版本) 界面的方式:

  1. 通过 WebdavDocumentUploadField 组件打开,需要点击文档版本号链接。

    link for open versions
  2. 通过 WebDAV 文档版本 界面中的 Manage versions(版本管理) 按钮打开。

WebDAV document versions(WebDAV 文档版本) 对话框窗口:

web dav document versions

WebDAV document versions(WebDAV 文档版本) 界面支持下列操作:

  1. 创建文档的新版本。点击 Upload 选择要上传到系统的文件。也可以直接将所需文件拖放到放置区。之后,上传的文件将根据最新文档的版本号进行编号。新版本号用 * 符号标记。表示已上传,但尚未链接到文档。保存更改后,将更新版本号。如果对话框窗口关闭而不保存,则在启动 WebdavDocumentVersionsCleaningJob 后,所有标记有 * 版本都将被删除。

    drop files into document versions
  2. 基于另一版本创建新版本。选择一个文档版本,然后点击 Copy to head(复制到新版本) 按钮复制文档并根据最新版本号进行编号。新版本号用 * 符号标记。表示已上传,但尚未链接到文档。保存更改后,将更新版本号。如果对话框窗口关闭而不保存,则在启动 WebdavDocumentVersionsCleaningJob 后,所有标记有 * 版本都将被删除。

    copy to head
  3. 打开文档编辑。选择一个文档版本,点击 Open(打开) 按钮,即可编辑文档。当每次在外部应用程序保存文档时,新版本会发送回数据库。使用 Refresh(刷新) 按钮更新展示在 WebDAV document versions(WebDAV 文档版本) 中的文档版本列表。

    点击 Refresh(刷新) 时,会删除所有未保存的文档版本。因此,如果复制了某些文档版本但是未保存,这些版本将被删除。

  4. 只读打开文档。如需阅读文档,点击文件名链接即可。

  5. 下载文档版本压缩包(ZIP)Download(下载) 按钮支持两个选项。一个是支持将选择的文档作为独立文件下载。Download as ZIP(下载 ZIP 包) 选项支持将选择的文档压缩成 ZIP 包后下载。为方便起见,文件名包含带有相应版本号的 -v 后缀,例如,example-v3.docxdocument-v1.docx

冲突解决策略

有几种策略可以解决多个用户同时编辑同一文档时可能发生的冲突。

例如,两个用户同时在 WebDAV document versions(WebDAV 文档版本) 中打开同一文档,并添加了一堆新版本。第一个用户工作完成后,保存了一些版本。之后,第二个用户也执行了相同的操作。因此,数据库包含由两个用户创建的版本。但是,每个用户只能在 WebDAV document versions(WebDAV 文档版本) 中看到他们各自的版本。

这种情况可能会导致对这些冲突的文档版本进行排序和保存时出现问题。要解决冲突,可以使用下面提到的策略。

默认情况使用 RejectMergePolicy(拒绝合并) 策略。

RebaseMergePolicy

基于最新合并 - 支持基于数据库已有的版本创建新版本。新版本根据数据库中现有的最新文档版本的编号进行编号。

CancelMyMergePolicy

丢弃我的修改 - 如果在 WebDAV document versions(WebDAV 文档版本) 处理文件时,文档的版本发生了变化,则删除所有非持久化的版本(标记 * 的版本)。

CancelTheirMergePolicy

丢弃他人的修改 - 如果在 WebDAV document versions(WebDAV 文档版本) 处理文件时,文档的版本发生了变化,则保存我的所有标记 * 的版本,丢弃 WebDAV document versions(WebDAV 文档版本) 中的新加版本。

RejectMergePolicy

拒绝合并 - 当发生冲突时,会展示相应的警告信息,所有的新版本都会被丢弃。

覆盖默认冲突解决策略

如需重定义默认的冲突解决策略,在 Spring 配置类中定义一个 DefaultMergePolicy 类型的 bean。返回需要的合并策略。示例:

@Bean
public DefaultMergePolicy defaultMergePolicy() {
    return RebaseMergePolicy::new;
}

安全

文档访问限制通过 资源角色行级角色 配置。

预定义角色

WebDAV 扩展组件带有两个内置资源角色:

  • WebDAV: minimal access - 基本的 WebDAV 角色,分配给所有需要使用 WebDAV 功能的用户。

  • WebDAV: view document browser - 授予访问 WebDAV document versions(WebDAV 文档版本) 界面的权限。

限制访问文档

假设有些用户只能编辑由他们自己创建的文档。下面示例展示如何使用行级角色实现这个功能。

  1. 使用 Administration(管理) → Row-level roles(行级角色) 界面创建一个行级角色。

  2. 创建一个 WebdavDocument 实体 UPDATE 操作的行级 断言策略

  3. 为策略定义下列 Groovy 脚本:

    import io.jmix.core.security.CurrentAuthentication
    
    def authBean = applicationContext.getBean(CurrentAuthentication)
    
    return {E}.createdBy.equals(authBean.user.username)
  4. 将角色分配给需要的用户。

系统会检查当前用户是不是文档的作者。如果不是,则用户无法编辑文档,并显示 Access denied(拒绝访问) 的警告信息。

用于保存文档的 OK 按钮也不可用。仅支持以只读方式打开文档。

WebdavSupport 注解

@WebdavSupport 注解可用于 WebdavDocument 类型的字段。通过该注解可以为特定的字段禁用版本功能。默认情况下开启版本功能。

示例:

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@WebdavSupport(versioning = false)
@JoinColumn(name = "DOC_WITHOUT_VERSION_ID")
private WebdavDocument docWithoutVersion;

该扩展组件可以生成指向文档的链接,链接可以发布在网站上或发送给第三方,格式类似 https://<host>:<port>/webdav/link/82b62377-7fd1-b75e-47fc-9ef4b8d67360。打开链接时,用户的浏览器会请求用于访问文档的凭据。成功授权后,如果用户的计算机上安装了桌面端 Office 程序,则会在相应的桌面应用中打开该文档。