@ruovea/notice
v1.0.3
Published
通知公告模块(源码包,Vue 3 插件化依赖注入)
Readme
@ruovea/notice
通知公告模块,以 pnpm 源码包 形式提供给各宿主项目复用。
- 不打 dist、不发 npm——exports 直指
./src/*,由宿主 Vite 编译 - 依赖注入解耦——request / auth / i18n / 富文本编辑器组件由宿主装配时注入
- 零侵入——包内不含
/@/等宿主别名引用,可独立运行,不绑定特定宿主
一、目录结构
src/
├─ index.ts # 入口:导出 NoticePlugin + API + 类型
├─ plugin.ts # Vue install(校验必填项 / provide / mergeLocaleMessage)
├─ context.ts # InjectionKey + useNoticeContext()
├─ types.ts # NoticePluginOptions
├─ routes.ts # 1 条静态路由(可选使用)
├─ api/
│ ├─ index.ts # 10 个 API 函数
│ ├─ http.ts # request 注入点
│ ├─ endpoints.ts # URL 前缀(可覆盖)
│ └─ notice.ts # 通知公告 CRUD + 发布/撤回/已读
├─ i18n/locales/ # 6 语言(en / fr-fr / ja-jp / vi-vn / zh-cn / zh-tw)
└─ views/notice/
├─ index.vue # 通知公告列表页
└─ component/editNotice.vue # 新增/编辑弹窗(富文本编辑器由宿主注入)二、宿主接入
2.1 安装
宿主 package.json 用 link: 协议指向本仓库:
{
"dependencies": {
"@ruovea/notice": "link:../../notice-module/packages/notice"
}
}cd <宿主> && pnpm install # 建立 link2.2 装配插件
// plugins/notice.ts
import type { App } from 'vue';
import { NoticePlugin } from '@ruovea/notice';
import request from '/@/utils/request';
import { auth } from '/@/utils/authFunction';
import { i18n } from '/@/i18n/index';
import Editor from '/@/components/editor/index.vue';
import commonFunction from '/@/utils/commonFunction';
export function setupNotice(app: App) {
const { removeHtml } = commonFunction();
app.use(NoticePlugin, {
request: request as any,
auth,
i18n: i18n as any,
components: { Editor },
removeHtml,
});
}// main.ts
import { setupNotice } from '/@/plugins/notice';
// ... app.use(pinia) 之后
setupNotice(app);三、NoticePluginOptions 说明
| 字段 | 必填 | 说明 |
|---|---|---|
| request | ✅ | 宿主 axios 实例(已配 baseURL / token / 拦截器) |
| auth | ➖ | (code: string) => boolean,按钮权限校验,缺省 () => true |
| i18n | ➖ | 宿主 vue-i18n 实例(用于 mergeLocaleMessage) |
| endpoints | ➖ | 覆盖 API URL 前缀(见下方 Endpoints 章节) |
| registerI18n | ➖ | 是否自动 merge i18n,默认 true |
| components.Editor | ✅ | 宿主富文本编辑器组件,editNotice 弹窗用 |
| removeHtml | ➖ | HTML 去标签函数,列表展示 content 摘要用,缺省走包内兜底 |
i18n 注入约定
包内视图使用 message.notice.xxx / message.router.sysNotice 格式的 key。插件 merge 时同时注册到顶层和 message 层,兼容宿主两级结构。
四、Endpoints 说明
interface NoticeEndpoints {
sysNoticePages: '/SysNotice/Pages'
sysNoticeList: '/SysNotice/List'
sysNoticeAdd: '/SysNotice/Add'
sysNoticeUpdate: '/SysNotice/Update'
sysNoticeDelete: '/SysNotice/Delete'
sysNoticePublic: '/SysNotice/Public'
sysNoticeCancel: '/SysNotice/Cancel'
sysNoticeSetRead: '/SysNotice/SetRead'
sysNoticeUnReadList: '/SysNotice/UnReadList'
sysNoticePageReceived: '/SysNotice/PageReceived'
}五、权限编码清单
| 编码 | 位置 | 说明 |
|---|---|---|
| sysNotice:page | 列表路由 | 路由访问 |
| sysNotice:add | 列表 | 新增按钮 |
| sysNotice:update | 列表 | 编辑按钮 |
| sysNotice:delete | 列表 | 删除按钮 |
| sysNotice:public | 列表 | 发布按钮 |
| sysNotice:cancel | 列表 | 撤回按钮 |
六、路由
| path | name | keepAlive | 说明 |
|---|---|---|---|
| /system/notice | sysNotice | ✅ | 通知公告列表 |
路由
meta.title使用硬编码中文'通知公告',菜单国际化通过包内 locale 文件的router.sysNotice键实现。
七、Vite 预构建排除
⚠️ 宿主
vite.config.ts的optimizeDeps.exclude必须包含@ruovea/notice,否则会出现"页面进入即报『查询失败』、但 Network 面板无任何请求"的诡异现象。
现象
- 通知公告列表页一打开就
ElMessage.error('查询失败'); - 浏览器 DevTools Network 面板没有发出任何 HTTP 请求;
- 控制台抛出
[@ruovea/notice] request 未注入,请先 install 插件。
根因
本包是 pnpm 源码包,package.json 的 exports 把 . 与 ./api 都指向 ./src/*。若不排除预构建,Vite 会把主入口 @ruovea/notice 预打包成 node_modules/.vite/deps/@ruovea_notice.js,但 ./api 子路径仍走源码 src/api/index.ts → src/api/http.ts。两端各持一份模块级 _request:
main.ts中setupNotice(app)→NoticePlugin.install→__setRequest(request)写入的是预构建产物里的_request;- 视图层
import { apiSysNoticePagePost } from '@ruovea/notice/api'拿到的是源码 http.ts 的_request,永远是undefined; - 视图调 API →
http()→ throw → catch →ElMessage.error('查询失败'),全程不进 axios,所以无网络请求。
修复
宿主 vite.config.ts:
optimizeDeps: {
exclude: ['vue-demi', '@ruovea/notice'],
},改完清除 Vite 预构建缓存后重启 dev:
rm -rf Web/node_modules/.vite/deps
pnpm dev验证
重启后进入"通知公告"菜单,DevTools Network 应能看到 GET /SysNotice/Pages?... 请求,列表正常渲染。
八、License
MIT
