<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>版本管理 - tag - 沐木</title><link>https://oldletter.cn/tags/%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/</link><description>版本管理 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 11 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/" rel="self" type="application/rss+xml"/><item><title>测评平台（一）：资源、发布包与测评任务分层</title><link>https://oldletter.cn/posts/assessment-platform-01-resource-release-task/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/assessment-platform-01-resource-release-task/</guid><description><![CDATA[<blockquote>
<p>系列导航：<a href="/posts/assessment-platform-01-resource-release-task/" rel="">5</a> | <a href="/posts/assessment-platform-02-multi-resource-runtime/" rel="">6</a> | <a href="/posts/assessment-platform-03-draft-preview-publish/" rel="">7</a></p></blockquote>
<p>测评后台同时承载问卷、考试、材料和报告配置。编辑页面需要频繁保存，参与者却必须在整个作答周期内读取同一份题目和评分规则。把资源、发布版本和任务放在一张表里，任何一次后台修改都可能改变进行中的结果，问题发生后也很难回答“这份报告依据了哪个版本”。</p>
<h2 id="三个对象对应三种生命周期">三个对象对应三种生命周期</h2>
<p>资源是可编辑的设计对象，保存标题、FormDSL、评分配置和报告模板。资源可以有多个草稿版本，但草稿不参与正式作答。发布包是审核通过后的不可变快照，绑定一个资源版本、题目快照和报告规则。测评任务引用发布包，运行阶段再附加参与者范围与执行策略。</p>
<div class="mermaid" id="id-2" data-mermaid-definition="Zmxvd2NoYXJ0IFRECiAgICBEcmFmdFvotYTmupDojYnnqL9dIC0tPiBSZXZpZXdb5qCh6aqM5LiO5a6h5qC4XQogICAgUmV2aWV3IC0tPiBSZWxlYXNlW&#43;S4jeWPr&#43;WPmOWPkeW4g&#43;WMhV0KICAgIFJlbGVhc2UgLS0&#43;IFRhc2tb5rWL6K&#43;E5Lu75YqhXQogICAgVGFzayAtLT4gUnVuW&#43;WPguS4juiAhei/kOihjOWunuS&#43;i10KICAgIERyYWZ0IC0tPnzlpI3liLZ8IE5ld0RyYWZ0W&#43;aWsOiNieeov10KICAgIFJlbGVhc2UgLS7npoHmraLkv67mlLkuLT4gUmVsZWFzZQ==">flowchart TD
    Draft[资源草稿] --&gt; Review[校验与审核]
    Review --&gt; Release[不可变发布包]
    Release --&gt; Task[测评任务]
    Task --&gt; Run[参与者运行实例]
    Draft --&gt;|复制| NewDraft[新草稿]
    Release -.禁止修改.-&gt; Release</div><p>核心关系可以简化为：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">assessment_resource(id)
</span></span><span class="line"><span class="cl">assessment_form_version(resource_id, version_no, form_dsl)
</span></span><span class="line"><span class="cl">assessment_release(id, resource_id, form_version_id, status, checksum)
</span></span><span class="line"><span class="cl">assessment_task(id, release_id, access_mode, starts_at, ends_at)
</span></span><span class="line"><span class="cl">assessment_run(id, task_id, release_id, participant_id, status)</span></span></code></pre></div></div>
<p>运行实例保存 <code>release_id</code>，不能只保存资源 ID。资源后来创建了新版本，旧运行实例仍然通过发布包得到原题目。发布包的 checksum 用来检查快照是否被意外修改，历史版本不在原记录上覆盖。</p>
<h2 id="发布前校验要靠服务端">发布前校验要靠服务端</h2>
<p>保存草稿时可以允许未完成字段，进入发布流程后执行完整 FormDSL 校验：题目标识唯一、选项引用存在、必填规则可解析、跳题条件不形成非法引用、评分维度和报告模板能够对应。前端校验提供反馈，服务端校验决定是否生成发布包。</p>
<p>发布动作在事务中完成：锁定目标资源版本，写入题目快照和配置快照，计算摘要，创建 <code>AssessmentRelease</code>，再把发布状态改为可用。任何一步失败都不应留下“已发布但快照为空”的记录。重复发布请求使用幂等键返回已有发布包。</p>]]></description></item></channel></rss>