PROPOSAL TOOLKIT · EXPERT DATABASE
专家资源库
覆盖医疗保障、医药监管、医院管理、数字医疗等领域的专家信息,可用于会议嘉宾邀请、报告引用和 Proposal 背书。
👤 更新说明:新增专家请按模板在本目录创建独立页面。每位专家页面内嵌 Dataview 查询,会自动显示知识库中所有链接到该专家的项目和文章,无需手动维护。
按领域浏览
TABLE 单位 AS "单位", 职位 AS "职位", 领域 AS "领域"
FROM "03_提案素材库/专家资源库"
WHERE file.name != "_索引"
SORT 领域 ASC, 姓名 ASCconst { Modal } = require("obsidian");
class NewExpertModal extends Modal {
onOpen() {
const { contentEl } = this;
contentEl.createEl("h3", { text: "新增专家" });
const input = contentEl.createEl("input", { type: "text" });
input.placeholder = "专家姓名";
input.style.cssText = "width:100%;padding:6px 8px;margin:8px 0 12px;border-radius:4px;border:1px solid var(--background-modifier-border);font-size:14px;";
input.focus();
const hint = contentEl.createEl("div");
hint.style.cssText = "font-size:12px;color:var(--text-muted);margin-bottom:12px;";
hint.textContent = "保存至:03_提案素材库/专家资源库/";
const confirmBtn = contentEl.createEl("button", { text: "创建并打开" });
confirmBtn.style.cssText = "width:100%;background:var(--background-secondary);color:var(--text-normal);border:1px solid var(--background-modifier-border);border-radius:5px;padding:6px;font-size:14px;cursor:pointer;";
const doCreate = async () => {
const name = input.value.trim();
if (!name) { input.focus(); return; }
const tpl = app.vault.getAbstractFileByPath("Templates/专家档案模板.md");
const content = tpl ? await app.vault.read(tpl) : `---\n姓名: ${name}\n单位: \n职位: \n领域: []\ntags: [专家]\n---\n\n# ${name}\n`;
const path = \`03_提案素材库/专家资源库/\${name}.md\`;
try {
const file = await app.vault.create(path, content);
app.workspace.getLeaf().openFile(file);
this.close();
} catch (e) { new Notice("创建失败:" + e.message); }
};
confirmBtn.addEventListener("click", doCreate);
input.addEventListener("keydown", e => { if (e.key === "Enter") doCreate(); });
}
onClose() { this.contentEl.empty(); }
}
const btn = dv.el("button", "+ 新增专家", {attr: {style: "background:var(--background-secondary);color:var(--text-muted);border:1px solid var(--background-modifier-border);border-radius:5px;padding:4px 12px;font-size:0.82rem;cursor:pointer;"}});
btn.addEventListener("click", () => new NewExpertModal(app).open());