【协作】公告、讨论、通讯录与笔记
公告、讨论、通讯录与笔记,由 yudao-module-oa 后端模块的 announcement、discussion、contact、note 包实现,前端实现在 @/views/oa/announcement/list、@/views/oa/discussion/manage、@/views/oa/contact、@/views/oa/note 目录。
公告用于发布和接收通知,讨论区用于回复和投票,通讯录与笔记支持个人维护及共享。四类数据分别保存;阅读、共享和回复各自落在关系表上,删除自己的接收记录不会直接删除其他人的记录。本文四个功能均不涉及 BPM 流程。
本文涉及表如下图所示:
# 1. 公告管理
公告管理,由 OaAnnouncementController 提供接口(/oa/announcement)。
# 1.1 主表表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
公告表 oa_announcement,保存公告的类型、优先级、正文和置顶设置:
CREATE TABLE `oa_announcement` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`type` tinyint NOT NULL COMMENT '公告类型',
`priority` tinyint NOT NULL COMMENT '优先级',
`title` varchar(255) NOT NULL COMMENT '公告标题',
`content` text COMMENT '公告内容',
`url` varchar(512) DEFAULT NULL COMMENT '公告链接',
`top` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否置顶',
PRIMARY KEY (`id`),
KEY `idx_creator_top_create_time` (`creator`, `top`, `create_time`)
) ENGINE=InnoDB COMMENT='OA 公告';
① 公告没有独立的发布人字段,通用字段 creator 即发布人,create_time 即发布时间。idx_creator_top_create_time 索引支撑【我发布的】按发布人 + 置顶 + 时间的查询。修改和删除由 OaAnnouncementServiceImpl 的 validateAnnouncementPublisher 校验只能发布人操作。
② 枚举 type 公告类型(OaAnnouncementTypeEnum),对应字典 oa_announcement_type:
| 值 | 枚举 | 说明 |
|---|---|---|
1 | ANNOUNCEMENT | 公告 |
2 | NOTICE | 通知 |
3 | VOTE | 投票 |
公告类型里的「投票」≠ 讨论区投票
这里的 VOTE 只是公告的分类标签,不会创建投票选项和投票记录。真正的投票互动在讨论区(oa_discussion.type = VOTE)完成。
③ 枚举 priority 优先级(OaPriorityEnum),对应字典 oa_priority,与日程、笔记复用同一套:
| 值 | 枚举 | 说明 |
|---|---|---|
1 | NORMAL | 一般 |
2 | IMPORTANT | 重要 |
3 | URGENT | 紧急 |
④ top 置顶只影响列表排序;url 是可选的外链,正文 content 为富文本。
该表包含一个子表:
oa_announcement_receiver(公告接收人):创建公告时按发布人的管理范围自动写入,转发时追加下属。
# 1.2 子表结构
接收人表 oa_announcement_receiver,保存公告发给了谁以及各自的阅读状态:
CREATE TABLE `oa_announcement_receiver` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`announcement_id` bigint NOT NULL COMMENT '公告编号',
`receiver_user_id` bigint NOT NULL COMMENT '接收人用户编号',
`read_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否已读',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_announcement_id_receiver_user_id` (`announcement_id`, `receiver_user_id`, `deleted`),
KEY `idx_receiver_user_id_read_status` (`receiver_user_id`, `read_status`)
) ENGINE=InnoDB COMMENT='OA 公告接收人';
① announcement_id 关联 oa_announcement 表的 id 字段,receiver_user_id 关联 system_users 表的 id 字段。uk_announcement_id_receiver_user_id 唯一索引保证同一公告不会重复发给同一个人。
② idx_receiver_user_id_read_status 索引支撑【我收到的】按接收人 + 已读状态过滤。查看权限由 getAnnouncement 校验:要么是发布人,要么在接收人表中,否则抛出 ANNOUNCEMENT_ACCESS_DENIED。
# 1.3 发布、阅读与转发
公告没有独立的 status 字段,生命周期由接收关系驱动:
发布 / 阅读 / 转发说明
创建公告 ──→ 写入下属接收关系(read_status=0)
│
├── 打开详情 ──→ updateAnnouncementReadStatus → 已读(1)
│
└── 转发 ──→ 向下属追加接收关系(不重复)
- 创建公告(
createAnnouncement):接收人取自adminUserApi.getUserListBySubordinate(userId),即发布人负责部门及其子部门下的用户。不额外发站内信,接收人在【我收到的】列表查看。 - 阅读(
updateAnnouncementReadStatus):已读时直接返回,不重复更新;公告本身没有read_time字段(与日程参与人不同)。 - 转发(
forwardAnnouncement):先用selectByIdForUpdate对公告行加锁,串行处理同一公告的并发转发;再由validateAnnouncementReceiver校验当前用户本人必须是该公告的接收人,然后查其下属。无下属时直接返回0,不报错。只要任一下属已经是接收人,就视为已转发,抛出ANNOUNCEMENT_ALREADY_FORWARDED,不允许再次转发;否则批量追加下属的接收关系,并返回新增人数。 - 移除收到的公告(
deleteReceivedAnnouncement):只有已读才允许移除,未读抛出ANNOUNCEMENT_UNREAD_DELETE_DENIED;仅物理删除本人的接收关系,不影响公告和其他人。 - 发布人删除(
deleteAnnouncement):同时删除全部接收关系。
# 1.4 管理后台
对应 [OA 办公协同 -> 公告管理 -> 我发布的 / 我收到的] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/announcement/list、@/views/oa/announcement/my 目录。
# 列表

