3.1 KiB
3.1 KiB
description, globs
| description | globs | |||||
|---|---|---|---|---|---|---|
| Element Plus 使用规范、权限控制与 Pinia 状态管理约定 |
|
UI、权限与状态管理
Element Plus
- 组件与图标通过
unplugin-vue-components/unplugin-auto-import按需自动导入;必须手动补充的(如ElMessage、ElMessageBox、ElLoading)在src/types/element-plus.d.ts声明,禁止全量import ElementPlus from 'element-plus'。 - 消息提示统一使用
ElMessage/ElMessageBox/ElNotification,禁止alert/confirm原生弹窗。- 成功
ElMessage.success,失败由拦截器统一处理,删除确认用ElMessageBox.confirm。 - 同一操作不要堆叠多条 message。
- 成功
- 全局默认配置(size、zIndex、中文语言包)在
main.ts或App.vue的ElConfigProvider中统一设置,不在每个组件重复传size。 - 表单统一
label-width与布局:搜索栏inline,弹窗表单label-position="right",标签宽度按项目约定(默认100px)。 - 表格空数据、图片加载失败等边界状态必须处理(
empty-text、默认头像)。 - 主题定制通过
src/styles/element/index.scss覆盖 SCSS 变量,禁止用!important打补丁;确需覆盖内部样式时用:deep()且限定作用域。
权限
- 采用「动态路由 + 按钮级权限」双层控制:
- 菜单/页面:后端返回路由表,前端
router/index.ts中动态addRoute,静态路由仅保留登录、404、首页。 - 按钮:
v-hasPerm="['sys:user:add']"指令,指令实现从用户 store 读取权限集合,无权限时移除 DOM 节点而非仅禁用。
- 菜单/页面:后端返回路由表,前端
- 路由元信息
meta字段固定:title、icon、hidden、roles、keepAlive、breadcrumb。 - 路由守卫必须处理:已登录访问登录页跳转首页、无 Token 跳登录并携带
redirect、路由不存在跳 404。 - 权限判断不得散落在业务代码里写字符串比较,统一走指令或 store 中的
hasPermission()。
Pinia
- 一律使用 setup store 语法:
export const useUserStore = defineStore('user', () => { const token = ref('') const permissions = ref<string[]>([]) function resetToken() { token.value = '' } return { token, permissions, resetToken } }, { persist: true }) - 一个业务域一个 store,放
src/store/modules/{module}.ts,index 统一导出。 - 需要持久化的字段(token、主题、标签栏)必须显式声明
persist路径,禁止整个 store 无脑持久化,敏感信息不落 localStorage。 - 组件内不得直接修改其他模块的 store 状态,需通过该 store 暴露的 action。
- 接口请求优先放 API 层;store 只做状态存放与跨组件共享,不承载大量业务过程。
路由与页面缓存
- 页面组件
name必须与路由name一致,否则<keep-alive>的include/exclude失效。 - 列表页默认开启缓存;从详情页返回时保留查询条件,从菜单进入时重置。