Compare commits

...

425 Commits

Author SHA1 Message Date
xiaoxian521
37cd77d4dd chore: update 2025-09-25 20:27:14 +08:00
xiaoxian521
728ccd6d9a chore: update 2025-09-22 14:00:52 +08:00
xiaoxian521
07785fe989 Merge branch 'main' into pages 2025-09-19 14:37:16 +08:00
xiaoxian521
bf1f5b9f3f perf: 优化当捕获所有未匹配路由并跳转全屏404页面的时机 2025-09-19 14:34:08 +08:00
xiaoxian521
cb3672ec1e Merge branch 'main' into pages 2025-09-18 10:10:03 +08:00
xiaoming
faf24f300b feat: 添加全屏403404500页面,全屏错误页面清晰且安全,提升用户体验 (#1226) 2025-09-18 10:05:14 +08:00
xiaoxian521
1ebfc2c0ec Merge branch 'main' into pages 2025-09-15 15:51:48 +08:00
xiaoming
915e01c15c perf: 优化nprogress进度条,页面重进或接口请求时不再显示进度条,提升用户体验 (#1225) 2025-09-15 15:40:46 +08:00
xiaoxian521
c821f32ae9 chore(deps): update 2025-09-15 11:39:41 +08:00
xiaoxian521
acf15af930 fix: 修复内置的首页未设置name导致设置页面缓存后缓存无效的问题 2025-08-18 15:26:43 +08:00
xiaoxian521
d353da6ac5 chore: update 2025-08-14 09:10:49 +08:00
xiaoxian521
2cc688135e Merge branch 'main' into pages 2025-08-14 08:25:23 +08:00
xiaoxian521
069131a9c8 release: update 6.1.0 2025-07-31 12:07:32 +08:00
xiaoxian521
be4c4a00ec chore: update 2025-07-31 10:57:18 +08:00
xiaoxian521
9fcf54c360 chore: 升级@pureadmin/table兼容最新版element-plus 2025-07-30 16:54:55 +08:00
xiaoxian521
51e9dfc717 Merge branch 'main' into pages 2025-07-24 12:28:56 +08:00
xiaoxian521
185a5b710a fix: 修复标签页-关闭左侧标签页关闭异常问题 2025-07-24 12:14:03 +08:00
xiaoxian521
baabe42b84 chore: 升级至vite7,更新依赖,相关兼容处理 2025-07-07 13:44:35 +08:00
xiaoxian521
2799cfd8cf chore(deps): update 2025-06-09 16:50:22 +08:00
xiaoxian521
d9a4ab8f86 chore(deps): update 2025-05-31 12:41:54 +08:00
xiaoxian521
bd5ab754ca docs: update README 2025-05-27 15:39:09 +08:00
xiaoxian521
fe7d67af0d chore: update 2025-05-27 14:30:44 +08:00
xiaoxian521
2f2749e644 perf: 优化代码 2025-05-16 12:08:46 +08:00
xiaoxian521
b61d7b359f chore: 升级依赖,相关兼容处理 2025-05-15 10:11:22 +08:00
xiaoxian521
c2ae49a2e6 chore: update 2025-05-12 16:07:26 +08:00
xiaoxian521
99f070190c chore(deps): update 2025-05-03 10:20:21 +08:00
xiaoxian521
891ad9d6a2 chore: fix typo 2025-04-21 13:37:04 +08:00
xiaoxian521
22ee607aea docs: 新增一位特别代码贡献者[tinysimple](https://github.com/tinysimple) 2025-04-21 12:38:22 +08:00
tinyThing
8255f9063b fix: 修复resetRouter未清空全部路由数据 (#1208) 2025-04-21 12:29:38 +08:00
xiaoxian521
59319aac8b chore: 升级element-plus至最新版,相关兼容处理 2025-04-19 13:25:01 +08:00
xiaoxian521
a7f78ff1ec Merge branch 'main' into pages 2025-04-18 15:06:38 +08:00
xiaoxian521
6be410a03c chore: update 2025-04-18 14:25:53 +08:00
xiaoxian521
de36c33d3c Merge branch 'main' into pages 2025-04-17 14:45:23 +08:00
xiaoxian521
1730ecf4ce perf: 优化导航样式 2025-04-17 14:40:07 +08:00
xiaoxian521
41daa6a5db Merge branch 'main' into pages 2025-04-14 16:42:23 +08:00
xiaoxian521
51c3ac8631 fix: 修复ReSegmented分段控制器组件在浅色和深色整体风格切换时的闪烁问题 2025-04-14 16:34:17 +08:00
xiaoxian521
08b7b1b641 style: update 2025-04-14 10:50:46 +08:00
xiaoxian521
9b871c8164 chore: update 2025-04-10 18:39:00 +08:00
xiaoxian521
c3f017434e chore: update 2025-04-10 11:04:23 +08:00
xiaoxian521
c48279ce56 Merge branch 'main' into pages 2025-04-10 10:48:04 +08:00
xiaoxian521
1daf83cf9d release: update 6.0.0 2025-04-10 09:53:09 +08:00
xiaoxian521
a8ca71ae61 chore: update 2025-04-10 09:15:53 +08:00
xiaoxian521
7c61fabebe chore: update 2025-04-09 19:18:32 +08:00
xiaoxian521
440ce053e5 Merge branch 'main' into pages 2025-04-09 19:16:25 +08:00
xiaoming
e08626d443 refactor: 升级tailwindcssv4版本,带来更快的构建速度、更简化的安装和配置、提供专属vite插件 (#1203) 2025-04-09 19:09:45 +08:00
xiaoxian521
583feae7b7 chore: 更新eslint相关依赖并作兼容处理 2025-04-09 05:49:15 +08:00
xiaoxian521
92cfa9763b fix: 修复组件-瀑布流无限滚动示例中失效的链接 2025-04-07 16:33:26 +08:00
xiaoxian521
881366c78b chore: 更新vue-flow,相关兼容处理 2025-04-06 16:51:05 +08:00
xiaoxian521
f5cc6d2ff4 fix: 修复重构图标后的错误用法 2025-04-02 14:35:39 +08:00
xiaoxian521
4db365038c refactor: 删除已弃用的依赖包eslint-define-config,升级eslint至最新版本,相关兼容处理 2025-03-28 09:40:51 +08:00
xiaoming
a9ee9ebcf9 refactor: 重构图标模块,使用@iconify/json替换不再维护更新的@iconify-icons/*依赖,优化使用体验,确保图标库可持续更新并支持Tree-shaking (#1202)
refactor: 重构图标模块,使用`@iconify/json`替换不再维护更新的`@iconify-icons/*`依赖,优化使用体验,确保图标库可持续更新并支持`Tree-shaking`
2025-03-25 09:18:20 +08:00
xiaoxian521
e72ac8ae70 Merge branch 'main' into pages 2025-03-11 09:51:24 +08:00
xiaoxian521
b004c224c2 feat: 添加Ai聊天组件示例 2025-03-11 09:45:03 +08:00
xiaoxian521
399d3b2987 chore: 升级依赖,相关兼容处理 2025-02-14 11:25:38 +08:00
xiaoxian521
b87eb6fd0a chore: 升级依赖 2025-01-15 12:10:39 +08:00
xiaoxian521
a0246e31df feat: 添加tagOnClick标签切换全局公共事件 2025-01-09 16:20:31 +08:00
xiaoxian521
e1cd14a946 chore: 升级依赖,相关兼容处理(主要是typescriptvue-tsc升级最新版) 2025-01-09 15:55:45 +08:00
xiaoxian521
02380f69e1 chore: 优化src/style/dark.scss语法 2025-01-07 17:21:00 +08:00
可能
5208272456 chore: 优化登录传参 (#1197) 2025-01-06 14:30:43 +08:00
xiaoming
551292078e fix: 修复aria-hidden报错 (#1192) 2025-01-04 02:19:38 +08:00
xiaoxian521
edfbe7de87 chore: update 2024-12-27 12:04:30 +08:00
xiaoxian521
5c73d182b4 Merge branch 'main' into pages 2024-12-27 11:58:04 +08:00
XiaoYue
79cd159154 chore: 使用keydown替换keypresskeypress事件已弃用 (#1195) 2024-12-27 09:55:28 +08:00
xiaoming
6d26300181 feat: 添加代码编辑器示例 (#1194) 2024-12-24 09:14:43 +08:00
xiaoming
0dd6665b2a feat: 添加Markdown示例 (#1193) 2024-12-23 13:57:37 +08:00
xiaoxian521
dfa3797b27 Merge branch 'main' into pages 2024-12-19 17:38:42 +08:00
xiaoxian521
bbdd44a917 feat: 添加滑块示例 2024-12-19 17:29:45 +08:00
xiaoxian521
f8690a0b73 fix: 修复使用this语法时无法显示代码提示的问题并更新pinia相关语法 2024-12-15 23:29:37 +08:00
xiaoxian521
a84529418c Merge branch 'main' into pages 2024-12-14 17:09:24 +08:00
xiaoxian521
b843eda26f style: update 2024-12-14 11:20:45 +08:00
xiaoxian521
1b48bc8049 release: update 5.9.0 2024-12-10 14:36:47 +08:00
xiaoming
21ff69b10e refactor: 升级vitev6版本,升级sass至最新版,重构主题写法,弃用@pureadmin/theme (#1188)
* refactor: 升级`vite`至`v6`版本,升级`sass`至最新版,重构主题写法,删除`@pureadmin/theme`
2024-12-10 14:10:47 +08:00
xiaoxian521
81d8a51d6c chore: update 2024-11-28 13:06:32 +08:00
xiaoxian521
533199656e chore: update 2024-11-24 13:58:31 +08:00
xiaoxian521
66f5d6d423 refactor: 使用code-inspector-plugin替换vite-plugin-vue-inspector 2024-11-04 12:54:20 +08:00
xiaoxian521
fd9ad7eb21 chore: 固定sass版本至v1.79.6,待稳定后再升级 2024-10-23 11:28:09 +08:00
xiaoxian521
5057e0933b chore: update 2024-10-19 09:37:05 +08:00
xiaoxian521
5ce380d7e6 Merge branch 'main' into pages 2024-10-19 08:24:32 +08:00
xiaoxian521
a0618c01ba chore: 升级依赖,相关兼容处理 2024-10-12 09:46:44 +08:00
xiaoxian521
9d351ab600 Merge branch 'main' into pages 2024-09-25 17:00:31 +08:00
xiaoxian521
7a3c1ab3cd docs: 更新特别代码贡献名单 2024-09-25 16:57:19 +08:00
Mer
5032a75221 feat: 新增函数式抽屉组件 (#1183)
* feat: 函数式抽屉组件

* feat: 添加ReDrawer demo

* fix: 组件ReDrawer 增加按钮loading等功能
2024-09-25 16:49:12 +08:00
xiaoxian521
81111c096a Merge branch 'main' into pages 2024-09-24 12:12:16 +08:00
xiaoxian521
384c789fc0 perf: 优化用户管理左侧部门树的布局 2024-09-24 11:52:16 +08:00
xiaoxian521
281675bdaf fix: 修复在菜单、部门管理中,表格展开后启用或关闭全屏功能时,表格高度未自动适应的问题 2024-09-24 08:42:46 +08:00
xiaoxian521
66f099fa99 Merge branch 'main' into pages 2024-09-23 14:52:29 +08:00
xiaoxian521
0004f1318c feat: pure-table添加动态表头示例 2024-09-23 14:45:02 +08:00
xiaoxian521
ab39864ef4 chore: 升级i18n相关依赖,相关兼容处理 2024-09-21 16:05:02 +08:00
xiaoxian521
4e14ab22ba chore: 升级依赖,相关兼容处理 2024-09-21 12:09:41 +08:00
xiaoxian521
cd21f1e050 release: update 5.8.0 2024-08-19 13:53:33 +08:00
xiaoxian521
190c3c6123 Merge branch 'main' into pages 2024-08-13 10:28:40 +08:00
xiaoxian521
5fbb664da7 chore: 升级依赖,element-plus最新版兼容处理 2024-08-12 14:51:34 +08:00
xiaoming
244ab7f990 feat: 新增第二种按钮权限指令(根据登录接口返回的permissions字段进行判断) (#1177)
* feat: 新增第二种按钮权限指令(根据登录接口返回的`permissions`字段进行判断)
2024-08-12 13:32:04 +08:00
xiaoxian521
96152ed134 feat: ReDialog组件的确定按钮提供关闭按钮动画closeLoading功能 2024-08-05 13:15:10 +08:00
xiaoxian521
c0d683c9b1 Merge branch 'main' into pages 2024-08-03 15:39:24 +08:00
xiaoxian521
37ab40f188 feat: VxeTableBar组件添加全屏和退出全屏功能 2024-08-03 15:13:20 +08:00
xiaoxian521
91ae63a8c5 feat: PureTableBar组件添加全屏和退出全屏功能 2024-08-03 14:39:21 +08:00
xiaoxian521
6d7e92fed1 feat: 函数式弹框ReDialog添加点击确认按钮后是否开启loading加载动画功能 2024-07-30 14:56:47 +08:00
xiaoxian521
0706f37254 fix: 修复顶部菜单模式下logo不可隐藏的问题 2024-07-29 10:52:12 +08:00
xiaoxian521
8a9695cf7c chore(deps): update 2024-07-29 09:49:38 +08:00
xiaoxian521
d395c9c6ba chore(deps): update 2024-07-21 17:09:05 +08:00
xiaoxian521
3dec3c002f perf: 优化系统管理-角色管理的权限功能样式 2024-07-04 11:14:22 +08:00
xiaoxian521
bae1122e58 feat: 添加vite-plugin-checker插件,更严格的类型和eslint校验 2024-07-03 11:31:37 +08:00
xiaoxian521
37e9d8a1ac chore: 升级依赖,相关兼容处理 2024-07-02 20:57:35 +08:00
sea
dea9664677 perf: 手机端层级展示 (#1169) 2024-07-02 15:30:27 +08:00
sea
775d7a2d32 perf: 优化登录页 (#1168) 2024-06-27 09:55:47 +08:00
xiaoxian521
c3320d771c chore: update 2024-06-26 17:52:50 +08:00
xiaoxian521
76a173ceb2 chore: update 2024-06-15 17:09:38 +08:00
xiaoxian521
13e7a13e9d chore(deps): update 2024-06-14 14:01:18 +08:00
xiaoxian521
47afa9209e fix: 修复配置路由属性fixedTagfalse后当前标签页不可关闭的问题 2024-06-12 14:56:09 +08:00
xiaoxian521
87a89ff85a chore: js 2024-06-11 22:35:05 +08:00
xiaoxian521
bf0d7dd060 Merge branch 'main' into pages 2024-06-11 22:30:41 +08:00
xiaoxian521
933ced4ac4 docs: update 2024-06-11 22:28:57 +08:00
Fifteen
8816e61e3a chore: update plugins/elementPlus.ts (#1164) 2024-06-07 10:38:19 +08:00
sea
edf82ea727 feat: 添加开发环境代码调试vite-plugin-vue-inspector插件,提升开发体验 (#1162) 2024-06-06 17:32:25 +08:00
sea
a75cf8394e types: 优化自定义指令的类型提示 (#1161) 2024-06-06 16:26:32 +08:00
xiaoxian521
f1d1abd661 chore: 通知 2024-06-06 10:51:32 +08:00
xiaoxian521
06977488ef Merge branch 'main' into pages 2024-06-06 10:48:26 +08:00
xiaoxian521
debd439eeb Merge branch 'main' into pages 2024-06-04 13:59:51 +08:00
xiaoxian521
e33eb54d36 chore: update sponsors 2024-06-01 06:26:27 +08:00
xiaoxian521
4315c3122f chore: update 2024-05-30 08:42:27 +08:00
xiaoxian521
7159227ebf Merge branch 'main' into pages 2024-05-30 08:30:18 +08:00
xiaoxian521
134a06d282 Merge branch 'main' into pages 2024-05-28 12:39:16 +08:00
xiaoxian521
bdb32b3b22 chore: update 2024-05-20 22:15:03 +08:00
xiaoxian521
a02b5b7b5c chore: update 2024-05-14 21:15:03 +08:00
xiaoxian521
b80013f458 chore: update 2024-05-14 18:41:19 +08:00
xiaoxian521
097d6cd8bf Merge branch 'main' into pages 2024-05-14 18:02:09 +08:00
xiaoxian521
d9bd2ecca3 Merge branch 'main' into pages 2024-05-08 16:08:03 +08:00
xiaoxian521
2e0fdcad4b chore: update 2024-05-06 16:44:51 +08:00
xiaoxian521
da9467d98a chore: update 2024-05-06 16:41:55 +08:00
xiaoxian521
fb856a158d Merge branch 'main' into gitee 2024-05-06 16:40:05 +08:00
xiaoxian521
b617ce650a Merge branch 'main' into gitee 2024-05-06 16:08:45 +08:00
xiaoxian521
0e68510f4f chore: update 2024-04-26 13:08:33 +08:00
xiaoxian521
b33f8ca05c Merge branch 'main' into gitee 2024-04-26 13:05:42 +08:00
xiaoxian521
192a52a07c chore: update 2024-04-24 11:30:28 +08:00
xiaoxian521
5f768aa3c5 Merge branch 'main' into gitee 2024-04-24 11:26:31 +08:00
xiaoxian521
5d12a6d556 chore: update 2024-04-24 10:52:09 +08:00
xiaoxian521
8b2ca51272 chore: update 2024-04-24 10:48:45 +08:00
xiaoxian521
b3983df384 Merge branch 'main' into gitee 2024-04-24 10:40:12 +08:00
xiaoxian521
a5a527fa54 chore: update 2024-04-18 13:50:05 +08:00
xiaoxian521
c8686999f5 Merge branch 'main' into gitee 2024-04-18 13:48:43 +08:00
xiaoxian521
dabadf98fd chore: update 2024-04-17 15:48:20 +08:00
xiaoxian521
3720c15712 Merge branch 'main' into gitee 2024-04-17 15:47:06 +08:00
xiaoxian521
b4a8384fa9 chore: update 2024-04-15 17:57:56 +08:00
xiaoxian521
ebf6bb23eb Merge branch 'main' into gitee 2024-04-15 17:56:10 +08:00
xiaoxian521
147e8125e8 chore: update 2024-04-13 11:26:55 +08:00
xiaoxian521
0f35e7e0c5 Merge branch 'main' into gitee 2024-04-13 11:24:57 +08:00
xiaoxian521
733cb795fa chore: update 2024-04-12 16:26:23 +08:00
xiaoxian521
07dc4942ba Merge branch 'main' into gitee 2024-04-12 16:24:07 +08:00
xiaoxian521
c1cfe98f3e chore: update 2024-04-04 22:21:40 +08:00
xiaoxian521
5b51aedab4 chore: update 2024-04-04 22:20:14 +08:00
xiaoxian521
0bb0026974 Merge branch 'main' into gitee 2024-04-04 22:18:28 +08:00
xiaoxian521
3db2e53367 chore: update 2024-03-31 20:44:49 +08:00
xiaoxian521
0c1b14a9b5 Merge branch 'main' into gitee 2024-03-31 20:42:04 +08:00
xiaoxian521
3b1af3ec99 chore: update 2024-03-29 10:15:56 +08:00
xiaoxian521
1c5cc42220 chore: update 2024-03-29 10:14:01 +08:00
xiaoxian521
fc40bb3ea3 Merge branch 'main' into gitee 2024-03-29 10:12:02 +08:00
xiaoxian521
a47610fb59 chore: update 2024-03-28 11:34:33 +08:00
xiaoxian521
8d987d247d chore: update 2024-03-28 11:33:09 +08:00
xiaoxian521
2ac8eab760 chore: update 2024-03-27 13:58:47 +08:00
xiaoxian521
a5f2fcca01 chore: update 2024-03-27 13:57:25 +08:00
xiaoxian521
34d5d2d64d chore: update 2024-03-27 10:39:58 +08:00
xiaoxian521
6eb28f13fd chore: update 2024-03-27 10:38:38 +08:00
xiaoxian521
08b902a836 chore: update 2024-03-27 10:30:27 +08:00
xiaoxian521
1a033a784f Merge branch 'main' into gitee 2024-03-27 10:28:52 +08:00
xiaoxian521
b00afc7b82 chore: update 2024-03-24 21:22:32 +08:00
xiaoxian521
1d27d6e83a Merge branch 'main' into gitee 2024-03-24 21:21:00 +08:00
xiaoxian521
14aa977cb7 Merge branch 'main' into gitee 2024-03-24 19:38:40 +08:00
xiaoxian521
518db3d318 chore: update 2024-03-23 16:24:25 +08:00
xiaoxian521
6f4f2276bb Merge branch 'main' into gitee 2024-03-23 16:20:11 +08:00
xiaoxian521
9098546fc4 chore: update 2024-03-23 08:40:42 +08:00
xiaoxian521
a4f32df68d chore: update 2024-03-23 08:39:09 +08:00
xiaoxian521
9a6124c97b Merge branch 'main' into gitee 2024-03-23 08:24:55 +08:00
xiaoxian521
6764da7991 chore: update 2024-03-22 15:43:03 +08:00
xiaoxian521
712aca8ba1 Merge branch 'main' into gitee 2024-03-22 15:41:13 +08:00
xiaoxian521
c23919cc5d chore: update 2024-03-21 23:09:55 +08:00
xiaoxian521
26ee13de8c chore: update 2024-03-21 23:08:37 +08:00
xiaoxian521
3a25022df0 chore: update 2024-03-21 22:48:37 +08:00
xiaoxian521
edd481ad67 chore: update 2024-03-21 22:47:13 +08:00
xiaoxian521
52b59453f3 chore: update 2024-03-21 16:24:24 +08:00
xiaoxian521
c6b96cfe63 Merge branch 'main' into gitee 2024-03-21 16:21:30 +08:00
xiaoxian521
e5d90d9089 chore: update 2024-03-21 00:18:27 +08:00
xiaoxian521
a93850341c Merge branch 'main' into gitee 2024-03-21 00:17:11 +08:00
xiaoxian521
e793a69cb1 chore: update 2024-03-20 19:40:27 +08:00
xiaoxian521
dc5745e502 Merge branch 'main' into gitee 2024-03-20 19:39:14 +08:00
xiaoxian521
dcc4904e32 chore: update 2024-03-20 15:07:39 +08:00
xiaoxian521
4d6bbb2ada Merge branch 'main' into gitee 2024-03-20 15:05:56 +08:00
xiaoxian521
258ba5adaa chore: update 2024-03-19 21:08:43 +08:00
xiaoxian521
caab9c9843 Merge branch 'main' into gitee 2024-03-19 21:07:39 +08:00
xiaoxian521
b3be037a2d chore: update 2024-03-19 16:55:49 +08:00
xiaoxian521
97ff577085 Merge branch 'main' into gitee 2024-03-19 16:54:28 +08:00
xiaoxian521
58f0891141 chore: update 2024-03-19 16:25:05 +08:00
xiaoxian521
c1659c01a4 Merge branch 'main' into gitee 2024-03-19 16:23:56 +08:00
xiaoxian521
4d746a969c chore: update 2024-03-18 16:18:26 +08:00
xiaoxian521
e3b4f0f7f9 Merge branch 'main' into gitee 2024-03-18 16:17:23 +08:00
xiaoxian521
c074e99021 chore: update 2024-03-17 22:58:29 +08:00
xiaoxian521
166f785ce6 Merge branch 'main' into gitee 2024-03-17 22:57:05 +08:00
xiaoxian521
54f3ebbc9b chore: update 2024-03-17 14:19:43 +08:00
xiaoxian521
3f195a33c3 Merge branch 'main' into gitee 2024-03-17 14:18:41 +08:00
xiaoxian521
27b374d9fc chore: update 2024-03-16 23:29:07 +08:00
xiaoxian521
56ec3eda80 Merge branch 'main' into gitee 2024-03-16 23:27:38 +08:00
xiaoxian521
7e976bebbe chore: update 2024-03-16 01:27:17 +08:00
xiaoxian521
8d16627ca9 chore: update 2024-03-16 01:26:24 +08:00
xiaoxian521
b6f2575182 chore: update 2024-03-14 11:25:24 +08:00
xiaoxian521
91a57cbba9 Merge branch 'main' into gitee 2024-03-14 11:24:14 +08:00
xiaoxian521
e153ed3054 chore: update 2024-03-14 10:16:54 +08:00
xiaoxian521
26d564095b Merge branch 'main' into gitee 2024-03-14 10:15:39 +08:00
xiaoxian521
47855a39f2 chore: update 2024-03-13 21:19:45 +08:00
xiaoxian521
be773575bb Merge branch 'main' into gitee 2024-03-13 21:18:39 +08:00
xiaoxian521
4ac6a0b238 chore: update 2024-03-13 20:52:43 +08:00
xiaoxian521
0fb677540a Merge branch 'main' into gitee 2024-03-13 20:50:26 +08:00
xiaoxian521
e642f37317 chore: update 2024-03-12 14:51:49 +08:00
xiaoxian521
017a294112 Merge branch 'main' into gitee 2024-03-12 14:49:40 +08:00
xiaoxian521
0386152b52 chore: update 2024-03-08 14:39:07 +08:00
xiaoxian521
6d47fa628b chore: update 2024-03-08 14:37:58 +08:00
xiaoxian521
3209cf727f chore: update 2024-03-06 16:26:30 +08:00
xiaoxian521
be64390cee Merge branch 'main' into gitee 2024-03-06 16:24:50 +08:00
xiaoxian521
c5863f6e34 chore: update 2024-03-06 12:13:53 +08:00
xiaoxian521
4406b5fa1b Merge branch 'main' into gitee 2024-03-06 12:07:55 +08:00
xiaoxian521
562e31d119 chore: update 2024-03-06 08:53:15 +08:00
xiaoxian521
cf1efcc9f5 Merge branch 'main' into gitee 2024-03-06 08:50:51 +08:00
xiaoxian521
c9655d25d1 chore: update 2024-03-06 01:17:27 +08:00
xiaoxian521
969c0f89ec Merge branch 'main' into gitee 2024-03-06 01:15:52 +08:00
xiaoxian521
5b7c868829 chore: update 2024-03-05 22:26:40 +08:00
xiaoxian521
87a2af7181 Merge branch 'main' into gitee 2024-03-05 22:24:55 +08:00
xiaoxian521
057db33e5a chore: update 2024-03-05 00:13:41 +08:00
xiaoxian521
74197929d5 chore: update 2024-03-05 00:12:06 +08:00
xiaoxian521
43b61aad25 chore: update 2024-03-04 16:51:30 +08:00
xiaoxian521
8742a67d56 Merge branch 'main' into gitee 2024-03-04 16:50:18 +08:00
xiaoxian521
3885cec95b chore: update 2024-03-04 01:14:01 +08:00
xiaoxian521
95f3cf7c0a chore: update 2024-03-04 01:12:38 +08:00
xiaoxian521
0576b1cfeb Merge branch 'main' into gitee 2024-03-04 01:07:55 +08:00
xiaoxian521
a65f90f50a chore: update 2024-03-02 01:33:15 +08:00
xiaoxian521
08110770e0 Merge branch 'main' into gitee 2024-03-02 01:31:19 +08:00
xiaoxian521
cd8d80bfb0 chore: update 2024-03-01 21:13:02 +08:00
xiaoxian521
0316a3de5f Merge branch 'main' into gitee 2024-03-01 21:11:10 +08:00
xiaoxian521
691cec8c94 chore: update 2024-03-01 16:42:37 +08:00
xiaoxian521
10aa2c0718 Merge branch 'main' into gitee 2024-03-01 16:40:24 +08:00
xiaoxian521
bdcdef41df chore: update 2024-03-01 12:10:40 +08:00
xiaoxian521
97cb48e726 Merge branch 'main' into gitee 2024-03-01 12:09:15 +08:00
xiaoxian521
41df77fe95 chore: update 2024-02-29 13:21:03 +08:00
xiaoxian521
7076d2761a Merge branch 'main' into gitee 2024-02-29 13:18:53 +08:00
xiaoxian521
13c1adf03c chore: update 2024-02-26 23:17:32 +08:00
xiaoxian521
bbf64e1ff0 Merge branch 'main' into gitee 2024-02-26 23:13:54 +08:00
xiaoxian521
c32a60a10d chore: update 2024-02-19 13:47:30 +08:00
xiaoxian521
7a32d804b5 Merge branch 'main' into gitee 2024-02-19 13:43:08 +08:00
xiaoxian521
5027e26633 chore: update 2024-01-29 13:32:11 +08:00
xiaoxian521
907f8ffbef Merge remote-tracking branch 'origin/main' into gitee 2024-01-29 13:28:30 +08:00
xiaoxian521
358f7c2c1f chore: update 2024-01-27 16:42:55 +08:00
xiaoxian521
8c2bd1e986 chore: update 2024-01-27 16:39:59 +08:00
xiaoxian521
63f5d47fc7 chore: update 2024-01-27 16:31:53 +08:00
xiaoxian521
f069f45418 Merge remote-tracking branch 'origin/main' into gitee 2024-01-27 16:28:45 +08:00
xiaoxian521
60304dcb33 chore: update 2024-01-24 15:59:56 +08:00
xiaoxian521
07f6145179 Merge remote-tracking branch 'origin/main' into gitee 2024-01-24 15:56:57 +08:00
xiaoxian521
be1504ea83 chore: update 2024-01-23 14:03:17 +08:00
xiaoxian521
9d640eee48 Merge remote-tracking branch 'origin/main' into gitee 2024-01-23 14:00:11 +08:00
xiaoxian521
213ad9d851 chore: update 2024-01-22 11:25:00 +08:00
xiaoxian521
ac36246e19 Merge remote-tracking branch 'origin/main' into gitee 2024-01-22 11:19:06 +08:00
xiaoxian521
64f529a84e chore: update 2024-01-21 23:34:55 +08:00
xiaoxian521
46cec38fe6 Merge remote-tracking branch 'origin/main' into gitee 2024-01-21 23:31:02 +08:00
xiaoxian521
5def64a02d chore: update 2024-01-19 17:24:55 +08:00
xiaoxian521
bce6656926 Merge remote-tracking branch 'origin/main' into gitee 2024-01-19 17:22:01 +08:00
xiaoxian521
e42012a3eb chore: update 2024-01-19 16:25:57 +08:00
xiaoxian521
01a2e49377 Merge remote-tracking branch 'origin/main' into gitee 2024-01-19 16:23:08 +08:00
xiaoxian521
cc59397dc5 chore: update 2024-01-19 13:06:15 +08:00
xiaoxian521
c9bb37339d Merge remote-tracking branch 'origin/main' into gitee 2024-01-19 13:03:16 +08:00
xiaoxian521
1d8ec613ce chore: update 2024-01-18 23:57:34 +08:00
xiaoxian521
a118b701d1 Merge remote-tracking branch 'origin/main' into gitee 2024-01-18 23:53:03 +08:00
xiaoxian521
765bd35b9f chore: update 2024-01-18 17:53:34 +08:00
xiaoxian521
90b4107496 Merge remote-tracking branch 'origin/main' into gitee 2024-01-18 17:50:07 +08:00
xiaoxian521
666dc9bcb0 chore: update 2024-01-17 10:44:25 +08:00
xiaoxian521
8376191b19 chore: update 2024-01-17 10:41:21 +08:00
xiaoxian521
800577c127 chore: update 2024-01-16 13:07:17 +08:00
xiaoxian521
fdf0b9ba7e Merge remote-tracking branch 'origin/main' into gitee 2024-01-16 13:05:40 +08:00
xiaoxian521
03f8a25f75 chore: update 2024-01-16 01:02:30 +08:00
xiaoxian521
827481c909 Merge remote-tracking branch 'origin/main' into gitee 2024-01-16 01:01:22 +08:00
xiaoxian521
947bf62635 chore: update 2024-01-16 00:52:06 +08:00
xiaoxian521
dd647eb3b2 Merge remote-tracking branch 'origin/main' into gitee 2024-01-16 00:50:22 +08:00
xiaoxian521
305da78f75 chore: update 2024-01-16 00:47:18 +08:00
xiaoxian521
9eec96809f chore: update 2024-01-14 23:27:52 +08:00
xiaoxian521
e3f5f3c1a9 Merge remote-tracking branch 'origin/main' into gitee 2024-01-14 23:26:00 +08:00
xiaoxian521
27e4ad9460 chore: update 2024-01-14 12:51:27 +08:00
xiaoxian521
17eaf8161f Merge remote-tracking branch 'origin/main' into gitee 2024-01-14 12:49:39 +08:00
xiaoxian521
78b37d3480 chore: update 2024-01-12 01:04:39 +08:00
xiaoxian521
bad65648a2 Merge remote-tracking branch 'origin/main' into gitee 2024-01-12 01:03:03 +08:00
xiaoxian521
dce3dea7fe chore: update 2024-01-11 19:46:16 +08:00
xiaoxian521
4b3cdbf473 Merge remote-tracking branch 'origin/main' into gitee 2024-01-11 19:43:54 +08:00
xiaoxian521
4bcdc7229a chore: update 2024-01-11 01:58:59 +08:00
xiaoxian521
236f9e1b6a Merge remote-tracking branch 'origin/main' into gitee 2024-01-11 01:57:17 +08:00
xiaoxian521
7d5c7dfeb3 chore: update 2024-01-08 00:03:57 +08:00
xiaoxian521
1a38146587 Merge remote-tracking branch 'origin/main' into gitee 2024-01-08 00:02:10 +08:00
xiaoxian521
796348094d Merge remote-tracking branch 'origin/main' into gitee 2024-01-07 23:31:16 +08:00
xiaoxian521
6126d53bc0 chore: update 2024-01-03 17:34:25 +08:00
xiaoxian521
9a5f1f0d89 Merge remote-tracking branch 'origin/main' into gitee 2024-01-03 17:32:52 +08:00
xiaoxian521
1abdfe683a chore: update 2024-01-03 00:09:15 +08:00
xiaoxian521
f9124c886c Merge remote-tracking branch 'origin/main' into gitee 2024-01-03 00:07:21 +08:00
xiaoxian521
2aaf141178 chore: update 2024-01-02 23:18:01 +08:00
xiaoxian521
4dc7ccda4f Merge remote-tracking branch 'origin/main' into gitee 2024-01-02 23:16:18 +08:00
xiaoxian521
951496c72b chore: update 2024-01-02 19:54:47 +08:00
xiaoxian521
4fb186424c Merge remote-tracking branch 'origin/main' into gitee 2024-01-02 19:52:43 +08:00
xiaoxian521
7c66dcdfe1 chore: update 2023-11-02 10:07:20 +08:00
xiaoxian521
c57b2be2b0 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-11-02 10:06:18 +08:00
xiaoxian521
d921e54f76 chore: update 2023-10-31 01:00:12 +08:00
xiaoxian521
3be4d87f6a Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-10-31 00:59:05 +08:00
xiaoxian521
18aade8cde chore: update 2023-10-30 23:54:06 +08:00
xiaoxian521
3a488eff38 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-10-30 23:52:58 +08:00
xiaoxian521
9d6624fe5e chore: update 2023-10-17 11:41:08 +08:00
xiaoxian521
227a7b7a2a Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-10-17 11:39:36 +08:00
xiaoxian521
7336406b02 chore: update 2023-10-09 19:02:53 +08:00
xiaoxian521
ea188be3d7 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-10-09 19:00:40 +08:00
xiaoxian521
09e24f5e03 chore: update 2023-10-07 15:33:43 +08:00
xiaoxian521
94382e4bcd chore: update 2023-10-07 15:32:03 +08:00
xiaoxian521
0c01fbfa9c Merge branch 'main' into gitee 2023-10-07 15:09:03 +08:00
xiaoxian521
a2e0b9155b chore: update 2023-08-30 21:53:35 +08:00
xiaoxian521
d7a479afc6 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-08-30 21:52:26 +08:00
xiaoxian521
e38b5ec797 chore: update 2023-08-30 21:51:41 +08:00
xiaoxian521
fd097c5a6a chore: update 2023-08-30 12:39:32 +08:00
xiaoxian521
421fe54bbd chore: update 2023-08-30 12:36:43 +08:00
xiaoxian521
6fa1d28748 chore: update 2023-08-30 12:14:51 +08:00
xiaoxian521
94c5c6e7d0 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-08-30 12:12:12 +08:00
xiaoxian521
1a61d934bd chore: update 2023-07-18 12:46:39 +08:00
xiaoxian521
29ba70d041 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-07-18 12:45:22 +08:00
xiaoxian521
bd5e96c6ab chore: update 2023-07-12 18:27:40 +08:00
xiaoxian521
ff272087ee Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-07-12 18:25:35 +08:00
xiaoxian521
c0ec81b669 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-07-12 18:17:02 +08:00
xiaoxian521
16ff8b60c1 chore: update 2023-06-27 17:57:56 +08:00
xiaoxian521
71a7d3ce1f chore: update 2023-06-27 17:46:30 +08:00
xiaoxian521
a831ea2bb3 chore: update 2023-06-27 17:45:15 +08:00
xiaoxian521
1cd173b66c Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-27 17:44:30 +08:00
xiaoxian521
dbff002c00 chore: update 2023-06-26 18:07:18 +08:00
xiaoxian521
43cd5d9321 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-26 18:06:01 +08:00
xiaoxian521
131766bba1 chore: update 2023-06-26 11:33:52 +08:00
xiaoxian521
4d458169ea Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-26 11:32:30 +08:00
xiaoxian521
8194f6c98f chore: update 2023-06-25 18:39:46 +08:00
xiaoxian521
cf54809ee8 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-25 18:38:36 +08:00
xiaoxian521
e362927e51 chore: update 2023-06-22 00:38:07 +08:00
xiaoxian521
eed805414d Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-22 00:36:58 +08:00
xiaoxian521
e9a1550134 chore: update 2023-06-19 11:57:27 +08:00
xiaoxian521
52a973db34 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-19 11:56:02 +08:00
xiaoxian521
98790df5b8 chore: update 2023-06-14 11:11:18 +08:00
xiaoxian521
433035ac94 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-14 11:10:13 +08:00
xiaoxian521
41e912101a chore: update 2023-06-13 23:14:27 +08:00
xiaoxian521
518fd88362 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-13 23:13:17 +08:00
xiaoxian521
04aa161a1d chore: update 2023-06-12 21:14:45 +08:00
xiaoxian521
4e62edc78e Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-12 21:13:23 +08:00
xiaoxian521
19522aa2f0 chore: update 2023-06-09 18:08:38 +08:00
xiaoxian521
2bd7d44119 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-09 18:07:26 +08:00
xiaoxian521
f13b471e9b chore: update 2023-06-07 11:06:35 +08:00
xiaoxian521
793e228be2 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-07 11:05:30 +08:00
xiaoxian521
de628597c0 chore: update 2023-06-05 19:35:34 +08:00
xiaoxian521
f797d9531c Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-05 19:34:16 +08:00
xiaoxian521
0e09b8c809 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-04 12:47:03 +08:00
xiaoxian521
55129577c7 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-06-04 12:44:01 +08:00
xiaoxian521
c95a090649 chore: update 2023-05-29 11:37:34 +08:00
xiaoxian521
d18b2787f4 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-29 11:34:16 +08:00
xiaoxian521
7d4a5cc431 chore: update 2023-05-27 21:59:43 +08:00
xiaoxian521
2a7e35696b Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-27 21:58:34 +08:00
xiaoxian521
362bae0e64 chore: update 2023-05-27 13:35:12 +08:00
xiaoxian521
22e7b4b503 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-27 13:33:53 +08:00
xiaoxian521
ad0ca59796 chore: update 2023-05-27 13:33:15 +08:00
xiaoxian521
a33dea3c6d chore: update 2023-05-26 23:30:14 +08:00
xiaoxian521
24b645d462 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-26 23:27:51 +08:00
xiaoxian521
52d0adf4a8 chore: update 2023-05-26 23:11:09 +08:00
xiaoxian521
69841db686 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-26 23:08:39 +08:00
xiaoxian521
76acd82ec5 chore: update 2023-05-26 12:49:16 +08:00
xiaoxian521
9d2878f534 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-26 12:40:49 +08:00
xiaoxian521
08f05fe621 chore: update 2023-05-24 13:01:18 +08:00
xiaoxian521
6294a3ffac Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-24 12:58:59 +08:00
xiaoxian521
e59acea894 chore: update 2023-05-18 17:26:20 +08:00
xiaoxian521
b1ada2f1ae Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-18 17:25:14 +08:00
xiaoxian521
b9daa90b37 chore: update 2023-05-16 14:36:04 +08:00
xiaoxian521
93498b6643 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-16 14:35:01 +08:00
xiaoxian521
7b067a8801 chore: update 2023-05-15 19:16:46 +08:00
xiaoxian521
88f7aefa16 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-15 19:15:37 +08:00
xiaoxian521
fb72d4afec chore: update 2023-05-15 14:50:02 +08:00
xiaoxian521
45ec532ec6 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-15 14:48:13 +08:00
xiaoxian521
45d225c3d0 chore: update 2023-05-14 16:42:53 +08:00
xiaoxian521
b9c1d8e351 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-14 16:41:23 +08:00
xiaoxian521
21f658489c chore: update 2023-05-11 20:53:36 +08:00
xiaoxian521
ff9d0da464 chore: update 2023-05-11 20:37:21 +08:00
xiaoxian521
d352cfbcde Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-11 20:36:00 +08:00
xiaoxian521
1adec2df2a chore: update 2023-05-11 15:25:20 +08:00
xiaoxian521
a51c11865d Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-11 15:23:37 +08:00
xiaoxian521
c5f2118a34 chore: update 2023-05-10 01:54:17 +08:00
xiaoxian521
2df0b16320 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-10 01:52:32 +08:00
xiaoxian521
3fa7176a68 chore: update 2023-05-09 15:35:56 +08:00
xiaoxian521
c8356ac05f Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-09 15:34:26 +08:00
xiaoxian521
784b6943a0 chore: update 2023-05-08 20:16:48 +08:00
xiaoxian521
c77ec6bda3 Merge branch 'main' of github.com:pure-admin/vue-pure-admin into gitee 2023-05-08 20:14:32 +08:00
xiaoxian521
0c2a430485 chore: update 2023-03-30 12:27:12 +08:00
xiaoxian521
013ae275de Merge branch 'main' into gitee 2023-03-30 12:25:53 +08:00
xiaoxian521
6696a3964e chore: update 2023-02-28 22:58:13 +08:00
xiaoxian521
6b2b5dee78 Merge branch 'main' into gitee 2023-02-28 22:56:58 +08:00
xiaoxian521
e637b37416 chore: update 2023-02-16 12:44:44 +08:00
xiaoxian521
534d125c33 Merge branch 'main' into gitee 2023-02-16 12:43:26 +08:00
xiaoxian521
a873c3977b chore: update 2023-02-13 14:03:46 +08:00
xiaoxian521
d063407e3d Merge branch 'main' into gitee 2023-02-13 14:02:19 +08:00
xiaoxian521
534e889f49 perf: 优化logo图和文字布局 2023-02-13 14:00:37 +08:00
xiaoxian521
cb7bd9e5a8 chore: update 2023-02-12 23:55:06 +08:00
xiaoxian521
0b4a281bad Merge branch 'main' into gitee 2023-02-12 23:53:58 +08:00
xiaoxian521
9243e6e290 chore: update 2023-02-12 14:40:59 +08:00
xiaoxian521
039a194788 Merge branch 'main' into gitee 2023-02-12 14:40:21 +08:00
xiaoxian521
8f12419660 style: update 2023-02-12 14:38:50 +08:00
xiaoxian521
9683a7be9c chore: update 2023-02-12 13:29:47 +08:00
xiaoxian521
94ac2ba400 Merge branch 'main' into gitee 2023-02-12 13:28:41 +08:00
xiaoxian521
eed95cd109 chore: update 2023-02-11 16:18:55 +08:00
xiaoxian521
3fb9c6895e Merge branch 'main' into gitee 2023-02-11 16:17:53 +08:00
xiaoxian521
9c3ac7a888 chore: update 2023-02-09 12:11:18 +08:00
xiaoxian521
d05a4e9990 Merge branch 'main' into gitee 2023-02-09 12:09:47 +08:00
xiaoxian521
585997dbb7 chore: update 2023-02-09 00:25:06 +08:00
xiaoxian521
0c7185cc47 Merge branch 'main' into gitee 2023-02-09 00:23:57 +08:00
xiaoxian521
d0c45b7995 chore: update 2023-02-08 18:11:24 +08:00
xiaoxian521
9ba545ae3b Merge branch 'main' into gitee 2023-02-08 18:10:12 +08:00
xiaoxian521
86f5a040dc chore: update 2023-01-08 16:15:33 +08:00
xiaoxian521
9ff777c8d2 Merge branch 'main' into gitee 2023-01-08 16:11:59 +08:00
xiaoxian521
e0b7922b13 chore: update 2022-12-26 12:57:03 +08:00
xiaoxian521
c951880e3a Merge branch 'main' into gitee 2022-12-26 12:56:01 +08:00
xiaoxian521
0d02cb739e chore: update 2022-12-16 14:54:53 +08:00
xiaoxian521
9c5140d117 Merge branch 'main' into gitee 2022-12-16 14:53:11 +08:00
xiaoxian521
7707607545 chore: update 2022-12-13 15:28:52 +08:00
xiaoxian521
e6775a1b05 Merge branch 'main' into gitee 2022-12-13 15:27:01 +08:00
xiaoxian521
0087f0f27c chore: update 2022-12-09 22:35:31 +08:00
xiaoxian521
5da968f122 Merge branch 'main' into gitee 2022-12-09 22:34:27 +08:00
xiaoxian521
43d0a53ce0 chore: update 2022-12-09 20:23:54 +08:00
xiaoxian521
db64905ab0 chore: update 2022-12-09 20:21:50 +08:00
298 changed files with 10064 additions and 5978 deletions

View File

@@ -32,7 +32,7 @@ body:
label: 验证 (Verify)
description: 在提交问题之前,请确保您执行以下操作 (Before submitting an issue, please ensure you do the following)
options:
- label: 是否仔细阅读过 [文档](https://pure-admin.github.io/pure-admin-doc/) (Have you read [documentation](https://pure-admin.github.io/pure-admin-doc/) carefully)
- label: 是否仔细阅读过 [文档](https://pure-admin.cn/) (Have you read [documentation](https://pure-admin.cn/) carefully)
required: true
- label: 检查是否存在相同或类似的问题 [issues](https://github.com/pure-admin/vue-pure-admin/issues) (Check for the same or similar [issues](https://github.com/pure-admin/vue-pure-admin/issues))
required: true

3
.gitignore vendored
View File

@@ -1,10 +1,9 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
.eslintcache
report.html
dist
vite.config.*.timestamp*
yarn.lock

View File

@@ -1,8 +0,0 @@
#!/bin/sh
# shellcheck source=./_/husky.sh
. "$(dirname "$0")/_/husky.sh"
PATH="/usr/local/bin:$PATH"
npx --no-install commitlint --edit "$1"

View File

@@ -1,9 +0,0 @@
#!/bin/sh
command_exists () {
command -v "$1" >/dev/null 2>&1
}
# Workaround for Windows 10, Git Bash and Pnpm
if command_exists winpty && test -t 1; then
exec < /dev/tty
fi

View File

@@ -1,10 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
. "$(dirname "$0")/common.sh"
[ -n "$CI" ] && exit 0
PATH="/usr/local/bin:$PATH"
# Perform lint check on files in the staging area through .lintstagedrc configuration
pnpm exec lint-staged

2
.nvmrc
View File

@@ -1 +1 @@
v20.13.1
v22.17.1

View File

@@ -1,6 +1,7 @@
{
"recommendations": [
"christian-kohler.path-intellisense",
"warmthsea.vscode-custom-code-color",
"vscode-icons-team.vscode-icons",
"davidanson.vscode-markdownlint",
"ms-azuretools.vscode-docker",

27
.vscode/settings.json vendored
View File

@@ -31,11 +31,18 @@
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.enabledParsers": ["yaml", "js"],
"i18n-ally.enabledParsers": [
"yaml",
"js"
],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue"],
"iconify.excludes": ["el"],
"i18n-ally.enabledFrameworks": [
"vue"
],
"iconify.excludes": [
"el"
],
"vsmqtt.brokerProfiles": [
{
"name": "broker.emqx.io",
@@ -43,5 +50,15 @@
"port": 1883,
"clientId": "vsmqtt_client_db34"
}
]
}
],
"vscodeCustomCodeColor.highlightValue": [
"v-loading",
"v-auth",
"v-copy",
"v-longpress",
"v-optimize",
"v-perms",
"v-ripple"
],
"vscodeCustomCodeColor.highlightValueColor": "#b392f0",
}

View File

@@ -1,3 +1,94 @@
# 6.1.0 (2025-07-31)
### ✔️ Refactor
- Upgrade to `vite7`, update dependencies, and related compatibility processing
### 🐞 Bug fixes
- Fixed a flickering issue in the `ReSegmented` segmented controller component when switching between light and dark styles
- Fixed an issue where `resetRouter` did not clear all routing data
- Fixed an issue where closing the left tab in the tabs window did not work properly
### 🍏 Perf
- Optimized navigation styles
- Upgraded `@pureadmin/table` to be compatible with all `el-table` APIs in the latest `element-plus` version.
# 6.0.0 (2025-04-10)
### ✔️ Refactor
- Refactor the icon module, use `@iconify/json` to replace the `@iconify-icons/*` dependency that is no longer maintained and updated, optimize the user experience, ensure that the icon library can be continuously updated and support `Tree-shaking`
- Upgrade `tailwindcss` to `v4` version, bringing faster build speed, simpler installation and configuration, and providing a dedicated `vite` plug-in
### 🎫 Feat
- Add `Ai` chat component example
- Add `tagOnClick` tag to switch global public events
- Add code editor example
- Add `Markdown` example
- Add slider example
### 🐞 Bug fixes
- Fix `aria-hidden` error
- Fix the problem that code hints cannot be displayed when using `this` syntax and update `pinia` related syntax
### 🍏 Perf
- Fix broken links in the waterfall infinite scrolling example
- Update `vue-flow`, related compatibility processing
- Delete the deprecated dependency package `eslint-define-config`, upgrade `eslint` to the latest version, related compatibility processing
- Optimize `src/style/dark.scss` syntax
- Optimize login parameter transfer
- Use `keydown` to replace `keypress`, the `keypress` event has been deprecated
# 5.9.0 (2024-12-10)
### ✔Refactor
- Upgrade `vite` to `v6` version, upgrade `sass` to the latest version, reconstruct the theme writing method, and deprecate [@pureadmin/theme](https://www.npmjs.com/package/@pureadmin/theme) , click to view [Related optimization point details](https://github.com/pure-admin/vue-pure-admin/pull/1188#issue-2630095115). For users who have the [Max version](https://pure-admin.cn/pages/service/#max-%E7%89%88%E6%9C%AC), it is strongly recommended to upgrade. Subsequent Max version users will enjoy a more modern, beautiful and highly customized theme color
- Use [code-inspector-plugin](https://www.npmjs.com/package/code-inspector-plugin) to replace [vite-plugin-vue-inspector](https://www.npmjs.com/package/vite-plugin-vue-inspector)
### 🎫Feat
- Added `ReDrawer` component
- `pure-table` adds dynamic table header example
### 🐞 Bug fixes
- Fixed an issue where the height of the table does not automatically adapt when the full screen function is enabled or disabled after the table is expanded in the menu and department management
### 🍏Perf
- Optimize the layout of the department tree on the left side of user management
# 5.8.0 (2024-08-19)
### 🎫 Feat
- Added a second button permission command (judged based on the `permissions` field returned by the login interface)
- Functional pop-up box `ReDialog` adds whether to enable the `loading` loading animation function after clicking the confirmation button
- `PureTableBar` component adds full screen and exit full screen functions
- `VxeTableBar` component adds full screen and exit full screen functions
- The OK button of the `ReDialog` component provides the close button animation `closeLoading` function
- Add development environment code debugging `vite-plugin-vue-inspector` plug-in to improve development experience
- Added `vite-plugin-checker` plugin for stricter type and `eslint` verification
### 🐞 Bug fixes
- Fixed the problem that the current tab cannot be closed after configuring the routing attribute `fixedTag` to `false`
- Fixed the issue where `logo` cannot be hidden in top menu mode
### 🍏 Perf
- Optimize type hints for custom instructions
- Optimize the press enter login function on the login page
- Optimize the mask level of the left menu on the mobile side
- Optimize system management-permission function style of role management
- Upgraded dependencies, compatible with the latest version of `element-plus`
# 5.7.0 (2024-06-04)
### 🎫 Feat
@@ -28,7 +119,7 @@
The addresses of the document site and full version preview site have been changed!
- The latest document site address: https://pure-admin.github.io/pure-admin-doc
- The latest document site address: https://pure-admin.cn
- The latest full version preview site address: https://pure-admin.github.io/vue-pure-admin
### ✔️ Refactor
@@ -429,7 +520,7 @@ Totally `ESM` version
### ✔️ Refactor
- completely removed `lodash` and its related libraries
[Click here to see Why Removed? How to integrate it yourself? ](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7 %89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C% E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9 %99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[Click here to see Why Removed? How to integrate it yourself? ](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C%E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -449,7 +540,7 @@ Totally `ESM` version
### ✔️ Refactor
- Completely removed `vxe-table`, after removal, the overall package size of the full version is reduced by `1.82MB`, and the initial startup time is basically the same as the lite version 🐮
[Click here to see Why Removed? How to integrate it yourself?](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[Click here to see Why Removed? How to integrate it yourself?](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -662,7 +753,7 @@ Totally `ESM` version
### ✔️ Refactor
- Replace `unocss` with `tailwindcss`, add `tailwindcss` [documentation](https://pure-admin.github.io/pure-admin-doc/pages/tailwindcss/)
- Replace `unocss` with `tailwindcss`, add `tailwindcss` [documentation](https://pure-admin.cn/pages/tailwindcss/)
### 🐞 Bug fixes

View File

@@ -1,3 +1,94 @@
# 6.1.0 (2025-07-31)
### ✔️ Refactor
- Upgrade to `vite7`, update dependencies, and related compatibility processing
### 🐞 Bug fixes
- Fixed a flickering issue in the `ReSegmented` segmented controller component when switching between light and dark styles
- Fixed an issue where `resetRouter` did not clear all routing data
- Fixed an issue where closing the left tab in the tabs window did not work properly
### 🍏 Perf
- Optimized navigation styles
- Upgraded `@pureadmin/table` to be compatible with all `el-table` APIs in the latest `element-plus` version.
# 6.0.0 (2025-04-10)
### ✔️ Refactor
- Refactor the icon module, use `@iconify/json` to replace the `@iconify-icons/*` dependency that is no longer maintained and updated, optimize the user experience, ensure that the icon library can be continuously updated and support `Tree-shaking`
- Upgrade `tailwindcss` to `v4` version, bringing faster build speed, simpler installation and configuration, and providing a dedicated `vite` plug-in
### 🎫 Feat
- Add `Ai` chat component example
- Add `tagOnClick` tag to switch global public events
- Add code editor example
- Add `Markdown` example
- Add slider example
### 🐞 Bug fixes
- Fix `aria-hidden` error
- Fix the problem that code hints cannot be displayed when using `this` syntax and update `pinia` related syntax
### 🍏 Perf
- Fix broken links in the waterfall infinite scrolling example
- Update `vue-flow`, related compatibility processing
- Delete the deprecated dependency package `eslint-define-config`, upgrade `eslint` to the latest version, related compatibility processing
- Optimize `src/style/dark.scss` syntax
- Optimize login parameter transfer
- Use `keydown` to replace `keypress`, the `keypress` event has been deprecated
# 5.9.0 (2024-12-10)
### ✔Refactor
- Upgrade `vite` to `v6` version, upgrade `sass` to the latest version, reconstruct the theme writing method, and deprecate [@pureadmin/theme](https://www.npmjs.com/package/@pureadmin/theme) , click to view [Related optimization point details](https://github.com/pure-admin/vue-pure-admin/pull/1188#issue-2630095115). For users who have the [Max version](https://pure-admin.cn/pages/service/#max-%E7%89%88%E6%9C%AC), it is strongly recommended to upgrade. Subsequent Max version users will enjoy a more modern, beautiful and highly customized theme color
- Use [code-inspector-plugin](https://www.npmjs.com/package/code-inspector-plugin) to replace [vite-plugin-vue-inspector](https://www.npmjs.com/package/vite-plugin-vue-inspector)
### 🎫Feat
- Added `ReDrawer` component
- `pure-table` adds dynamic table header example
### 🐞 Bug fixes
- Fixed an issue where the height of the table does not automatically adapt when the full screen function is enabled or disabled after the table is expanded in the menu and department management
### 🍏Perf
- Optimize the layout of the department tree on the left side of user management
# 5.8.0 (2024-08-19)
### 🎫 Feat
- Added a second button permission command (judged based on the `permissions` field returned by the login interface)
- Functional pop-up box `ReDialog` adds whether to enable the `loading` loading animation function after clicking the confirmation button
- `PureTableBar` component adds full screen and exit full screen functions
- `VxeTableBar` component adds full screen and exit full screen functions
- The OK button of the `ReDialog` component provides the close button animation `closeLoading` function
- Add development environment code debugging `vite-plugin-vue-inspector` plug-in to improve development experience
- Added `vite-plugin-checker` plugin for stricter type and `eslint` verification
### 🐞 Bug fixes
- Fixed the problem that the current tab cannot be closed after configuring the routing attribute `fixedTag` to `false`
- Fixed the issue where `logo` cannot be hidden in top menu mode
### 🍏 Perf
- Optimize type hints for custom instructions
- Optimize the press enter login function on the login page
- Optimize the mask level of the left menu on the mobile side
- Optimize system management-permission function style of role management
- Upgraded dependencies, compatible with the latest version of `element-plus`
# 5.7.0 (2024-06-04)
### 🎫 Feat
@@ -28,7 +119,7 @@
The addresses of the document site and full version preview site have been changed!
- The latest document site address: https://pure-admin.github.io/pure-admin-doc
- The latest document site address: https://pure-admin.cn
- The latest full version preview site address: https://pure-admin.github.io/vue-pure-admin
### ✔️ Refactor
@@ -429,7 +520,7 @@ Totally `ESM` version
### ✔️ Refactor
- completely removed `lodash` and its related libraries
[Click here to see Why Removed? How to integrate it yourself? ](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7 %89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C% E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9 %99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[Click here to see Why Removed? How to integrate it yourself? ](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C%E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -449,7 +540,7 @@ Totally `ESM` version
### ✔️ Refactor
- Completely removed `vxe-table`, after removal, the overall package size of the full version is reduced by `1.82MB`, and the initial startup time is basically the same as the lite version 🐮
[Click here to see Why Removed? How to integrate it yourself?](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[Click here to see Why Removed? How to integrate it yourself?](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -662,7 +753,7 @@ Totally `ESM` version
### ✔️ Refactor
- Replace `unocss` with `tailwindcss`, add `tailwindcss` [documentation](https://pure-admin.github.io/pure-admin-doc/pages/tailwindcss/)
- Replace `unocss` with `tailwindcss`, add `tailwindcss` [documentation](https://pure-admin.cn/pages/tailwindcss/)
### 🐞 Bug fixes

View File

@@ -1,3 +1,94 @@
# 6.1.0 (2025-07-31)
### ✔️ Refactor
- 升级至`vite7`,更新依赖,相关兼容处理
### 🐞 Bug fixes
- 修复`ReSegmented`分段控制器组件在浅色和深色整体风格切换时的闪烁问题
- 修复`resetRouter`未清空全部路由数据问题
- 修复标签页-关闭左侧标签页关闭异常问题
### 🍏 Perf
- 优化导航样式
- 升级`@pureadmin/table`兼容最新版`element-plus``el-table`的所有`API`
# 6.0.0 (2025-04-10)
### ✔️ Refactor
- 重构图标模块,使用`@iconify/json`替换不再维护更新的`@iconify-icons/*`依赖,优化使用体验,确保图标库可持续更新并支持`Tree-shaking`
- 升级`tailwindcss``v4`版本,带来更快的构建速度、更简化的安装和配置、提供专属`vite`插件
### 🎫 Feat
- 添加`Ai`聊天组件示例
- 添加`tagOnClick`标签切换全局公共事件
- 添加代码编辑器示例
- 添加`Markdown`示例
- 添加滑块示例
### 🐞 Bug fixes
- 修复`aria-hidden`报错
- 修复使用`this`语法时无法显示代码提示的问题并更新`pinia`相关语法
### 🍏 Perf
- 修复组件-瀑布流无限滚动示例中失效的链接
- 更新`vue-flow`,相关兼容处理
- 删除已弃用的依赖包`eslint-define-config`,升级`eslint`至最新版本,相关兼容处理
- 优化`src/style/dark.scss`语法
- 优化登录传参
- 使用`keydown`替换`keypress``keypress`事件已弃用
# 5.9.0 (2024-12-10)
### ✔️ Refactor
- 升级`vite``v6`版本,升级`sass`至最新版,重构主题写法,弃用 [@pureadmin/theme](https://www.npmjs.com/package/@pureadmin/theme),点击查看 [相关优化点细节](https://github.com/pure-admin/vue-pure-admin/pull/1188#issue-2630095115)。对于拥有 [Max版本](https://pure-admin.cn/pages/service/#max-%E7%89%88%E6%9C%AC) 的用户平台强烈建议升级,后续`Max版本用户`会享有一套更现代、美观且自定义程度高的主题色
- 使用 [code-inspector-plugin](https://www.npmjs.com/package/code-inspector-plugin) 替换 [vite-plugin-vue-inspector](https://www.npmjs.com/package/vite-plugin-vue-inspector)
### 🎫 Feat
- 新增函数式抽屉组件
- `pure-table`添加动态表头示例
### 🐞 Bug fixes
- 修复在菜单、部门管理中,表格展开后启用或关闭全屏功能时,表格高度未自动适应的问题
### 🍏 Perf
- 优化用户管理左侧部门树的布局
# 5.8.0 (2024-08-19)
### 🎫 Feat
- 新增第二种按钮权限指令(根据登录接口返回的`permissions`字段进行判断)
- 函数式弹框`ReDialog`添加点击确认按钮后是否开启`loading`加载动画功能
- `PureTableBar`组件添加全屏和退出全屏功能
- `VxeTableBar`组件添加全屏和退出全屏功能
- `ReDialog`组件的确定按钮提供关闭按钮动画`closeLoading`功能
- 添加开发环境代码调试`vite-plugin-vue-inspector`插件,提升开发体验
- 添加`vite-plugin-checker`插件,更严格的类型和`eslint`校验
### 🐞 Bug fixes
- 修复配置路由属性`fixedTag``false`后当前标签页不可关闭的问题
- 修复顶部菜单模式下`logo`不可隐藏的问题
### 🍏 Perf
- 优化自定义指令的类型提示
- 优化登录页回车登录功能
- 优化移动端左侧菜单遮罩层级
- 优化系统管理-角色管理的权限功能样式
- 升级依赖,`element-plus`最新版兼容处理
# 5.7.0 (2024-06-04)
### 🎫 Feat
@@ -28,7 +119,7 @@
文档站和完整版预览站地址更换!
- 最新文档站地址https://pure-admin.github.io/pure-admin-doc
- 最新文档站地址https://pure-admin.cn
- 最新完整版预览站地址https://pure-admin.github.io/vue-pure-admin
### ✔️ Refactor
@@ -428,7 +519,7 @@
### ✔️ Refactor
- 完全移除了 `lodash` 和其相关库
[点击此处查看为什么移除?如何自行集成?](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C%E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[点击此处查看为什么移除?如何自行集成?](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-5-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-lodash-%E5%92%8C%E5%85%B6%E7%9B%B8%E5%85%B3%E5%BA%93-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -448,7 +539,7 @@
### ✔️ Refactor
- 完全移除了 `vxe-table`,移除后,完整版整体打包大小减少 `1.82MB`,首启动时长基本和精简版持平 🐮
[点击此处查看为什么移除?如何自行集成?](https://pure-admin.github.io/pure-admin-doc/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
[点击此处查看为什么移除?如何自行集成?](https://pure-admin.cn/pages/FAQ/#%E5%B9%B3%E5%8F%B0%E5%9C%A8-v3-9-4-%E7%89%88%E6%9C%AC%E5%AE%8C%E5%85%A8%E7%A7%BB%E9%99%A4%E4%BA%86-vxe-table-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A7%BB%E9%99%A4-%E5%A6%82%E4%BD%95%E8%87%AA%E8%A1%8C%E9%9B%86%E6%88%90)
### 🎫 Feat
@@ -661,7 +752,7 @@
### ✔️ Refactor
- 使用 `tailwindcss` 替换 `unocss`,新增 `tailwindcss` [使用文档](https://pure-admin.github.io/pure-admin-doc/pages/tailwindcss/)
- 使用 `tailwindcss` 替换 `unocss`,新增 `tailwindcss` [使用文档](https://pure-admin.cn/pages/tailwindcss/)
### 🐞 Bug fixes

View File

@@ -28,12 +28,12 @@ The simplified version is based on the shelf extracted from [vue-pure-admin](htt
## Nanny-level documents
[Click me to view vue-pure-admin documentation](https://pure-admin.github.io/pure-admin-doc)
[Click me to view vue-pure-admin documentation](https://pure-admin.cn/)
[Click me to view @pureadmin/utils documentation](https://pure-admin-utils.netlify.app)
## Quality service, software outsourcing, sponsorship support
## Premium service
[Click me for details](https://pure-admin.github.io/pure-admin-doc/pages/service/)
[Click me for details](https://pure-admin.cn/pages/service/)
## Tauri
@@ -183,6 +183,8 @@ Thank you very much for your in-depth understanding of the source code and your
| [QFifteen](https://github.com/QFifteen) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=QFifteen) |
| [edgexie](https://github.com/edgexie) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=edgexie) |
| [way-jm](https://github.com/way-jm) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=way-jm) |
| [simple-hui](https://github.com/simple-hui) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=simple-hui) |
| [tinysimple](https://github.com/tinysimple) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=tinysimple) |
## Git Contribution submission specification

View File

@@ -29,16 +29,12 @@
## 配套保姆级文档
[点我查看 vue-pure-admin 文档](https://pure-admin.github.io/pure-admin-doc)
[点我查看 vue-pure-admin 文档](https://pure-admin.cn/)
[点我查看 @pureadmin/utils 文档](https://pure-admin-utils.netlify.app)
## 优质服务、软件外包、赞助支持
## 高级服务
[点我查看详情](https://pure-admin.github.io/pure-admin-doc/pages/service/)
## `max` 版本
[点我查看 max 版本](https://github.com/pure-admin/vue-pure-admin-max)
[点我查看详情](https://pure-admin.cn/pages/service/)
## `Tauri` 版本
@@ -188,6 +184,8 @@ docker run -dp 8080:80 --name pure-admin vue-pure-admin
| [QFifteen](https://github.com/QFifteen) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=QFifteen) |
| [edgexie](https://github.com/edgexie) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=edgexie) |
| [way-jm](https://github.com/way-jm) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=way-jm) |
| [simple-hui](https://github.com/simple-hui) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=simple-hui) |
| [tinysimple](https://github.com/tinysimple) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=tinysimple) |
## `Git` 贡献提交规范

View File

@@ -1,13 +1,13 @@
import type { Plugin } from "vite";
import gradient from "gradient-string";
import { getPackageSize } from "./utils";
import dayjs, { type Dayjs } from "dayjs";
import duration from "dayjs/plugin/duration";
import gradientString from "gradient-string";
import boxen, { type Options as BoxenOptions } from "boxen";
dayjs.extend(duration);
const welcomeMessage = gradientString("cyan", "magenta").multiline(
`您好! 欢迎使用 pure-admin 开源项目\n我们为您精心准备了下面两个贴心的保姆级文档\nhttps://pure-admin.github.io/pure-admin-doc\nhttps://pure-admin-utils.netlify.app`
const welcomeMessage = gradient(["cyan", "magenta"]).multiline(
`您好! 欢迎使用 pure-admin 开源项目\n我们为您精心准备了下面两个贴心的保姆级文档\nhttps://pure-admin.cn\nhttps://pure-admin-utils.netlify.app`
);
const boxenOptions: BoxenOptions = {
@@ -41,7 +41,7 @@ export function viteBuildInfo(): Plugin {
callback: (size: string) => {
console.log(
boxen(
gradientString("cyan", "magenta").multiline(
gradient(["cyan", "magenta"]).multiline(
`🎉 恭喜打包完成(总用时${dayjs
.duration(endTime.diff(startTime))
.format("mm分ss秒")},打包后的大小为${size}`

View File

@@ -11,21 +11,25 @@ const include = [
"dayjs",
"axios",
"pinia",
"vditor",
"typeit",
"swiper",
"qrcode",
"intro.js",
"vue-i18n",
"deep-chat",
"vxe-table",
"vue-types",
"js-cookie",
"vue-tippy",
"cropperjs",
"jsbarcode",
"codemirror",
"pinyin-pro",
"sortablejs",
"swiper/vue",
"mint-filter",
"highlight.js",
"@vueuse/core",
"vue3-danmaku",
"v-contextmenu",
@@ -42,6 +46,7 @@ const include = [
"@howdyjs/mouse-menu",
"@logicflow/extension",
"vue-virtual-scroller",
"codemirror-editor-vue3",
"@amap/amap-jsapi-loader",
"el-table-infinite-scroll",
"vue-waterfall-plugin-next",
@@ -52,12 +57,8 @@ const include = [
/**
* 在预构建中强制排除的依赖项
* 温馨提示:所有以 `@iconify-icons/` 开头引入的的本地图标模块,都应该加入到下面的 `exclude` 里,因为平台推荐的使用方式是哪里需要哪里引入而且都是单个的引入,不需要预构建,直接让浏览器加载就好
* 温馨提示:平台推荐的使用方式是哪里需要哪里引入而且都是单个的引入,不需要预构建,直接让浏览器加载就好
*/
const exclude = [
"@iconify-icons/ep",
"@iconify-icons/ri",
"@pureadmin/theme/dist/browser-utils"
];
const exclude = ["@iconify/json"];
export { include, exclude };

View File

@@ -3,15 +3,16 @@ import vue from "@vitejs/plugin-vue";
import { pathResolve } from "./utils";
import { viteBuildInfo } from "./info";
import svgLoader from "vite-svg-loader";
import Icons from "unplugin-icons/vite";
import type { PluginOption } from "vite";
import vueJsx from "@vitejs/plugin-vue-jsx";
import tailwindcss from "@tailwindcss/vite";
import { configCompressPlugin } from "./compress";
import removeNoMatch from "vite-plugin-router-warn";
import { visualizer } from "rollup-plugin-visualizer";
import removeConsole from "vite-plugin-remove-console";
import { themePreprocessorPlugin } from "@pureadmin/theme";
import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite";
import { genScssMultipleScopeVars } from "../src/layout/theme";
import { codeInspectorPlugin } from "code-inspector-plugin";
import { vitePluginFakeServer } from "vite-plugin-fake-server";
export function getPluginsList(
@@ -20,13 +21,29 @@ export function getPluginsList(
): PluginOption[] {
const lifecycle = process.env.npm_lifecycle_event;
return [
vue(),
tailwindcss(),
vue({
template: {
compilerOptions: {
isCustomElement: tag => tag === "deep-chat"
}
}
}),
// jsx、tsx语法支持
vueJsx(),
VueI18nPlugin({
jitCompilation: false,
include: [pathResolve("../locales/**")]
}),
/**
* 在页面上按住组合键时,鼠标在页面移动即会在 DOM 上出现遮罩层并显示相关信息,点击一下将自动打开 IDE 并将光标定位到元素对应的代码位置
* Mac 默认组合键 Option + Shift
* Windows 默认组合键 Alt + Shift
* 更多用法看 https://inspector.fe-dev.cn/guide/start.html
*/
codeInspectorPlugin({
bundler: "vite",
hideConsole: true
}),
viteBuildInfo(),
/**
* 开发环境下移除非必要的vue-router动态路由警告No match found for location with path
@@ -41,15 +58,13 @@ export function getPluginsList(
infixName: false,
enableProd: true
}),
// 自定义主题
themePreprocessorPlugin({
scss: {
multipleScopeVars: genScssMultipleScopeVars(),
extract: true
}
}),
// svg组件化支持
svgLoader(),
// 自动按需加载图标
Icons({
compiler: "vue3",
scale: 1
}),
VITE_CDN ? cdn : null,
configCompressPlugin(VITE_COMPRESSION),
// 线上环境删除console

View File

@@ -1,26 +1,25 @@
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import pluginVue from "eslint-plugin-vue";
import * as parserVue from "vue-eslint-parser";
import configPrettier from "eslint-config-prettier";
import pluginPrettier from "eslint-plugin-prettier";
import { defineFlatConfig } from "eslint-define-config";
import * as parserTypeScript from "@typescript-eslint/parser";
import pluginTypeScript from "@typescript-eslint/eslint-plugin";
import { defineConfig, globalIgnores } from "eslint/config";
export default defineFlatConfig([
export default defineConfig([
globalIgnores([
"**/.*",
"dist/*",
"*.d.ts",
"public/*",
"src/assets/**",
"src/**/iconfont/**"
]),
{
...js.configs.recommended,
ignores: [
"**/.*",
"dist/*",
"*.d.ts",
"public/*",
"src/assets/**",
"src/**/iconfont/**"
],
languageOptions: {
globals: {
// index.d.ts
// types/index.d.ts
RefType: "readonly",
EmitType: "readonly",
TargetContext: "readonly",
@@ -73,26 +72,18 @@ export default defineFlatConfig([
]
}
},
{
...tseslint.config({
extends: [...tseslint.configs.recommended],
files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
languageOptions: {
parser: parserTypeScript,
parserOptions: {
sourceType: "module"
}
},
plugins: {
"@typescript-eslint": pluginTypeScript
},
rules: {
...pluginTypeScript.configs.strict.rules,
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/no-redeclare": "error",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/prefer-as-const": "warn",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unused-expressions": "off",
"@typescript-eslint/no-unsafe-function-type": "off",
"@typescript-eslint/no-import-type-side-effects": "error",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/consistent-type-imports": [
@@ -111,20 +102,20 @@ export default defineFlatConfig([
}
]
}
},
}),
{
files: ["**/*.d.ts"],
rules: {
"eslint-comments/no-unlimited-disable": "off",
"import/no-duplicates": "off",
"no-restricted-syntax": "off",
"unused-imports/no-unused-vars": "off"
}
},
{
files: ["**/*.?([cm])js"],
rules: {
"@typescript-eslint/no-require-imports": "off",
"@typescript-eslint/no-var-requires": "off"
"@typescript-eslint/no-require-imports": "off"
}
},
{
@@ -145,18 +136,19 @@ export default defineFlatConfig([
jsx: true
},
extraFileExtensions: [".vue"],
parser: "@typescript-eslint/parser",
parser: tseslint.parser,
sourceType: "module"
}
},
plugins: {
"@typescript-eslint": tseslint.plugin,
vue: pluginVue
},
processor: pluginVue.processors[".vue"],
rules: {
...pluginVue.configs.base.rules,
...pluginVue.configs["vue3-essential"].rules,
...pluginVue.configs["vue3-recommended"].rules,
...pluginVue.configs.essential.rules,
...pluginVue.configs.recommended.rules,
"no-undef": "off",
"no-unused-vars": "off",
"vue/no-v-html": "off",

View File

@@ -1,87 +1,94 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta
name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<title>vue-pure-admin</title>
<link rel="icon" href="/favicon.ico" />
<script>
window.process = {};
</script>
</head>
<body>
<div id="app">
<style>
html,
body,
#app {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
overflow: hidden;
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<title>vue-pure-admin</title>
<link rel="icon" href="/favicon.ico" />
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script")
hm.src = "https://hm.baidu.com/hm.js?d3824e75ef2bf6d851035f74ae1aec68"
var s = document.getElementsByTagName("script")[0]
s.parentNode.insertBefore(hm, s)
})();
</script>
</head>
<body>
<div id="app">
<style>
html,
body,
#app {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
overflow: hidden;
}
.loader,
.loader::before,
.loader::after {
width: 2.5em;
height: 2.5em;
border-radius: 50%;
animation: load-animation 1.8s infinite ease-in-out;
animation-fill-mode: both;
}
.loader {
position: relative;
top: 0;
margin: 80px auto;
font-size: 10px;
color: #406eeb;
text-indent: -9999em;
transform: translateZ(0);
transform: translate(-50%, 0);
animation-delay: -0.16s;
}
.loader::before,
.loader::after {
position: absolute;
top: 0;
content: "";
}
.loader::before {
left: -3.5em;
animation-delay: -0.32s;
}
.loader::after {
left: 3.5em;
}
@keyframes load-animation {
0%,
80%,
100% {
box-shadow: 0 2.5em 0 -1.3em;
}
.loader,
.loader::before,
.loader::after {
width: 2.5em;
height: 2.5em;
border-radius: 50%;
animation: load-animation 1.8s infinite ease-in-out;
animation-fill-mode: both;
40% {
box-shadow: 0 2.5em 0 0;
}
}
</style>
<div class="loader"></div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
.loader {
position: relative;
top: 0;
margin: 80px auto;
font-size: 10px;
color: #406eeb;
text-indent: -9999em;
transform: translateZ(0);
transform: translate(-50%, 0);
animation-delay: -0.16s;
}
.loader::before,
.loader::after {
position: absolute;
top: 0;
content: "";
}
.loader::before {
left: -3.5em;
animation-delay: -0.32s;
}
.loader::after {
left: 3.5em;
}
@keyframes load-animation {
0%,
80%,
100% {
box-shadow: 0 2.5em 0 -1.3em;
}
40% {
box-shadow: 0 2.5em 0 0;
}
}
</style>
<div class="loader"></div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
</html>

View File

@@ -76,13 +76,16 @@ menus:
pureLoginLog: Login Log
pureOperationLog: Operation Log
pureSystemLog: System Log
pureCodeMirror: CodeMirror
pureMarkdown: Markdown
pureEditor: Editor
pureAbnormal: Abnormal Page
pureFourZeroFour: "404"
pureFourZeroOne: "403"
pureFive: "500"
purePageNotFound: "404"
pureAccessDenied: "403"
pureServerError: "500"
pureComponents: Components
pureDialog: Dialog
pureDrawer: Drawer
pureMessage: Message Tips
pureVideo: Video
pureSegmented: Segmented
@@ -91,6 +94,7 @@ menus:
pureDraggable: Draggable
pureSplitPane: Split Pane
pureText: Text Ellipsis
pureSlider: Slider
pureElButton: Button
pureButton: Button Animation
pureCheckButton: Check Button
@@ -125,6 +129,8 @@ menus:
purePermission: Permission Manage
purePermissionPage: Page Permission
purePermissionButton: Button Permission
purePermissionButtonRouter: Route return button permission
purePermissionButtonLogin: Login interface return button permission
pureTabs: Tabs Operate
pureGuide: Guide
pureAble: Able

View File

@@ -76,13 +76,16 @@ menus:
pureLoginLog: 登录日志
pureOperationLog: 操作日志
pureSystemLog: 系统日志
pureCodeMirror: 代码编辑器
pureMarkdown: Markdown
pureEditor: 编辑器
pureAbnormal: 异常页面
pureFourZeroFour: "404"
pureFourZeroOne: "403"
pureFive: "500"
purePageNotFound: "404"
pureAccessDenied: "403"
pureServerError: "500"
pureComponents: 组件
pureDialog: 函数式弹框
pureDrawer: 函数式抽屉
pureMessage: 消息提示
pureVideo: 视频
pureSegmented: 分段控制器
@@ -91,6 +94,7 @@ menus:
pureDraggable: 拖拽
pureSplitPane: 切割面板
pureText: 文本省略
pureSlider: 滑块
pureElButton: 按钮
pureCheckButton: 可选按钮
pureButton: 按钮动效
@@ -125,6 +129,8 @@ menus:
purePermission: 权限管理
purePermissionPage: 页面权限
purePermissionButton: 按钮权限
purePermissionButtonRouter: 路由返回按钮权限
purePermissionButtonLogin: 登录接口返回按钮权限
pureTabs: 标签页操作
pureGuide: 引导页
pureAble: 功能
@@ -231,4 +237,4 @@ login:
purePassWordRuleReg: 密码格式应为8-18位数字、字母、符号的任意两种组合
purePassWordSureReg: 请输入确认密码
purePassWordDifferentReg: 两次密码不一致!
purePassWordUpdateReg: 修改密码成功
purePassWordUpdateReg: 修改密码成功

View File

@@ -123,17 +123,34 @@ const permissionRouter = {
}
},
{
path: "/permission/button/index",
name: "PermissionButton",
path: "/permission/button",
meta: {
title: "menus.purePermissionButton",
roles: ["admin", "common"],
auths: [
"permission:btn:add",
"permission:btn:edit",
"permission:btn:delete"
]
}
roles: ["admin", "common"]
},
children: [
{
path: "/permission/button/router",
component: "permission/button/index",
name: "PermissionButtonRouter",
meta: {
title: "menus.purePermissionButtonRouter",
auths: [
"permission:btn:add",
"permission:btn:edit",
"permission:btn:delete"
]
}
},
{
path: "/permission/button/login",
component: "permission/button/perms",
name: "PermissionButtonLogin",
meta: {
title: "menus.purePermissionButtonLogin"
}
}
]
}
]
};
@@ -242,7 +259,7 @@ const frameRouter = {
children: [
{
path: "/external",
name: "https://pure-admin.github.io/pure-admin-doc",
name: "https://pure-admin.cn/",
meta: {
title: "menus.pureExternalLink",
roles: ["admin", "common"]

View File

@@ -15,6 +15,8 @@ export default defineFakeRoute([
nickname: "小铭",
// 一个用户可能有多个角色
roles: ["admin"],
// 按钮级别权限
permissions: ["*:*:*"],
accessToken: "eyJhbGciOiJIUzUxMiJ9.admin",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.adminRefresh",
expires: "2030/10/30 00:00:00"
@@ -28,6 +30,7 @@ export default defineFakeRoute([
username: "common",
nickname: "小林",
roles: ["common"],
permissions: ["permission:btn:add", "permission:btn:edit"],
accessToken: "eyJhbGciOiJIUzUxMiJ9.common",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.commonRefresh",
expires: "2030/10/30 00:00:00"

View File

@@ -25,7 +25,7 @@ export default defineFakeRoute([
url: "/mine-logs",
method: "get",
response: () => {
let list = [
const list = [
{
id: 1,
ip: faker.internet.ipv4(),

View File

@@ -430,7 +430,7 @@ export default defineFakeRoute([
id: 102,
menuType: 2,
title: "menus.pureExternalLink",
name: "https://pure-admin.github.io/pure-admin-doc",
name: "https://pure-admin.cn/",
path: "/external",
component: "",
rank: null,
@@ -696,7 +696,7 @@ export default defineFakeRoute([
menuType: 0,
title: "menus.purePermissionButton",
name: "PermissionButton",
path: "/permission/button/index",
path: "/permission/button",
component: "",
rank: null,
redirect: "",
@@ -717,6 +717,30 @@ export default defineFakeRoute([
{
parentId: 202,
id: 203,
menuType: 0,
title: "menus.purePermissionButtonRouter",
name: "PermissionButtonRouter",
path: "/permission/button/router",
component: "permission/button/index",
rank: null,
redirect: "",
icon: "",
extraIcon: "",
enterTransition: "",
leaveTransition: "",
activePath: "",
auths: "",
frameSrc: "",
frameLoading: true,
keepAlive: false,
hiddenTag: false,
fixedTag: false,
showLink: true,
showParent: false
},
{
parentId: 203,
id: 210,
menuType: 3,
title: "添加",
name: "",
@@ -739,8 +763,8 @@ export default defineFakeRoute([
showParent: false
},
{
parentId: 202,
id: 204,
parentId: 203,
id: 211,
menuType: 3,
title: "修改",
name: "",
@@ -762,9 +786,105 @@ export default defineFakeRoute([
showLink: true,
showParent: false
},
{
parentId: 203,
id: 212,
menuType: 3,
title: "删除",
name: "",
path: "",
component: "",
rank: null,
redirect: "",
icon: "",
extraIcon: "",
enterTransition: "",
leaveTransition: "",
activePath: "",
auths: "permission:btn:delete",
frameSrc: "",
frameLoading: true,
keepAlive: false,
hiddenTag: false,
fixedTag: false,
showLink: true,
showParent: false
},
{
parentId: 202,
id: 205,
id: 204,
menuType: 0,
title: "menus.purePermissionButtonLogin",
name: "PermissionButtonLogin",
path: "/permission/button/login",
component: "permission/button/perms",
rank: null,
redirect: "",
icon: "",
extraIcon: "",
enterTransition: "",
leaveTransition: "",
activePath: "",
auths: "",
frameSrc: "",
frameLoading: true,
keepAlive: false,
hiddenTag: false,
fixedTag: false,
showLink: true,
showParent: false
},
{
parentId: 204,
id: 220,
menuType: 3,
title: "添加",
name: "",
path: "",
component: "",
rank: null,
redirect: "",
icon: "",
extraIcon: "",
enterTransition: "",
leaveTransition: "",
activePath: "",
auths: "permission:btn:add",
frameSrc: "",
frameLoading: true,
keepAlive: false,
hiddenTag: false,
fixedTag: false,
showLink: true,
showParent: false
},
{
parentId: 204,
id: 221,
menuType: 3,
title: "修改",
name: "",
path: "",
component: "",
rank: null,
redirect: "",
icon: "",
extraIcon: "",
enterTransition: "",
leaveTransition: "",
activePath: "",
auths: "permission:btn:edit",
frameSrc: "",
frameLoading: true,
keepAlive: false,
hiddenTag: false,
fixedTag: false,
showLink: true,
showParent: false
},
{
parentId: 204,
id: 222,
menuType: 3,
title: "删除",
name: "",

View File

@@ -1,6 +1,6 @@
{
"name": "vue-pure-admin",
"version": "5.7.0",
"version": "6.1.0",
"private": true,
"type": "module",
"scripts": {
@@ -48,144 +48,162 @@
},
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",
"@howdyjs/mouse-menu": "^2.1.3",
"@howdyjs/mouse-menu": "^2.1.7",
"@infectoone/vue-ganttastic": "^2.3.2",
"@logicflow/core": "^1.2.27",
"@logicflow/extension": "^1.2.27",
"@logicflow/core": "^1.2.28",
"@logicflow/extension": "^1.2.28",
"@pureadmin/descriptions": "^1.2.1",
"@pureadmin/table": "^3.1.2",
"@pureadmin/utils": "^2.4.7",
"@vue-flow/background": "^1.3.0",
"@vue-flow/core": "^1.34.0",
"@vueuse/core": "^10.10.0",
"@vueuse/motion": "^2.2.0",
"@pureadmin/table": "^3.3.0",
"@pureadmin/utils": "^2.6.2",
"@vue-flow/background": "^1.3.2",
"@vue-flow/core": "^1.46.4",
"@vueuse/core": "^13.9.0",
"@vueuse/motion": "^3.0.3",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"axios": "^1.7.2",
"axios": "^1.12.2",
"china-area-data": "^5.0.1",
"codemirror": "^5.65.20",
"codemirror-editor-vue3": "^2.8.0",
"cropperjs": "^1.6.2",
"dayjs": "^1.11.11",
"echarts": "^5.5.0",
"el-table-infinite-scroll": "^3.0.5",
"element-plus": "^2.7.3",
"dayjs": "^1.11.18",
"deep-chat": "^2.2.2",
"echarts": "^5.6.0",
"el-table-infinite-scroll": "^3.0.7",
"element-plus": "^2.11.2",
"highlight.js": "^11.11.1",
"intro.js": "^7.2.0",
"js-cookie": "^3.0.5",
"jsbarcode": "^3.11.6",
"jsbarcode": "^3.12.1",
"localforage": "^1.10.0",
"mint-filter": "^4.0.3",
"mitt": "^3.0.1",
"mqtt": "4.3.7",
"nprogress": "^0.2.0",
"path": "^0.12.7",
"pinia": "^2.1.7",
"pinyin-pro": "^3.21.1",
"plus-pro-components": "^0.1.7",
"qrcode": "^1.5.3",
"qs": "^6.12.1",
"path-browserify": "^1.0.1",
"pinia": "^3.0.3",
"pinyin-pro": "^3.27.0",
"plus-pro-components": "^0.1.29",
"qrcode": "^1.5.4",
"qs": "^6.14.0",
"responsive-storage": "^2.2.0",
"sortablejs": "^1.15.2",
"swiper": "^11.1.4",
"typeit": "^8.8.3",
"sortablejs": "^1.15.6",
"swiper": "^11.2.10",
"typeit": "^8.8.7",
"v-contextmenu": "^3.2.0",
"v3-infinite-loading": "^1.3.1",
"version-rocket": "^1.7.1",
"vue": "^3.4.27",
"vue-i18n": "^9.13.1",
"vue-json-pretty": "^2.4.0",
"vue-pdf-embed": "^2.0.4",
"vue-router": "^4.3.2",
"vue-tippy": "^6.4.1",
"vue-types": "^5.1.2",
"v3-infinite-loading": "^1.3.2",
"vditor": "^3.11.2",
"version-rocket": "^1.7.4",
"vue": "^3.5.21",
"vue-i18n": "^11.1.12",
"vue-json-pretty": "^2.5.0",
"vue-pdf-embed": "^2.1.3",
"vue-router": "^4.5.1",
"vue-tippy": "^6.7.1",
"vue-types": "^6.0.0",
"vue-virtual-scroller": "2.0.0-beta.8",
"vue-waterfall-plugin-next": "^2.4.3",
"vue3-danmaku": "^1.6.0",
"vue-waterfall-plugin-next": "^2.6.9",
"vue3-danmaku": "^1.6.6",
"vue3-puzzle-vcode": "^1.1.7",
"vuedraggable": "^4.1.0",
"vxe-table": "^4.6.17",
"wavesurfer.js": "^7.7.15",
"xgplayer": "^3.0.18",
"vxe-table": "4.6.25",
"wavesurfer.js": "^7.10.1",
"xgplayer": "^3.0.23",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2",
"@commitlint/types": "^19.0.3",
"@eslint/js": "^9.3.0",
"@faker-js/faker": "^8.4.1",
"@iconify-icons/ep": "^1.2.12",
"@iconify-icons/ri": "^1.2.10",
"@iconify/vue": "^4.1.2",
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@pureadmin/theme": "^3.2.0",
"@types/dagre": "^0.7.52",
"@types/gradient-string": "^1.1.6",
"@commitlint/cli": "^19.8.1",
"@commitlint/config-conventional": "^19.8.1",
"@commitlint/types": "^19.8.1",
"@eslint/js": "^9.35.0",
"@faker-js/faker": "^9.9.0",
"@iconify/json": "^2.2.384",
"@iconify/vue": "4.2.0",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@tailwindcss/vite": "^4.1.13",
"@types/codemirror": "^5.60.16",
"@types/dagre": "^0.7.53",
"@types/intro.js": "^5.1.5",
"@types/js-cookie": "^3.0.6",
"@types/node": "^20.12.13",
"@types/node": "^20.19.14",
"@types/nprogress": "^0.2.3",
"@types/path-browserify": "^1.0.3",
"@types/qrcode": "^1.5.5",
"@types/qs": "^6.9.15",
"@types/qs": "^6.14.0",
"@types/sortablejs": "^1.15.8",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"autoprefixer": "^10.4.19",
"boxen": "^7.1.1",
"cssnano": "^7.0.1",
"@vitejs/plugin-vue": "^6.0.1",
"@vitejs/plugin-vue-jsx": "^5.1.1",
"boxen": "^8.0.1",
"code-inspector-plugin": "^1.2.8",
"cssnano": "^7.1.1",
"dagre": "^0.8.5",
"eslint": "^9.3.0",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "^2.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.26.0",
"gradient-string": "^2.0.2",
"husky": "^9.0.11",
"lint-staged": "^15.2.5",
"postcss": "^8.4.38",
"postcss-html": "^1.7.0",
"postcss-import": "^16.1.0",
"eslint": "^9.35.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-vue": "^10.4.0",
"gradient-string": "^3.0.0",
"husky": "^9.1.7",
"lint-staged": "^16.1.6",
"postcss": "^8.5.6",
"postcss-html": "^1.8.0",
"postcss-load-config": "^6.0.1",
"postcss-scss": "^4.0.9",
"prettier": "^3.2.5",
"rimraf": "^5.0.7",
"rollup-plugin-visualizer": "^5.12.0",
"sass": "^1.77.4",
"stylelint": "^16.6.1",
"stylelint-config-recess-order": "^5.0.1",
"stylelint-config-recommended-vue": "^1.5.0",
"stylelint-config-standard-scss": "^13.1.0",
"stylelint-prettier": "^5.0.0",
"svgo": "^3.3.2",
"tailwindcss": "^3.4.3",
"typescript": "^5.4.5",
"vite": "^5.2.12",
"prettier": "^3.6.2",
"rimraf": "^6.0.1",
"rollup-plugin-visualizer": "^6.0.3",
"sass": "^1.92.1",
"stylelint": "^16.24.0",
"stylelint-config-recess-order": "^7.3.0",
"stylelint-config-recommended-vue": "^1.6.1",
"stylelint-config-standard-scss": "^14.0.0",
"stylelint-prettier": "^5.0.3",
"svgo": "^4.0.0",
"tailwindcss": "^4.1.13",
"typescript": "^5.9.2",
"typescript-eslint": "^8.43.0",
"unplugin-icons": "^22.3.0",
"vite": "^7.1.5",
"vite-plugin-cdn-import": "^1.0.1",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-fake-server": "^2.1.1",
"vite-plugin-fake-server": "^2.2.0",
"vite-plugin-remove-console": "^2.2.0",
"vite-plugin-router-warn": "^1.0.0",
"vite-svg-loader": "^5.1.0",
"vue-eslint-parser": "^9.4.2",
"vue-tsc": "^1.8.27"
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.0.7"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0",
"node": "^20.19.0 || >=22.12.0",
"pnpm": ">=9"
},
"pnpm": {
"allowedDeprecatedVersions": {
"are-we-there-yet": "*",
"sourcemap-codec": "*",
"lodash.isequal": "*",
"domexception": "*",
"w3c-hr-time": "*",
"inflight": "*",
"npmlog": "*",
"rimraf": "*",
"stable": "*",
"abab": "*"
"gauge": "*",
"abab": "*",
"glob": "*"
},
"peerDependencyRules": {
"allowedVersions": {
"eslint": "9"
}
}
"onlyBuiltDependencies": [
"@parcel/watcher",
"core-js",
"es5-ext",
"esbuild",
"typeit",
"vue-demi"
],
"ignoredBuiltDependencies": [
"@tailwindcss/oxide",
"vue3-danmaku"
]
}
}
}

8986
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,10 +3,6 @@
/** @type {import('postcss-load-config').Config} */
export default {
plugins: {
"postcss-import": {},
"tailwindcss/nesting": {},
tailwindcss: {},
autoprefixer: {},
...(process.env.NODE_ENV === "production" ? { cssnano: {} } : {})
}
};

View File

@@ -1,5 +1,5 @@
{
"Version": "5.7.0",
"Version": "6.1.0",
"Title": "PureAdmin",
"FixedHeader": true,
"HiddenSideBar": false,

View File

@@ -2,6 +2,7 @@
<el-config-provider :locale="currentLocale">
<router-view />
<ReDialog />
<ReDrawer />
</el-config-provider>
</template>
@@ -10,16 +11,19 @@ import { defineComponent } from "vue";
import { checkVersion } from "version-rocket";
import { ElConfigProvider } from "element-plus";
import { ReDialog } from "@/components/ReDialog";
import { ReDrawer } from "@/components/ReDrawer";
import en from "element-plus/es/locale/lang/en";
import zhCn from "element-plus/es/locale/lang/zh-cn";
import plusEn from "plus-pro-components/es/locale/lang/en";
import plusZhCn from "plus-pro-components/es/locale/lang/zh-cn";
import { ElNotification } from "element-plus";
export default defineComponent({
name: "app",
components: {
[ElConfigProvider.name]: ElConfigProvider,
ReDialog
ReDialog,
ReDrawer
},
computed: {
currentLocale() {
@@ -50,6 +54,32 @@ export default defineComponent({
}
);
}
},
mounted() {
ElNotification({
title: "国庆限时优惠活动",
duration: 0,
customClass: "fullpage-notification",
// @ts-expect-error
style: { width: "260px" },
position: "bottom-right",
dangerouslyUseHTMLString: true,
message: `
<a target='_blank' class='block text-base text-center border mt-4 rounded hover:text-[red]!' href='https://pure-admin.cn/pages/service/#最新活动'>
点我查看
</a>
`
});
}
});
</script>
<style>
.fullpage-notification > .el-notification__group > .el-notification__closeBtn {
top: 15px;
}
.fullpage-notification > div > h2 {
color: red;
font-size: 18px;
}
</style>

View File

@@ -11,6 +11,8 @@ export type UserResult = {
nickname: string;
/** 当前登录用户的角色 */
roles: Array<string>;
/** 按钮级别权限 */
permissions: Array<string>;
/** `token` */
accessToken: string;
/** 用于调用刷新`accessToken`的接口时所需的`token` */

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" aria-hidden="true" class="iconify iconify--ant-design" viewBox="0 0 1024 1024"><path fill="currentColor" d="M864 170h-60c-4.4 0-8 3.6-8 8v518H310v-73c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 0 0 0 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-75h498c35.3 0 64-28.7 64-64V178c0-4.4-3.6-8-8-8"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" class="iconify iconify--ant-design" viewBox="0 0 1024 1024"><path fill="currentColor" d="M864 170h-60c-4.4 0-8 3.6-8 8v518H310v-73c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 0 0 0 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-75h498c35.3 0 64-28.7 64-64V178c0-4.4-3.6-8-8-8"/></svg>

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 332 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" aria-hidden="true" class="re-screen" color="#00000073" viewBox="0 0 16 16"><path fill="currentColor" d="M3.5 4H1V3h2V1h1v2.5zM13 3V1h-1v2.5l.5.5H15V3zm-1 9.5V15h1v-2h2v-1h-2.5zM1 12v1h2v2h1v-2.5l-.5-.5zm11-1.5-.5.5h-7l-.5-.5v-5l.5-.5h7l.5.5zM10 7H6v2h4z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" class="re-screen" color="#00000073" viewBox="0 0 16 16"><path fill="currentColor" d="M3.5 4H1V3h2V1h1v2.5zM13 3V1h-1v2.5l.5.5H15V3zm-1 9.5V15h1v-2h2v-1h-2.5zM1 12v1h2v2h1v-2.5l-.5-.5zm11-1.5-.5.5h-7l-.5-.5v-5l.5-.5h7l.5.5zM10 7H6v2h4z"/></svg>

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" aria-hidden="true" class="re-screen" color="#00000073" viewBox="0 0 16 16"><path fill="currentColor" d="M3 12h10V4H3zm2-6h6v4H5zM2 6H1V2.5l.5-.5H5v1H2zm13-3.5V6h-1V3h-3V2h3.5zM14 10h1v3.5l-.5.5H11v-1h3zM2 13h3v1H1.5l-.5-.5V10h1z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" class="re-screen" color="#00000073" viewBox="0 0 16 16"><path fill="currentColor" d="M3 12h10V4H3zm2-6h6v4H5zM2 6H1V2.5l.5-.5H5v1H2zm13-3.5V6h-1V3h-3V2h3.5zM14 10h1v3.5l-.5.5H11v-1h3zM2 13h3v1H1.5l-.5-.5V10h1z"/></svg>

Before

Width:  |  Height:  |  Size: 302 B

After

Width:  |  Height:  |  Size: 283 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" aria-hidden="true" class="globalization" viewBox="0 0 512 512"><path fill="currentColor" d="m478.33 433.6-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362 368 281.65 401.17 362zm-66.99-19.08a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73 39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93.92 1.19 1.83 2.35 2.74 3.51-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59 22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" class="globalization" viewBox="0 0 512 512"><path fill="currentColor" d="m478.33 433.6-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362 368 281.65 401.17 362zm-66.99-19.08a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73 39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93.92 1.19 1.83 2.35 2.74 3.51-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59 22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z"/></svg>

Before

Width:  |  Height:  |  Size: 826 B

After

Width:  |  Height:  |  Size: 807 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" aria-hidden="true" class="iconify iconify--mdi" viewBox="0 0 24 24"><path fill="currentColor" d="M1 7h6v2H3v2h4v2H3v2h4v2H1zm10 0h4v2h-4v2h2a2 2 0 0 1 2 2v2c0 1.11-.89 2-2 2H9v-2h4v-2h-2a2 2 0 0 1-2-2V9c0-1.1.9-2 2-2m8 0h2a2 2 0 0 1 2 2v1h-2V9h-2v6h2v-1h2v1c0 1.11-.89 2-2 2h-2a2 2 0 0 1-2-2V9c0-1.1.9-2 2-2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" class="iconify iconify--mdi" viewBox="0 0 24 24"><path fill="currentColor" d="M1 7h6v2H3v2h4v2H3v2h4v2H1zm10 0h4v2h-4v2h2a2 2 0 0 1 2 2v2c0 1.11-.89 2-2 2H9v-2h4v-2h-2a2 2 0 0 1-2-2V9c0-1.1.9-2 2-2m8 0h2a2 2 0 0 1 2 2v1h-2V9h-2v6h2v-1h2v1c0 1.11-.89 2-2 2h-2a2 2 0 0 1-2-2V9c0-1.1.9-2 2-2"/></svg>

Before

Width:  |  Height:  |  Size: 379 B

After

Width:  |  Height:  |  Size: 360 B

View File

@@ -1 +1 @@
<svg width="32" height="32" fill="currentColor" aria-hidden="true" data-icon="holder" viewBox="64 64 896 896"><path d="M300 276.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97m0 284a56 56 0 1 0 56-97 56 56 0 0 0-56 97M640 228a56 56 0 1 0 112 0 56 56 0 0 0-112 0m0 284a56 56 0 1 0 112 0 56 56 0 0 0-112 0M300 844.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97M640 796a56 56 0 1 0 112 0 56 56 0 0 0-112 0"/></svg>
<svg width="32" height="32" fill="currentColor" data-icon="holder" viewBox="64 64 896 896"><path d="M300 276.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97m0 284a56 56 0 1 0 56-97 56 56 0 0 0-56 97M640 228a56 56 0 1 0 112 0 56 56 0 0 0-112 0m0 284a56 56 0 1 0 112 0 56 56 0 0 0-112 0M300 844.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97M640 796a56 56 0 1 0 112 0 56 56 0 0 0-112 0"/></svg>

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 373 B

View File

@@ -95,7 +95,7 @@ function onMouseleave() {
:view-style="{ overflow: 'hidden' }"
class="border-t border-[#e5e7eb]"
>
<ul class="flex flex-wrap justify-around mb-1">
<ul class="flex flex-wrap justify-around mb-1!">
<li
v-for="(animate, index) in animatesList"
:key="index"

View File

@@ -119,7 +119,7 @@ export default defineComponent({
"p-[6px]",
"h-[30px]",
"w-[30px]",
"outline-none",
"outline-hidden",
"rounded-[4px]",
"cursor-pointer",
"hover:bg-[rgba(0,0,0,0.06)]"

View File

@@ -8,13 +8,14 @@ import {
} from "./index";
import { ref, computed } from "vue";
import { isFunction } from "@pureadmin/utils";
import Fullscreen from "@iconify-icons/ri/fullscreen-fill";
import ExitFullscreen from "@iconify-icons/ri/fullscreen-exit-fill";
import Fullscreen from "~icons/ri/fullscreen-fill";
import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
defineOptions({
name: "ReDialog"
});
const sureBtnMap = ref({});
const fullscreen = ref(false);
const footerButtons = computed(() => {
@@ -43,10 +44,26 @@ const footerButtons = computed(() => {
bg: true,
popconfirm: options?.popconfirm,
btnClick: ({ dialog: { options, index } }) => {
const done = () =>
if (options?.sureBtnLoading) {
sureBtnMap.value[index] = Object.assign(
{},
sureBtnMap.value[index],
{
loading: true
}
);
}
const closeLoading = () => {
if (options?.sureBtnLoading) {
sureBtnMap.value[index].loading = false;
}
};
const done = () => {
closeLoading();
closeDialog(options, index, { command: "sure" });
};
if (options?.beforeSure && isFunction(options?.beforeSure)) {
options.beforeSure(done, { options, index });
options.beforeSure(done, { options, index, closeLoading });
} else {
done();
}
@@ -62,7 +79,7 @@ const fullscreenClass = computed(() => {
"el-dialog__close",
"-translate-x-2",
"cursor-pointer",
"hover:!text-[red]"
"hover:text-[red]!"
];
});
@@ -172,6 +189,7 @@ function handleClose(
<el-button
v-else
v-bind="btn"
:loading="key === 1 && sureBtnMap[index]?.loading"
@click="
btn.btnClick({
dialog: { options, index },

View File

@@ -69,11 +69,11 @@ type DialogProps = {
type Popconfirm = {
/** 标题 */
title?: string;
/** 确按钮文字 */
/** 确按钮文字 */
confirmButtonText?: string;
/** 取消按钮文字 */
cancelButtonText?: string;
/** 确按钮类型,默认 `primary` */
/** 确按钮类型,默认 `primary` */
confirmButtonType?: ButtonType;
/** 取消按钮类型,默认 `text` */
cancelButtonType?: ButtonType;
@@ -121,7 +121,7 @@ type ButtonProps = {
round?: boolean;
/** 是否为圆形按钮,默认 `false` */
circle?: boolean;
/** 确按钮的 `Popconfirm` 气泡确认框相关配置 */
/** 确按钮的 `Popconfirm` 气泡确认框相关配置 */
popconfirm?: Popconfirm;
/** 是否为加载中状态,默认 `false` */
loading?: boolean;
@@ -160,8 +160,10 @@ interface DialogOptions extends DialogProps {
props?: any;
/** 是否隐藏 `Dialog` 按钮操作区的内容 */
hideFooter?: boolean;
/** 确按钮的 `Popconfirm` 气泡确认框相关配置 */
/** 确按钮的 `Popconfirm` 气泡确认框相关配置 */
popconfirm?: Popconfirm;
/** 点击确定按钮后是否开启 `loading` 加载动画 */
sureBtnLoading?: boolean;
/**
* @description 自定义对话框标题的内容渲染器
* @see {@link https://element-plus.org/zh-CN/component/dialog.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%A4%B4%E9%83%A8}
@@ -259,10 +261,13 @@ interface DialogOptions extends DialogProps {
done: Function,
{
options,
index
index,
closeLoading
}: {
options: DialogOptions;
index: number;
/** 关闭确定按钮的 `loading` 加载动画 */
closeLoading: Function;
}
) => void;
}

View File

@@ -0,0 +1,64 @@
import { ref } from "vue";
import reDrawer from "./index.vue";
import { useTimeoutFn } from "@vueuse/core";
import { withInstall } from "@pureadmin/utils";
import type {
EventType,
ArgsType,
DrawerProps,
DrawerOptions,
ButtonProps
} from "./type";
const drawerStore = ref<Array<DrawerOptions>>([]);
/** 打开抽屉 */
const addDrawer = (options: DrawerOptions) => {
const open = () =>
drawerStore.value.push(Object.assign(options, { visible: true }));
if (options?.openDelay) {
useTimeoutFn(() => {
open();
}, options.openDelay);
} else {
open();
}
};
/** 关闭抽屉 */
const closeDrawer = (options: DrawerOptions, index: number, args?: any) => {
drawerStore.value[index].visible = false;
options.closeCallBack && options.closeCallBack({ options, index, args });
const closeDelay = options?.closeDelay ?? 200;
useTimeoutFn(() => {
drawerStore.value.splice(index, 1);
}, closeDelay);
};
/**
* @description 更改抽屉自身属性值
* @param value 属性值
* @param key 属性,默认`title`
* @param index 弹框索引(默认`0`,代表只有一个弹框,对于嵌套弹框要改哪个弹框的属性值就把该弹框索引赋给`index`
*/
const updateDrawer = (value: any, key = "title", index = 0) => {
drawerStore.value[index][key] = value;
};
/** 关闭所有弹框 */
const closeAllDrawer = () => {
drawerStore.value = [];
};
const ReDrawer = withInstall(reDrawer);
export type { EventType, ArgsType, DrawerOptions, DrawerProps, ButtonProps };
export {
ReDrawer,
drawerStore,
addDrawer,
closeDrawer,
updateDrawer,
closeAllDrawer
};

View File

@@ -0,0 +1,169 @@
<script setup lang="ts">
import {
type EventType,
type ButtonProps,
type DrawerOptions,
closeDrawer,
drawerStore
} from "./index";
import { computed, ref } from "vue";
import { isFunction } from "@pureadmin/utils";
defineOptions({
name: "ReDrawer"
});
const sureBtnMap = ref({});
const footerButtons = computed(() => {
return (options: DrawerOptions) => {
return options?.footerButtons?.length > 0
? options.footerButtons
: ([
{
label: "取消",
text: true,
bg: true,
btnClick: ({ drawer: { options, index } }) => {
const done = () =>
closeDrawer(options, index, { command: "cancel" });
if (options?.beforeCancel && isFunction(options?.beforeCancel)) {
options.beforeCancel(done, { options, index });
} else {
done();
}
}
},
{
label: "确定",
type: "primary",
text: true,
bg: true,
popConfirm: options?.popConfirm,
btnClick: ({ drawer: { options, index } }) => {
if (options?.sureBtnLoading) {
sureBtnMap.value[index] = Object.assign(
{},
sureBtnMap.value[index],
{
loading: true
}
);
}
const closeLoading = () => {
if (options?.sureBtnLoading) {
sureBtnMap.value[index].loading = false;
}
};
const done = () => {
closeLoading();
closeDrawer(options, index, { command: "sure" });
};
if (options?.beforeSure && isFunction(options?.beforeSure)) {
options.beforeSure(done, { options, index, closeLoading });
} else {
done();
}
}
}
] as Array<ButtonProps>);
};
});
function eventsCallBack(
event: EventType,
options: DrawerOptions,
index: number
) {
if (options?.[event] && isFunction(options?.[event])) {
return options?.[event]({ options, index });
}
}
/**
*
* @param {DrawerOptions} options - 包含抽屉相关配置的对象
* @param {number} index - 抽屉的索引
* @param {Object} args - 传递给关闭抽屉操作的参数对象,默认为 { command: 'close' }
* @returns {void} 这个函数不返回任何值
*/
function handleClose(
options: DrawerOptions,
index: number,
args = { command: "close" }
) {
closeDrawer(options, index, args);
eventsCallBack("close", options, index);
}
</script>
<template>
<el-drawer
v-for="(options, index) in drawerStore"
:key="index"
v-bind="options"
v-model="options.visible"
class="pure-drawer"
:append-to-body="!!options?.appendToBody"
:append-to="options?.appendTo ? options.appendTo : 'body'"
:destroy-on-close="!!options?.destroyOnClose"
:lock-scroll="!!options?.lockScroll"
@closed="handleClose(options, index)"
@opened="eventsCallBack('open', options, index)"
@open-auto-focus="eventsCallBack('openAutoFocus', options, index)"
@close-auto-focus="eventsCallBack('closeAutoFocus', options, index)"
>
<!-- header -->
<template
v-if="options?.headerRenderer"
#header="{ close, titleId, titleClass }"
>
<component
:is="options?.headerRenderer({ close, titleId, titleClass })"
/>
</template>
<!-- body -->
<component
v-bind="options?.props"
:is="options.contentRenderer({ options, index })"
@close="args => handleClose(options, index, args)"
/>
<!-- footer -->
<template v-if="!options?.hideFooter" #footer>
<template v-if="options?.footerRenderer">
<component :is="options?.footerRenderer({ options, index })" />
</template>
<span v-else>
<template v-for="(btn, key) in footerButtons(options)" :key="key">
<el-popconfirm
v-if="btn.popConfirm"
v-bind="btn.popConfirm"
@confirm="
btn.btnClick({
drawer: { options, index },
button: { btn, index: key }
})
"
>
<template #reference>
<el-button v-bind="btn">{{ btn?.label }}</el-button>
</template>
</el-popconfirm>
<el-button
v-else
v-bind="btn"
:loading="key === 1 && sureBtnMap[index]?.loading"
@click="
btn.btnClick({
drawer: { options, index },
button: { btn, index: key }
})
"
>
{{ btn?.label }}
</el-button>
</template>
</span>
</template>
</el-drawer>
</template>

View File

@@ -0,0 +1,262 @@
import type { CSSProperties, VNode, Component } from "vue";
type DoneFn = (cancel?: boolean) => void;
type EventType = "open" | "close" | "openAutoFocus" | "closeAutoFocus";
type ArgsType = {
/** `cancel` 点击取消按钮、`sure` 点击确定按钮、`close` 点击右上角关闭按钮或空白页或按下了 `esc` 键 */
command: "cancel" | "sure" | "close";
};
type ButtonType =
| "primary"
| "success"
| "warning"
| "danger"
| "info"
| "text";
type DrawerProps = {
/** `Drawer` 的显示与隐藏 */
visible?: boolean;
/** `Drawer` 自身是否插入至 `body` 元素上。嵌套的 `Drawer` 必须指定该属性并赋值为 `true`,默认 `false` */
appendToBody?: boolean;
/** 挂载到哪个 `DOM` 元素 将覆盖 `appendToBody` */
appendTo?: string;
/** 是否在 `Drawer` 出现时将 `body` 滚动锁定,默认 `true` */
lockScroll?: boolean;
/** 关闭前的回调,会暂停 `Drawer` 的关闭 回调函数内执行 `done` 参数方法的时候才是真正关闭对话框的时候 */
beforeClose?: (done: DoneFn) => void;
/** 是否可以通过点击 `modal` 关闭 `Drawer` ,默认 `true` */
closeOnClickModal?: boolean;
/** 是否可以通过按下 `ESC` 关闭 `Drawer` ,默认 `true` */
closeOnPressEscape?: boolean;
/** 是否显示关闭按钮,默认 `true` */
showClose?: boolean;
/** `Drawer` 打开的延时时间,单位毫秒,默认 `0` */
openDelay?: number;
/** `Drawer` 关闭的延时时间,单位毫秒,默认 `0` */
closeDelay?: number;
/** `Drawer` 自定义类名 */
class?: string;
/** `Drawer` 的自定义样式 */
style?: CSSProperties;
/** 控制是否在关闭 `Drawer` 之后将子元素全部销毁,默认 `false` */
destroyOnClose?: boolean;
/** 是否需要遮罩层,默认 `true` */
modal?: boolean;
/** `Drawer` 打开的方向,默认 `rtl` */
direction?: "rtl" | "ltr" | "ttb" | "btt";
/** `Drawer` 窗体的大小, 当使用 `number` 类型时, 以像素为单位, 当使用 `string` 类型时, 请传入 `'x%'`, 否则便会以 `number` 类型解释 */
size?: string | number;
/** `Drawer` 的标题 */
title?: string;
/** 控制是否显示 `header` 栏, 默认为 `true`, 当此项为 `false` 时, `title attribute` 和 `title slot` 均不生效 */
withHeader?: boolean;
/** 遮罩层的自定义类名 */
modalClass?: string;
/** 设置 `z-index` */
zIndex?: number;
/** `header` 的 `aria-level` 属性,默认 `2` */
headerAriaLevel?: string;
};
//element-plus.org/zh-CN/component/popConfirm.html#attributes
type PopConfirm = {
/** 标题 */
title?: string;
/** 确认按钮文字 */
confirmButtonText?: string;
/** 取消按钮文字 */
cancelButtonText?: string;
/** 确认按钮类型,默认 `primary` */
confirmButtonType?: ButtonType;
/** 取消按钮类型,默认 `text` */
cancelButtonType?: ButtonType;
/** 自定义图标,默认 `QuestionFilled` */
icon?: string | Component;
/** `Icon` 颜色,默认 `#f90` */
iconColor?: string;
/** 是否隐藏 `Icon`,默认 `false` */
hideIcon?: boolean;
/** 关闭时的延迟,默认 `200` */
hideAfter?: number;
/** 是否将 `popover` 的下拉列表插入至 `body` 元素,默认 `true` */
teleported?: boolean;
/** 当 `popover` 组件长时间不触发且 `persistent` 属性设置为 `false` 时, `popover` 将会被删除,默认 `false` */
persistent?: boolean;
/** 弹层宽度,最小宽度 `150px`,默认 `150` */
width?: string | number;
};
type BtnClickDrawer = {
options?: DrawerOptions;
index?: number;
};
type BtnClickButton = {
btn?: ButtonProps;
index?: number;
};
/** https://element-plus.org/zh-CN/component/button.html#button-attributes */
type ButtonProps = {
/** 按钮文字 */
label: string;
/** 按钮尺寸 */
size?: "large" | "default" | "small";
/** 按钮类型 */
type?: "primary" | "success" | "warning" | "danger" | "info";
/** 是否为朴素按钮,默认 `false` */
plain?: boolean;
/** 是否为文字按钮,默认 `false` */
text?: boolean;
/** 是否显示文字按钮背景颜色,默认 `false` */
bg?: boolean;
/** 是否为链接按钮,默认 `false` */
link?: boolean;
/** 是否为圆角按钮,默认 `false` */
round?: boolean;
/** 是否为圆形按钮,默认 `false` */
circle?: boolean;
/** 确认按钮的 `PopConfirm` 气泡确认框相关配置 */
popConfirm?: PopConfirm;
/** 是否为加载中状态,默认 `false` */
loading?: boolean;
/** 自定义加载中状态图标组件 */
loadingIcon?: string | Component;
/** 按钮是否为禁用状态,默认 `false` */
disabled?: boolean;
/** 图标组件 */
icon?: string | Component;
/** 是否开启原生 `autofocus` 属性,默认 `false` */
autofocus?: boolean;
/** 原生 `type` 属性,默认 `button` */
nativeType?: "button" | "submit" | "reset";
/** 自动在两个中文字符之间插入空格 */
autoInsertSpace?: boolean;
/** 自定义按钮颜色, 并自动计算 `hover` 和 `active` 触发后的颜色 */
color?: string;
/** `dark` 模式, 意味着自动设置 `color` 为 `dark` 模式的颜色,默认 `false` */
dark?: boolean;
/** 自定义元素标签 */
tag?: string | Component;
/** 点击按钮后触发的回调 */
btnClick?: ({
drawer,
button
}: {
/** 当前 `Drawer` 信息 */
drawer: BtnClickDrawer;
/** 当前 `button` 信息 */
button: BtnClickButton;
}) => void;
};
interface DrawerOptions extends DrawerProps {
/** 内容区组件的 `props`,可通过 `defineProps` 接收 */
props?: any;
/** 是否隐藏 `Drawer` 按钮操作区的内容 */
hideFooter?: boolean;
/** 确认按钮的 `PopConfirm` 气泡确认框相关配置 */
popConfirm?: PopConfirm;
/** 点击确定按钮后是否开启 `loading` 加载动画 */
sureBtnLoading?: boolean;
/**
* @description 自定义抽屉标题的内容渲染器
* @see {@link https://element-plus.org/zh-CN/component/drawer.html#%E6%8F%92%E6%A7%BD}
*/
headerRenderer?: ({
close,
titleId,
titleClass
}: {
close: Function;
titleId: string;
titleClass: string;
}) => VNode | Component;
/** 自定义内容渲染器 */
contentRenderer?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => VNode | Component;
/** 自定义按钮操作区的内容渲染器,会覆盖`footerButtons`以及默认的 `取消` 和 `确定` 按钮 */
footerRenderer?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => VNode | Component;
/** 自定义底部按钮操作 */
footerButtons?: Array<ButtonProps>;
/** `Drawer` 打开后的回调 */
open?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => void;
/** `Drawer` 关闭后的回调只有点击右上角关闭按钮或空白页或按下了esc键关闭页面时才会触发 */
close?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => void;
/** `Drawer` 关闭后的回调。 `args` 返回的 `command` 值解析:`cancel` 点击取消按钮、`sure` 点击确定按钮、`close` 点击右上角关闭按钮或空白页或按下了esc键 */
closeCallBack?: ({
options,
index,
args
}: {
options: DrawerOptions;
index: number;
args: any;
}) => void;
/** 输入焦点聚焦在 `Drawer` 内容时的回调 */
openAutoFocus?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => void;
/** 输入焦点从 `Drawer` 内容失焦时的回调 */
closeAutoFocus?: ({
options,
index
}: {
options: DrawerOptions;
index: number;
}) => void;
/** 点击底部取消按钮的回调,会暂停 `Drawer` 的关闭. 回调函数内执行 `done` 参数方法的时候才是真正关闭对话框的时候 */
beforeCancel?: (
done: Function,
{
options,
index
}: {
options: DrawerOptions;
index: number;
}
) => void;
/** 点击底部确定按钮的回调,会暂停 `Drawer` 的关闭. 回调函数内执行 `done` 参数方法的时候才是真正关闭对话框的时候 */
beforeSure?: (
done: Function,
{
options,
index,
closeLoading
}: {
options: DrawerOptions;
index: number;
closeLoading: Function;
}
) => void;
}
export type { ButtonProps, DrawerOptions, ArgsType, DrawerProps, EventType };

View File

@@ -3,7 +3,7 @@ import { ref, unref, onMounted } from "vue";
import { LogicFlow } from "@logicflow/core";
interface Props {
lf: LogicFlow;
lf?: LogicFlow;
catTurboData?: boolean;
}
@@ -114,7 +114,8 @@ onMounted(() => {
:style="{
cursor: item.disabled === false ? 'pointer' : 'not-allowed',
color: item.disabled === false ? '' : '#00000040',
background: 'transparent'
background: 'transparent',
border: 'none'
}"
@click="onControl(item, key)"
>

View File

@@ -9,8 +9,8 @@ type nodeListType = {
};
interface Props {
lf: LogicFlow;
nodeList: Array<nodeListType>;
lf?: LogicFlow;
nodeList?: Array<nodeListType>;
}
const props = withDefaults(defineProps<Props>(), {

View File

@@ -23,26 +23,25 @@
function h() {
n || ((n = !0), o());
}
(t = function () {
((t = function () {
var c, t, e, o;
((o = document.createElement("div")).innerHTML = i),
(((o = document.createElement("div")).innerHTML = i),
(i = null),
(e = o.getElementsByTagName("svg")[0]) &&
(e.setAttribute("aria-hidden", "true"),
(e.style.position = "absolute"),
((e.style.position = "absolute"),
(e.style.width = 0),
(e.style.height = 0),
(e.style.overflow = "hidden"),
(c = e),
(t = document.body).firstChild
? ((o = c), (e = t.firstChild).parentNode.insertBefore(o, e))
: t.appendChild(c));
: t.appendChild(c)));
}),
document.addEventListener
? ~["complete", "loaded", "interactive"].indexOf(document.readyState)
? setTimeout(t, 0)
: ((e = function () {
document.removeEventListener("DOMContentLoaded", e, !1), t();
(document.removeEventListener("DOMContentLoaded", e, !1), t());
}),
document.addEventListener("DOMContentLoaded", e, !1))
: document.attachEvent &&
@@ -59,5 +58,5 @@
})(),
(a.onreadystatechange = function () {
"complete" == a.readyState && ((a.onreadystatechange = null), h());
}));
})));
})(window);

View File

@@ -2,7 +2,7 @@
import { IconJson } from "@/components/ReIcon/data";
import { cloneDeep, isAllEmpty } from "@pureadmin/utils";
import { ref, computed, CSSProperties, watch } from "vue";
import Search from "@iconify-icons/ri/search-eye-line";
import Search from "~icons/ri/search-eye-line";
type ParameterCSSProperties = (item?: string) => CSSProperties | undefined;
@@ -158,7 +158,7 @@ watch(
:name="pane.name"
>
<el-scrollbar height="220px">
<ul class="flex flex-wrap px-2 ml-2">
<ul class="flex flex-wrap px-2! ml-2!">
<li
v-for="(item, key) in pageList"
:key="key"
@@ -194,11 +194,11 @@ watch(
:pager-count="5"
layout="pager"
background
small
size="small"
@current-change="onCurrentChange"
/>
<el-button
class="justify-end mr-2 ml-2"
class="justify-end mx-2!"
type="danger"
size="small"
text
@@ -219,8 +219,8 @@ watch(
&:hover {
color: var(--el-color-primary);
border-color: var(--el-color-primary);
transition: all 0.4s;
transform: scaleX(1.05);
transition: all 0.4s;
}
}

View File

@@ -1,10 +1,10 @@
import type { iconType } from "./types";
import { h, defineComponent, type Component } from "vue";
import { IconifyIconOnline, IconifyIconOffline, FontIcon } from "../index";
import { FontIcon, IconifyIconOnline, IconifyIconOffline } from "../index";
/**
* 支持 `iconfont`、自定义 `svg` 以及 `iconify` 中所有的图标
* @see 点击查看文档图标篇 {@link https://pure-admin.github.io/pure-admin-doc/pages/icon/}
* @see 点击查看文档图标篇 {@link https://pure-admin.cn/pages/icon/}
* @param icon 必传 图标
* @param attrs 可选 iconType 属性
* @returns Component
@@ -49,10 +49,12 @@ export function useRenderIcon(icon: any, attrs?: iconType): Component {
return defineComponent({
name: "Icon",
render() {
const IconifyIcon =
icon && icon.includes(":") ? IconifyIconOnline : IconifyIconOffline;
if (!icon) return;
const IconifyIcon = icon.includes(":")
? IconifyIconOnline
: IconifyIconOffline;
return h(IconifyIcon, {
icon: icon,
icon,
...attrs
});
}

View File

@@ -27,8 +27,7 @@ export default defineComponent({
return h(
"svg",
{
class: "icon-svg",
"aria-hidden": true
class: "icon-svg"
},
{
default: () => [

View File

@@ -13,18 +13,35 @@ export default defineComponent({
render() {
if (typeof this.icon === "object") addIcon(this.icon, this.icon);
const attrs = this.$attrs;
return h(
IconifyIcon,
{
icon: this.icon,
style: attrs?.style
? Object.assign(attrs.style, { outline: "none" })
: { outline: "none" },
...attrs
},
{
default: () => []
}
);
if (typeof this.icon === "string") {
return h(
IconifyIcon,
{
icon: this.icon,
"aria-hidden": false,
style: attrs?.style
? Object.assign(attrs.style, { outline: "none" })
: { outline: "none" },
...attrs
},
{
default: () => []
}
);
} else {
return h(
this.icon,
{
"aria-hidden": false,
style: attrs?.style
? Object.assign(attrs.style, { outline: "none" })
: { outline: "none" },
...attrs
},
{
default: () => []
}
);
}
}
});

View File

@@ -17,6 +17,7 @@ export default defineComponent({
IconifyIcon,
{
icon: `${this.icon}`,
"aria-hidden": false,
style: attrs?.style
? Object.assign(attrs.style, { outline: "none" })
: { outline: "none" },

View File

@@ -1,70 +1,87 @@
// 这里存放本地图标,在 src/layout/index.vue 文件中加载,避免在首启动加载
import { getSvgInfo } from "@pureadmin/utils";
import { addIcon } from "@iconify/vue/dist/offline";
// https://icon-sets.iconify.design/ep/?keyword=ep
import EpMenu from "~icons/ep/menu?raw";
import EpEdit from "~icons/ep/edit?raw";
import EpGuide from "~icons/ep/guide?raw";
import EpSetUp from "~icons/ep/set-up?raw";
import EpMonitor from "~icons/ep/monitor?raw";
import EpLollipop from "~icons/ep/lollipop?raw";
import EpHistogram from "~icons/ep/histogram?raw";
import EpHomeFilled from "~icons/ep/home-filled?raw";
// https://icon-sets.iconify.design/ri/?keyword=ri
import RiMindMap from "~icons/ri/mind-map?raw";
import RiAdminFill from "~icons/ri/admin-fill?raw";
import RiTableLine from "~icons/ri/table-line?raw";
import RiLinksFill from "~icons/ri/links-fill?raw";
import RiAdminLine from "~icons/ri/admin-line?raw";
import RiListCheck from "~icons/ri/list-check?raw";
import RiSearchLine from "~icons/ri/search-line?raw";
import RiWindowLine from "~icons/ri/window-line?raw";
import RiUbuntuFill from "~icons/ri/ubuntu-fill?raw";
import RiHistoryFill from "~icons/ri/history-fill?raw";
import RiEditBoxLine from "~icons/ri/edit-box-line?raw";
import RiCodeBoxLine from "~icons/ri/code-box-line?raw";
import RiArtboardLine from "~icons/ri/artboard-line?raw";
import RiMarkdownLine from "~icons/ri/markdown-line?raw";
import RiFileInfoLine from "~icons/ri/file-info-line?raw";
import RiBankCardLine from "~icons/ri/bank-card-line?raw";
import RiFilePpt2Line from "~icons/ri/file-ppt-2-line?raw";
import RiGitBranchLine from "~icons/ri/git-branch-line?raw";
import RiSettings3Line from "~icons/ri/settings-3-line?raw";
import RiUserVoiceLine from "~icons/ri/user-voice-line?raw";
import RiBookmark2Line from "~icons/ri/bookmark-2-line?raw";
import RiFileSearchLine from "~icons/ri/file-search-line?raw";
import RiChatSearchLine from "~icons/ri/chat-search-line?raw";
import RiInformationLine from "~icons/ri/information-line?raw";
import RiTerminalWindowLine from "~icons/ri/terminal-window-line?raw";
import RiCheckboxCircleLine from "~icons/ri/checkbox-circle-line?raw";
import RiBarChartHorizontalLine from "~icons/ri/bar-chart-horizontal-line?raw";
const icons = [
// Element Plus Icon: https://github.com/element-plus/element-plus-icons
["ep/menu", EpMenu],
["ep/edit", EpEdit],
["ep/guide", EpGuide],
["ep/set-up", EpSetUp],
["ep/monitor", EpMonitor],
["ep/lollipop", EpLollipop],
["ep/histogram", EpHistogram],
["ep/home-filled", EpHomeFilled],
// Remix Icon: https://github.com/Remix-Design/RemixIcon
["ri/mind-map", RiMindMap],
["ri/admin-fill", RiAdminFill],
["ri/table-line", RiTableLine],
["ri/links-fill", RiLinksFill],
["ri/admin-line", RiAdminLine],
["ri/list-check", RiListCheck],
["ri/search-line", RiSearchLine],
["ri/window-line", RiWindowLine],
["ri/ubuntu-fill", RiUbuntuFill],
["ri/history-fill", RiHistoryFill],
["ri/edit-box-line", RiEditBoxLine],
["ri/code-box-line", RiCodeBoxLine],
["ri/artboard-line", RiArtboardLine],
["ri/markdown-line", RiMarkdownLine],
["ri/file-info-line", RiFileInfoLine],
["ri/bank-card-line", RiBankCardLine],
["ri/file-ppt-2-line", RiFilePpt2Line],
["ri/git-branch-line", RiGitBranchLine],
["ri/settings-3-line", RiSettings3Line],
["ri/user-voice-line", RiUserVoiceLine],
["ri/bookmark-2-line", RiBookmark2Line],
["ri/file-search-line", RiFileSearchLine],
["ri/chat-search-line", RiChatSearchLine],
["ri/information-line", RiInformationLine],
["ri/terminal-window-line", RiTerminalWindowLine],
["ri/checkbox-circle-line", RiCheckboxCircleLine],
["ri/bar-chart-horizontal-line", RiBarChartHorizontalLine]
];
// 本地菜单图标,后端在路由的 icon 中返回对应的图标字符串并且前端在此处使用 addIcon 添加即可渲染菜单图标
// @iconify-icons/ep
import Menu from "@iconify-icons/ep/menu";
import Edit from "@iconify-icons/ep/edit";
import SetUp from "@iconify-icons/ep/set-up";
import Guide from "@iconify-icons/ep/guide";
import Monitor from "@iconify-icons/ep/monitor";
import Lollipop from "@iconify-icons/ep/lollipop";
import Histogram from "@iconify-icons/ep/histogram";
import HomeFilled from "@iconify-icons/ep/home-filled";
addIcon("ep:menu", Menu);
addIcon("ep:edit", Edit);
addIcon("ep:set-up", SetUp);
addIcon("ep:guide", Guide);
addIcon("ep:monitor", Monitor);
addIcon("ep:lollipop", Lollipop);
addIcon("ep:histogram", Histogram);
addIcon("ep:home-filled", HomeFilled);
// @iconify-icons/ri
import Tag from "@iconify-icons/ri/bookmark-2-line";
import Ppt from "@iconify-icons/ri/file-ppt-2-line";
import Card from "@iconify-icons/ri/bank-card-line";
import Role from "@iconify-icons/ri/admin-fill";
import Info from "@iconify-icons/ri/file-info-line";
import Dept from "@iconify-icons/ri/git-branch-line";
import Table from "@iconify-icons/ri/table-line";
import Links from "@iconify-icons/ri/links-fill";
import Search from "@iconify-icons/ri/search-line";
import FlUser from "@iconify-icons/ri/admin-line";
import Setting from "@iconify-icons/ri/settings-3-line";
import MindMap from "@iconify-icons/ri/mind-map";
import BarChart from "@iconify-icons/ri/bar-chart-horizontal-line";
import LoginLog from "@iconify-icons/ri/window-line";
import Artboard from "@iconify-icons/ri/artboard-line";
import SystemLog from "@iconify-icons/ri/file-search-line";
import ListCheck from "@iconify-icons/ri/list-check";
import UbuntuFill from "@iconify-icons/ri/ubuntu-fill";
import OnlineUser from "@iconify-icons/ri/user-voice-line";
import EditBoxLine from "@iconify-icons/ri/edit-box-line";
import OperationLog from "@iconify-icons/ri/history-fill";
import InformationLine from "@iconify-icons/ri/information-line";
import TerminalWindowLine from "@iconify-icons/ri/terminal-window-line";
import CheckboxCircleLine from "@iconify-icons/ri/checkbox-circle-line";
addIcon("ri:bookmark-2-line", Tag);
addIcon("ri:file-ppt-2-line", Ppt);
addIcon("ri:bank-card-line", Card);
addIcon("ri:admin-fill", Role);
addIcon("ri:file-info-line", Info);
addIcon("ri:git-branch-line", Dept);
addIcon("ri:links-fill", Links);
addIcon("ri:table-line", Table);
addIcon("ri:search-line", Search);
addIcon("ri:admin-line", FlUser);
addIcon("ri:settings-3-line", Setting);
addIcon("ri:mind-map", MindMap);
addIcon("ri:bar-chart-horizontal-line", BarChart);
addIcon("ri:window-line", LoginLog);
addIcon("ri:file-search-line", SystemLog);
addIcon("ri:artboard-line", Artboard);
addIcon("ri:list-check", ListCheck);
addIcon("ri:ubuntu-fill", UbuntuFill);
addIcon("ri:user-voice-line", OnlineUser);
addIcon("ri:edit-box-line", EditBoxLine);
addIcon("ri:history-fill", OperationLog);
addIcon("ri:information-line", InformationLine);
addIcon("ri:terminal-window-line", TerminalWindowLine);
addIcon("ri:checkbox-circle-line", CheckboxCircleLine);
icons.forEach(([name, icon]) => {
addIcon(name as string, getSvgInfo(icon as string));
});

View File

@@ -0,0 +1,5 @@
import perms from "./src/perms";
const Perms = perms;
export { Perms };

View File

@@ -0,0 +1,20 @@
import { defineComponent, Fragment } from "vue";
import { hasPerms } from "@/utils/auth";
export default defineComponent({
name: "Perms",
props: {
value: {
type: undefined,
default: []
}
},
setup(props, { slots }) {
return () => {
if (!slots) return null;
return hasPerms(props.value) ? (
<Fragment>{slots.default?.()}</Fragment>
) : null;
};
}
});

View File

@@ -18,6 +18,8 @@ import {
getKeyList
} from "@pureadmin/utils";
import Fullscreen from "~icons/ri/fullscreen-fill";
import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
import DragIcon from "@/assets/table-bar/drag.svg?component";
import ExpandIcon from "@/assets/table-bar/expand.svg?component";
import RefreshIcon from "@/assets/table-bar/refresh.svg?component";
@@ -52,11 +54,12 @@ const props = {
export default defineComponent({
name: "PureTableBar",
props,
emits: ["refresh"],
emits: ["refresh", "fullscreen"],
setup(props, { emit, slots, attrs }) {
const size = ref("default");
const loading = ref(false);
const checkAll = ref(true);
const isFullscreen = ref(false);
const isIndeterminate = ref(false);
const instance = getCurrentInstance()!;
const isExpandAll = ref(props.isExpandAll);
@@ -84,9 +87,9 @@ export default defineComponent({
"text-black",
"dark:text-white",
"duration-100",
"hover:!text-primary",
"hover:text-primary!",
"cursor-pointer",
"outline-none"
"outline-hidden"
];
});
@@ -114,6 +117,11 @@ export default defineComponent({
toggleRowExpansionAll(props.tableRef.data, isExpandAll.value);
}
function onFullscreen() {
isFullscreen.value = !isFullscreen.value;
emit("fullscreen", isFullscreen.value);
}
function toggleRowExpansionAll(data, isExpansion) {
data.forEach(item => {
props.tableRef.toggleRowExpansion(item, isExpansion);
@@ -244,7 +252,18 @@ export default defineComponent({
return () => (
<>
<div {...attrs} class="w-[99/100] mt-2 px-2 pb-2 bg-bg_color">
<div
{...attrs}
class={[
"w-full",
"px-2",
"pb-2",
"bg-bg_color",
isFullscreen.value
? ["h-full!", "z-2002", "fixed", "inset-0"]
: "mt-2"
]}
>
<div class="flex justify-between w-full h-[60px] p-4">
{slots?.title ? (
slots.title()
@@ -298,7 +317,7 @@ export default defineComponent({
>
<div class={[topClass.value]}>
<el-checkbox
class="!-mr-1"
class="-mr-1!"
label="列展示"
v-model={checkAll.value}
indeterminate={isIndeterminate.value}
@@ -328,8 +347,8 @@ export default defineComponent({
class={[
"drag-btn w-[16px] mr-2",
isFixedColumn(item)
? "!cursor-no-drop"
: "!cursor-grab"
? "cursor-no-drop!"
: "cursor-grab!"
]}
onMouseenter={(event: {
preventDefault: () => void;
@@ -358,6 +377,14 @@ export default defineComponent({
</el-scrollbar>
</div>
</el-popover>
<el-divider direction="vertical" />
<iconifyIconOffline
class={["w-[16px]", iconClass.value]}
icon={isFullscreen.value ? ExitFullscreen : Fullscreen}
v-tippy={isFullscreen.value ? "退出全屏" : "全屏"}
onClick={() => onFullscreen()}
/>
</div>
</div>
{slots.default({

View File

@@ -11,7 +11,7 @@ import "./index.scss";
import propTypes from "@/utils/propTypes";
import { isString, cloneDeep } from "@pureadmin/utils";
import QRCode, { type QRCodeRenderersOptions } from "qrcode";
import RefreshRight from "@iconify-icons/ep/refresh-right";
import RefreshRight from "~icons/ep/refresh-right";
interface QrcodeLogo {
src?: string;

View File

@@ -60,12 +60,15 @@ export function copyObj() {
copyIsArray,
clone,
i = 1,
// eslint-disable-next-line prefer-rest-params
target = arguments[0] || {}, // 使用||运算符排除隐式强制类型转换为false的数据类型
deep = false,
// eslint-disable-next-line prefer-const
len = arguments.length;
if (typeof target === "boolean") {
deep = target;
// eslint-disable-next-line prefer-rest-params
target = arguments[1] || {};
i++;
}
@@ -79,6 +82,7 @@ export function copyObj() {
for (; i < len; i++) {
//所以如果源对象中数据类型为Undefined或Null那么就会跳过本次循环接着循环下一个源对象
// eslint-disable-next-line prefer-rest-params
if ((options = arguments[i]) != null) {
// 如果遇到源对象的数据类型为Boolean, Number for in循环会被跳过不执行for in循环// src用于判断target对象是否存在name属性
for (name in options) {

View File

@@ -98,7 +98,6 @@
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
transition: 0.1s;
}
.pure-segmented-group {

View File

@@ -6,7 +6,7 @@ export interface OptionsType {
label?: string | (() => VNode | Component);
/**
* @description 图标,采用平台内置的 `useRenderIcon` 函数渲染
* @see {@link 用法参考 https://pure-admin.github.io/pure-admin-doc/pages/icon/#%E9%80%9A%E7%94%A8%E5%9B%BE%E6%A0%87-userendericon-hooks }
* @see {@link 用法参考 https://pure-admin.cn/pages/icon/#%E9%80%9A%E7%94%A8%E5%9B%BE%E6%A0%87-userendericon-hooks }
*/
icon?: string | Component;
/** 图标属性、样式配置 */

View File

@@ -33,25 +33,26 @@
}
l();
}
(t = function () {
((t = function () {
var e,
t = document.createElement("div");
(t.innerHTML = i),
((t.innerHTML = i),
(i = null),
(t = t.getElementsByTagName("svg")[0]) &&
(t.setAttribute("aria-hidden", "true"),
(t.style.position = "absolute"),
((t.style.position = "absolute"),
(t.style.width = 0),
(t.style.height = 0),
(t.style.overflow = "hidden"),
(t = t),
(e = document.body).firstChild ? m(t, e.firstChild) : e.appendChild(t));
(e = document.body).firstChild
? m(t, e.firstChild)
: e.appendChild(t)));
}),
document.addEventListener
? ~["complete", "loaded", "interactive"].indexOf(document.readyState)
? setTimeout(t, 0)
: ((n = function () {
document.removeEventListener("DOMContentLoaded", n, !1), t();
(document.removeEventListener("DOMContentLoaded", n, !1), t());
}),
document.addEventListener("DOMContentLoaded", n, !1))
: document.attachEvent &&
@@ -61,5 +62,5 @@
a(),
(o.onreadystatechange = function () {
"complete" == o.readyState && ((o.onreadystatechange = null), l());
}));
})));
})(window);

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup>
import { h, onMounted, ref, useSlots } from "vue";
import { type TippyOptions, useTippy } from "vue-tippy";
<script setup lang="ts">
import { h, onMounted, ref } from "vue";
import { type TippyOptions, type TippyContent, useTippy } from "vue-tippy";
defineOptions({
name: "ReText"
@@ -17,7 +17,10 @@ const props = defineProps({
}
});
const $slots = useSlots();
const slots = defineSlots<{
content: () => TippyContent;
default: () => any;
}>();
const textRef = ref();
const tippyFunc = ref();
@@ -33,7 +36,7 @@ const isTextEllipsis = (el: HTMLElement) => {
};
const getTippyProps = () => ({
content: h($slots.content || $slots.default),
content: h(slots.content || slots.default),
...props.tippyProps
});

View File

@@ -90,9 +90,9 @@ export default defineComponent({
];
// 取得每一层的当前节点是不是在当前层级列表的最后一个
const lastnodeArr = [];
let currentNode = this.node;
let currentNode: any = this.node;
while (currentNode) {
let parentNode = currentNode.parent;
let parentNode: any = currentNode.parent;
// 兼容element-plus的 el-tree-v2 (Virtualized Tree 虚拟树)
if (currentNode.level === 1 && !currentNode.parent) {
// el-tree-v2的第一层node是没有parent的必需 treeData 创建一个parent

View File

@@ -12,6 +12,8 @@ import {
getCurrentInstance
} from "vue";
import Fullscreen from "~icons/ri/fullscreen-fill";
import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
import DragIcon from "@/assets/table-bar/drag.svg?component";
import ExpandIcon from "@/assets/table-bar/expand.svg?component";
import RefreshIcon from "@/assets/table-bar/refresh.svg?component";
@@ -50,11 +52,12 @@ const props = {
export default defineComponent({
name: "VxeTableBar",
props,
emits: ["refresh"],
emits: ["refresh", "fullscreen"],
setup(props, { emit, slots, attrs }) {
const size = ref("small");
const loading = ref(false);
const checkAll = ref(true);
const isFullscreen = ref(false);
const isIndeterminate = ref(false);
const instance = getCurrentInstance()!;
const isExpandAll = ref(props.isExpandAll);
@@ -77,9 +80,9 @@ export default defineComponent({
"text-black",
"dark:text-white",
"duration-100",
"hover:!text-primary",
"hover:text-primary!",
"cursor-pointer",
"outline-none"
"outline-hidden"
];
});
@@ -110,6 +113,11 @@ export default defineComponent({
props.vxeTableRef.refreshColumn();
}
function onFullscreen() {
isFullscreen.value = !isFullscreen.value;
emit("fullscreen", isFullscreen.value);
}
function reloadColumn() {
const curCheckedColumns = cloneDeep(dynamicColumns.value).filter(item =>
checkedColumns.value.includes(item.title)
@@ -237,7 +245,18 @@ export default defineComponent({
return () => (
<>
<div {...attrs} class="w-[99/100] mt-2 px-2 pb-2 bg-bg_color">
<div
{...attrs}
class={[
"w-full",
"px-2",
"pb-2",
"bg-bg_color",
isFullscreen.value
? ["h-full!", "z-2002", "fixed", "inset-0"]
: "mt-2"
]}
>
<div class="flex justify-between w-full h-[60px] p-4">
{slots?.title ? (
slots.title()
@@ -291,7 +310,7 @@ export default defineComponent({
>
<div class={[topClass.value]}>
<el-checkbox
class="!-mr-1"
class="-mr-1!"
label="列展示"
v-model={checkAll.value}
indeterminate={isIndeterminate.value}
@@ -321,8 +340,8 @@ export default defineComponent({
class={[
"drag-btn w-[16px] mr-2",
isFixedColumn(item)
? "!cursor-no-drop"
: "!cursor-grab"
? "cursor-no-drop!"
: "cursor-grab!"
]}
onMouseenter={(event: {
preventDefault: () => void;
@@ -349,6 +368,14 @@ export default defineComponent({
</el-scrollbar>
</div>
</el-popover>
<el-divider direction="vertical" />
<iconifyIconOffline
class={["w-[16px]", iconClass.value]}
icon={isFullscreen.value ? ExitFullscreen : Fullscreen}
v-tippy={isFullscreen.value ? "退出全屏" : "全屏"}
onClick={() => onFullscreen()}
/>
</div>
</div>
{slots.default({

View File

@@ -2,7 +2,7 @@ import { hasAuth } from "@/router/utils";
import type { Directive, DirectiveBinding } from "vue";
export const auth: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
mounted(el: HTMLElement, binding: DirectiveBinding<string | Array<string>>) {
const { value } = binding;
if (value) {
!hasAuth(value) && el.parentNode?.removeChild(el);

View File

@@ -3,13 +3,13 @@ import { useEventListener } from "@vueuse/core";
import { copyTextToClipboard } from "@pureadmin/utils";
import type { Directive, DirectiveBinding } from "vue";
interface CopyEl extends HTMLElement {
export interface CopyEl extends HTMLElement {
copyValue: string;
}
/** 文本复制指令(默认双击复制) */
export const copy: Directive = {
mounted(el: CopyEl, binding: DirectiveBinding) {
mounted(el: CopyEl, binding: DirectiveBinding<string>) {
const { value } = binding;
if (value) {
el.copyValue = value;

View File

@@ -2,4 +2,5 @@ export * from "./auth";
export * from "./copy";
export * from "./longpress";
export * from "./optimize";
export * from "./perms";
export * from "./ripple";

View File

@@ -3,7 +3,7 @@ import type { Directive, DirectiveBinding } from "vue";
import { subBefore, subAfter, isFunction } from "@pureadmin/utils";
export const longpress: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
mounted(el: HTMLElement, binding: DirectiveBinding<Function>) {
const cb = binding.value;
if (cb && isFunction(cb)) {
let timer = null;

View File

@@ -8,9 +8,22 @@ import {
import { useEventListener } from "@vueuse/core";
import type { Directive, DirectiveBinding } from "vue";
export interface OptimizeOptions {
/** 事件名 */
event: string;
/** 事件触发的方法 */
fn: (...params: any) => any;
/** 是否立即执行 */
immediate?: boolean;
/** 防抖或节流的延迟时间(防抖默认:`200`毫秒、节流默认:`1000`毫秒) */
timeout?: number;
/** 传递的参数 */
params?: any;
}
/** 防抖v-optimize或v-optimize:debounce、节流v-optimize:throttle指令 */
export const optimize: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
mounted(el: HTMLElement, binding: DirectiveBinding<OptimizeOptions>) {
const { value } = binding;
const optimizeType = binding.arg ?? "debounce";
const type = ["debounce", "throttle"].find(t => t === optimizeType);

View File

@@ -0,0 +1,15 @@
import { hasPerms } from "@/utils/auth";
import type { Directive, DirectiveBinding } from "vue";
export const perms: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding<string | Array<string>>) {
const { value } = binding;
if (value) {
!hasPerms(value) && el.parentNode?.removeChild(el);
} else {
throw new Error(
"[Directive: perms]: need perms! Like v-perms=\"['btn.add','btn.edit']\""
);
}
}
};

View File

@@ -13,10 +13,10 @@ $ripple-animation-visible-opacity: 0.25 !default;
z-index: 0;
width: 100%;
height: 100%;
contain: strict;
overflow: hidden;
pointer-events: none;
border-radius: inherit;
contain: strict;
}
&__animation {

View File

@@ -2,8 +2,10 @@ import "./index.scss";
import { isObject } from "@pureadmin/utils";
import type { Directive, DirectiveBinding } from "vue";
interface RippleOptions {
export interface RippleOptions {
/** 自定义`ripple`颜色,支持`tailwindcss` */
class?: string;
/** 是否从中心扩散 */
center?: boolean;
circle?: boolean;
}
@@ -30,8 +32,8 @@ const calculate = (
const offset = el.getBoundingClientRect();
// 获取点击位置距离 el 的垂直和水平距离
let localX = e.clientX - offset.left;
let localY = e.clientY - offset.top;
const localX = e.clientX - offset.left;
const localY = e.clientY - offset.top;
let radius = 0;
let scale = 0.3;
@@ -220,13 +222,6 @@ function updated(el: HTMLElement, binding: RippleDirectiveBinding) {
updateRipple(el, binding, wasEnabled);
}
/**
* @description 指令 v-ripple
* @use 用法如下
* 1. v-ripple 代表启用基本的 ripple 功能
* 2. v-ripple="{ class: 'text-red' }" 代表自定义 ripple 颜色,支持 tailwindcss生效样式是 color
* 3. v-ripple.center 代表从中心扩散
*/
export const Ripple: Directive = {
mounted,
unmounted,

View File

@@ -1,4 +1,4 @@
<script lang="ts" setup>
<script setup lang="ts">
import { getConfig } from "@/config";
const TITLE = getConfig("Title");
@@ -8,20 +8,31 @@ const TITLE = getConfig("Title");
<footer
class="layout-footer text-[rgba(0,0,0,0.6)] dark:text-[rgba(220,220,242,0.8)]"
>
Copyright © 2020-present
Copyright © 2020-2025
<a
class="hover:text-primary"
class="hover:text-primary!"
href="https://github.com/pure-admin"
target="_blank"
>
&nbsp;{{ TITLE }}
</a>
<!-- <div class="ml-8">
<span>赞助商</span>
<a
class="hover:text-primary"
href="https://ai-tools.cn/resume/start"
target="_blank"
>
二猫 AI 简历
</a>
</div> -->
</footer>
</template>
<style lang="scss" scoped>
.layout-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: 100%;

View File

@@ -9,10 +9,10 @@ import LaySidebarBreadCrumb from "../lay-sidebar/components/SidebarBreadCrumb.vu
import LaySidebarTopCollapse from "../lay-sidebar/components/SidebarTopCollapse.vue";
import GlobalizationIcon from "@/assets/svg/globalization.svg?component";
import AccountSettingsIcon from "@iconify-icons/ri/user-settings-line";
import LogoutCircleRLine from "@iconify-icons/ri/logout-circle-r-line";
import Setting from "@iconify-icons/ri/settings-3-line";
import Check from "@iconify-icons/ep/check";
import AccountSettingsIcon from "~icons/ri/user-settings-line";
import LogoutCircleRLine from "~icons/ri/logout-circle-r-line";
import Setting from "~icons/ri/settings-3-line";
import Check from "~icons/ep/check";
const {
layout,
@@ -33,7 +33,7 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
</script>
<template>
<div class="navbar bg-[#fff] shadow-sm shadow-[rgba(0,21,41,0.08)]">
<div class="navbar bg-[#fff] shadow-xs shadow-[rgba(0,21,41,0.08)]">
<LaySidebarTopCollapse
v-if="device === 'mobile'"
class="hamburger-container"
@@ -54,13 +54,13 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
<!-- 国际化 -->
<el-dropdown id="header-translation" trigger="click">
<GlobalizationIcon
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden"
/>
<template #dropdown>
<el-dropdown-menu class="translation">
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'zh')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'zh')]"
@click="translationCh"
>
<IconifyIconOffline
@@ -72,7 +72,7 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
</el-dropdown-item>
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'en')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'en')]"
@click="translationEn"
>
<span v-show="locale === 'en'" class="check-en">

View File

@@ -49,7 +49,7 @@ function hoverDescription(event, description) {
<template>
<div
class="notice-container border-b-[1px] border-solid border-[#f0f0f0] dark:border-[#303030]"
class="notice-container border-0 border-b-[1px] border-solid border-[#f0f0f0] dark:border-[#303030]"
>
<el-avatar
v-if="noticeItem.avatar"
@@ -112,7 +112,7 @@ function hoverDescription(event, description) {
max-width: 238px;
}
</style>
<style scoped lang="scss">
<style lang="scss" scoped>
.notice-container {
display: flex;
align-items: flex-start;

View File

@@ -3,7 +3,7 @@ import { useI18n } from "vue-i18n";
import { ref, computed } from "vue";
import { noticesData } from "./data";
import NoticeList from "./components/NoticeList.vue";
import BellIcon from "@iconify-icons/ep/bell";
import BellIcon from "~icons/ep/bell";
const { t } = useI18n();
const noticesNum = ref(0);

View File

@@ -4,7 +4,7 @@ import { emitter } from "@/utils/mitt";
import { onClickOutside } from "@vueuse/core";
import { ref, computed, onMounted, onBeforeUnmount } from "vue";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
import CloseIcon from "@iconify-icons/ep/close";
import CloseIcon from "~icons/ep/close";
const target = ref(null);
const show = ref<Boolean>(false);
@@ -16,7 +16,7 @@ const iconClass = computed(() => {
"flex",
"justify-center",
"items-center",
"outline-none",
"outline-hidden",
"rounded-[4px]",
"cursor-pointer",
"transition-colors",
@@ -51,7 +51,7 @@ onBeforeUnmount(() => {
<div class="right-panel-background" />
<div ref="target" class="right-panel bg-bg_color">
<div
class="project-configuration border-b-[1px] border-solid border-[var(--pure-border-color)]"
class="project-configuration border-0 border-b-[1px] border-solid border-[var(--pure-border-color)]"
>
<h4 class="dark:text-white">
{{ t("panel.pureSystemSet") }}
@@ -78,7 +78,7 @@ onBeforeUnmount(() => {
</el-scrollbar>
<div
class="flex justify-end p-3 border-t-[1px] border-solid border-[var(--pure-border-color)]"
class="flex justify-end p-3 border-0 border-t-[1px] border-solid border-[var(--pure-border-color)]"
>
<el-button
v-tippy="{
@@ -121,8 +121,8 @@ onBeforeUnmount(() => {
width: 100%;
max-width: 280px;
box-shadow: 0 0 15px 0 rgb(0 0 0 / 5%);
transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1);
transform: translate(100%);
transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1);
}
.show {

View File

@@ -3,10 +3,10 @@ import { useI18n } from "vue-i18n";
import { useNav } from "@/layout/hooks/useNav";
import MdiKeyboardEsc from "@/assets/svg/keyboard_esc.svg?component";
import EnterOutlined from "@/assets/svg/enter_outlined.svg?component";
import ArrowUpLine from "@iconify-icons/ri/arrow-up-line";
import ArrowDownLine from "@iconify-icons/ri/arrow-down-line";
import ArrowUpLine from "~icons/ri/arrow-up-line";
import ArrowDownLine from "~icons/ri/arrow-down-line";
withDefaults(defineProps<{ total: number }>(), {
withDefaults(defineProps<{ total?: number }>(), {
total: 0
});

View File

@@ -2,8 +2,8 @@
import type { optionsItem } from "../types";
import { transformI18n } from "@/plugins/i18n";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import StarIcon from "@iconify-icons/ep/star";
import CloseIcon from "@iconify-icons/ep/close";
import StarIcon from "~icons/ep/star";
import CloseIcon from "~icons/ep/close";
interface Props {
item: optionsItem;

View File

@@ -6,14 +6,14 @@ import { useRouter } from "vue-router";
import SearchResult from "./SearchResult.vue";
import SearchFooter from "./SearchFooter.vue";
import { useNav } from "@/layout/hooks/useNav";
import { transformI18n } from "@/plugins/i18n";
import SearchHistory from "./SearchHistory.vue";
import { transformI18n, $t } from "@/plugins/i18n";
import type { optionsItem, dragItem } from "../types";
import { ref, computed, shallowRef, watch } from "vue";
import { useDebounceFn, onKeyStroke } from "@vueuse/core";
import { usePermissionStoreHook } from "@/store/modules/permission";
import { cloneDeep, isAllEmpty, storageLocal } from "@pureadmin/utils";
import SearchIcon from "@iconify-icons/ri/search-line";
import SearchIcon from "~icons/ri/search-line";
interface Props {
/** 弹窗显隐 */

View File

@@ -14,7 +14,7 @@ function handleSearch() {
class="search-container w-[40px] h-[48px] flex-c cursor-pointer navbar-bg-hover"
@click="handleSearch"
>
<IconifyIconOffline icon="ri:search-line" />
<IconifyIconOffline icon="ri/search-line" />
</div>
<SearchModal v-model:value="show" />
</div>

View File

@@ -14,15 +14,14 @@ import { emitter } from "@/utils/mitt";
import LayPanel from "../lay-panel/index.vue";
import { useNav } from "@/layout/hooks/useNav";
import { useAppStoreHook } from "@/store/modules/app";
import { toggleTheme } from "@pureadmin/theme/dist/browser-utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import Segmented, { type OptionsType } from "@/components/ReSegmented";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
import { useDark, useGlobal, debounce, isNumber } from "@pureadmin/utils";
import Check from "@iconify-icons/ep/check";
import LeftArrow from "@iconify-icons/ri/arrow-left-s-line";
import RightArrow from "@iconify-icons/ri/arrow-right-s-line";
import Check from "~icons/ep/check";
import LeftArrow from "~icons/ri/arrow-left-s-line?width=20&height=20";
import RightArrow from "~icons/ri/arrow-right-s-line?width=20&height=20";
import DayIcon from "@/assets/svg/day.svg?component";
import DarkIcon from "@/assets/svg/dark.svg?component";
import SystemIcon from "@/assets/svg/system.svg?component";
@@ -50,9 +49,7 @@ const {
if (unref(layoutTheme)) {
const layout = unref(layoutTheme).layout;
const theme = unref(layoutTheme).theme;
toggleTheme({
scopeName: `layout-theme-${theme}`
});
document.documentElement.setAttribute("data-theme", theme);
setLayoutModel(layout);
}
@@ -192,7 +189,7 @@ const getThemeColor = computed(() => {
});
const pClass = computed(() => {
return ["mb-[12px]", "font-medium", "text-sm", "dark:text-white"];
return ["mb-[12px]!", "font-medium", "text-sm", "dark:text-white"];
});
const themeOptions = computed<Array<OptionsType>>(() => {
@@ -338,7 +335,7 @@ onUnmounted(() => removeMatchMedia);
"
/>
<p :class="['mt-5', pClass]">{{ t("panel.pureThemeColor") }}</p>
<p :class="['mt-5!', pClass]">{{ t("panel.pureThemeColor") }}</p>
<ul class="theme-color">
<li
v-for="(item, index) in themeColors"
@@ -357,7 +354,7 @@ onUnmounted(() => removeMatchMedia);
</li>
</ul>
<p :class="['mt-5', pClass]">{{ t("panel.pureLayoutModel") }}</p>
<p :class="['mt-5!', pClass]">{{ t("panel.pureLayoutModel") }}</p>
<ul class="pure-theme">
<li
ref="verticalRef"
@@ -400,7 +397,7 @@ onUnmounted(() => removeMatchMedia);
</ul>
<span v-if="useAppStoreHook().getViewportWidth > 1280">
<p :class="['mt-5', pClass]">{{ t("panel.pureStretch") }}</p>
<p :class="['mt-5!', pClass]">{{ t("panel.pureStretch") }}</p>
<Segmented
resize
class="mb-2 select-none"
@@ -429,21 +426,19 @@ onUnmounted(() => removeMatchMedia);
>
<IconifyIconOffline
:icon="settings.stretch ? RightArrow : LeftArrow"
height="20"
/>
<div
class="flex-grow border-b border-dashed"
class="grow border-0 border-b border-dashed"
style="border-color: var(--el-color-primary)"
/>
<IconifyIconOffline
:icon="settings.stretch ? LeftArrow : RightArrow"
height="20"
/>
</div>
</button>
</span>
<p :class="['mt-4', pClass]">{{ t("panel.pureTagsStyle") }}</p>
<p :class="['mt-4!', pClass]">{{ t("panel.pureTagsStyle") }}</p>
<Segmented
resize
class="select-none"
@@ -452,7 +447,7 @@ onUnmounted(() => removeMatchMedia);
@change="onChange"
/>
<p class="mt-5 font-medium text-sm dark:text-white">
<p class="mt-5! font-medium text-sm dark:text-white">
{{ t("panel.pureInterfaceDisplay") }}
</p>
<ul class="setting">

View File

@@ -1,21 +1,28 @@
<script setup lang="ts">
import { isAllEmpty } from "@pureadmin/utils";
import { ref, nextTick, computed } from "vue";
import { emitter } from "@/utils/mitt";
import { useNav } from "@/layout/hooks/useNav";
import LaySearch from "../lay-search/index.vue";
import LayNotice from "../lay-notice/index.vue";
import { responsiveStorageNameSpace } from "@/config";
import { ref, nextTick, computed, onMounted } from "vue";
import { storageLocal, isAllEmpty } from "@pureadmin/utils";
import { useTranslationLang } from "../../hooks/useTranslationLang";
import { usePermissionStoreHook } from "@/store/modules/permission";
import LaySidebarItem from "../lay-sidebar/components/SidebarItem.vue";
import LaySidebarFullScreen from "../lay-sidebar/components/SidebarFullScreen.vue";
import GlobalizationIcon from "@/assets/svg/globalization.svg?component";
import AccountSettingsIcon from "@iconify-icons/ri/user-settings-line";
import LogoutCircleRLine from "@iconify-icons/ri/logout-circle-r-line";
import Setting from "@iconify-icons/ri/settings-3-line";
import Check from "@iconify-icons/ep/check";
import AccountSettingsIcon from "~icons/ri/user-settings-line";
import LogoutCircleRLine from "~icons/ri/logout-circle-r-line";
import Setting from "~icons/ri/settings-3-line";
import Check from "~icons/ep/check";
const menuRef = ref();
const showLogo = ref(
storageLocal().getItem<StorageConfigs>(
`${responsiveStorageNameSpace()}configure`
)?.showLogo ?? true
);
const { t, route, locale, translationCh, translationEn } =
useTranslationLang(menuRef);
@@ -40,6 +47,12 @@ const defaultActive = computed(() =>
nextTick(() => {
menuRef.value?.handleResize();
});
onMounted(() => {
emitter.on("logoChange", key => {
showLogo.value = key;
});
});
</script>
<template>
@@ -47,7 +60,7 @@ nextTick(() => {
v-loading="usePermissionStoreHook().wholeMenus.length === 0"
class="horizontal-header"
>
<div class="horizontal-header-left" @click="backTopMenu">
<div v-if="showLogo" class="horizontal-header-left" @click="backTopMenu">
<img :src="getLogo()" alt="logo" />
<span>{{ title }}</span>
</div>
@@ -71,13 +84,13 @@ nextTick(() => {
<!-- 国际化 -->
<el-dropdown id="header-translation" trigger="click">
<GlobalizationIcon
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden"
/>
<template #dropdown>
<el-dropdown-menu class="translation">
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'zh')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'zh')]"
@click="translationCh"
>
<span v-show="locale === 'zh'" class="check-zh">
@@ -87,7 +100,7 @@ nextTick(() => {
</el-dropdown-item>
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'en')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'en')]"
@click="translationEn"
>
<span v-show="locale === 'en'" class="check-en">

View File

@@ -13,10 +13,10 @@ import LaySidebarExtraIcon from "../lay-sidebar/components/SidebarExtraIcon.vue"
import LaySidebarFullScreen from "../lay-sidebar/components/SidebarFullScreen.vue";
import GlobalizationIcon from "@/assets/svg/globalization.svg?component";
import AccountSettingsIcon from "@iconify-icons/ri/user-settings-line";
import LogoutCircleRLine from "@iconify-icons/ri/logout-circle-r-line";
import Setting from "@iconify-icons/ri/settings-3-line";
import Check from "@iconify-icons/ep/check";
import AccountSettingsIcon from "~icons/ri/user-settings-line";
import LogoutCircleRLine from "~icons/ri/logout-circle-r-line";
import Setting from "~icons/ri/settings-3-line";
import Check from "~icons/ep/check";
const menuRef = ref();
const defaultActive = ref(null);
@@ -105,13 +105,13 @@ watch(
<!-- 国际化 -->
<el-dropdown id="header-translation" trigger="click">
<GlobalizationIcon
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none"
class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden"
/>
<template #dropdown>
<el-dropdown-menu class="translation">
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'zh')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'zh')]"
@click="translationCh"
>
<span v-show="locale === 'zh'" class="check-zh">
@@ -121,7 +121,7 @@ watch(
</el-dropdown-item>
<el-dropdown-item
:style="getDropdownItemStyle(locale, 'en')"
:class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
:class="['dark:text-white!', getDropdownItemClass(locale, 'en')]"
@click="translationEn"
>
<span v-show="locale === 'en'" class="check-en">

View File

@@ -105,12 +105,12 @@ watch(
</script>
<template>
<el-breadcrumb class="!leading-[50px] select-none" separator="/">
<el-breadcrumb class="leading-[50px]! select-none" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item
v-for="item in levelList"
:key="item.path"
class="!inline !items-stretch"
class="inline! items-stretch!"
>
<a @click.prevent="handleLink(item)">
{{ transformI18n(item.meta.title) }}

View File

@@ -4,10 +4,10 @@ import { useI18n } from "vue-i18n";
import { useGlobal } from "@pureadmin/utils";
import { useNav } from "@/layout/hooks/useNav";
import ArrowLeft from "@iconify-icons/ri/arrow-left-double-fill";
import ArrowLeft from "~icons/ri/arrow-left-double-fill";
interface Props {
isActive: boolean;
isActive?: boolean;
}
withDefaults(defineProps<Props>(), {

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import path from "path";
import { getConfig } from "@/config";
import { posix } from "path-browserify";
import { menuType } from "@/layout/types";
import { ReText } from "@/components/ReText";
import { useNav } from "@/layout/hooks/useNav";
@@ -17,10 +17,10 @@ import {
useAttrs
} from "vue";
import ArrowUp from "@iconify-icons/ep/arrow-up-bold";
import EpArrowDown from "@iconify-icons/ep/arrow-down-bold";
import ArrowLeft from "@iconify-icons/ep/arrow-left-bold";
import ArrowRight from "@iconify-icons/ep/arrow-right-bold";
import ArrowUp from "~icons/ep/arrow-up-bold";
import EpArrowDown from "~icons/ep/arrow-down-bold";
import ArrowLeft from "~icons/ep/arrow-left-bold";
import ArrowRight from "~icons/ep/arrow-right-bold";
const attrs = useAttrs();
const { layout, isCollapse, tooltipEffect, getDivStyle } = useNav();
@@ -61,6 +61,21 @@ const getSubMenuIconStyle = computed((): CSSProperties => {
};
});
const textClass = computed(() => {
const item = props.item;
const baseClass = "w-full! text-inherit!";
if (
layout.value !== "horizontal" &&
isCollapse.value &&
!toRaw(item.meta.icon) &&
((layout.value === "vertical" && item.parentId === null) ||
(layout.value === "mix" && item.pathList.length === 2))
) {
return `${baseClass} min-w-[54px]! text-center! px-3!`;
}
return baseClass;
});
const expandCloseIcon = computed(() => {
if (!getConfig()?.MenuArrowIconNoTransition) return "";
return {
@@ -99,8 +114,7 @@ function resolvePath(routePath) {
if (httpReg.test(routePath) || httpReg.test(props.basePath)) {
return routePath || props.basePath;
} else {
// 使用path.posix.resolve替代path.resolve 避免windows环境下使用electron出现盘符问题
return path.posix.resolve(props.basePath, routePath);
return posix.resolve(props.basePath, routePath);
}
}
</script>
@@ -145,7 +159,7 @@ function resolvePath(routePath) {
item?.pathList?.length === 2)
"
truncated
class="!w-full !pl-4 !text-inherit"
class="w-full! px-3! min-w-[54px]! text-center! text-inherit!"
>
{{ transformI18n(onlyOneChild.meta.title) }}
</el-text>
@@ -157,7 +171,7 @@ function resolvePath(routePath) {
offset: [0, -10],
theme: tooltipEffect
}"
class="!w-full !text-inherit"
class="w-full! text-inherit!"
>
{{ transformI18n(onlyOneChild.meta.title) }}
</ReText>
@@ -196,15 +210,7 @@ function resolvePath(routePath) {
offset: [0, -10],
theme: tooltipEffect
}"
:class="{
'!w-full': true,
'!text-inherit': true,
'!pl-4':
layout !== 'horizontal' &&
isCollapse &&
!toRaw(item.meta.icon) &&
item.parentId === null
}"
:class="textClass"
>
{{ transformI18n(item.meta.title) }}
</ReText>

View File

@@ -4,10 +4,10 @@ import { useI18n } from "vue-i18n";
import { useGlobal } from "@pureadmin/utils";
import { useNav } from "@/layout/hooks/useNav";
import MenuFold from "@iconify-icons/ri/menu-fold-fill";
import MenuFold from "~icons/ri/menu-fold-fill";
interface Props {
isActive: boolean;
isActive?: boolean;
}
withDefaults(defineProps<Props>(), {
@@ -23,7 +23,7 @@ const iconClass = computed(() => {
"mb-1",
"w-[16px]",
"h-[16px]",
"inline-block",
"inline-block!",
"align-middle",
"cursor-pointer",
"duration-[100ms]"

View File

@@ -60,11 +60,11 @@ const { title, getLogo } = useNav();
height: 32px;
margin: 2px 0 0 12px;
overflow: hidden;
text-overflow: ellipsis;
font-size: 18px;
font-weight: 600;
line-height: 32px;
color: $subMenuActiveText;
text-overflow: ellipsis;
color: var(--pure-theme-sub-menu-active-text);
white-space: nowrap;
}
}

View File

@@ -1,10 +1,10 @@
<script setup lang="ts">
import { useI18n } from "vue-i18n";
import MenuFold from "@iconify-icons/ri/menu-fold-fill";
import MenuUnfold from "@iconify-icons/ri/menu-unfold-fill";
import MenuFold from "~icons/ri/menu-fold-fill";
import MenuUnfold from "~icons/ri/menu-unfold-fill";
interface Props {
isActive: boolean;
isActive?: boolean;
}
withDefaults(defineProps<Props>(), {
@@ -32,7 +32,7 @@ const toggleClick = () => {
>
<IconifyIconOffline
:icon="isActive ? MenuFold : MenuUnfold"
class="inline-block align-middle hover:text-primary dark:hover:!text-white"
class="inline-block! align-middle hover:text-primary dark:hover:text-white!"
/>
</div>
</template>

View File

@@ -59,10 +59,10 @@
color: var(--el-color-primary);
cursor: pointer;
border-radius: 4px;
transform: translate(0, -50%);
transition:
background-color 0.12s,
color 0.12s;
transform: translate(0, -50%);
&:hover {
color: rgb(0 0 0 / 88%) !important;
@@ -127,10 +127,10 @@
font-weight: normal;
color: var(--el-text-color-primary);
white-space: nowrap;
outline: 0;
list-style-type: none;
background: #fff;
border-radius: 4px;
outline: 0;
box-shadow: 0 2px 8px rgb(0 0 0 / 15%);
li {

View File

@@ -1,6 +1,7 @@
<script setup lang="ts">
import { $t } from "@/plugins/i18n";
import { emitter } from "@/utils/mitt";
import NProgress from "@/utils/progress";
import { RouteConfigs } from "../../types";
import { useTags } from "../../hooks/useTag";
import { routerArrays } from "@/layout/types";
@@ -18,11 +19,11 @@ import {
useResizeObserver
} from "@pureadmin/utils";
import ExitFullscreen from "@iconify-icons/ri/fullscreen-exit-fill";
import Fullscreen from "@iconify-icons/ri/fullscreen-fill";
import ArrowDown from "@iconify-icons/ri/arrow-down-s-line";
import ArrowRightSLine from "@iconify-icons/ri/arrow-right-s-line";
import ArrowLeftSLine from "@iconify-icons/ri/arrow-left-s-line";
import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
import Fullscreen from "~icons/ri/fullscreen-fill";
import ArrowDown from "~icons/ri/arrow-down-s-line";
import ArrowRightSLine from "~icons/ri/arrow-right-s-line";
import ArrowLeftSLine from "~icons/ri/arrow-left-s-line";
const {
Close,
@@ -37,6 +38,7 @@ const {
buttonLeft,
showModel,
translateX,
isFixedTag,
pureSetting,
activeIndex,
getTabStyle,
@@ -205,12 +207,14 @@ function dynamicRouteTag(value: string): void {
/** 刷新路由 */
function onFresh() {
NProgress.start();
const { fullPath, query } = unref(route);
router.replace({
path: "/redirect" + fullPath,
query
});
handleAliveRoute(route as ToRouteType, "refresh");
NProgress.done();
}
function deleteDynamicTag(obj: any, current: any, tag?: string) {
@@ -253,7 +257,7 @@ function deleteDynamicTag(obj: any, current: any, tag?: string) {
if (tag === "other") {
spliceRoute(1, 1, true);
} else if (tag === "left") {
spliceRoute(fixedTags.length, valueIndex - 1, true);
spliceRoute(fixedTags.length, valueIndex - fixedTags.length);
} else if (tag === "right") {
spliceRoute(valueIndex + 1, multiTags.value.length);
} else {
@@ -510,6 +514,7 @@ function tagOnClick(item) {
} else {
router.push({ path });
}
emitter.emit("tagOnClick", item);
}
onClickOutside(contextmenuRef, closeMenu, {
@@ -578,7 +583,7 @@ onBeforeUnmount(() => {
'scroll-item is-closable',
linkIsActive(item),
showModel === 'chrome' && 'chrome-item',
!isAllEmpty(item?.meta?.fixedTag) && 'fixed-tag'
isFixedTag(item) && 'fixed-tag'
]"
@contextmenu.prevent="openMenu(item, $event)"
@mouseenter.prevent="onMouseenter(index)"
@@ -587,16 +592,16 @@ onBeforeUnmount(() => {
>
<template v-if="showModel !== 'chrome'">
<span
class="tag-title dark:!text-text_color_primary dark:hover:!text-primary"
class="tag-title dark:text-text_color_primary! dark:hover:text-primary!"
>
{{ transformI18n(item.meta.title) }}
</span>
<span
v-if="
isAllEmpty(item?.meta?.fixedTag)
? iconIsActive(item, index) ||
isFixedTag(item)
? false
: iconIsActive(item, index) ||
(index === activeIndex && index !== 0)
: false
"
class="el-icon-close"
@click.stop="deleteMenu(item)"
@@ -617,7 +622,7 @@ onBeforeUnmount(() => {
{{ transformI18n(item.meta.title) }}
</span>
<span
v-if="isAllEmpty(item?.meta?.fixedTag) ? index !== 0 : false"
v-if="isFixedTag(item) ? false : index !== 0"
class="chrome-close-btn"
@click.stop="deleteMenu(item)"
>

View File

@@ -6,14 +6,9 @@ import { routerArrays } from "@/layout/types";
import { router, resetRouter } from "@/router";
import type { themeColorsType } from "../types";
import { useAppStoreHook } from "@/store/modules/app";
import { useGlobal, storageLocal } from "@pureadmin/utils";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import {
darken,
lighten,
toggleTheme
} from "@pureadmin/theme/dist/browser-utils";
import { darken, lighten, useGlobal, storageLocal } from "@pureadmin/utils";
export function useDataThemeChange() {
const { layoutTheme, layout } = useLayout();
@@ -54,9 +49,7 @@ export function useDataThemeChange() {
isClick = true
) {
layoutTheme.value.theme = theme;
toggleTheme({
scopeName: `layout-theme-${theme}`
});
document.documentElement.setAttribute("data-theme", theme);
// 如果非isClick保留之前的themeColor
const storageThemeColor = $storage.layout.themeColor;
$storage.layout = {

View File

@@ -14,8 +14,8 @@ import { useUserStoreHook } from "@/store/modules/user";
import { useGlobal, isAllEmpty } from "@pureadmin/utils";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
import { usePermissionStoreHook } from "@/store/modules/permission";
import ExitFullscreen from "@iconify-icons/ri/fullscreen-exit-fill";
import Fullscreen from "@iconify-icons/ri/fullscreen-fill";
import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
import Fullscreen from "~icons/ri/fullscreen-fill";
const errorInfo =
"The current routing configuration is incorrect, please check the configuration";
@@ -64,7 +64,7 @@ export function useNav() {
const getDropdownItemClass = computed(() => {
return (locale, t) => {
return locale === t ? "" : "dark:hover:!text-primary";
return locale === t ? "" : "dark:hover:text-primary!";
};
});

View File

@@ -21,13 +21,13 @@ import {
hasClass
} from "@pureadmin/utils";
import Fullscreen from "@iconify-icons/ri/fullscreen-fill";
import CloseAllTags from "@iconify-icons/ri/subtract-line";
import CloseOtherTags from "@iconify-icons/ri/text-spacing";
import CloseRightTags from "@iconify-icons/ri/text-direction-l";
import CloseLeftTags from "@iconify-icons/ri/text-direction-r";
import RefreshRight from "@iconify-icons/ep/refresh-right";
import Close from "@iconify-icons/ep/close";
import Fullscreen from "~icons/ri/fullscreen-fill";
import CloseAllTags from "~icons/ri/subtract-line";
import CloseOtherTags from "~icons/ri/text-spacing";
import CloseRightTags from "~icons/ri/text-direction-l";
import CloseLeftTags from "~icons/ri/text-direction-r";
import RefreshRight from "~icons/ep/refresh-right";
import Close from "~icons/ep/close";
export function useTags() {
const route = useRoute();
@@ -125,6 +125,12 @@ export function useTags() {
}
}
const isFixedTag = computed(() => {
return item => {
return isBoolean(item?.meta?.fixedTag) && item?.meta?.fixedTag === true;
};
});
const iconIsActive = computed(() => {
return (item, index) => {
if (index === 0) return;
@@ -221,6 +227,7 @@ export function useTags() {
buttonTop,
buttonLeft,
translateX,
isFixedTag,
pureSetting,
activeIndex,
getTabStyle,

View File

@@ -210,8 +210,8 @@ const LayHeader = defineComponent({
height: 100%;
&::after {
display: table;
clear: both;
display: table;
content: "";
}
@@ -224,7 +224,7 @@ const LayHeader = defineComponent({
.app-mask {
position: absolute;
top: 0;
z-index: 999;
z-index: 2001;
width: 100%;
height: 100%;
background: #000;

View File

@@ -1,129 +0,0 @@
/**
* @description ⚠️:此文件仅供主题插件使用,请不要在此文件中导出别的工具函数(仅在页面加载前运行)
*/
import type { multipleScopeVarsOptions } from "@pureadmin/theme";
/** 预设主题色 */
const themeColors = {
/* 亮白色 */
light: {
subMenuActiveText: "#000000d9",
menuBg: "#fff",
menuHover: "#f6f6f6",
subMenuBg: "#fff",
subMenuActiveBg: "#e0ebf6",
menuText: "rgb(0 0 0 / 60%)",
sidebarLogo: "#fff",
menuTitleHover: "#000",
menuActiveBefore: "#4091f7"
},
/* 道奇蓝 */
default: {
subMenuActiveText: "#fff",
menuBg: "#001529",
menuHover: "rgb(64 145 247 / 15%)",
subMenuBg: "#0f0303",
subMenuActiveBg: "#4091f7",
menuText: "rgb(254 254 254 / 65%)",
sidebarLogo: "#002140",
menuTitleHover: "#fff",
menuActiveBefore: "#4091f7"
},
/* 深紫罗兰色 */
saucePurple: {
subMenuActiveText: "#fff",
menuBg: "#130824",
menuHover: "rgb(105 58 201 / 15%)",
subMenuBg: "#000",
subMenuActiveBg: "#693ac9",
menuText: "#7a80b4",
sidebarLogo: "#1f0c38",
menuTitleHover: "#fff",
menuActiveBefore: "#693ac9"
},
/* 深粉色 */
pink: {
subMenuActiveText: "#fff",
menuBg: "#28081a",
menuHover: "rgb(216 68 147 / 15%)",
subMenuBg: "#000",
subMenuActiveBg: "#d84493",
menuText: "#7a80b4",
sidebarLogo: "#3f0d29",
menuTitleHover: "#fff",
menuActiveBefore: "#d84493"
},
/* 猩红色 */
dusk: {
subMenuActiveText: "#fff",
menuBg: "#2a0608",
menuHover: "rgb(225 60 57 / 15%)",
subMenuBg: "#000",
subMenuActiveBg: "#e13c39",
menuText: "rgb(254 254 254 / 65.1%)",
sidebarLogo: "#42090c",
menuTitleHover: "#fff",
menuActiveBefore: "#e13c39"
},
/* 橙红色 */
volcano: {
subMenuActiveText: "#fff",
menuBg: "#2b0e05",
menuHover: "rgb(232 95 51 / 15%)",
subMenuBg: "#0f0603",
subMenuActiveBg: "#e85f33",
menuText: "rgb(254 254 254 / 65%)",
sidebarLogo: "#441708",
menuTitleHover: "#fff",
menuActiveBefore: "#e85f33"
},
/* 绿宝石 */
mingQing: {
subMenuActiveText: "#fff",
menuBg: "#032121",
menuHover: "rgb(89 191 193 / 15%)",
subMenuBg: "#000",
subMenuActiveBg: "#59bfc1",
menuText: "#7a80b4",
sidebarLogo: "#053434",
menuTitleHover: "#fff",
menuActiveBefore: "#59bfc1"
},
/* 酸橙绿 */
auroraGreen: {
subMenuActiveText: "#fff",
menuBg: "#0b1e15",
menuHover: "rgb(96 172 128 / 15%)",
subMenuBg: "#000",
subMenuActiveBg: "#60ac80",
menuText: "#7a80b4",
sidebarLogo: "#112f21",
menuTitleHover: "#fff",
menuActiveBefore: "#60ac80"
}
};
/**
* @description 将预设主题色处理成主题插件所需格式
*/
export const genScssMultipleScopeVars = (): multipleScopeVarsOptions[] => {
const result = [] as multipleScopeVarsOptions[];
Object.keys(themeColors).forEach(key => {
result.push({
scopeName: `layout-theme-${key}`,
varsContent: `
$subMenuActiveText: ${themeColors[key].subMenuActiveText} !default;
$menuBg: ${themeColors[key].menuBg} !default;
$menuHover: ${themeColors[key].menuHover} !default;
$subMenuBg: ${themeColors[key].subMenuBg} !default;
$subMenuActiveBg: ${themeColors[key].subMenuActiveBg} !default;
$menuText: ${themeColors[key].menuText} !default;
$sidebarLogo: ${themeColors[key].sidebarLogo} !default;
$menuTitleHover: ${themeColors[key].menuTitleHover} !default;
$menuActiveBefore: ${themeColors[key].menuActiveBefore} !default;
`
} as multipleScopeVarsOptions);
});
return result;
};

View File

@@ -1,4 +1,4 @@
import type { IconifyIcon } from "@iconify/vue";
import type { FunctionalComponent } from "vue";
const { VITE_HIDE_HOME } = import.meta.env;
export const routerArrays: Array<RouteConfigs> =
@@ -6,9 +6,10 @@ export const routerArrays: Array<RouteConfigs> =
? [
{
path: "/welcome",
name: "Welcome",
meta: {
title: "menus.pureHome",
icon: "ep:home-filled"
icon: "ep/home-filled"
}
}
]
@@ -16,7 +17,7 @@ export const routerArrays: Array<RouteConfigs> =
export type routeMetaType = {
title?: string;
icon?: string | IconifyIcon;
icon?: string | FunctionalComponent;
showLink?: boolean;
savedPosition?: boolean;
auths?: Array<string>;
@@ -36,7 +37,7 @@ export type multiTagsType = {
};
export type tagsViewsType = {
icon: string | IconifyIcon;
icon: string | FunctionalComponent;
text: string;
divided: boolean;
disabled: boolean;

View File

@@ -44,7 +44,9 @@ app.component("FontIcon", FontIcon);
// 全局注册按钮级别权限组件
import { Auth } from "@/components/ReAuth";
import { Perms } from "@/components/RePerms";
app.component("Auth", Auth);
app.component("Perms", Perms);
// 全局注册vue-tippy
import "tippy.js/dist/tippy.css";

View File

@@ -107,6 +107,7 @@ import {
ElWatermark,
ElTour,
ElTourStep,
ElSegmented,
/**
* 为了方便演示平台将 element-plus 导出的所有插件引入,实际使用中如果你没用到哪个插件,将其注释掉就行
* 导出来源https://github.com/element-plus/element-plus/blob/dev/packages/element-plus/plugin.ts#L11-L16
@@ -221,7 +222,8 @@ const components = [
ElUpload,
ElWatermark,
ElTour,
ElTourStep
ElTourStep,
ElSegmented
];
const plugins = [

Some files were not shown because too many files have changed in this diff Show More