# 新增与修改
点击【新增】打开 OaAnnouncementForm.vue,填写公告类型、优先级、置顶、标题、相关链接和正文。修改时仅发布人可以维护本人公告。

# 阅读与转发
对应 [OA 办公协同 -> 公告管理 -> 我收到的] 菜单,页面在 @/views/oa/announcement/my。点击标题打开详情并标记已读;点击【转发】调用 POST /oa/announcement/forward,已经转发的公告显示【已转发】。

# 删除
发布人删除公告时,同时删除接收关系。在【我收到的】中,只有已读公告可以移除,调用 /oa/announcement/delete-received,仅移除本人的接收关系。
# 2. 讨论区
讨论区,由 OaDiscussionController 提供接口(/oa/discussion)。回复、点赞、投票分别由 OaDiscussionReplyController(/oa/discussion-reply)、OaDiscussionLikeController(/oa/discussion-like)、OaDiscussionVoteController(/oa/discussion-vote)提供。
# 2.1 主表表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
讨论表 oa_discussion,保存讨论或投票主题,投票主题额外记录单选多选和起止时间:
CREATE TABLE `oa_discussion` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '发布人用户编号',
`type` tinyint NOT NULL COMMENT '类型',
`title` varchar(200) NOT NULL COMMENT '标题',
`content` longtext COMMENT '正文',
`file_urls` json DEFAULT NULL COMMENT '附件地址列表',
`visit_count` int NOT NULL DEFAULT 0 COMMENT '访问次数',
`vote_multiple` bit(1) DEFAULT NULL COMMENT '投票是否多选',
`vote_start_time` datetime DEFAULT NULL COMMENT '投票开始时间',
`vote_end_time` datetime DEFAULT NULL COMMENT '投票结束时间',
PRIMARY KEY (`id`),
KEY `idx_type_create_time` (`type`, `create_time`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB COMMENT='OA 讨论';
① 与公告不同,讨论有独立的 user_id 发布人字段(不复用 creator 做业务判断),关联 system_users 表的 id 字段。创建时强制写入当前登录用户,更新时 setUserId(null) 禁止被前端篡改。
② 枚举 type 讨论类型(OaDiscussionTypeEnum),对应字典 oa_discussion_type:
| 值 | 枚举 | 说明 |
|---|---|---|
1 | ANNOUNCEMENT | 公告 |
2 | DISCUSSION | 讨论 |
3 | VOTE | 投票 |
③ 发布后不允许修改 type。非投票类型会在保存时清空三个 vote_* 字段;投票类型在更新时只允许改结束时间(必须晚于原开始时间),vote_multiple 和 vote_start_time 以及投票选项在发布后都不能改。
④ visit_count 由 increaseDiscussionVisitCount 在打开详情时累加。file_urls 是 JSON 数组,形如 ["http://xxx/a.pdf"]。
该表包含四个子表:
oa_discussion_reply(讨论回复):楼层回复,parent_id形成楼中楼。oa_discussion_like(讨论点赞):对主题或主回复的点赞。oa_vote_option(投票选项):仅投票主题使用。oa_vote_record(投票记录):谁投了哪个选项。
# 2.2 子表结构
回复表 oa_discussion_reply,保存楼层回复:
CREATE TABLE `oa_discussion_reply` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`discussion_id` bigint NOT NULL COMMENT '讨论编号',
`user_id` bigint NOT NULL COMMENT '回复人用户编号',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父回复编号',
`reply_user_id` bigint DEFAULT NULL COMMENT '被回复人用户编号',
`content` varchar(2000) NOT NULL COMMENT '回复内容',
PRIMARY KEY (`id`),
KEY `idx_discussion_id_create_time` (`discussion_id`, `create_time`)
) ENGINE=InnoDB COMMENT='OA 讨论回复';
① discussion_id 关联 oa_discussion 表的 id 字段。parent_id = 0 表示回复主贴;非 0 时必须属于同一讨论,否则非法。创建楼中楼时,reply_user_id 自动取父回复的作者,不接受前端指定。
② 删除回复(deleteDiscussionReply)校验当前用户是讨论发布人或超级管理员(不是回复作者本人),否则抛出 DISCUSSION_REPLY_ACCESS_DENIED。删除某条回复时,会连同其全部子孙回复及对应点赞一起清理。
点赞表 oa_discussion_like,保存对讨论主题或某条回复的点赞关系:
CREATE TABLE `oa_discussion_like` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`discussion_id` bigint DEFAULT NULL COMMENT '讨论编号',
`reply_id` bigint DEFAULT NULL COMMENT '回复编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
PRIMARY KEY (`id`),
KEY `idx_discussion_id_user_id` (`discussion_id`, `user_id`, `deleted`),
KEY `idx_reply_id_user_id` (`reply_id`, `user_id`, `deleted`)
) ENGINE=InnoDB COMMENT='OA 讨论点赞';
① discussion_id 与 reply_id 二选一:赞主题时写 discussion_id,赞回复时写 reply_id。createDiscussionLike 已点赞则直接返回,取消点赞找不到记录也直接返回,保证幂等。
投票选项表 oa_vote_option,保存投票主题下的候选项:
CREATE TABLE `oa_vote_option` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`discussion_id` bigint NOT NULL COMMENT '讨论编号',
`title` varchar(200) NOT NULL COMMENT '选项标题',
`color` varchar(20) DEFAULT NULL COMMENT '展示颜色',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
PRIMARY KEY (`id`),
KEY `idx_discussion_id_sort` (`discussion_id`, `sort`)
) ENGINE=InnoDB COMMENT='OA 投票选项';
① discussion_id 关联 oa_discussion 表的 id 字段。选项只在创建主题时一次性写入(createVoteOptionList),发布后不能增删改。
投票记录表 oa_vote_record,保存「谁投了哪个选项」:
CREATE TABLE `oa_vote_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`discussion_id` bigint NOT NULL COMMENT '讨论编号',
`option_id` bigint NOT NULL COMMENT '投票选项编号',
`user_id` bigint NOT NULL COMMENT '投票人用户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_option_id_user_id` (`option_id`, `user_id`, `deleted`),
KEY `idx_discussion_id_user_id` (`discussion_id`, `user_id`)
) ENGINE=InnoDB COMMENT='OA 投票记录';
① option_id 关联 oa_vote_option 表的 id 字段,uk_option_id_user_id 唯一索引保证同一选项不能被同一个人投两次。
# 2.3 投票规则
投票由 OaDiscussionVoteServiceImpl 的 voteDiscussion 控制:
投票说明
投票主题(type=VOTE) ──在 [vote_start_time, vote_end_time] 内──→ 提交选项
│
┌──────────────┴──────────────┐
▼ ▼
单选(vote_multiple=0) 多选(vote_multiple=1)
只能提交一次、选一个 可分次追加,同一选项不重复
- 非投票类型调用投票接口 →
DISCUSSION_VOTE_INVALID。 - 当前时间不在投票窗口内 →
DISCUSSION_VOTE_EXPIRED。 - 单选却传了多个选项,或多选时选项不属于本主题 →
DISCUSSION_VOTE_INVALID/DISCUSSION_VOTE_OPTION_NOT_EXISTS。 - 单选已投过,或多选重复投同一选项 →
DISCUSSION_VOTE_DUPLICATE。
删除讨论主题(deleteDiscussion)时,依次清理回复(含回复点赞)、主题点赞、投票记录和选项,最后删主题。发布人或超级管理员可删。
# 2.4 管理后台
对应 [OA 办公协同 -> 讨论区 -> 讨论管理 / 讨论区列表] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/discussion/manage、@/views/oa/discussion/list 目录。
# 列表

