本项目是基于上游开源项目 Daymychen/art-design-pro 二次开发(Fork)的企业后台管理模板。我们在保留上游优秀体验与视觉规范的基础上,面向企业级场景做了契约对齐与功能精简:
- 多租户 + 图形验证码登录,保留
access_token/refresh_token字段命名 - 平台/系统分层:平台维护“菜单定义 + 元素权限 + 租户范围”,租户侧维护“角色—菜单—元素权限”
- 动态菜单完全后端驱动,严格遵守后端契约,不前端造字段/重映射
- 登录页支持 URL
tenant_code预填与锁定,“二维码联系管理员”弹窗(VITE_ADMIN_QRCODE_URL) - 去除国际化与演示页:保持中文单语界面,删除 article/change/examples/result/safeguard/template/widgets
- UI 约定:系统页表格默认居中、无序号列、操作列展开规则统一,空值占位
-- - HTTP 规则:GET 查询参数自动清理空值(保留 0/false),最小 UI 字段映射
- 全局水印:默认“租户编码 | 用户账号”,可通过 props 覆盖
- 使用最新技术栈
- 内置常用业务组件模版
- 提供多种主题模式,可以自定义主题
- 漂亮的 UI设计、极致的用户体验和细节处理
- 系统全面支持自定义设置,满足您的个性化需求
- 开发框架:Vue3、TypeScript、Vite、Element-Plus、Tailwind CSS
- 代码规范:Eslint、Prettier、Stylelint、Husky、Lint-staged、cz-git
- 丰富主题切换
- 全局搜索
- 锁屏
- 多标签页
- 全局面包屑
- 图标库
- 富文本编辑器
- Echarts 图表
- Utils工具包
- 网络异常处理
- 路由级别鉴权
- 侧边栏菜单鉴权
- 鉴权指令
- 移动端适配
- 优秀的持久化存储方案
- 本地数据存储校验
- 代码提交校验与格式化
- 代码提交规范化
- 支持 Chrome、Safari、Firefox 等现代主流浏览器。
- 官方演示:https://www.artd.pro
- 上游文档:https://www.artd.pro/docs
- 变更记录:
CHANGELOG.md/CHANGELOG.zh-CN.md
# 安装依赖
pnpm install
# 如果 pnpm install 安装失败,尝试使用下面的命令安装依赖
pnpm install --ignore-scripts
# 本地开发环境启动
pnpm dev
# 生产环境打包
pnpm build- 上游项目:Daymychen/art-design-pro
- 同步分支:upstream/main
- 同步提交:c4aa8ae9b7bcff3a2e8d393cb53d9a2a6af56747(feat: useTable hooks addcolumn、updatecolumn、togglecolumn support batch operations,基于 tag v3.0.1 的功能增强提交)
- 同步时间:见本仓库最近一次同步提交(分支:merge/upstream-sync-3.0.1)
本仓库在同步上游的同时,保留并增强了以下业务能力:
-
多租户与图形验证码登录
- 登录页保留租户编码与图形验证码输入,支持点击图片刷新验证码。
- 接口:
- 获取验证码:
GET /api/v1/private/admin/system/user/login/captcha(函数:src/api/auth.ts:fetchCaptcha) - 登录:
POST /api/v1/private/admin/system/user/login(函数:src/api/auth.ts:fetchLogin) - 用户信息:
GET /api/v1/private/admin/system/user/info(函数:src/api/auth.ts:fetchGetUserInfo)
- 获取验证码:
- Token 字段:
access_token、refresh_token。 - Store 增强:在
src/store/modules/user.ts中保留tenantInfo、currentTenantCode等字段,便于多租户场景使用。
-
多租户管理页面
- 页面:
src/views/system/tenant/index.vue - 接口:
src/api/tenant.ts - 类型:
src/types/api/api.d.ts中Api.SystemTenant.*
- 页面:
-
构建与主题
- 已启用
unplugin-element-plus的useSource: true按需样式方案,主题变量通过 Vite 的css.preprocessorOptions.scss.additionalData注入(见vite.config.ts)。 - 亮色主题变量来自
@styles/el-light.scss,暗黑主题通过@styles/el-dark.scss与@assets/styles/dark.scss协同。
- 已启用
-
组件和样式同步要点(与上游同步)
- 搜索条组件 ArtSearchBar API 统一:
show-reset-button→show-resetshow-search-button→show-searchdisabled-search-button→disabled-search- 系统页面示例:
src/views/system/user/index.vue
- 统计卡片 ArtStatsCard 兼容计数为 0:
v-if="count !== undefined"- 文件:
src/components/core/cards/art-stats-card/index.vue
- 文件:
- 登录页样式:选择器高度与输入框统一
- 文件:
src/views/auth/login/index.scss
- 文件:
- 布局层级:顶栏
z-index调整为 50(更合理的层级关系)- 文件:
src/views/index/style.scss
- 文件:
- 搜索条组件 ArtSearchBar API 统一:
-
认证流程精简
- 移除“注册/忘记密码”页面,统一改为“二维码联系管理员”。
- 登录页提供“联系管理员”入口,点击弹出二维码。
- 二维码内容支持环境变量配置:
VITE_ADMIN_QRCODE_URL。
-
平台 / 系统分层(本仓库独有)
- 平台管理员(
/api/v1/private/admin/platform)- 仅维护“全局菜单定义 + 元素权限”。
- 为各租户分配“菜单范围”。
- 租户管理员(
/api/v1/private/admin/system)- 在平台授权范围内创建并维护本租户的“角色—菜单—元素权限”。
- 维护部门与用户,并为用户授予本租户角色。
- 登录后基于
GET /admin/system/user/menu动态注册路由。 - 页面与接口(主要位置)
- 平台菜单(定义):
src/views/platform/menu/index.vueGET/POST/PUT/DELETE /api/v1/private/admin/platform/menu- 元素权限:
GET/POST/PUT/DELETE /api/v1/private/admin/platform/menu/auth
- 平台租户菜单范围(从租户列表“查看”抽屉进入):
src/views/platform/tenant/scope.vue- 查询带 hasPermission 的菜单树:
GET /api/v1/private/admin/platform/menu/tenant?tenant_id - 保存范围:
PUT /api/v1/private/admin/platform/menu/tenant { tenant_id, menu_data }
- 查询带 hasPermission 的菜单树:
- 系统角色权限抽屉:
src/views/system/role/auth.vue- 查询:
GET /api/v1/private/admin/system/menu/role?role_id - 保存:
PUT /api/v1/private/admin/system/menu/role { role_id, menu_data }
- 查询:
- 平台菜单(定义):
- 权限树行为
- 渲染:仅当整棵子树全为 true 时父节点才勾选,否则父节点半选、叶子按实际勾选。
- 提交:父节点以“已选 ∪ 半选”判定,子节点按实际勾选;
- 将
meta.authList转换为子节点参与勾选(id = auth_${menuId}_${authId})。
- 平台管理员(
-
HTTP 契约与数据规则(本仓库约定)
- 严格遵守后端契约,不为兼容上游而前端造字段或做字段重映射。
- 接口前缀:系统
/api/v1/private/admin/system、平台/api/v1/private/admin/platform。 - 菜单 meta 仅使用约定字段(如
title、icon、keepAlive、isHide等),禁止引入上游前端私有字段(如showBadge、fixedTab、roles等)。 - GET 查询参数清理(仅 GET 生效):剔除
undefined/null/空字符串/纯空白字符串,保留0/false。 - 仅做必要的最小 UI 映射,如把数字
status映射为布尔meta.isEnable便于渲染。 - 认证字段保持:
access_token、refresh_token;不要改用上游/api/auth/login。
-
顶部栏与个人信息(本仓库约定)
- 已移除通知中心与在线对话入口;顶部栏仅保留刷新、全屏、设置、主题等按钮。
- 个人信息通过全局组件
ArtEditInfoDialog打开(mittBus.emit('openEditInfoDialog'))。 - 头像使用
userInfo.avatar,默认兜底图:src/assets/img/user/avatar.webp。
-
全局水印(本仓库约定)
- 默认文案为“租户编码 | 用户账号”,实现位置:
src/components/core/others/art-watermark/index.vue。 - 优先使用传入
props.content;否则从用户/租户信息组装;再否则回退AppConfig.systemInfo.name。
- 默认文案为“租户编码 | 用户账号”,实现位置:
-
系统管理页面 UI 约定(本仓库约定)
- 表格单元格与表头默认居中(
align="center"+header-align="center")。 - 不展示序号列(
type: 'index')。 - 操作列:不超过 3 个操作直出按钮;超过则收起到下拉菜单。
- 全局空值占位:
ArtTable统一输出--(保留0/false)。
- 表格单元格与表头默认居中(
-
登录页增强(本仓库约定)
- 支持从 URL 读取
tenant_code并自动填写、锁定租户选择框。
- 支持从 URL 读取
-
移除的功能(保持不回归)
- 国际化(仅中文 UI)与“快速入口”已彻底移除;合并上游时勿回归。
- 仪表盘仅保留“工作台(Console)”,已移除演示性质的
src/views/dashboard/analysis与src/views/dashboard/ecommerce及对应路由。 - 示例/演示页面目录已删除:
src/views/article、src/views/change、src/views/examples、src/views/result、src/views/safeguard、src/views/template、src/views/widgets(保留src/views/outside)。
如果你从旧版本升级到当前版本,请注意:
-
搜索条属性重命名
- 全局搜索
show-reset-button/show-search-button/disabled-search-button已重命名。 - 项目中可通过检索定位并替换(可参考系统页:
src/views/system/user/index.vue)。
- 全局搜索
-
视图精简(移除示例页面)
- 删除以下演示/示例视图目录:
src/views/article、src/views/change、src/views/examples、src/views/result、src/views/safeguard、src/views/template、src/views/widgets。 - 保留
src/views/outside以支持外链 iframe 嵌入。 - 已同步精简动态路由配置;可参考系统管理页面作为用法示例。
- 删除以下演示/示例视图目录:
-
统计卡片显示 0 值
- 若你在自定义卡片中使用了
v-if="count",请改为v-if\u003d\"count !== undefined\"以正确显示 0。
- 若你在自定义卡片中使用了
-
登录接口与多租户
- 本项目保留自有后台契约:登录返回
access_token、refresh_token,并保留验证码与租户字段。 - 如需对接其他后台,请在
src/api/auth.ts中调整端点与参数映射即可。
- 本项目保留自有后台契约:登录返回
-
主题与按需样式
- 不再手动全量引入 ElementPlus 样式,已通过
unplugin-element-plus+ SCSS 变量按需生效。 - 若你额外手动引入了
el-light.scss,可移除重复引入,避免体积增大。
- 不再手动全量引入 ElementPlus 样式,已通过
-
忘记密码/注册流程
- 已移除注册与忘记密码页面;请使用登录页“联系管理员”二维码。
- 可在环境变量中设置
VITE_ADMIN_QRCODE_URL指向你的客服/工单/企业微信链接。
本项目基于上游开源项目 Daymychen/art-design-pro 二次开发,感谢上游项目及其所有贡献者的长期投入与维护。
-
去除国际化(仅中文)
- 所有
$t()调用已替换为简体中文静态文案,移除vue-i18n依赖。 - 顶栏和设置面板的语言相关入口全部删除,界面始终展示中文。
- 后续同步上游若出现新的国际化 key,请手动改写为中文字符串,保持单语言模式。
- 所有
-
去除快速入口
- 顶部栏“快速入口”默认关闭。
- 通过
src/config/headerBar.ts禁用(fastEnter.enabled = false)。 - 设置面板对应开关随之隐藏。