需求

TitanHouse Titan Portal 简历分块保存。基本信息单独保存,每个Experience单独保存,等等。

技术设计

Talent 作为 mainContentModel,任何相关信息变更,Talent的版本都要+1,除Talent之外,任何其他ContentModel的实例只有在自身发生变化时才去保存。

业务代码示例

Talent端

// 用户注册即创建一个新的 Talent,只有最基本的email
Talent.create(talent) {
    time = getTime();
    uesr = getUser();

    newObject {
        ...
        version = 1,
        createdBy = user,
        createdAt = time,
        deletedAt = NULL
    } to Talents
}

// Talent修改基本信息
Talent.update(talent) {
    latestVersion = Talent.getLatestVersionFromMain(talent.id); 
     time = getTime();
    uesr = getUser();

    newObject {
        ...
        version = latestVersion + 1,
        createdBy = user,
        createdAt = time,
        deletedAt = NULL
    } to Talents

    // Talents_WorkIndustries 由于后端无法区分industries数组中的每一项是修改出来的,还是删除新增出来的,所以对于这类相关联的两个表,通过一个保存按钮进行保存的,统一做“全部丢弃后新增”处理。
    // 版本管理层对于此种情况有两种处理方式,一种是遍历出原有的industries置为删除状态;另一种不管原有industries,直接新建一组industries,查询时通过与talent一致的createdBy和createdAt取出。
    for (industry in talent.industries) {
        newObject {
            talentId,
            industryId,
            ...
            version = 1,
            createdBy = user,
            createdAt = time,
            deletedAt = NULL
        } to Talents_WorkIndustries;        
    }
}

// 新增一个experience
Experience.create(exp) {
    time = getTime();
    uesr = getUser();

    newObject {
        companyId,
        ...
        version = 1,
        createdBy = user,
        createdAt = time,
        deletedAt = NULL
    } to Experiences

    // Generate new Talent version
    Talent.newVersionWithoutChange(exp.talentId, user, time);
}

// 更新一个experience
Experience.update(exp) {
    // Get the latest version number.
    latestVersionEntity = private.getLatestVersion(exp.experienceId);

    newObject {
        companyId,
        ...
        version = latestVersionEntity.version + 1,
        createdBy = user,
        createdAt = time(),
        deletedAt = NULL
    }

    // Generate new Talent version
    Talent.newVersionWithoutChange(exp.talentId, user, time);
}

// 获取实例指定版本所关联的其他类型实例
Talent.fetchWithRelativeEntities(talentId, version) {
    // Get the specific version talent.
    talent = select * from Talents where talentId = talentId && version = version;
    talent.industries = select * from Talents_WorkIndustries where talentId = talentId && createdBy = talent.createdBy && createdAt = talent.createdAt;

    // Get upperTimeLimit.
    upperTimeLimet = talent.createdAt;

    // Get all the experiences which createdAt less than upperTimeLimit.
    experiences = distinct(experienceId, 'select * from Experiences where talentId = talent.id && createdAt <= upperTimeLimit orderBy createdAt desc');

    for (exp in experiences) {
        exp.company = distinct(companyId, 'select * from Companies where experienceId = exp.experienceId && createdAt <= upperTimeLimit orderBy createdAt desc');

        push(talent.experiences, exp);
    }

    return talent;
}

// 关于主表
// 每次存储新版本到history表后,覆盖主表

results matching ""

    No results matching ""