# 发布与管理
点击【发布】打开 OaDiscussionForm.vue,选择讨论类型,填写标题、正文和附件。投票类型还需配置单选或多选、起止时间和投票选项。

# 查看与回复
在 [讨论区 -> 讨论区列表] 点击标题进入 @/views/oa/discussion/detail/index.vue。OaDiscussionReply.vue 展示回复楼层,支持回复主贴或楼层,并按全部、楼主、本人筛选。

# 点赞与投票
讨论和主回复可点赞、取消点赞。投票在 OaDiscussionVote.vue 中选择选项后点击【提交投票】,调用 POST /oa/discussion-vote/create。

# 删除
讨论管理中删除主题时会删除关联互动记录。回复删除由后端校验讨论发布人或超级管理员身份,删除某条回复时连同其子回复一起清理。
# 3. 通讯录
通讯录,由 OaContactController 提供接口(/oa/contact)。分类由 OaContactCategoryController 提供接口(/oa/contact-category)。
# 3.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
联系人分类表 oa_contact_category,保存每个用户自己的联系人分类:
CREATE TABLE `oa_contact_category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`name` varchar(50) NOT NULL COMMENT '分类名称',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示排序',
PRIMARY KEY (`id`),
KEY `idx_user_id_sort` (`user_id`, `sort`)
) ENGINE=InnoDB COMMENT='OA 联系人分类';
① user_id 关联 system_users 表的 id 字段。分类是个人维度的,用户 A 的分类编号不能被用户 B 使用。删除分类时只清空联系人上的 category_id,不删除联系人。
外部联系人表 oa_contact,保存联系人的姓名、电话、邮箱和公司等资料:
CREATE TABLE `oa_contact` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`category_id` bigint DEFAULT NULL COMMENT '分类编号',
`name` varchar(50) NOT NULL COMMENT '姓名',
`pinyin` varchar(100) DEFAULT NULL COMMENT '姓名拼音',
`sex` tinyint DEFAULT NULL COMMENT '性别',
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`company_name` varchar(100) DEFAULT NULL COMMENT '公司名称',
`company_phone` varchar(30) DEFAULT NULL COMMENT '公司电话',
`avatar` varchar(512) DEFAULT NULL COMMENT '头像地址',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_creator_category_id` (`creator`, `category_id`),
KEY `idx_name_mobile` (`name`, `mobile`)
) ENGINE=InnoDB COMMENT='OA 外部联系人';
① category_id 关联 oa_contact_category 表的 id 字段,表示创建人自己的分类。共享给别人之后,接收人的分类存在共享关系表里,不改这里的值。
② pinyin 由后端用 StrUtils.toPinyin(name) 在创建/修改时自动生成,不接受前端传入,用于列表按拼音检索。
③ sex 复用 System 模块的 SexEnum(不是 OA 自有枚举)。
联系人共享表 oa_contact_share,保存「谁持有这个联系人」:
CREATE TABLE `oa_contact_share` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`contact_id` bigint NOT NULL COMMENT '联系人编号',
`user_id` bigint NOT NULL COMMENT '共享接收人用户编号',
`category_id` bigint DEFAULT NULL COMMENT '接收人的分类编号',
`handle_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否已处理',
PRIMARY KEY (`id`),
KEY `idx_contact_id_user_id` (`contact_id`, `user_id`, `deleted`),
KEY `idx_user_id_handle_status` (`user_id`, `handle_status`)
) ENGINE=InnoDB COMMENT='OA 联系人共享';
① contact_id 关联 oa_contact 表的 id 字段,user_id 关联 system_users 表的 id 字段。创建人在创建联系人时也会写入一条 handle_status = 1 的持有关系。
② category_id 是接收人自己的分类,与主表 oa_contact.category_id 彼此独立。
# 3.2 共享与持有
共享 / 处理 / 移除说明
创建联系人 ──→ 写入本人持有关系(handle_status=1)
│
├── 共享 ──→ 为接收人写入 handle_status=0
│ │
│ └── 处理 ──→ handle_status=1 + 写入本人分类
│
└── 移除 ──→ 删除本人持有关系
│
└── 若已无任何持有人 ──→ 删除联系人正文
- 共享(
shareContact):已持有且有权限的人可继续共享;新接收人初始handle_status = 0。 - 处理(
handleContactShare):接收人选择自己的分类后,标记已处理,联系人进入【我的联系人】。 - 移除(
deleteReceivedContact/deleteContact):只删当前用户的持有关系;最后一个持有人离开时才删除oa_contact正文。
# 3.3 管理后台
对应 [OA 办公协同 -> 通讯录] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/contact 目录。
# 分类与新增
点击【管理分类】维护个人分类。点击【新增】打开 OaContactForm.vue,填写姓名、分类、性别、手机、邮箱、公司和地址等资料。

# 共享
选择联系人后点击【共享】,选择共享接收人,调用 POST /oa/contact/share。已持有联系人且有相应操作权限的接收人也可继续共享。
# 接收与归类
切换到共享给本人的联系人,点击【处理】选择自己的分类,调用 PUT /oa/contact/handle-share。处理后联系人进入【我的联系人】;分类属于当前用户,不使用共享人的分类编号。
# 修改与移除
联系人资料修改由后端校验归属。删除或移除时仅清理当前用户的持有关系;删除分类会清空对应分类关联,不删除联系人。
# 4. 笔记管理
笔记管理,由 OaNoteController 提供接口(/oa/note)。目录由 OaNoteCategoryController 提供接口(/oa/note-category)。
# 4.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
笔记目录表 oa_note_category,保存每个用户自己的笔记目录:
CREATE TABLE `oa_note_category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`name` varchar(50) NOT NULL COMMENT '目录名称',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
PRIMARY KEY (`id`),
KEY `idx_user_id_sort` (`user_id`, `sort`)
) ENGINE=InnoDB COMMENT='OA 笔记目录';
① 与通讯录分类一样,目录是个人维度的。删除目录时(deleteNotesByCategoryId)会删除该目录下本人的笔记及其接收关系,行为比通讯录分类更激进,使用时需注意。
笔记表 oa_note,保存笔记的正文、附件和收藏状态:
CREATE TABLE `oa_note` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`category_id` bigint DEFAULT NULL COMMENT '目录编号',
`type` tinyint NOT NULL COMMENT '笔记类型',
`priority` tinyint NOT NULL COMMENT '优先级',
`title` varchar(100) NOT NULL COMMENT '标题',
`content` longtext COMMENT '内容',
`favorite` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否收藏',
`file_urls` json DEFAULT NULL COMMENT '附件地址列表',
PRIMARY KEY (`id`),
KEY `idx_creator_category_id` (`creator`, `category_id`),
KEY `idx_type` (`type`)
) ENGINE=InnoDB COMMENT='OA 笔记';
① category_id 关联 oa_note_category 表的 id 字段。通用字段 creator 即笔记所属人,修改、删除、共享由 OaNoteServiceImpl 校验归属。
② 枚举 type 笔记类型(OaNoteTypeEnum),对应字典 oa_note_type:
| 值 | 枚举 | 说明 |
|---|---|---|
1 | PRIVATE | 我的笔记 |
2 | COMPANY | 公司笔记 |
3 | SHARED | 共享笔记 |
③ 枚举 priority 优先级(OaPriorityEnum),对应字典 oa_priority,与公告、日程复用。
④ favorite 由 updateNoteFavorite 单独维护,只对本人笔记生效。file_urls 是 JSON 附件地址列表。
笔记接收人表 oa_note_receiver,保存笔记共享给了哪些用户:
CREATE TABLE `oa_note_receiver` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`note_id` bigint NOT NULL COMMENT '笔记编号',
`user_id` bigint NOT NULL COMMENT '接收人用户编号',
PRIMARY KEY (`id`),
KEY `idx_note_id_user_id` (`note_id`, `user_id`, `deleted`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB COMMENT='OA 笔记接收人';
① note_id 关联 oa_note 表的 id 字段,user_id 关联 system_users 表的 id 字段。共享范围由创建人通过 updateNoteShare 全量覆盖维护(与日程参与人的差量更新不同):本次列表之外的接收关系会被删除,新的会被插入。
# 4.2 共享与收藏
共享 / 收藏 / 移除说明
创建笔记 ──→ 本人可收藏、可共享
│
├── updateNoteFavorite ──→ favorite 0↔1(仅本人)
│
├── updateNoteShare ──→ 全量覆盖接收人列表
│
└── 接收人 deleteReceivedNote ──→ 只删本人接收关系
- 创建人维护笔记正文和共享范围;接收人只能查看共享给自己的笔记,不能改正文。
- 取消某人的共享只移除接收关系,笔记正文仍由创建人持有。
- 创建人删除笔记时,会一并清理全部接收关系。
# 4.3 管理后台
对应 [OA 办公协同 -> 笔记管理] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/note 目录。
# 列表

# 目录与新增
点击【管理分类】维护笔记目录。点击【新增】打开 OaNoteForm.vue,填写类型、优先级、目录、标题、正文和附件。

# 收藏与共享
本人笔记可点击【收藏】,调用 PUT /oa/note/update-favorite。点击【共享】打开 OaNoteShareForm.vue,选择共享接收人后保存,调用 PUT /oa/note/update-share。
# 查看与删除
切换本人笔记和共享笔记查看详情。创建人可修改、删除本人笔记;接收人点击【移除】,只调用 /oa/note/delete-received 删除本人的接收关系。