v27 个人笔记模块:分块(段落/图片/清单)+ 单层多标签 + 默认私有可共享
参考 flomo(时间流卡片 + 标签即筛)、Obsidian(图文混排的直觉)、
思源(「块」的粒度),但刻意只取轻的那一层:
- 分块只做 text / image / list 三种,可增删、可上下移;不做块引用 / 块 ID 双链
- 标签单层、多对多,只存字符串(**不建标签表**)——改名/合并这类重型能力一律不做
- 不做富文本工具栏、不做 Markdown 预览、不做拖拽排序(只有 ↑↓ 按钮)
- 可见性默认**私有**,单条可勾「共享给全家」;共享出去只给别人看,不给别人改
落地:
- 新增 app/Note.php(块清洗、标签归一、可见性、认领草稿附件)
- 新增 3 张表 notes / note_blocks / note_tags;Schema VERSION 26→27
- 🔴 attachments.target_type 是 ENUM:加 'note' 必须同时改建表串 +
新增 widenAttachTargetEnum()(老库不做这一步,传笔记图片会被严格模式拒掉)
- 路由 5 条:notes / notes/form / notes/save / notes/destroy / notes/upload
- 模板 templates/notes/index.php(列表)+ form.php(分块编辑)
- JS assets/js/note_editor.js(按需加载,同 person_picker 那套)
- 编辑器状态放 DOM 而非 JS 数组:移动块时用户已输入的内容一字不丢
This commit is contained in:
@@ -72,6 +72,7 @@ $isLoggedIn = \App\Auth::check();
|
||||
⚠️ 只覆盖这三个变量,**不碰** --paper / --ink 这些纸墨底色 ——
|
||||
模块色是用来"分区"的,把整页背景也换了就不是家书了。 */ ?>
|
||||
<body class="mod-<?= e($moduleKey) ?>"
|
||||
data-media-base="media.php?k="
|
||||
style="--brand: <?= e($themeVars['brand']) ?>; --brand-2: <?= e($themeVars['brand2']) ?>; --brand-ink: <?= e($themeVars['ink']) ?>;">
|
||||
|
||||
<?php if ($isLoggedIn): ?>
|
||||
@@ -163,6 +164,18 @@ $isLoggedIn = \App\Auth::check();
|
||||
document.head.appendChild(s);
|
||||
})();
|
||||
</script>
|
||||
<?php /* v27:笔记的分块编辑器同样**按需加载**(页面上真有 `#noteForm` 才拉)。
|
||||
理由与 person_picker.js 完全同一套:它只在写笔记那一页有用,
|
||||
每页都带一份等于让别的页面白付流量。判据用表单的真实 id(不是含糊找 "note")。 */ ?>
|
||||
<script>
|
||||
(function () {
|
||||
if (!document.getElementById('noteForm')) { return; }
|
||||
var s = document.createElement('script');
|
||||
s.src = <?= json_encode(asset('/assets/js/note_editor.js')) ?>;
|
||||
s.defer = true;
|
||||
document.head.appendChild(s);
|
||||
})();
|
||||
</script>
|
||||
<script src="<?= e(asset('/assets/js/filter.js')) ?>"></script>
|
||||
<script src="<?= e(asset('/assets/js/preview.js')) ?>"></script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user