Compare commits

...

478 Commits

Author SHA1 Message Date
invalid w
d9b9e53d33 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2024-04-20 17:19:17 +08:00
invalid w
d500c0b61c chore: relese 2.11.1 2024-04-20 17:19:04 +08:00
Electrolux
65e5e71f5e fix: the form not working when setFieldsValue through form-groups and add a demo with form groups (#3765)
* fix(util): 修复form表单批量添加的时候用setFieldsValue和model设置不生效的问题

* feat(demo): 为表单组增删添加表单组增删的demo与给出表单组赋值修复后setFieldsValue的示例
2024-04-20 17:16:06 +08:00
Electrolux
82bf0094c7 fix(batch-add-formitem):fix the form not working when setFieldsValue through form-groups and add a demo with form groups (#3765)
* fix(util): 修复form表单批量添加的时候用setFieldsValue和model设置不生效的问题

* feat(demo): 为表单组增删添加表单组增删的demo与给出表单组赋值修复后setFieldsValue的示例
2024-04-20 16:56:05 +08:00
invalid w
4a1277493b feat: revert changelog instructions (#3771)
* chore: install conventional-changelog-cli

* chore: bump version to 2.11.0
2024-04-20 16:11:41 +08:00
invalid w
895dabfa46 docs: typo yarn -> pnpm 2024-04-20 14:39:54 +08:00
Electrolux
44b1877eae fix(demo): 修复form demo的远程搜索不会触发的bug (#3770) 2024-04-19 17:30:43 +08:00
Zhong
c58c1929c1 fix(router): the issue of blank page navigation during repair of non-LAYOUT first-level route component (#3764) 2024-04-19 14:16:35 +08:00
xingyu
87541da27c chore(deps): 升级最新依赖 (#3743)
* chore: update deps

* fix: eslint

* chore: update deps

* fix: typecheck
2024-04-19 11:27:30 +08:00
1455668754
302e2125ba feat(components->Upload): 修正图片上传组件允许自定义上传格式限制 (#3755) 2024-04-18 14:10:32 +08:00
Zhong
36274025d6 fix(util): resolve executing retry even when HTTP status code is 401 (#3756) 2024-04-18 12:22:06 +08:00
Henry Rao
04d4c5cd66 fix(components->Upload): 修复文件上传过程中删除文件终止上传时,上传状态未改变不能关闭Modal的bug (#3761) 2024-04-18 12:20:59 +08:00
invalid w
83455a07a0 fix(ci): update use pnpm version for deploy 2024-04-18 12:16:57 +08:00
invalid w
64b9696eee chore(config): update pnpm version 2024-04-18 12:12:22 +08:00
invalid w
a5565bf9cf fix(ci): update node version for linter 2024-04-18 12:08:03 +08:00
zhang
e9c6dd83b1 feat(BasicForm): 新增监听表单收缩方法传值进行判断 (#3745) 2024-04-17 04:01:13 +08:00
6LWa6ZKx
a00725be57 fix: 修复确认弹出框样式错乱的问题 (#3742) 2024-04-16 16:44:13 +08:00
KaneOne
162a0d0252 fix: modalElIterator可能为空,导致报错 (#3738) 2024-04-13 21:41:03 +08:00
No name
96ac362fa6 feat(search): adjust the menu search function to recognize lowercase input (#3736) 2024-04-12 16:12:52 +08:00
No name
e8a86ec8b9 fix: breadcrumb is displayed despite the menu being hidden (#3733)
* fix: bug RangePicker with componentProps valueFormat ('YYYY-MM-DD') does not return the formatted value when using form validate() method #3690

* fix: breadcrumb is displayed despite the menu being hidden
2024-04-11 14:37:20 +08:00
joeguang
9784cdc840 perf: 优化水印在控制台可以hide的问题 (#3732) 2024-04-11 14:36:24 +08:00
zhang
13b031eef9 fix(BasicModal): 修复BasicModal添加wrapClassName样式异常问题 (#3726)
* fix(BasicModal): 全屏样式异常

* fix(BasicModal): 修复BasicModal添加wrapClassName样式异常问题

* fix(BasicModal): 修复BasicModal添加wrapClassName样式异常问题
2024-04-10 16:10:31 +08:00
sea
c9966b1f13 chore: add Inspector(developer open vscode) (#3725) 2024-04-10 16:10:13 +08:00
zhang
6054fa2ffa fix(BasicTable): 修复BasicTable数据为空时,重置后高度不能自适应问题 (#3724)
* fix(BasicTable): 修复BasicTable数据为空时,重置后高度不能自适应问题

* fix(BasicTable): 修复BasicTable数据为空时,重置后高度不能自适应问题
2024-04-10 16:09:31 +08:00
Zhong
212e78fa76 fix(component): resovle fullscreen content issues with "fixedHeight" and "contentFullHeight" combined (#3721) 2024-04-10 16:09:16 +08:00
sea
890ff8f338 types: complete dirctives and v-role custom color (#3718)
* types: complete dirctives

* chore: v-auth custom color
2024-04-09 20:33:57 +08:00
zhang
ade6d4c22d fix(Modal): 修复BasicModal跟原生Modal样式冲突问题 (#3720) 2024-04-09 10:39:05 +08:00
jinmao88
0bbc2ef4ba chore: Create stale.yml 2024-04-08 15:14:31 +08:00
zhang
de5f9e3047 feat(BasicTable): 新增表格搜索获取参数的方法 (#3715)
* feat(BasicTable): 新增表格搜索获取参数的方法

* feat(BasicTable): 新增表格搜索获取参数的方法

* feat(BasicTable): 新增表格搜索获取参数的方法

* feat(BasicTable): 新增表格搜索获取参数的方法
2024-04-05 13:42:30 +08:00
Zhong
38d58ab47a fix(component): resolve the error when clicking on a row when clickRowToExpand is true (#3714) 2024-04-04 08:35:17 +08:00
likui628
6528dc45df refactor: improving the readability 2024-04-02 16:25:35 +08:00
Electrolux
b28a46edcb feat(feature):upload->preview & upload->resultfield (#3707)
* feat(components->upload->resultField): upload和imageupload组件中添加resultField与demo

* feat(components->upload->preview): upload组件中添加自定义预览组件的方法与demo
2024-03-31 07:02:02 +08:00
1455668754
b5c87cf6ab fix: 1.修正ImageUpload直接使用时无法正常回传value 2.修正ImageUpload无法正常初始化第一次传值 (#3704) 2024-03-31 07:01:51 +08:00
Electrolux
c7ab4a5298 feat(type->api): resultField推断api的返回值应该包含recordbale类型 (#3699)
* feat(type->api): resultField推断api的返回值应该包含object类型

* perf(format): simplify type about api response
2024-03-29 09:09:04 +08:00
zhang
573fd53b4e fix(menu): top menu and breadcrumb show wrong (#3703) 2024-03-29 09:07:55 +08:00
苗大
ea863f2d2d style(BasicTable): 表头帮助图标 多余颜色样式去除, 修复深色图标看不清问题 (#3701) 2024-03-28 18:30:47 +08:00
Electrolux
954f04f1c8 fix(koa->upload): fix the error that occurs when uploading files in the test server of Koa. (#3698)
* fix(koa->upload): 修复koa上传文件的报错

* fix(koa->upload): 补充遗漏的返回值

* fix(koa->upload): 补充遗漏的返回值
2024-03-28 10:28:55 +08:00
Werheng Zhang
05030ee984 refactor: 优化代码 (#3695)
优化变量使用及定义的顺序
优化ts及tsx文件类型
使用===替换==
替换不必要的map为forEach
优化部分注释
2024-03-27 14:22:54 +08:00
No name
09f795e00e fix: bug RangePicker with componentProps valueFormat ('YYYY-MM-DD') does not return the formatted value when using form validate() method #3690 (#3691)
close #3690
2024-03-27 09:29:54 +08:00
苗大
c1809cd6c5 fix: 菜单搜索功能修复 (#3688) 2024-03-26 14:19:22 +08:00
苗大
7c52f083db feat(VirtualScroll): 虚拟滚动增加滚动到顶部, 底部, 指定项方法 (#3687) 2024-03-25 14:24:29 +08:00
zandko
9882e8df86 feat(input): add auto-trimming for vxe-table input components (#3684)
* fix: Correct spelling errors in form component

* fix: Correct spelling errors in form component

* fix: Correct spelling errors in vxetable component
2024-03-25 11:41:53 +08:00
0x588
264f34e49d fix: 修复菜单在MIX_SIDEBAR模式下title显示为name的问题 (#3682) 2024-03-22 14:06:40 +08:00
阿朱quq
54f8584443 fix: Correct spelling error in comments (#3678) 2024-03-19 16:03:18 +08:00
Caichong
c33ee66473 fix: remove duplicate code (#3674) 2024-03-15 16:50:46 +08:00
Ze.Rui
0434e718ed Pref: 路由菜单取title字段 而不是name,树结构数据修改 (#3666)
* perf: 修改路由菜单获取title字段

* perf: 调整树结构获取的数据源

* perf: 修改getI18nName 获取值方式

---------

Co-authored-by: 赵泽瑞 <zhaozerui@jilinxiangyun.com>
2024-03-15 16:50:31 +08:00
松鼠
3d733de399 fix(ApiSelect): ApiSelect的isFirstLoaded赋值逻辑,只有当加载报错时才能恢复未初次加载状态 (#3671) 2024-03-14 10:02:20 +08:00
苗大
02b3a2fce8 chore: typo in Container (#3669) 2024-03-12 15:27:47 +08:00
invalid w
e26a4ee9cb chore: remove the volar plugin because it is not recommended for use 2024-03-12 09:22:42 +08:00
Zhong
c7631fed68 fix(router): resolve menu loading failure when permission is in "role mode" (#3660)
closed #3655
2024-03-07 13:59:32 +08:00
Caichong
a4cc1d5316 fix: typo in locale (#3659) 2024-03-07 11:32:32 +08:00
crudboy
c827ffb8e6 fix(component): insertNextAt is not a function (#3656) (#3657) 2024-03-06 20:31:36 +08:00
Zhong
d42acb477c fix(component): resolve the defaultValue error in setting the date type (#3652)
closed #3651
2024-03-06 09:16:37 +08:00
Zhong
bc5e5fa015 fix(component): resolve the issue of "vxe-table" export function not being able to be used (#3646)
closed #3614
2024-03-05 19:28:15 +08:00
codelo
32061f468c chore: Update README.zh-CN.md (#3648)
vite4, vite2 => vite5
2024-03-05 19:23:48 +08:00
Mr.Dear
9372f1d159 feat: fix ellipsis bug (#3644) 2024-03-05 13:05:26 +08:00
Zhong
7ec9344be8 fix(router): resolve the next function being called twice (#3643)
closed #3642
2024-03-05 10:26:05 +08:00
黄小民
89830ec7e6 fix: basemodal 无法透传 attributes 至 Modal.tsx (#3637) 2024-03-04 10:56:20 +08:00
Zhong
eae68bb029 fix(layout->user-dropdown): resolve warning "Invalid prop name: key is a reserved property" (#3640)
closed #3639
2024-03-02 10:07:41 +08:00
kian
ca3ddd19f7 feat(watermark): support custom style (#3634) 2024-03-02 10:05:24 +08:00
xachary
aef90aa2a0 fix(CropperAvatar): wrong type about the prop size (#3635) 2024-03-02 10:02:18 +08:00
xachary
ab55cbf99b fix(Login): avoid infinite loop when query redirect to next route redirect (#3630). resolve #3620 #3627 2024-02-27 18:14:06 +08:00
xachary
1a7ae0e810 fix(LayoutSidre): resolve the breakpoint conflict. resolve #3605
* fix(LayoutSidre): resolve the breakpoint conflict

* docs: update comment

* fix(LayoutSider): add trigger footer limit
2024-02-23 09:32:14 +08:00
shixi
b7944690d1 fix(typo): fileservice class name (#3625)
我觉得这是个错误的名字
2024-02-22 16:05:07 +08:00
Carlos Andres Padillla Sainz
76ffd8fdf1 fix: Update TableAction.vue (#3619)
Clearing icon property to avoid using icon name in PopConfirmButton and delegate the icon only to the Icon component
2024-02-21 16:09:19 +08:00
xachary
246d1be89e refactor(Exception): support original status values with not overrided (#3610) 2024-02-20 17:25:00 +08:00
Li Kui
b233973974 fix: TableAction设置icon显示iconify关键字 (#3608) 2024-02-19 19:44:55 +08:00
xingyu
0cb379e5ab chore: update deps (#3602)
* chore: up vue 3.4.13 antdv 4.1.0

* fix: stylelint

* chore: update deps

* feat: vite-html

* fix: eslint

* fix: type check

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2024-02-19 11:45:29 +08:00
xachary
b6bcf8d36d fix(CropperModal): beforeUpload should return false (#3601) 2024-02-19 11:37:55 +08:00
xachary
5ec4446443 fix(PopConfirmButton): avoid type lint error (#3600) 2024-02-19 11:26:20 +08:00
xachary
236ddf3471 fix: repair login about redirect query (#3592)
* fix: repair login about redirect query

* fix: about buildRoutesAction and redirect

* fix: make sure unknown redirect will back to home
2024-02-11 14:30:44 +08:00
Tian_ya_luer
e6a73840ab fix: 当TableAction的actions属性中的ActionItem传递了color属性时,PopConfirm的指示箭头颜色异常问题 (#3597)
Co-authored-by: linja <linja@film.com>
2024-02-11 14:30:12 +08:00
xachary
6f4bdae5c2 fix(BackTop): repair BackTup comp (#3581) 2024-01-30 14:14:23 +08:00
Owen Tsai
62c124ef45 chore: update README.md (#3575) 2024-01-25 13:16:38 +08:00
xachary
43aa743032 fix(BasicForm->FormItem): model should update before event call (#3573). resolve #3570 2024-01-24 17:10:36 +08:00
苗大
778ebe1f44 fix(PageWrapper): 修复headerSticky样式 (#3569) 2024-01-24 09:03:15 +08:00
xachary
a1e862bde7 fix(ScrollContainer): enable x scroll (#3564) 2024-01-23 21:11:43 +08:00
luchanan
e6a7e4c4fc perf(component): formItem: label支持函数渲染 (#3504)
* perf(component): formItem: label支持函数渲染

(cherry picked from commit abd6e2b1298712e58cc69cdaa55f44e3393b71a5)

* perf(component): formItem: label支持函数渲染

* feat(component): formItem: label支持函数渲染

* perf(component): formItem: label支持函数渲染

(cherry picked from commit abd6e2b1298712e58cc69cdaa55f44e3393b71a5)

perf(component): formItem: label支持函数渲染

feat(component): formItem: label支持函数渲染

* chore: update label type

---------

Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>
2024-01-21 21:27:50 +08:00
xachary
b750fc9e51 style(tabs): tab close button position (#3560) resolve #3557 2024-01-20 10:57:03 +08:00
xachary
54af5bb42d fix(BasicTable->useColumns): handle deep colunm hidden (#3561) resolve #3559 2024-01-20 10:56:16 +08:00
xachary
e6797043c5 fix(test-server): test-server can not lanuch (#3554) 2024-01-19 09:34:18 +08:00
Li Kui
2c121edd3d chore(i18n): add ts,js file support (#3552) 2024-01-18 15:42:31 +08:00
苗大
f3fbb57dc9 fix: typo substract -> subtract (#3551) 2024-01-17 19:37:45 +08:00
xachary
a121b32252 fix(BasicTable): BasicTable resize wrong in modal (#3549) 2024-01-16 16:50:57 +08:00
crudboy
0c1235e75a fix: (demo->page>form>high) expose getDataSource close #3529 (#3530) 2024-01-16 16:49:12 +08:00
xachary
974c1fad7f fix(BasicTable): getSelectRows return duplicate records (#3545) 2024-01-15 14:06:19 +08:00
xachary
e23e3383dd fix(BasicTable->rowKey&scroll): declear and usage about rowKey and scroll (#3541)
* fix(rowKey&scroll): declear and usage about rowKey and scroll

* fix: key/keyValue type declare fix
2024-01-12 14:20:45 +08:00
xachary
69c36021fa fix(BasicTable): selection wrong by click input when cross pages (#3540). resolve #3539 2024-01-12 09:17:25 +08:00
xachary
abae7f3295 feat(BasicTable): table enable accordion expand (#3533). resolve #3525 2024-01-11 15:29:36 +08:00
xachary
83f16da2d3 fix(ApiCascader): wrong api reload (#3536) resolve #3534 2024-01-11 15:28:45 +08:00
Yao
0589458b2d fix: change salesProductPie.vue's data name to '成交占比'. (#3524)
Co-authored-by: gakkispy <12834847+gakkispy@user.noreply.gitee.com>
2024-01-10 14:39:21 +08:00
xachary
49fdb6c986 fix: content fixed mode with blank page (#3523) 2024-01-10 14:32:34 +08:00
xiaoMingTongXue
50276cb602 fix(layout): 修复切换导航栏模式,分割菜单的状态不同步,导致页面内容区域存在被遮挡的问题 (#3519)
Co-authored-by: chengmingrui <chengmingrui@oneaiops.com>
2024-01-10 09:24:12 +08:00
zhang
8f175fca21 chore(menu): about icon is missing (#3522) 2024-01-09 16:19:06 +08:00
xachary
6978517a3a fix(config): vite:html warning (#3518) 2024-01-08 15:57:06 +08:00
superlollipop
c2c9f4f556 fix: contextmenu location not right when body with scroll (#3516)
Co-authored-by: quanbisen <bisen_quan@lebo.cn>
2024-01-08 11:15:49 +08:00
invalid w
a20bac1682 chore(hooks): lock vue version to 3.3.4 2024-01-08 10:27:32 +08:00
invalid w
f2a0f73028 chore(deps): lock the version of Vue to 3.3.4
由于vue的3.4.x版本与 antdv的4.0.x版本不兼容,但是antdv的 4.1.x类型定义有些问题,所以暂且锁死vue的版本
2024-01-08 10:05:46 +08:00
invalid w
f9fc369637 Revert "chore(deps): update ant-design-vue version to 4.1.0. resolve #3495"
This reverts commit 445ea238fb.
2024-01-08 10:01:25 +08:00
invalid w
445ea238fb chore(deps): update ant-design-vue version to 4.1.0. resolve #3495 2024-01-06 09:26:15 +08:00
xingyu
e6c7b5f928 feat(deps): update vite version to 5.x (#3508) 2024-01-06 09:19:52 +08:00
xachary
d709dd67b5 fix: scroll back to top when tab switch (#3498). resolve #3490 2024-01-05 09:54:05 +08:00
xachary
7ffe1726b9 fix(layout->menu): can`t hover when menu is colappsed (#3499) resolve #3492 2024-01-05 09:52:19 +08:00
luocong2016
f0ca8d5a03 fix(component->markdown): 浏览器媒体获取兼容 (#3470) 2024-01-05 09:48:04 +08:00
xingyu
626c54504e chore: update deps (#3465)
* chore: update deps

* fix: eslint

* chore: update deps

* chore: stylelint v16

* fix: stylelint

* fix: typecheck

* chore: node v18.12.0

* fix: type

* fix: style

* chore: up vue 3.4.3

* chore: prettier format

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2024-01-05 09:45:30 +08:00
nullcache
6fbb57621e fix: handleFormValues 不再将所有空字符串转换为undefined (#3496) 2024-01-02 20:18:52 +08:00
xachary
d88f455cd3 fix(BasicTable): showIndexColumn/showRowSelection cache should by route name (#3489) 2024-01-02 09:46:41 +08:00
xiaoMingTongXue
98e2e4c89a fix(BasicForm): 修复 useComponentRegister 方法无法添加自定义的组件,添加时爆类型错误的问题 (#3483)
* types(component): 修复 useComponentRegister 方法无法添加自定义的组件,添加时爆类型错误的问题

* types(component): 修复 table 组件的 useTableForm 入参的 fetch 和 TableActionType 的 reload 类型定义报错的问题

---------

Co-authored-by: chengmingrui <chengmingrui@oneaiops.com>
2024-01-02 09:44:50 +08:00
xachary
78234e2ef0 style: fix basic tree style alignment (#3487) 2024-01-01 14:10:44 +08:00
xachary
2f921cfb88 fix(BasicTable): avoid select when edit cell (#3484) 2023-12-29 11:50:25 +08:00
xachary
816553bfcd feat(demo->BasicTable): add TableSelectionBar and enable checkbox rowSelection demo (#3477)
* feat: add TableSelectionBar

* feat: enable TableSelectionBar for checkbox rowSelection demo
2023-12-29 09:20:02 +08:00
xachary
00b8d169cb style(demo->iframe): fix double scroll when use iframe inner (#3482) 2023-12-29 09:19:09 +08:00
胤玄
dcbe5510d4 fix: Docker 打包逻辑改进,彻底解决缓存问题 (#3473)
* feat: update nginx.conf 使用固定编译入口可能导致浏览器使用缓存js文件,而此配置可以解决

* feat: 更新docker打包逻辑: 原本固定的entry是为了方便替换环境变量,同时在nginx配置内让每次获取js等资源都不走缓存。这样的问题是首次打开会很慢。
因此本次使用的解决方案,回归vben原本的hash+timestamp的入口文件名,但是在环境变量替换的时候使用模糊匹配。
大家有类似需要可以参考环境变量的方式做 单镜像打包多环境的适配。
2023-12-27 14:28:37 +08:00
zzc0217
3de22b44b1 chore: 表单使用updateSchema时只对更新的schema重设默认值
* fix: 修复搜索表单使用updateSchema时,如果使用fieldMapToTime引起的bug

* fix: set all schema to default value

---------

Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>
2023-12-27 10:47:43 +08:00
xachary
1e34d3e9e4 feat(layout->tabs): support insert new tab after current tab (#3471)
* feat: insert new tab after current tab

* fix: go params declare wrong
2023-12-27 10:19:34 +08:00
invalid w
182b4fc437 chore(dep): update dayjs version 1.11.9 to 1.11.10 2023-12-27 10:09:43 +08:00
xachary
b92c6c40fa Fix the demo /comp/table/formTable about selection cross pages (#3468)
* fix: keep rowSelection onChange call outside

* fix: demo FormTable about seletion
2023-12-27 09:15:15 +08:00
xachary
fc002d3db3 fix: column setting index column sort (#3463)
* fix: keep rowSelection onChange call outside

* fix: ColumnSetting index column sort wrong
2023-12-26 20:41:03 +08:00
xiaoMingTongXue
141f3bdbd0 fix: 修复表单按钮的类型定义外部无法修改重置或者提交按钮的文字的问题
* 解决 eslint-plugin-vue 关于 v-show 无法在 template 中报错的问题

* fix: 修复表单按钮的类型定义外部无法修改重置或者提交按钮的文字的问题

* chore: remove type ButtonOptions

---------

Co-authored-by: chengmingrui <chengmingrui@oneaiops.com>
Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>
2023-12-26 17:56:13 +08:00
xachary
cc97f06354 fix: modal open logic missing (#3462)
* fix: keep rowSelection onChange call outside

* fix: watch open logic lost after build (modal)
2023-12-25 19:43:37 +08:00
xachary
a7b2f14b90 fix(BasicTable): keep rowSelection onChange call outside (#3461). resolve #3453 2023-12-25 17:15:39 +08:00
luocong2016
b57d9fc60d feat(demo->useRequest): 更新useRequest 依赖 Effect 函数案例 (#3460) 2023-12-25 17:00:01 +08:00
苗大
1b763fceee style: 优化滚动条深色模式样式 (#3458) 2023-12-25 14:31:44 +08:00
luocong2016
7fa2578e6d feat(demo->useRequest): 更新错误重试示例 (#3456) 2023-12-25 14:31:11 +08:00
xachary
75f5b7ac4d fix(BasicTable): index still show when set showIndexColumn false (#3455) 2023-12-25 11:29:58 +08:00
luocong2016
d6d1120d00 feat(demo): hooks useRequest 异步数据管理 (#3447) 2023-12-22 16:50:41 +08:00
likui628
9e055ad273 fix: FormItem won't render when a component is not provided 2023-12-21 16:58:57 +08:00
likui628
2db4cfbd33 chore: remove slot from ComponentFormSchema type 2023-12-21 16:12:57 +08:00
xk
6bb79180fc feat(BasicForm): Improve ts types for BasicForm (#3426)
* fix(ApiCascader): Resolve api type conflict with labelField/valueField

* chore: Improve ts types for BasicForm

* fix(ApiCascader): Resolve API type error

* chore: Resolve type:check error

* chore: fix form type error

* fix(ApiRadioGroup): Resolve api type conflict with labelField/valueField

* fix(ApiTree): api type error

* chore(demo): form basic page schemas use FormSchemaAll

* chore: FormSchemaAll to FormSchema

* fix: ComponentFormSchemaType

* fix: Object literal may only specify known properties

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>
2023-12-21 15:59:32 +08:00
xachary
65122ea1a5 fix(BasicTable): ColumnSetting about selectedRowKeys override (#3446) 2023-12-21 09:37:41 +08:00
xachary
86ecb2729e fix(BasicTable): column setting about action fixed and default not cache (#3441) 2023-12-20 09:14:35 +08:00
松鼠
7ba83e71bf fix(BasicTable): 滑动表格内容合计行不跟随滑动bug (#3438) resolve #2166 2023-12-19 14:42:35 +08:00
苗大
b008c44246 perf(darkMode): 深色模式颜色定义以及切换方式优化 (#3436)
* perf(darkMode): 深色模式颜色定义以及切换方式优化

* perf: text-color rgb->rgba

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-12-18 21:15:23 +08:00
苗大
2bc8981b4f style(autofill): 修复深色模式输入框自动填充后样式异常; 修正登录页不恰当全局样式 (#3435)
* fix(autofill): 修复深色模式输入框自动填充后样式异常

* perf(Login): 去除登录页重复autofill样式;ant-divider-inner-text样式改为仅对登录页深色模式生效

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-12-18 17:35:00 +08:00
xachary
089a98953e fix: watch open logic lost after build (#3421)
* fix: watch open logic lost after build

* fix: drawer for better understand
2023-12-16 21:33:44 +08:00
xachary
404a4720b0 fix: EditableCell about checked/unChecked Value, getDisable, rowKey missing for updating (#3418). resolve #3419 2023-12-15 16:12:43 +08:00
xiaoMingTongXue
d502e1d493 fix:修复气泡确认框的底部按钮换行的问题 (#3413)
* fix:修复气泡确认框的底部按钮换行的问题

* fix: 修复气泡确认框的底部按钮换行的问题
2023-12-14 10:53:19 +08:00
xachary
af6e73b83f style: tabs bottom double line fix (#3415) 2023-12-14 09:27:48 +08:00
xachary
e23f29464b feat(IconPicker): IconPicker could allowClear and readonly for form (#3414) 2023-12-14 09:26:34 +08:00
bowen
595b1ce680 fix(FormTable): Invert select bug (#3412) 2023-12-14 09:13:36 +08:00
invalid w
23b684977c chore: 自定义组件默认rule校验默认触发逻辑为blur 2023-12-13 18:34:02 +08:00
invalid w
1296590e3a chore(ApiRadioGroup): 移除多余的change事件 2023-12-13 18:28:56 +08:00
invalid w
ccf4027533 fix(ApiSelect): 修复监听不到params的变动 2023-12-13 17:35:25 +08:00
invalid w
fdde6f06b2 fix(BasicForm->ApiRadioGroup): when options click, duplicate requests. resolve #3387 2023-12-13 17:25:45 +08:00
luchanan
2828ed304a Revert "feat: table搜索表单值发生改变可以触发reload (#3378)" (#3407)
This reverts commit 1ca3f7c2c0.
2023-12-13 09:11:07 +08:00
xachary
fec67b4d53 fix(BasicTable): ColumnSetting mistake when use setColumns (#3408) 2023-12-13 09:10:17 +08:00
luocong2016
d3600daf5c fix: navigator.clipboard 兼容问题 #3372 (#3403) 2023-12-12 15:25:13 +08:00
xachary
f4df2d5a4b feat: ColumnSetting and SizeSetting persist (#3398) 2023-12-12 12:04:03 +08:00
bowen
57e6e4f004 fix(BasicDrawer): remove toRaw props (#3399) 2023-12-11 17:55:01 +08:00
jackhoo(胡彪)
0a1a5ffedc feat(hooks): useWatermark添加水印防篡改功能(#3395) (#3397)
Co-authored-by: jackhoo_98 <jackhoo_98@foxmail.com>
2023-12-11 14:14:00 +08:00
xachary
20698c052c fix: table height calc when fullcontent and footer visible change (#3392)
* fix: table height calc when fullcontent and footer visible change

* fix: useRootSetting dep path wrong
2023-12-11 09:49:26 +08:00
TOUCHERS
bca5154a9d fix(BasicTable): table表格宽度自适应,隐藏的列导致宽度增加 (#3388) 2023-12-08 09:13:14 +08:00
luchanan
6b6b790f87 fix: 使用suffix时,label没有垂直居中 (#3384) 2023-12-07 10:52:42 +08:00
luchanan
1ca3f7c2c0 feat: table搜索表单值发生改变可以触发reload (#3378) 2023-12-06 12:07:14 +08:00
zhang
e656b5d8dc feat(treeTable): add function collapseRows and demo (#3375)
* feat(treeTable): add function collapseRows and demo
2023-12-04 11:54:31 +08:00
zhang
943f50051c perf(BasicTree): 外部获取treeData不必通过treeDataRef.value (#3353) 2023-12-04 11:54:11 +08:00
Simon He
7207a0b840 chore(table): typo (#3374) 2023-12-04 11:53:11 +08:00
luocong2016
05bc4acb9b feat: iframe expose postmessage function (#3368)
* feat: iframe postmessage

iframe postmessage

* chore: prettier format code

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-12-01 18:00:08 +08:00
林飞
cd71e60dd1 feat(Form): 在Form将BasicTitle识做为Divider一样的处理 (#3371)
* feat(Form): 在Form将BasicTitle识做为Divider一样的处理

* refactor: 抽离是否存在SimpleComponents的校验逻辑

---------

Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-12-01 17:48:11 +08:00
Sina Kulas
dde3652b7d fix: 解决table复选框点击无法勾选状态问题 (#3370)
Co-authored-by: Tang <11726782+sugar_gitee@user.noreply.gitee.com>
2023-12-01 16:21:30 +08:00
林飞
522e892d79 feat(vxetable): 新增 clearEdit 方法 (#3369)
Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-12-01 14:36:31 +08:00
林飞
f6147fa449 feat(Form): 新增Transfer、CropperAvatar、BasicTitle 组件至Form中,并添加至演示页面 (#3362)
Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-11-30 14:10:45 +08:00
林飞
2376e8f67d feat: 修复 vxetable 实例中缺少的 getRefMaps 和 getComputeMaps 方法 (#3361)
Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-11-30 09:16:37 +08:00
松鼠
beee35173b fix: 修复BasicForm使用componentProps函数返回valueFormat时DatePicker无法正确格式化的问题 (#3357)
* 修复BasicForm使用componentProps函数返回valueFormat时DatePicker无法正确格式化的问题

* chore: resolve prettier error

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-29 16:56:49 +08:00
韩菱纱
b0e8154f9f feat: 解决Form updateSchema后执行setProps导致schemaRef被重置的问题 (#3354) 2023-11-28 18:00:34 +08:00
jackhoo(胡彪)
be935eb44e fix(demo): 修复引导页文件名问题 (#3352)
Co-authored-by: jackhoo_98 <jackhoo_98@foxmail.com>
2023-11-27 17:59:31 +08:00
1455668754
8b516b75b8 调整后的ImageUpload组件无法正常使用且无法使用单个上传[#3344] (#3345)
* Update typing.ts

* 默认上传单个

* fix(ImageUpload): 修正图片单个上传&返回结果未进行处理
2023-11-27 09:17:19 +08:00
林飞
97b76ea6bc feat: RefForm页面新增只读功能按钮 (#3346)
* feat(RefForm): 新增只读表单demo
2023-11-27 09:15:31 +08:00
林飞
342328ce5f feat: 新增表单只读功能 (#3335)
* fix(useFormEvents): 修复setFieldsValue 方法设置完值后,表单属性丢失formActionType 的bug

* feat: 新增 sync 的action

* feat(FormItem): 新增只读属性

* feat(FormItem): 新增表单只读属性

---------

Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-11-26 14:04:13 +08:00
xachary
0f13758554 fix: table index column width is not enough in english (#3342) 2023-11-25 16:15:07 +08:00
invalid w
3efe662c91 ci: rename node.js.yml -> linter.yml 2023-11-25 15:09:31 +08:00
jackhoo(胡彪)
895352ad22 fix(breadcrumb): 修复面包屑跳转外链时,导致当前页面404问题 (#3337). close #3336
Co-authored-by: jackhoo_98 <jackhoo_98@foxmail.com>
2023-11-25 14:47:03 +08:00
xingyu
064922dd4c fix: turbo run lint (#3332)
closed #3277
2023-11-24 10:33:35 +08:00
Sina Kulas
3a5f406260 fix: 解决 'Cannot find module uncss' 的问题 (#3334)
Co-authored-by: Tang <11726782+sugar_gitee@user.noreply.gitee.com>
2023-11-24 10:32:32 +08:00
xingyu
4d2fb0cb6f refactor: '/@/' ==> '@/' and '/#/ '==> '#/' (#3329)
* refactor: /@/ ==> @/

* chore: '/@/' ==> '@/' and '/#/ '==> '#/'

* fix: lint:prettier
2023-11-24 10:32:04 +08:00
xachary
3f65baf503 fix: scrollbar is obscured (#3331) 2023-11-24 00:04:34 +08:00
xingyu
42e9de50a2 fix: Failed to resolve component EllipsisText (#3330) 2023-11-24 00:03:44 +08:00
xingyu
8a000705d1 fix: resolve conflicts between eslint and prettier and bump prettier-plugin-packagejson version to 2.4.6(#3328) 2023-11-23 17:45:25 +08:00
xingyu
c8744a057e fix(BasicTable): ref table (#3327) 2023-11-23 17:41:37 +08:00
xingyu
7191ebc122 chore: 更新 unocss 版本及配置 (#3326)
* chore: 升级 unocss 版本 添加 unocss.config.ts 配置文件

* chore: 更新 unocss 插件
2023-11-23 17:40:49 +08:00
xingyu
4305f58d20 fix: 设置 baseurl 后不生效的问题 (#3318)
* fix: 设置 baseurl 后不生效

* chore: update vite-config antdv version
2023-11-23 15:52:12 +08:00
zhang
f62043b1fc fix(DatePicker): date show is wrong and setup script defineExpose (#3324)
* fix(useFormEvents): some function is lost in componentsProps

* fix(useFormEvents): some function is lost in componentsProps

* fix(useFormEvents): some function is lost in componentsProps

* fix(DatePicker): date show is wrong

* fix(useFormEvents): some function is lost in componentsProps

* fix(useFormEvents): some function is lost in componentsProps

* fix(useFormEvents): some function is lost in componentsProps

* fix(DatePicker): date show is wrong

* fix(DatePicker): date show is wrong
2023-11-23 13:46:46 +08:00
xingyu
0cfaa40bd0 refactor: layouts use setup (#3312)
* refactor: layouts use setup

* refactor: dashboard use setup

* fix: breadcrumbs types

* fix: noticeList type check error

* fix: noticeList type check error

* chore(Breadcrumb): revert setup change

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-23 12:14:06 +08:00
xachary
617b01338c fix: fullscreen-modal width wrong (#3321)
* fix: fullscreen-modal width wrong

* fix: ModalWrapper expose setModalHeight missing
2023-11-23 09:10:21 +08:00
bowen
f58ef6777c fix(BasicForm): script setup defineExpose (#3316) 2023-11-22 10:02:26 +08:00
xachary
c715d35ad5 fix: 修复index.html加载文字偏移的问题 (#3306) 2023-11-21 18:39:13 +08:00
invalid w
83fb63faa6 ci: add ts type check 2023-11-21 16:46:46 +08:00
invalid w
d8ab800b8a Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2023-11-21 16:39:30 +08:00
invalid w
eed50db873 chore(demo->form-design): resolve ts error. close #2719 #1882 2023-11-21 16:39:11 +08:00
invalid w
c59983345e chore(demo->form-design): resolve ts error. close #2179 #1882 2023-11-21 16:37:24 +08:00
bowen
2cd5a40322 fix(type): type:check error (#3309) 2023-11-21 15:38:00 +08:00
林飞
82671d0750 fix(useFormEvents): 修复setFieldsValue 方法设置完值后,函数 componentProps丢失formActionType 的bug (#3301)
Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-11-20 16:59:05 +08:00
Hannah Jensen
a9530877c0 style: 修复eslint和stylelint (#3303)
Co-authored-by: DreamyTZK <i@tzki.cn>
2023-11-20 16:57:23 +08:00
bowen
d7472b8a2e fix(VFormDesign): findIndex === -1 (#3305) 2023-11-20 16:56:28 +08:00
胡彪
6c0b857d7d refactor(demo): transition and account use setup (#3298)
Co-authored-by: jackhoo_98 <jackhoo_98@foxmail.com>
2023-11-20 15:46:40 +08:00
xingyu
bab28af986 refactor: components use setup (#3299)
* refactor: /@/ => @/

* refactor: table demo use script setup

* refactor: change /@/ to @/
2023-11-20 12:27:11 +08:00
明修
cb13986a17 fix: 修复表单设计的右侧属性配置面板中部分表单错乱的问题 (#3300). close #3268 2023-11-20 09:21:34 +08:00
invalid w
11e689c86c chore: rm unnecessary script 2023-11-18 16:53:56 +08:00
xingyu
9fad2ab631 refactor(demo): table demo use script setup (#3296)
* refactor: /@/ => @/

* refactor: table demo use script setup

* refactor: change /@/ to @/

* feat: add antdv qrcode demo

* style(qrcode): add margin bottom

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-18 16:50:20 +08:00
zhang
003a951bef feat(menu): Restore side bar settings and added menu mouse move in mode light style (#3295)
* feat(menu):  Added menu mouse move in style

* feat: 恢复菜单主题设置

* type(setting): change the function name to a more appropriate one

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-18 16:04:52 +08:00
xingyu
35751068c5 refactor(demo): 重构demo页面组件为 script setup 语法 (#3293)
* refactor: charts demo use setup refactor

* refactor: demo use script setup refactor

* refactor: demo feat use script setup refactor

* fix: tab-params

* revert: settings.json

* style(demo->Modal1): loading text line height

* Update index.vue

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-18 11:43:18 +08:00
bowen
cb907165ec refactor: some feat pages transfer setup grammar (#3292)
* refactor: some feat pages transfer setup grammar

* refactor: update
2023-11-18 09:26:59 +08:00
zhang
72ef3df57f fix(useFormEvent): 修复表单项存在defaultValue时,updateSchema方法会将setFieldsValue设置的值覆盖问题 (#3287) 2023-11-17 11:56:04 +08:00
黄小民
3b2760ca3a fix: defaultValue类型为number时的bug (#3288) 2023-11-16 10:00:13 +08:00
bowen
100f3cf26c fix(BasicForm): validate Form tip height (#3286). close #3281 2023-11-15 09:00:50 +08:00
bowen
2bbc2d2811 perf(IconPicker): input trigger popover by click (#3278) 2023-11-15 09:00:03 +08:00
苗大
89323186b5 perf(breakpointEnum): 修改enum与breakpoint.less内一致 (#3276)
Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-11-13 13:15:16 +08:00
zhang
6d047fb53f fix(DatePicker): zh-CN is not work in DatePicker (#3273)
* fix(DatePicker): zh-CN is not work in DatePicker

* fix(DatePicker): locale zh-CN is not work in DatePicker
2023-11-13 13:14:59 +08:00
zhang
2991bb1670 perf(ImageUpload): 根据官方示例设置图片回显格式 (#3252)
* perf(ImageUpload): 根据官方示例设置图片回显格式

* perf(ImageUpload): 优化图片上传组
2023-11-13 13:14:21 +08:00
invalid w
bfb7cd32f2 chore(deps): bump ant-design-vue and typescript to latest version 2023-11-10 15:47:10 +08:00
invalid w
538fa168fe chore(demo->form): 增加ApiTransfer使用示例. close #1760 2023-11-10 11:09:03 +08:00
xachary
83426b5c96 feat(layout): move setting button to tabs when fold (#3264) 2023-11-09 16:02:57 +08:00
xachary
191e809b6d feat(MultipleTab): add tabs auto collapse interaction in fold mode and setting (#3256)
* fix: validateFields await missing

* feat(MultipleTab): add tabs auto collapse interaction and setting

* chore(locales): update  setting name to better reflect its purpose

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-09 11:24:27 +08:00
invalid w
b976933766 chore(i18n): resolve ts type error 2023-11-09 11:10:36 +08:00
invalid w
90b45b3a51 chore(demo->BasicTree): 增加获取当前tree数据示例. resolve #3253 2023-11-09 09:57:01 +08:00
invalid w
748b99b18f perf(BasicTree): 获取treeData改写成函数 2023-11-09 09:56:11 +08:00
invalid w
caf1783525 feat(BasicTree): BasicTree组件暴露treeData数据 2023-11-09 09:47:00 +08:00
bowen
2142506ce5 fix(dept): no parentDept can edit parentDept (#3255) 2023-11-08 11:43:24 +08:00
xachary
71c3fea88a fix: validateFields await missing (#3254) 2023-11-08 11:42:54 +08:00
invalid w
8ef39def79 chore(demo): 自定义列的helpMessage增加tsx和h函数渲染的数据 2023-11-07 11:17:42 +08:00
invalid w
c373ffd3bf feat(Table-> CustomerCell): helpMessage支持传递 tsx 和 h函数的数据 2023-11-07 11:16:52 +08:00
Kirk Lin
f91d777e4f refactor: fix type check (#3246) 2023-11-07 10:31:32 +08:00
Kirk Lin
11cbe66937 refactor: remove cipher old (#3245) 2023-11-07 10:13:42 +08:00
Kirk Lin
ea51c492c2 feat: pinia persist plugin custom serializer (#3244) 2023-11-07 10:13:24 +08:00
zhang
dccc8f625d 优化Upload组件目录结构,以及图片上传组件 (#3241)
* fix(vxe-table): theme dark is not work

* perf(ImageUpload): 优化Upload组件目录结构,以及图片上传组件
2023-11-06 18:24:54 +08:00
zhang
031d613b18 fix(vxe-table): theme dark is not work (#3239) 2023-11-06 18:24:23 +08:00
xingyu
b6f8379e93 fix: breakpoint (#3242) 2023-11-06 11:08:19 +08:00
open-carp
ec646c57b8 fix(demo->customerForm): FormItem下有多个受控组件控制台显示错误提示的bug (#3238)
* fix: FormItem下有多个受控组件控制台显示错误提示的bug

* chore(demo->customerForm): use Promise in rule validator

---------

Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-11-04 11:28:25 +08:00
zhang
509541d11e style(theme): resolve ts type error and perf themeColor selected (#3237)
* perf(useTree): resolve ts type error

* perf(projectSetting): themeColor selected

* perf(dark): fix mode dark component-background-color var is not work
2023-11-04 09:21:18 +08:00
熊丽君
da1f177284 chore: Update TableImg.vue (#3234)
TableImg Displaying images in the table will result in preview text for other hidden tags AImage
2023-11-04 09:16:37 +08:00
invalid w
6b919cd2fc chore(useLocale): resolve ts type error 2023-11-03 12:37:36 +08:00
invalid w
9c8e848684 chore(deps): update vue-i18n version 2023-11-03 12:36:57 +08:00
invalid w
4de756aa2d chore(routeHelper): [Fixes #3217] remove undefined property 2023-11-03 11:53:33 +08:00
bowen
beed7f2e11 feat(Upload): file list add drag func (#3227). resolve #3179 2023-11-02 11:26:35 +08:00
苗大
2e632e4d4d fix(dark): fix --text-color light color not work (#3228)
* fix(dark): fix --text-color light color not work

* fix(dark): fix --text-color light color not work

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-11-02 11:23:01 +08:00
黄小民
59145ade25 feat: vxeTable searchInfo demo (#3223) close #3011 2023-11-02 09:13:48 +08:00
Jiaxin sugar
bf060376e6 Update ApiSelect.vue (#3225)
修复 isFirstLoaded 状态没有重置导致 fetch方法只会调用一次
2023-11-02 09:06:49 +08:00
苗大
bb3d5b8ae8 perf(ConfigProvider): 配置antdv主题色, 使其与modifyVars配置一致 (#3219)
* perf(ConfigProvider): 配置antdv主题, 使其与modifyVars配置一致

* fix(dark): 修正颜色写法

* fix(dark): 修正app-content-background-color深色颜色

* style(BasicTable): row striped style add important

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
2023-11-02 09:05:58 +08:00
invalid w
3689bd1cb1 chore(readme): add Star History Chart 2023-10-31 17:57:46 +08:00
invalid w
50eac7f353 chore(Table->setting): fix CheckboxGroup onchange event fn type 2023-10-31 16:51:41 +08:00
苗大
e497721e9b perf(darkMode): 优化深色模式颜色切换相关方法; 增加根据主题更新自定义颜色方法和示例 (#3216)
* perf(darkMode): 优化深色模式颜色切换相关方法; 增加根据主题更新自定义颜色方法和示例

* revert: 撤销notify组件的样式修改测试

* chore: color pattern error

* chore(theme): remove dead code

---------

Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
Co-authored-by: invalid w <wangjuesix@gmail.com>
2023-10-31 16:40:08 +08:00
wuzhican
ee8ec9eacf fix: 修复notice样式绑定路径错误 (#3218)
* fix: 修复notice样式绑定路径错误

* fix: 修改notice的style嵌套结构以匹配template结构

---------

Co-authored-by: wuzhican <3245076860@qq.com>
2023-10-31 14:03:42 +08:00
Jiaxin sugar
295f7eef1a Update routeHelper.ts (#3217)
某些情况下如果name如果没有值, 多个一级路由菜单会导致页面404
2023-10-31 11:44:50 +08:00
bowen
ed267d9c01 fix(FormItem): use getPopupContainer default value (#3215) 2023-10-31 11:43:30 +08:00
invalid w
5b9759710b chore(ApiSelect): optimize the type of OptionsItem 2023-10-30 16:08:56 +08:00
invalid w
726bb73b58 chore(Table): Popup style disorder. close #3211 2023-10-30 15:51:01 +08:00
invalid w
8f900871ac perf(useForm): If the args of the setFieldsValue is empty, it will not be executed. close #3209 2023-10-30 12:23:43 +08:00
zhang
06a6c947a9 fix(style): 修复黑暗模式下弹框、demo目录下、按钮样式问题 (#3208)
删除黑暗模式下冗余的样式代码
2023-10-30 08:14:38 +08:00
Jiaxin sugar
97f16271b1 Update role.data.ts (#3207)
fix: The component value is incorrect,
2023-10-29 21:35:06 +08:00
zhang
054a476d25 fix: 修复黑暗模式下一些样式问题 (#3201)
* fix: 修复黑暗模式下一些样式问题

* chore: refactor dark.less

---------

Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>
2023-10-28 21:37:44 +08:00
bowen
ae61fa1186 fix: checkedKeys use unref bug (#3198) 2023-10-26 16:16:58 +08:00
bowen
405ef9e2b3 fix: async validator (#3194) 2023-10-26 11:54:09 +08:00
zhang
4755017bcc fix: 修复设置抽屉弹框滚动条样式异常 (#3193) 2023-10-26 09:25:37 +08:00
jinmao88
18211f6d14 Update README.zh-CN.md 2023-10-25 22:23:33 +08:00
jinmao88
52aba6c106 Update README.md
更新readme
2023-10-25 22:22:12 +08:00
invalid w
41451f4fa3 fix(BasicTable): pagination exceeds page height. close #3185 2023-10-25 17:17:27 +08:00
bowen
83fc4ae391 chore(ATypographyParagraph): fix type:check (#3187) 2023-10-25 11:55:14 +08:00
invalid w
6f0a44f528 chore(TableFooter): resolve ts type error 2023-10-24 12:08:57 +08:00
bowen
92875cbecc fix(tree): remove expandedKeys prop default value (#3184) 2023-10-24 10:20:13 +08:00
bowen
e7fbd74228 fix(Upload): The file name is too long bug (#3182)
* fix(Upload): The file name is too long bug

* fix: preview upload result file name nowrap

* chore: modify i18 to be uploaded

* chore: typing & i18n

---------

Co-authored-by: Li Kui <90845831+likui628@users.noreply.github.com>
2023-10-23 15:32:04 +08:00
zhang
87224715c3 feat: 增加文本省略组件 (#3180)
* feat: 增加文本省略组件

* refactor: 重构文本省略组件

* feat: 增加远程懒加载下拉树功能
2023-10-23 14:42:56 +08:00
luchanan
00bf5d5bbf 站内支持API接口地址切换 (#3162)
* feat: 站内切换接口API

* feat: 站内切换接口API

* feat: 站内支持API接口地址切换,解决冲突,新增开关显示

(cherry picked from commit c6d60b6cfd50bf8e19233a21640ecf1d41c01cc8)
2023-10-23 14:37:56 +08:00
1455668754
b776ac4cd8 feat: Form增加ImageUpload组件 (#3172)
* feat: Form增加图片上传组件

* fix: 还原表单组件引用

* chore: ImageUpload demo

* chore: update ImageUpload demo

* fix: 'visible' will be removed in next major version

* chore: 修改api接口返回值参数

---------

Co-authored-by: Li Kui <90845831+likui628@users.noreply.github.com>
2023-10-21 19:29:53 +08:00
invalid w
e4bcf8c899 chore(demo): basicTree组件增加icon 和 switcherIcon示例 2023-10-21 11:49:17 +08:00
invalid w
a0b2a9e949 fix(BasicTree): not inherit slot and not show icon slot. close #1902 2023-10-21 11:48:38 +08:00
invalid w
7b87d6d29e chore(BasicTable): resolve BasicTable component ts type error 2023-10-20 17:15:05 +08:00
invalid w
3d0b88708e chore(BasicTree): Resolve ts type error 2023-10-20 16:47:03 +08:00
Li Kui
c42ba1cc1b fix(ApiCascader): apiParamKey not working 2023-10-20 13:34:48 +08:00
invalid w
2ec5f6322d fix(Menu): tab标签切换选中状态焦点重复. fix #1681 2023-10-20 12:00:05 +08:00
bowen
83aa1da3de fix: SimpleRootMenuContextProps type error (#3176) 2023-10-20 09:55:34 +08:00
Kirk Lin
6f7d840128 refactor: cipher (#3174) 2023-10-19 16:41:29 +08:00
Kirk Lin
2152b3f779 feat: add pinia persist plugin (#3173) 2023-10-19 16:17:49 +08:00
invalid w
882270d5ba fix(ApiTree): 多触发一次onchange 2023-10-19 10:52:30 +08:00
invalid w
b103c64954 chore(ApiSelect): 该组件设定成手动触发验证 2023-10-19 10:41:11 +08:00
Li Kui
0f2c2eabd6 fix(ApiSelect): BasicForm emit ield-value-change twice 2023-10-18 21:06:10 +08:00
bowen
bbc2ede1aa chore: fix type:check error (#3169) 2023-10-18 19:24:26 +08:00
bowen
c24e0efd1d perf: Modify i18 file format to JSON (#3171) 2023-10-18 19:15:52 +08:00
invalid w
0cf79d4ce2 fix(ApiSelect): Incorrect value type definition. close #3168 2023-10-18 17:24:32 +08:00
Li Kui
8df2590aae fix(BasicTable): headerCell slot title not exist 2023-10-18 10:11:57 +08:00
bowen
40aac6544c fix(demo): account page table without dept (#3164) 2023-10-17 20:40:51 +08:00
Li Kui
1a5bedd1cb chore(deps): updated ant-design-vue to version 4.05 (#3160)
* chore(deps): updated ant-design-vue to version 4.04

* chore(deps): updated ant-design-vue to version 4.05
2023-10-17 20:06:45 +08:00
invalid w
b3a6ef63bb feat(Menu): Add custom images to menu (#3158)
* feat(SimpleMenu): Add custom images to menu icons

* style: Set image and text alignment

* feat: 顶部菜单模式路由也支持图片

* feat(mixSilder): 左侧菜单混合模式也支持图片显示

* style(menu): 调整图片对齐样式

* chore(Menu): 调整图片与文字间距样式

* chore: icon和img都传值的情况下, 仅显示img
2023-10-17 12:28:15 +08:00
前端爱码士
a0e43abeab fix: 修复Modal.confirm的返回类型问题,需要有destroy,update的方法 (#3161)
* fix: 修复Modal.confirm的返回类型问题,需要有destroy,update的方法

* chore: simplify

---------

Co-authored-by: Li Kui <90845831+likui628@users.noreply.github.com>
2023-10-17 10:16:02 +08:00
bowen
18222ab0b6 chore: fix type:check error (#3159) 2023-10-17 09:29:43 +08:00
Li Kui
0bb76a86d2 fix(BasicForm): useForm 中 scheme 选项 slot 与 component冲突 (#3133)
* fix(BasicForm): useForm 中 scheme 选项 slot 与 component冲突

* chore: add type-predicate utils

* chore: add FormSchemaInner type
2023-10-16 16:56:26 +08:00
Li Kui
d30fd1d546 chore: replace intro.js with driver.js (#3151) 2023-10-15 11:34:13 +08:00
Li Kui
8f6153fd2a fix(ApiSelect): type warning 2023-10-14 21:05:43 +08:00
invalid w
a0d4b10a1f feat(ApiTree): 完善ApiTree组件的重置回显功能. close #2307 2023-10-14 16:57:40 +08:00
invalid w
d4f2641b9a chore(Demo): restore ApiTree schema show 2023-10-14 11:19:58 +08:00
invalid w
094a33c0c2 fix(ApiTree): Modify Trigger Selection Event Name 2023-10-14 11:18:48 +08:00
黄小民
95ca2c3ae6 fix: ApiTransfer 不支持disabled (#3149) 2023-10-13 18:00:14 +08:00
黄小民
8e9d4f0a57 fix: #3144 Drawer的footer样式错位问题 (#3148)
fix: #3144 Drawer的footer样式错位问题
2023-10-13 17:33:03 +08:00
invalid w
5aac032acc feat(BasicButton): BasicButton组件支持icon插槽. close #1377 2023-10-13 17:26:07 +08:00
invalid w
f5f7952515 chore(Pagination): Remove the unnecessary pagesize attribute 2023-10-13 17:10:03 +08:00
bowen
cdac147bc8 fix(LockModal): Cannot unlock (#3143) 2023-10-13 11:22:23 +08:00
wuzhican
4b46be4a79 Pr/code editor boardered (#3142)
* feat: 为CodeEditor添加bordered属性

* fix: 去除重复的ant-inputclass

---------

Co-authored-by: wuzhican <3245076860@qq.com>
2023-10-12 17:16:54 +08:00
bowen
f87e078402 chore: fix type:check error (#3139) 2023-10-12 14:50:32 +08:00
bowen
4d02205839 fix(customExport): Failure to export (#3137) 2023-10-12 09:20:56 +08:00
bowen
e161c1449a fix(full-screen): dom fullscreen status text (#3130)
* chore: Fix ts type error

* chore: fix type:check error

* fix(full-screen): dom fullscreen status text
2023-10-11 10:47:24 +08:00
Li Kui
5a388be15e fix(BasicForm): type instantiation is excessively deep and possibly infinite. (#3128) 2023-10-10 22:35:41 +08:00
bowen
30b3ee5c89 chore: fix type:check error (#3126)
* chore: Fix ts type error

* chore: fix type:check error
2023-10-10 21:06:16 +08:00
黄小民
b43d3069e1 fix: #2744tabs选项卡渲染问题,以及完善路由中affix=true时处理逻辑。 (#3127)
* fix: #2744tabs选项卡渲染问题,以及完善路由中affix=true时处理逻辑。

* fix: type warning

---------

Co-authored-by: Li Kui <90845831+likui628@users.noreply.github.com>
2023-10-10 20:58:40 +08:00
Kirk Lin
a768b7d519 chore: update unplugin-config (#3120)
* chore: update `unplugin-config`

* fix: decode HTML entities in the injected HTML code
2023-10-10 18:18:09 +08:00
invalid w
c5a13dc92f Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2023-10-10 18:06:48 +08:00
invalid w
6dd2818247 chore(demo): 修正表单增删示例类型错误 2023-10-10 18:05:34 +08:00
Li Kui
ae58ada82e fix(demo): useForm中DatePicker,RangePicker 日期控件位置不对 2023-10-10 17:48:59 +08:00
Li Kui
8b13f62995 fix(Editor): ts类型错误 2023-10-10 13:28:34 +08:00
invalid w
025cf98f4b chore(MenuItem): watch回调参数类型不一致 2023-10-10 12:25:06 +08:00
invalid w
6e33c26893 fix(SimpleMenuTag): SimpleMenuTag的引用都改为动态组件引用,以消除打包警告.close #3121 2023-10-10 12:23:39 +08:00
invalid w
d9fd16f4de Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2023-10-10 12:07:28 +08:00
invalid w
a73187ccf4 chore(demo): 消除ts类型错误 2023-10-10 12:07:26 +08:00
黄小民
aa03c87383 fix: ScrollContainer的一个问题 #3046 (#3119) 2023-10-10 11:39:12 +08:00
invalid w
f5ce480f0f fix(StrengthMeter): change事件应随handleChange一起抛出。close #3118 2023-10-10 11:30:37 +08:00
invalid w
f0550f2043 Revert "chore: update unplugin-config (#3116)" (#3117)
This reverts commit f8698c4c3d.
2023-10-10 10:34:12 +08:00
Kirk Lin
f8698c4c3d chore: update unplugin-config (#3116) 2023-10-10 10:02:05 +08:00
invalid w
71c43945a5 fix(EditCellTable): 表格编辑行在使用Switch,checkedValue为数字时无法切换开关.close #2560 2023-10-09 18:20:11 +08:00
invalid w
0b9dd918d9 chore: set vscode default formatter 2023-10-09 17:51:26 +08:00
bowen
8289332214 chore: Fix ts type error (#3112) 2023-10-09 15:12:23 +08:00
invalid w
ae09d3cfd6 Revert "chore: Update Dependencies"
This reverts commit 6e1e1de0e2.
2023-10-09 12:37:05 +08:00
invalid w
6e1e1de0e2 chore: Update Dependencies 2023-10-09 12:31:29 +08:00
invalid w
cea297ce88 chore(error-handle): 处理vue errorHandler绑定事件的参数类型不一致 2023-10-09 12:02:53 +08:00
invalid w
e456f54ded chore(internal): 添加getEnvConfig返回类型 2023-10-09 11:54:31 +08:00
invalid w
e25af8dd8c chore(useFormEvents): 消除checkIsRangeSlider 校验类型错误 2023-10-09 11:37:59 +08:00
invalid w
49d40d685d chore: 消除Switch组件类型错误。close #3111 2023-10-09 11:26:48 +08:00
Kirk Lin
e53fefb310 refactor: use unplugin-config (#3110)
* refactor: use `unplugin-config`

* fix: preserve indentation in generated code

* refactor: use `unplugin-config`
2023-10-08 20:03:14 +08:00
invalid w
9c6b271097 chore(Form): 消除antd升级导致类型文件引用错误 2023-10-08 18:30:50 +08:00
invalid w
ec33820bf9 chore(Preview): 消除 onerror 参数类型错误 2023-10-08 18:25:11 +08:00
invalid w
a5a11fb846 chore(Preview):消除Preview Options的函数定义类型错误 2023-10-08 18:20:18 +08:00
invalid w
694dead311 Revert "refactor: use unplugin-config (#3106)"
This reverts commit a712a8e5a0.
2023-10-08 18:09:59 +08:00
invalid w
d84f6ef562 chore(Loading): 消除loading组件及示例类型问题 2023-10-08 18:07:42 +08:00
invalid w
ba5809669d chore(useCustomRow): 消除find tr函数类型错误 2023-10-08 17:54:53 +08:00
Kirk Lin
a712a8e5a0 refactor: use unplugin-config (#3106)
* refactor: use `unplugin-config`

* fix: preserve indentation in generated code
2023-10-08 17:31:55 +08:00
invalid w
1e95706f8b chore: Fix ts type error (#3100)
* chore: fix onUploadProgress params type error

* fix(BasicButton): extends type error

* fix: useFormRules 类型问题

* fix: IFormConfig 类型问题

* chore: 设定CollapseItem list参数的类型

* chore: 修复sliderSpan类型错误

* chore: 改写成setup组件

* fix: static func type error

* chore: 设定listener 函数 evt类型为Event

* chore(props): 消除ts类型错误

* chore: 移除多余的类型转换

* Update domUtils.ts

* chore: 消除iconPicker类型错误

* Update domUtils.ts

* chore(clickOutside): 消除类型错误

* Update repeatClick.ts

* Update index.ts

* chore: 补全参数类型

* fix(Cropper): avatar uploadapi 类型问题
2023-10-08 17:30:19 +08:00
invalid w
986430513b fix: tabel取消编辑单元格后会回到初始值. close #2739 (#3108) 2023-10-08 16:15:07 +08:00
invalid w
1519f47f7d fix(ApiSelect): 移除watchEffect引发的重复请求 (#3107) 2023-10-08 15:25:49 +08:00
invalid w
f3f2f548e6 Refactor:移除useCopyToClipboard hook, 使用navigator.clipboard进行替代。close #2723 (#3105)
* feat: 重写复制文本功能

* refactor: 替换复制文本示例代码

* chore: delete useCopyToClipboard hook
2023-10-08 10:50:05 +08:00
invalid w
18f55833e2 fix: 多选框必填选中校验异常,close #3097 (#3103) 2023-10-07 16:37:58 +08:00
invalid w
033d8828a9 perf: 解决ts文件通过alias引入vue文件后, vscode调转不到正确vue文件路径 (#3099) 2023-10-06 14:51:55 +08:00
1455668754
a3b9ff04f9 修正日期区间拆解时数据为null时异常问题/修正validate|validateFields时,未将对象型数据进行转换 (#3096)
* fix: 修正日期区间拆解时数据为null时异常问题

* fix: 修正validate|validateFields时,未将对象型数据进行转换
2023-10-06 10:02:18 +08:00
黄小民
c315aa9801 vite-config中将ant-design-vue升级到版本4 (#3089)
* fix: #3077 最新代码 ApiTransfer编辑后无法正常显示数据

* feat: 升级ant-design-vue至4.0.3

* feat: vite-config up to antd v4

* fix: 去掉console
2023-09-28 21:38:36 +08:00
James Zow
b5bdb53555 Fix unable to run the clear cache command normally #3086 (#3088)
* Create node.js.yml

* Fix unable to run the clear cache command normally #3086

This command will clear the pnpm cache and recompile through vite

* Maintain NPM packaging command
2023-09-28 16:31:40 +08:00
invalid w
690d887680 chore: 设定权限列columns宽度,消除演示表格错位问题 (#3087) 2023-09-28 16:21:28 +08:00
invalid w
64b812802f feat: 支持设置多重水印,增加清除所有水印方法. close #2610 (#3084)
* perf(watermark): 消除水印hook类型问题

* feat: 支持设置多重水印,增加清除所有水印方法

* chore: 应该让用户自己来进行水印清除
2023-09-28 11:05:53 +08:00
黄小民
c0c3116193 fix: #3077 最新代码 ApiTransfer编辑后无法正常显示数据 (#3083) 2023-09-27 17:56:31 +08:00
invalid w
10d6cc9b60 Merge pull request #3082 from wangjue666/fix-form-rule-validate
fix: 修复rule validator type默认为string
2023-09-27 17:03:25 +08:00
invalid w
a63a10c047 fix: 修复rule validator类型默认为string,导致 radio 等组件在 setFormValues 时,如果值不是string类型,提示校验错误 2023-09-27 16:38:59 +08:00
invalid w
b46a505582 Merge pull request #3081 from DesignHhuang/main
fix #3080 按钮权限示例的判断权限异常
2023-09-27 14:09:05 +08:00
huangxiaomin
d46c6daa13 #3080 按钮权限示例的判断权限异常 2023-09-27 13:58:35 +08:00
huangxiaomin
9f6d61d02c Merge branch 'main' of github.com:DesignHhuang/vue-vben-admin 2023-09-27 13:45:19 +08:00
invalid w
edffc12bb7 Merge pull request #3078 from wangjue666/chore-type
Chore:  优化了ApiTree绑定属性TS类型问题,删除了无用的插槽和引用
2023-09-27 10:21:58 +08:00
invalid w
b78f06898f chore(ApiTree): 移除无用的suffixIcon slot, ant的tree组件并没有提供这个slot 2023-09-27 10:13:41 +08:00
invalid w
a7ee3367e5 chore: rm unused watchEffect 2023-09-27 10:08:47 +08:00
invalid w
b3b2ca0738 chore(ApiTree): 消除绑定属性的类型错误 2023-09-27 10:02:21 +08:00
invalid w
fa5803f8c7 chore: release 2.10.1 2023-09-27 09:37:53 +08:00
smirkQAQ
aa6168fe20 fix: Fix context menu style not working (#3075) 2023-09-27 08:18:38 +08:00
invalid w
855a410557 style(Modal): modal全屏模式 ant 的modal-footer margin-top调整为0 (#3072) 2023-09-26 09:41:44 +08:00
invalid w
b1559e2cad fix(ApiSelect): ApiSelect首次选择值时仍然提示校验, fix #3065 (#3071) 2023-09-26 09:41:34 +08:00
invalid w
c5d24e07f0 Chore: 处理了Vben封装的Drawer,Modal组件的一些类型错误 (#3064)
* chore: rm unuse params

* chore(Modal): getCurrentInstance的uid类型为number

* chore(Drawer): 调整drawer组件的一些类型问题

* chore(Drawer): 移除多余的classname配置

* chore(Drawer): 修复getContainer和antd4 drawer组件类型不一致

* fix(AppSearchModal): 调整setRefs函数的类型
2023-09-26 09:41:25 +08:00
林飞
1cf2a81f2a feat(table): 表格拖拽列改变宽度
* feat(funcation): update 修复表格无法拖拽列改变宽度

* feat(function): add 完善可伸缩列

---------

Co-authored-by: gavin-james <meaganlindesy1258@gmail.com>
2023-09-22 10:35:30 +08:00
huangxiaomin
3569eda012 Merge branch 'main' of github.com:DesignHhuang/vue-vben-admin 2023-09-22 09:02:52 +08:00
黄小民
2abe24b8e0 Merge branch 'vbenjs:main' into main 2023-09-22 09:02:26 +08:00
黄小民
5665fd62a9 fix: 英文版本时提示中的单词没有分开 (#3062) 2023-09-22 08:21:44 +08:00
黄小民
eb2665059e fix: 英文版本时提示中的单词没有分开 2023-09-21 17:12:45 +08:00
huangxiaomin
be6f89b4bf Merge branch 'main' of github.com:DesignHhuang/vue-vben-admin 2023-09-21 17:08:15 +08:00
James Zow
b7554fdb74 Create node.js.yml (#3060) 2023-09-21 17:00:21 +08:00
黄小民
47348747a3 Merge branch 'vbenjs:main' into main 2023-09-21 16:16:43 +08:00
黄小民
3b62afe110 Update index.less (#3055)
处理 移动滚动条的时候,ant-select-dropdown 没有随form-item移动
2023-09-21 10:40:18 +08:00
invalid w
dbdd811705 feat(style): 使用Antd组件提供的切换主题功能 (#3051)
* perf(style): 使用antd4的暗黑主题

* refactor: 抽离切换暗黑主题模式
2023-09-21 10:40:09 +08:00
zmcode
a6b65b58a1 feat: 解决Form组件slot必须传递component字段才显示的问题 (#3049)
feat: 解决Form组件slot必须传递component字段才显示的问题
2023-09-21 10:39:44 +08:00
黄小民
a730afb67c Update index.less
处理 移动滚动条的时候,ant-select-dropdown 没有随form-item移动
2023-09-20 15:14:17 +08:00
huangxiaomin
f70cb62ecd 移动滚动条的时候,ant-select-dropdown 没有随form-item移动 2023-09-20 15:09:30 +08:00
胤玄
556575f501 feat: update nginx.conf 使用固定编译入口可能导致浏览器使用缓存js文件,而此配置可以解决 (#3045) 2023-09-20 08:16:48 +08:00
invalid w
e4778757ad style(TableColumn): fix Column settings container is too wide #3043 (#3044) 2023-09-20 08:16:38 +08:00
leo
b43fe7adbc fix(axios): get等方法配置ignoreCancelToken无效 (#3040) 2023-09-18 10:04:24 +08:00
Li Kui
4aaddef06f fix: type check failed for prop 'onClick' (#3038) 2023-09-18 10:04:15 +08:00
alixhome
ce6b25d03b fix: Change role to toles for LoginResultModel (#3037) 2023-09-18 10:04:00 +08:00
open-carp
74a2f6209f fix: FormAction组件 绑定表单提交事件 (#3036) 2023-09-18 10:03:52 +08:00
luchanan
99ddc3598a perf: 指令权限v-auth支持并显示按钮权限 (#3035) 2023-09-17 12:08:17 +08:00
invalid w
d3fd22dbbd chore: 解决 ESLint no-undef 规则校验问题和 basicTable 组件的类型问题,替换popover组件的 visible 属性。 (#3033)
* chore: 关闭eslint的no-undef规则校验

* chore(VFormDesign): 替换表单设计组件的modal是否可见属性

* chore(BasicTable): emit传参类型问题

* chore(Table): 调整函数参数类型

* chore: 调整expandedRowKeys数据类型

* chore(Table): 完善TableRowSelection接口类型

* chore(Table): 完善useRowSelection 文件的类型问题

* chore(useColumns): key赋值的类型问题

* chore(useDataSource): setTableData的类型问题

* chore:  替换rowKeys类型为 (string|number)[]

* fix(edit-cell): 修复edit table Popover 传参问题

* fix(Table):  handleItem函数进行绑定key dataIndex可能为数组,造成类型错误提示
2023-09-16 20:32:33 +08:00
LanceJiang
bf2f6390ad feat: BasicTable 组件 HeaderCell 新增(类customRender) customHeaderRender 方法 自定义渲染支持 (#3030)
示例见: /comp/table/multipleHeader
2023-09-15 15:56:26 +08:00
Li Kui
bd024cc521 fix: isible deprecated warnings (#3029) 2023-09-15 15:56:17 +08:00
Li Kui
4ac08e5ae5 fix: type check failed for prop 'onClick' (#3028) 2023-09-15 15:56:06 +08:00
invalid w
b0c2ca5393 fix(Header): 顶部菜单混合模式下,头部导航栏样式错位 #3021 (#3024)
* fix(Header): 顶部菜单混合模式下,头部导航栏样式错位 #3021

antdv4的ant-layout-header css会携带父选择器 导致line-height失效

* chore: 移除无用css
2023-09-13 20:26:16 +08:00
invalid w
1ac8c56c6b fix(Modal): 全屏modal样式问题 #3019 (#3020) 2023-09-13 16:32:00 +08:00
LanceJiang
f4149c2f1d fix: 由于更新ant-vue 新版本到 4.0.2以上 tsx 渲染 FormItem 插入style 导致的出错 改换class (#3016) 2023-09-12 23:19:11 +08:00
Li Kui
3ed49c3f8f fix: arrow-left icon not centered (#3013) 2023-09-11 22:22:43 +08:00
invalid w
356f132610 style(Drawer): antdv4版本 drawer要使用rootClassName来来配置最外层元素样式 (#3012) 2023-09-11 17:54:40 +08:00
k1ngbanana
1c668f21bf feat: pageWrapper.vue加入sticky功能 (#3008) 2023-09-08 22:10:29 +08:00
k1ngbanana
a244dcd261 fix: 配置文件公共路径无效 (#3007) 2023-09-08 22:10:19 +08:00
invalid w
aaf2fde3cf antdv升级到4.x版本 (#3006)
* fix(ApiTreeSelect):  ApiTreeSelect组件首次调用会重复请求(#2940)

由于watchEffect,onMounted会立即执行,所以导致重复请求。
并且 watch函数和watchEffect监听的依赖重复了,故删去

* chore: update ant design npm version

* chore: 修改antd的css引用路径

* style(layout):  替换sider header组件传参属性,适配原有组件的样式

* style(Menu): 去除气泡卡片的背景

* chore: typo

* typo(Modal): 将visible替换成open

* typo:修改modal弹窗的绑定函数名称

* style(Modal): 为了解决直接引用 Modal 组件时关闭按钮样式的问题,增加一个名为 "vben-basic-modal" 的类名,以实现样式隔离。

* Update package.json

* typo(Drawer): Drawer 组件 visible 变为 open

* typo(Table): Table 组件 filterDropdownVisible 变为 filterDropdownOpen。

* typo(TreeSelect): 组件弹框的 classname API 统一为 popupClassName,dropdownClassName
2023-09-08 22:10:07 +08:00
invalid w
607a24632a fix(ApiTreeSelect): ApiTreeSelect组件首次调用会重复请求(#2940) (#3005)
由于watchEffect,onMounted会立即执行,所以导致重复请求。
并且 watch函数和watchEffect监听的依赖重复了,故删去
2023-09-07 21:47:55 +08:00
invalid w
89d7a19f3f feat(Form): 为fieldMapToTime的映射类型增加时间戳转换 (#2996)
为fieldMapToTime的第三个参数增加 timestamp 和 timestampStartDay 选项

timestamp的作用: 将映射的时间格式转为时间戳

timestampStartDay的作用: 将映射的时间格式转为当天0点开始的时间戳
2023-09-03 16:22:02 +08:00
invalid w
a9017da294 perf: 为createAsyncComponent函数增加类型推导 (#2967) (#2991) 2023-09-03 16:21:51 +08:00
Li Kui
1c1ce4b0e3 fix: VxeTable demo parameter typo& tabs close icon not centered (#2989)
* fix(msg): message icon not centered

* fix: VxeTable demo parameter typo

* fix: tabs close icon not centered
2023-08-31 12:49:21 +08:00
Li Kui
e31525a803 fix(msg): message icon not centered (#2982) 2023-08-26 07:17:06 +08:00
invalid w
7b26c5994c feat: 增加Prompt组件, 并且修复 #2976 (#2979)
* feat: 增加Prompt组件

类似于Element UI组件库的MessageBox Prompt组件

* fix: #2976

* refactor: 对appendSchemaByField函数的通用操作进行整理
2023-08-25 12:36:10 +08:00
supperchong
248f9d5e81 chore: format nginx.conf (#2971) 2023-08-19 08:41:04 +08:00
scottMan1001
a2a78f40da Feat/scott man (#2970)
* feat: esbuild增加不同开发模式下对cnosole debugger的处理

* fix: fix production spelling
2023-08-16 21:35:21 +08:00
Li Kui
2c74e790cb fix(Tree): beforeRightClick type (#2968) 2023-08-16 21:34:57 +08:00
舜岳
b660f96220 refactor: code optimization (#2961) 2023-08-13 09:14:38 +08:00
Aynakeya
5dd3babc4e update left/right icon not align to center (#2958) 2023-08-13 09:14:15 +08:00
invalid w
5425dc241f fix: #2767 #2884 #2868 (#2956)
* fix: #2767

* fix: #2884

* fix: #2868
2023-08-13 09:14:04 +08:00
Hong Sen Lv
44f2b1c644 fix: ts error (#2955)
Co-authored-by: lvhongsen <lvhongsen@tal.com>
2023-08-11 08:39:24 +08:00
billyshen26
573d395b69 fix: 解决ApiTreeSelect的params更新后fetch不执行 (#2954)
* fix: 解决ApiTreeSelect的params更新后fetch不执行

* feat: 优化ApiTreeSelect参数,可自定义value等

---------

Co-authored-by: Billy Shen <shenfangtao@imaodu.com>
2023-08-11 08:39:13 +08:00
jinmao88
df1fceb291 fix: ci ok 2023-08-10 16:24:33 +08:00
jinmao88
9650122736 fix: ci 2023-08-10 15:52:57 +08:00
jinmao88
c99ef68b7b fix: ci 2023-08-10 15:16:22 +08:00
jinmao88
a95ba47b74 fix: ci 2023-08-10 15:09:38 +08:00
jinmao88
3fd193eb8b fix: ci 2023-08-10 14:51:56 +08:00
jinmao88
6fbc552ed1 fix: ci 2023-08-10 11:52:14 +08:00
jinmao88
247665513a fix: ci 2023-08-10 11:26:42 +08:00
jinmao88
351e1e55c2 fix: ci #12 2023-08-10 11:22:39 +08:00
jinmao88
8a27f5f277 fix: ci #11 2023-08-10 11:14:34 +08:00
jinmao88
befb508f7a fix: ci #10 2023-08-10 11:03:00 +08:00
jinmao88
e6c820792a fix: ci #9 2023-08-10 11:00:49 +08:00
jinmao88
30ccbfa695 fix: ci #8 2023-08-10 10:59:37 +08:00
jinmao88
7e12259ec4 fix: ci #7 2023-08-10 10:58:30 +08:00
jinmao88
244eeb18aa fix: ci #6 2023-08-10 10:47:16 +08:00
jinmao88
1108d78a06 fix: ci #5 2023-08-10 10:26:44 +08:00
jinmao88
ebe2047ae0 fix: ci #4 2023-08-10 10:12:39 +08:00
jinmao88
c7f4e6a459 fix: ci #3 2023-08-10 10:09:38 +08:00
jinmao88
833b31129b fix: getAppEnvConfig 2023-08-10 09:11:56 +08:00
smilv
86d5752ed7 perf: useRefs函数接收泛型类型 (#2952) 2023-08-09 21:58:22 +08:00
jinmao88
9babbc43fc fix: ci #2 2023-08-09 14:09:35 +08:00
jinmao88
a2451be5bc fix: ci 2023-08-08 19:07:09 +08:00
invalid w
eea414e04b feat: 恢复暗黑主题 (#2947)
* feat: 恢复暗黑主题

* fix: 修复danger btn暗黑样式优先级
2023-08-07 18:51:30 +08:00
Cao Duc Anh
0bd98b3c27 chore: split function for easy maintain, understand and using (#2945) 2023-08-03 16:28:34 +08:00
LanceJiang
a065de4fbc feat: Form 自定义组件渲染 新增 opts: {disabled} 用于自定义渲染判断 示例: /comp/form/customerForm页面 (#2944)
* feat: Form 自定义组件渲染 示例: /comp/form/customerForm页面
1. 针对自定义渲染功能 FormSchema 中
render, renderColContent, renderComponentContent 新增 opts:{disabled} 扩展 帮助自定义渲染时做 条件判断、展示同步
渲染: ((renderCallbackParams) => any) ===> ((renderCallbackParams, opts) => any)
2. slot, colSlot 分别是 render, renderColContent 插槽,为方便插槽使用
slotFn 进行解构 #test={scope} scope==={...data, ...opts}

* feat: Form 自定义组件渲染 示例: /comp/form/customerForm页面

1. 针对自定义渲染功能 FormSchema 新增 [fields] 和 [defaultValueObj] 帮助
render, renderColContent 自定义渲染时 存在多个 表单字段操作(复合field 场景)
2023-08-03 11:12:19 +08:00
ludens blunt
fa5ecb090f fix(Dropdown): still pop when disabled is true; (#2935)
Co-authored-by: chenguangzhuang <chenguangzhuang@techpci.com>
2023-07-29 10:43:07 +08:00
YueCHEN195
4f9c711012 fix: 修复BasicTable组件开启可编辑行卡顿/卡死问题 (#2939) 2023-07-29 10:42:51 +08:00
lessroc
12924fb3fa perf: 解决提交代码时stylelint格式化less和scss的媒体查询为不支持的语法(Media Queries Level 4) (#2931) 2023-07-29 10:42:25 +08:00
DoverDee
16b4b6d57c fit: 增加CropperAvatar组件图片上传大小限制默认最大5M (#2928)
Co-authored-by: doverlee <doverlee@fox.mail.com>
2023-07-26 19:05:31 +08:00
沐枫
c28224f3f8 增加TimeRangePicker时间区间范围选择组件 (#2926)
* feat: 增加TimeRangePicker时间范围选择组件

* feat: 增加TimeRangePicker时间范围选择组件2
2023-07-24 13:23:59 +08:00
zhangshujun
3b0b8d0baa feat:不允许可重复添加同一field的表单项 (#2923) 2023-07-21 20:23:04 +08:00
明修
b30270a3fb fix: 修复部分图标未居中的问题 (#2917) 2023-07-20 14:44:22 +08:00
zhangshujun
cb64e5d24c From default value (#2913)
* feat: defaultValue赋值后不改动时间相关字段无法格式化问题

* feat: 更新处理方式

* feat: 去除未引用方法

---------

Co-authored-by: zhangshujun <zhangsj01@51cto.com>
2023-07-17 16:52:21 +08:00
LittleSaya
a4e70b9efe 通过把名称编码成hex,使项目能够在VITE_GLOB_APP_TITLE包含特殊字符时正常打包 (#2910)
* Update env.ts

使getVariableName能处理含有特殊字符的标题

* Update appConfig.ts

是getVariableName能处理包含特殊字符的标题的情况
2023-07-13 10:44:13 +08:00
scottMan1001
4e3e721650 feat: esbuild增加不同开发模式下对cnosole debugger的处理 (#2907) 2023-07-11 11:52:54 +08:00
xingyu
c6e135195a 修复合并代码导致的冲突 (#2905)
* fix: 合并代码导致的问题,升级vite 4.4.0

* fix: stylelint
2023-07-07 07:06:36 +08:00
xingyu
1262e13067 升级最新依赖 并修复eslint报错 (#2896)
* chore: update deps

* fix: import.meta.globEager 已过期

* docs: fix doc bugs

* fix: eslint

* fix: lint:prettier

* fix: stylelint

* chore: update deps

* fix: eslint

* refactor: accountdetail setup

* fix: 'Nullable' is not defined

* feat: remove vite-plugin-vue-setup-extend

* chore: remove unplugin-vue-define-options

* fix(component): pageWrapper

use setup

closed #2898

* refactor: PageFooter use setup

---------

Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>
2023-07-06 15:00:38 +08:00
胤玄
c659c14c5a Docker dynamic publish support. (#2903)
* feat: Docker support, including dynamic publish

* fix:  run container command
2023-07-06 13:55:41 +08:00
LanceJiang
5ad5c8cdc7 fix: 类似 /comp/table/formTable页面 rowSelection.selectedRowKeys 数据双向绑定时 clickToRowSelect RowClick 触发失效 (#2893) 2023-06-29 21:04:06 +08:00
Li Kui
27cb958c2e fix: Cropper typo (#2891) 2023-06-28 16:52:33 +08:00
前端爱码士
155ad45848 fix: 修复ts-config未匹配上的文件 (#2880) 2023-06-21 22:41:06 +08:00
Kirk Lin
7535db377f fix(utils): deepMerge failing to correctly merge basic data types (#2872) 2023-06-19 16:59:44 +08:00
jinmao88
a0fdceeae7 fix: 修复边栏无法打开问题,deepMerge函数有问题未修复 2023-06-17 09:44:06 +08:00
jinmao88
c6e5c0f5f1 perf: 组件修改为setup 2023-06-17 09:42:42 +08:00
jinmao88
ca997c15ca fix: 默认不清除ts内console.log() 2023-06-17 08:45:58 +08:00
tawen
4c381596a9 fix: 可编辑单元格editCellTable,当值为空时无法进行编辑 (#2867)
* fix: 修复 Cannot access 'pagewrapper' before initialization

* fix: 修复 角色管理 编辑角色时,角色状态不正确

* fix: 可编辑单元格editCellTable,当值为空时无法进行编辑

* fix: 可编辑单元格editCellTable,当值为空时无法进行编辑
2023-06-16 07:40:35 +08:00
tawen
7bcdb46148 fix: 修复当设置apiselect的immediate为false时,默认赋值后取值不正确传入默认options方案 (#2862) 2023-06-14 06:09:03 +08:00
tawen
d33ccd042f fix: 修复 角色管理 编辑角色时,角色状态不正确 (#2861)
* fix: 修复 Cannot access 'pagewrapper' before initialization

* fix: 修复 角色管理 编辑角色时,角色状态不正确
2023-06-14 06:08:51 +08:00
zty
08f479f3e1 RoleDrawe.vue 改造为setup,角色编辑时状态不正确 (#2857)
* chore: 改造为setup

* fix: 状态不一致
2023-06-14 06:08:39 +08:00
zuihou
c054d73fe6 feat: 保持 和 windi 一样的全局样式,减少升级带来的影响
close 2814
close 2818

https://github.com/vbenjs/vue-vben-admin/issues/2814
https://github.com/vbenjs/vue-vben-admin/issues/2818
2023-06-12 10:44:20 +08:00
Kirk Lin
1f287145f4 fix(deepMerge): 去掉合并错误的代码 (#2848) 2023-06-10 17:19:18 +08:00
Kirk Lin
9c43c74131 Revert "fix(deepMerge): fix recursive merge data without removing duplicate bugs (#2831)" (#2844)
This reverts commit 7ca007ecd5.

Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>
2023-06-10 09:23:39 +08:00
Kirk Lin
c516d39225 fix(deepMerge): the default merge strategy is to replace the array (#2843) 2023-06-10 09:21:20 +08:00
Norton
a1283c1322 fix:关闭其它页签需要使用fullPath来判断,更新缓存后需要同时更新localStorage,否则刷新页面页签会再次加载 (#2847)
* fixed:修复操作页签后 打开页面需要使用fullPath,否则可能会导致参数丢失引起数据加载异常。

* fix:关闭其它页签需要使用fullPath来判断,更新缓存后需要同时更新localStorage,否则刷新页面页签会再次加载

---------

Co-authored-by: lichi <lichi@ilinecn.com>
2023-06-10 09:12:20 +08:00
tawen
cc88e1a66c fix: 修复 Cannot access 'pagewrapper' before initialization (#2835) 2023-06-07 08:42:39 +08:00
jinmao88
6aa3f934d0 Revert "perf: 优化modal弹窗样式 (#2824)" (#2834)
This reverts commit 1e8fab3fe5.
2023-06-06 16:30:01 +08:00
luojz
7ca007ecd5 fix(deepMerge): fix recursive merge data without removing duplicate bugs (#2831)
Co-authored-by: luojingzhou <luojingzhou@kezaihui.com>
2023-06-06 14:15:44 +08:00
Kyun Wong
361a189f6a fix: 修复未传参(params)的时,redo失效的问题 (#2826)
Co-authored-by: kelvin <kyun.wang@jodoinc.com>
2023-06-05 11:05:10 +08:00
前端爱码士
19fd49e22d perf: 优化tree getIcon方法类型定义 (#2825) 2023-06-05 11:04:56 +08:00
前端爱码士
1e8fab3fe5 perf: 优化modal弹窗样式 (#2824) 2023-06-05 11:04:37 +08:00
Gary
7e0456cc6c 删除appConfigSrc多余符号 (#2813) 2023-05-31 19:39:40 +08:00
HUCHAOQI
c118e83a2b 修复axios中responseInterceptorsCatch的类型 (#2811)
* fix(table): 使用lodash 的merge来递归assign,优化在多对象嵌套情况下的结构

* fix(view): 修复登入页面点击其他登入方式后返回时视图异常的bug

* fix(util): 修复类型错误
2023-05-30 10:14:02 +08:00
Peng Peidong
31d44ad372 fix(api/demo): fix typo (#2808) 2023-05-30 10:13:53 +08:00
GauharChan
f810a0892d ci(fix): 修复更新lock文件导致github action失败 (#2802) 2023-05-25 14:18:06 +08:00
GauharChan
5de89b5ec5 perf(demo): 动态更换表格配置 (#2793) 2023-05-24 16:42:39 +08:00
xiaoWangSec
0347c83620 fix: 修复VITE_GLOB_APP_TITLE中不能存在-的问题#1522 (#2794)
* fix #1522

fix #1522

* fix #1522

fix #1522

* fix #1522

fix #1522
2023-05-24 16:42:30 +08:00
HUCHAOQI
eb0fdb2cfc fix(component): 修复keep-alive组件包裹的文件onActivited不生效 (#2785)
* fix(table): 使用lodash 的merge来递归assign,优化在多对象嵌套情况下的结构

* fix(component): 修复keep-alive组件包裹的文件onActivited不生效
2023-05-22 10:10:57 +08:00
HUCHAOQI
e154d1366c Fix/views login (#2789)
* fix(table): 使用lodash 的merge来递归assign,优化在多对象嵌套情况下的结构

* fix(view): 修复登入页面点击其他登入方式后返回时视图异常的bug
2023-05-22 10:10:37 +08:00
GauharChan
34237ef033 workflow: fix github action build error (#2773)
* workflow: fix github action build error

* workflow: pnpm/action-setup 不指定具体版本号
2023-05-19 17:08:57 +08:00
LanceJiang
b13c4a81fc fix: 由于 多路径字段获取值 (#2664) 处理 造成的 set value值为0||''时不成功的情况 (#2776) 2023-05-19 16:35:58 +08:00
GauharChan
c46b04d548 workflow: fix github action build error (#2752) 2023-05-10 13:59:53 +08:00
Kyun Wong
afacf68825 fix: 解决重定向路径 params 参数丢失问题 (#2753)
Co-authored-by: kelvin <kyun.wang@jodoinc.com>
2023-05-10 13:59:36 +08:00
Norton
60a3b6a9f9 fixed:修复操作页签后 打开页面需要使用fullPath,否则可能会导致参数丢失引起数据加载异常。 (#2768)
Co-authored-by: lichi <lichi@ilinecn.com>
2023-05-10 13:59:06 +08:00
GauharChan
b97d588392 refactor: 完善ColumnSetting的操作逻辑 (#2745) 2023-04-30 22:52:42 +08:00
前端爱码士
6e716c5607 fix: 解决打包报内存溢出问题 (#2697) 2023-04-10 16:57:49 +08:00
783 changed files with 34487 additions and 24881 deletions

View File

@@ -51,7 +51,7 @@ module.exports = {
],
},
prompt: {
/** @use `yarn commit :f` */
/** @use `pnpm commit :f` */
alias: {
f: 'docs: fix typos',
r: 'docs: update README',

3
.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
node_modules/
dist/
.vscode/

22
.env.docker Normal file
View File

@@ -0,0 +1,22 @@
# Whether to open mock
VITE_USE_MOCK = false
# public path
VITE_PUBLIC_PATH = /
# timeout(seconds)
VITE_TIMEOUT = 15
# Delete console
VITE_DROP_CONSOLE = true
# Whether to enable gzip or brotli compression
# Optional: gzip | brotli | none
# If you need multiple forms, you can use `,` to separate
VITE_BUILD_COMPRESS = 'none'
VITE_GLOB_API_URL="__vg_base_url"
# File upload address optional
# It can be forwarded by nginx or write the actual address directly
VITE_GLOB_UPLOAD_URL=/files/upload
# Interface prefix
VITE_GLOB_API_URL_PREFIX=

View File

@@ -13,3 +13,4 @@ dist
.local
/bin
Dockerfile
package.json

View File

@@ -1,4 +1,7 @@
module.exports = {
root: true,
extends: ['@vben'],
rules: {
'no-undef': 'off',
},
};

View File

@@ -60,6 +60,8 @@ jobs:
- name: Checkout
uses: actions/checkout@v3
# - uses: NullVoxPopuli/action-setup-pnpm@v2
- name: Sed Config Base
shell: bash
run: |
@@ -67,22 +69,28 @@ jobs:
sed -i "s#VITE_DROP_CONSOLE\s*=.*#VITE_DROP_CONSOLE = true#g" ./.env.production
cat ./.env.production
- name: use Node.js 16
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 9
run_install: false
- name: use Node.js 20
uses: actions/setup-node@v3
with:
node-version: '16.x'
node-version: '20.x'
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
# - name: Get yarn cache directory path
# id: yarn-cache-dir-path
# run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
#
# - name: Cache dependencies
# uses: actions/cache@v3
# with:
# path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
# key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
# restore-keys: |
# ${{ runner.os }}-yarn-
- name: Set SSH Environment
env:
@@ -100,8 +108,8 @@ jobs:
env:
NODE_OPTIONS: '--max_old_space_size=4096'
run: |
yarn install
yarn run build
pnpm install --no-frozen-lockfile
pnpm build
touch dist/.nojekyll
cp dist/index.html dist/404.html

39
.github/workflows/linter.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
name: Node.js CI
on:
push:
branches: [main, thin]
pull_request:
branches: [main, thin]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install pnpm
run: npm install -g pnpm
- name: Install dependencies
run: pnpm install
- name: Run type:check
run: pnpm run type:check
- name: Build
run: pnpm build

18
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: "Close stale issues"
on:
schedule:
- cron: "30 1 * * *"
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.OPER_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days'
stale-pr-message: 'This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days'
exempt-issue-labels: 'bug,enhancement'
days-before-stale: 60
days-before-close: 7

View File

@@ -8,3 +8,5 @@ node_modules
public
.npmrc
*-lock.yaml

View File

@@ -7,7 +7,8 @@
"mrmlnc.vscode-less",
"lokalise.i18n-ally",
"antfu.iconify",
"antfu.unocss",
"mikestead.dotenv",
"heybourn.headwind"
"warmthsea.vscode-custom-code-color",
]
}
}

2
.vscode/launch.json vendored
View File

@@ -10,4 +10,4 @@
"sourceMaps": true
}
]
}
}

100
.vscode/settings.json vendored
View File

@@ -55,9 +55,16 @@
"**/yarn.lock": true
},
"stylelint.enable": true,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"stylelint.validate": [
"css",
"less",
"postcss",
"scss",
"vue",
"sass"
],
"path-intellisense.mappings": {
"/@/": "${workspaceRoot}/src"
"@/": "${workspaceRoot}/src"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
@@ -84,57 +91,67 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"[vue]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
}
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"i18n-ally.localesPaths": ["src/locales/lang"],
"i18n-ally.localesPaths": [
"src/locales/lang"
],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.enabledParsers": [
"json",
"ts",
"js"
],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"i18n-ally.enabledFrameworks": [
"vue",
"react"
],
"cSpell.words": [
"vben",
"browserslist",
"tailwindcss",
"esnext",
"antd",
"antv",
"tinymce",
"brotli",
"browserslist",
"codemirror",
"commitlint",
"cropperjs",
"echarts",
"esnext",
"esno",
"iconify",
"INTLIFY",
"lintstagedrc",
"logicflow",
"mockjs",
"nprogress",
"pinia",
"pnpm",
"qrcode",
"sider",
"pinia",
"sider",
"nprogress",
"INTLIFY",
"stylelint",
"esno",
"vitejs",
"sortablejs",
"mockjs",
"codemirror",
"iconify",
"commitlint",
"vditor",
"echarts",
"cropperjs",
"logicflow",
"vueuse",
"zxcvbn",
"lintstagedrc",
"brotli",
"stylelint",
"tailwindcss",
"sider",
"pnpm",
"antd"
"tinymce",
"unocss",
"unref",
"vben",
"vditor",
"Vite",
"vitejs",
"vueuse",
"zxcvbn"
],
"vetur.format.scriptInitialIndent": true,
"vetur.format.styleInitialIndent": true,
@@ -166,7 +183,10 @@
"*.env": "$(capture).env.*",
"CHANGELOG.md": "CHANGELOG*",
"package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,README*,.npmrc,.browserslistrc",
".eslintrc.js": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.js,.prettierrc.js,.stylelintrc.js"
".eslintrc.cjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,.stylelintrc.*"
},
"terminal.integrated.scrollback": 10000
}
"terminal.integrated.scrollback": 10000,
"nuxt.isNuxtApp": false,
"vscodeCustomCodeColor.highlightValue": "v-auth",
"vscodeCustomCodeColor.highlightValueColor": "#6366f1",
}

View File

@@ -1,3 +1,244 @@
## [2.11.1](https://github.com/vbenjs/vue-vben-admin/compare/v2.11.0...v2.11.1) (2024-04-20)
### Bug Fixes
- the form not working when setFieldsValue through form-groups and add a demo with form groups ([#3765](https://github.com/vbenjs/vue-vben-admin/issues/3765)) ([65e5e71](https://github.com/vbenjs/vue-vben-admin/commit/65e5e71f5ee44eac221721de2c8c1d03e622e34a))
# [2.11.0](https://github.com/vbenjs/vue-vben-admin/compare/2.10.1...2.11.0) (2024-04-20)
### Bug Fixes
- (demo->page>form>high) expose getDataSource close [#3529](https://github.com/vbenjs/vue-vben-admin/issues/3529) ([#3530](https://github.com/vbenjs/vue-vben-admin/issues/3530)) ([0c1235e](https://github.com/vbenjs/vue-vben-admin/commit/0c1235e75aa6a855d774435ef08d3ffae19d1272))
- [#2744](https://github.com/vbenjs/vue-vben-admin/issues/2744)tabs选项卡渲染问题以及完善路由中affix=true时处理逻辑。 ([#3127](https://github.com/vbenjs/vue-vben-admin/issues/3127)) ([b43d306](https://github.com/vbenjs/vue-vben-admin/commit/b43d3069e1ec731e339ed28c17325620f1fe9a6e))
- [#3077](https://github.com/vbenjs/vue-vben-admin/issues/3077) 最新代码 ApiTransfer编辑后无法正常显示数据 ([#3083](https://github.com/vbenjs/vue-vben-admin/issues/3083)) ([c0c3116](https://github.com/vbenjs/vue-vben-admin/commit/c0c31161939027f64fa44a57084acafa0c6c2a8b))
- [#3144](https://github.com/vbenjs/vue-vben-admin/issues/3144) Drawer的footer样式错位问题 ([#3148](https://github.com/vbenjs/vue-vben-admin/issues/3148)) ([8e9d4f0](https://github.com/vbenjs/vue-vben-admin/commit/8e9d4f0a5758bf414b2885f02563a3b24f5cf6f1))
- 1.修正ImageUpload直接使用时无法正常回传value 2.修正ImageUpload无法正常初始化第一次传值 ([#3704](https://github.com/vbenjs/vue-vben-admin/issues/3704)) ([b5c87cf](https://github.com/vbenjs/vue-vben-admin/commit/b5c87cf6abc46ccd9b9bb8795b235b738e8bb376))
- 菜单搜索功能修复 ([#3688](https://github.com/vbenjs/vue-vben-admin/issues/3688)) ([c1809cd](https://github.com/vbenjs/vue-vben-admin/commit/c1809cd6c59228d7932f24a2b1f8e4933654238d))
- 当TableAction的actions属性中的ActionItem传递了color属性时PopConfirm的指示箭头颜色异常问题 ([#3597](https://github.com/vbenjs/vue-vben-admin/issues/3597)) ([e6a7384](https://github.com/vbenjs/vue-vben-admin/commit/e6a73840ab7c7cbd5a5a534bd248f5ed5df11e5c))
- 多选框必填选中校验异常close [#3097](https://github.com/vbenjs/vue-vben-admin/issues/3097) ([#3103](https://github.com/vbenjs/vue-vben-admin/issues/3103)) ([18f5583](https://github.com/vbenjs/vue-vben-admin/commit/18f55833e282206c1ca650a7c62654d45e819759))
- 解决 'Cannot find module uncss' 的问题 ([#3334](https://github.com/vbenjs/vue-vben-admin/issues/3334)) ([3a5f406](https://github.com/vbenjs/vue-vben-admin/commit/3a5f4062602f8394523a82cd807a27580e96a42a))
- 解决table复选框点击无法勾选状态问题 ([#3370](https://github.com/vbenjs/vue-vben-admin/issues/3370)) ([dde3652](https://github.com/vbenjs/vue-vben-admin/commit/dde3652b7d8b68b7f8ac669bd96a55c7b9b1b1fa))
- 设置 baseurl 后不生效的问题 ([#3318](https://github.com/vbenjs/vue-vben-admin/issues/3318)) ([4305f58](https://github.com/vbenjs/vue-vben-admin/commit/4305f58d201382c71f41fcd2625bc45ae09a2ae0))
- 使用suffix时label没有垂直居中 ([#3384](https://github.com/vbenjs/vue-vben-admin/issues/3384)) ([6b6b790](https://github.com/vbenjs/vue-vben-admin/commit/6b6b790f87edab31cb8e0dff730a1490903a3048))
- 修复表单按钮的类型定义外部无法修改重置或者提交按钮的文字的问题 ([141f3bd](https://github.com/vbenjs/vue-vben-admin/commit/141f3bdbd06f4d32e3d0e871072f876c29a8d68b))
- 修复表单设计的右侧属性配置面板中部分表单错乱的问题 ([#3300](https://github.com/vbenjs/vue-vben-admin/issues/3300)). close [#3268](https://github.com/vbenjs/vue-vben-admin/issues/3268) ([cb13986](https://github.com/vbenjs/vue-vben-admin/commit/cb13986a170815c5a21c86033057a8a56d608388))
- 修复菜单在MIX_SIDEBAR模式下title显示为name的问题 ([#3682](https://github.com/vbenjs/vue-vben-admin/issues/3682)) ([264f34e](https://github.com/vbenjs/vue-vben-admin/commit/264f34e49d413783d6d23715ebd9ab721b03d01c))
- 修复黑暗模式下一些样式问题 ([#3201](https://github.com/vbenjs/vue-vben-admin/issues/3201)) ([054a476](https://github.com/vbenjs/vue-vben-admin/commit/054a476d25b2d8322b238a6da6028051bcfdab84))
- 修复确认弹出框样式错乱的问题 ([#3742](https://github.com/vbenjs/vue-vben-admin/issues/3742)) ([a00725b](https://github.com/vbenjs/vue-vben-admin/commit/a00725be571e90fa5d807ec2bc1e23b160c824ff))
- 修复设置抽屉弹框滚动条样式异常 ([#3193](https://github.com/vbenjs/vue-vben-admin/issues/3193)) ([4755017](https://github.com/vbenjs/vue-vben-admin/commit/4755017bcc2dc0aee2f98b46d929a060a5b1bb62))
- 修复BasicForm使用componentProps函数返回valueFormat时DatePicker无法正确格式化的问题 ([#3357](https://github.com/vbenjs/vue-vben-admin/issues/3357)) ([beee351](https://github.com/vbenjs/vue-vben-admin/commit/beee35173b84dfb4c27bcd403df689e102379303))
- 修复index.html加载文字偏移的问题 ([#3306](https://github.com/vbenjs/vue-vben-admin/issues/3306)) ([c715d35](https://github.com/vbenjs/vue-vben-admin/commit/c715d35ad5754dd78135073ddbea86e43e17be91))
- 修复Modal.confirm的返回类型问题需要有destroyupdate的方法 ([#3161](https://github.com/vbenjs/vue-vben-admin/issues/3161)) ([a0e43ab](https://github.com/vbenjs/vue-vben-admin/commit/a0e43abeab2930097209a0cf6c21f3de687435ca))
- 修复notice样式绑定路径错误 ([#3218](https://github.com/vbenjs/vue-vben-admin/issues/3218)) ([ee8ec9e](https://github.com/vbenjs/vue-vben-admin/commit/ee8ec9eacfbfe1c5dc3a842da126dbaf5d54b126))
- 修复rule validator类型默认为string导致 radio 等组件在 setFormValues 时如果值不是string类型提示校验错误 ([a63a10c](https://github.com/vbenjs/vue-vben-admin/commit/a63a10c047cda32d92f35780163772fb20a6fe7a))
- 英文版本时提示中的单词没有分开 ([eb26650](https://github.com/vbenjs/vue-vben-admin/commit/eb2665059eb5fdcb8299032dc1a49c73f1675156))
- **ApiCascader:** apiParamKey not working ([c42ba1c](https://github.com/vbenjs/vue-vben-admin/commit/c42ba1cc1b2fba7179701cb1f918443523a9fc70))
- **ApiCascader:** wrong api reload ([#3536](https://github.com/vbenjs/vue-vben-admin/issues/3536)) resolve [#3534](https://github.com/vbenjs/vue-vben-admin/issues/3534) ([83f16da](https://github.com/vbenjs/vue-vben-admin/commit/83f16da2d35716f94f1837ab9bee41c5878ab3b0))
- **ApiSelect:** 移除watchEffect引发的重复请求 ([#3107](https://github.com/vbenjs/vue-vben-admin/issues/3107)) ([1519f47](https://github.com/vbenjs/vue-vben-admin/commit/1519f47f7d7785a93be51ce9da0f9ef2e78705c9))
- **ApiSelect:** 修复监听不到params的变动 ([ccf4027](https://github.com/vbenjs/vue-vben-admin/commit/ccf4027533d2adabd21bade025ca7bc7d34d75f6))
- **ApiSelect:** ApiSelect的isFirstLoaded赋值逻辑只有当加载报错时才能恢复未初次加载状态 ([#3671](https://github.com/vbenjs/vue-vben-admin/issues/3671)) ([3d733de](https://github.com/vbenjs/vue-vben-admin/commit/3d733de3995a667782fa3219a0e0b171327c5b6f))
- **ApiSelect:** BasicForm emit ield-value-change twice ([0f2c2ea](https://github.com/vbenjs/vue-vben-admin/commit/0f2c2eabd671af457febbb16fa3996c845bae145))
- **ApiSelect:** Incorrect value type definition. close [#3168](https://github.com/vbenjs/vue-vben-admin/issues/3168) ([0cf79d4](https://github.com/vbenjs/vue-vben-admin/commit/0cf79d4ce2786e71444d4d9483ed77a99f57169c))
- **ApiSelect:** type warning ([8f6153f](https://github.com/vbenjs/vue-vben-admin/commit/8f6153fd2a73b9537e7f9ba0f2326388745bc232))
- ApiTransfer 不支持disabled ([#3149](https://github.com/vbenjs/vue-vben-admin/issues/3149)) ([95ca2c3](https://github.com/vbenjs/vue-vben-admin/commit/95ca2c3ae6085d97f24546e24117ee2518f33e2d))
- **ApiTree:** 多触发一次onchange ([882270d](https://github.com/vbenjs/vue-vben-admin/commit/882270d5baff92eb8f51ccb80758c68ef8babe51))
- **ApiTree:** Modify Trigger Selection Event Name ([094a33c](https://github.com/vbenjs/vue-vben-admin/commit/094a33c0c2511816079c935eb83e60ad93c9289c))
- async validator ([#3194](https://github.com/vbenjs/vue-vben-admin/issues/3194)) ([405ef9e](https://github.com/vbenjs/vue-vben-admin/commit/405ef9e2b3e61bd6195b58996504b9cb3939ef6f))
- **BackTop:** repair BackTup comp ([#3581](https://github.com/vbenjs/vue-vben-admin/issues/3581)) ([6f4bdae](https://github.com/vbenjs/vue-vben-admin/commit/6f4bdae5c2a5455cb924e1903612f9fe96cf4481))
- basemodal 无法透传 attributes 至 Modal.tsx ([#3637](https://github.com/vbenjs/vue-vben-admin/issues/3637)) ([89830ec](https://github.com/vbenjs/vue-vben-admin/commit/89830ec7e69a7cab55e6ccf90b74377bcbadf44c))
- **BasicDrawer:** remove toRaw props ([#3399](https://github.com/vbenjs/vue-vben-admin/issues/3399)) ([57e6e4f](https://github.com/vbenjs/vue-vben-admin/commit/57e6e4f00435637c545c58de3cd84c102003032a))
- **BasicForm->ApiRadioGroup:** when options click, duplicate requests. resolve [#3387](https://github.com/vbenjs/vue-vben-admin/issues/3387) ([fdde6f0](https://github.com/vbenjs/vue-vben-admin/commit/fdde6f06b2d388bbdcc7f0de2b5419593cd686c3))
- **BasicForm->FormItem:** model should update before event call ([#3573](https://github.com/vbenjs/vue-vben-admin/issues/3573)). resolve [#3570](https://github.com/vbenjs/vue-vben-admin/issues/3570) ([43aa743](https://github.com/vbenjs/vue-vben-admin/commit/43aa7430324a7f390c31ea9e8a2f1e00fad8a1d0))
- **BasicForm:** 修复 useComponentRegister 方法无法添加自定义的组件,添加时爆类型错误的问题 ([#3483](https://github.com/vbenjs/vue-vben-admin/issues/3483)) ([98e2e4c](https://github.com/vbenjs/vue-vben-admin/commit/98e2e4c89a859e67c911134652d4b005be51e2d1))
- **BasicForm:** script setup defineExpose ([#3316](https://github.com/vbenjs/vue-vben-admin/issues/3316)) ([f58ef67](https://github.com/vbenjs/vue-vben-admin/commit/f58ef6777c4dd8ac905919637410ea5373eb770b))
- **BasicForm:** type instantiation is excessively deep and possibly infinite. ([#3128](https://github.com/vbenjs/vue-vben-admin/issues/3128)) ([5a388be](https://github.com/vbenjs/vue-vben-admin/commit/5a388be15e44d86c87d76dc8829a5286ac1818e0))
- **BasicForm:** useForm 中 scheme 选项 slot 与 component冲突 ([#3133](https://github.com/vbenjs/vue-vben-admin/issues/3133)) ([0bb76a8](https://github.com/vbenjs/vue-vben-admin/commit/0bb76a86d25cbd1de1c672f5cc5e63d0ae478b68))
- **BasicForm:** validate Form tip height ([#3286](https://github.com/vbenjs/vue-vben-admin/issues/3286)). close [#3281](https://github.com/vbenjs/vue-vben-admin/issues/3281) ([100f3cf](https://github.com/vbenjs/vue-vben-admin/commit/100f3cf26c2b124bf94f3bb4913dd3d6d15aed3e))
- **BasicModal:** 修复BasicModal添加wrapClassName样式异常问题 ([#3726](https://github.com/vbenjs/vue-vben-admin/issues/3726)) ([13b031e](https://github.com/vbenjs/vue-vben-admin/commit/13b031eef9b8d4e8333c9397ff26e4875bf9816a))
- **BasicTable->rowKey&scroll:** declear and usage about rowKey and scroll ([#3541](https://github.com/vbenjs/vue-vben-admin/issues/3541)) ([e23e338](https://github.com/vbenjs/vue-vben-admin/commit/e23e3383dd73b20a479977d29bab999c51334a1a))
- **BasicTable->useColumns:** handle deep colunm hidden ([#3561](https://github.com/vbenjs/vue-vben-admin/issues/3561)) resolve [#3559](https://github.com/vbenjs/vue-vben-admin/issues/3559) ([54af5bb](https://github.com/vbenjs/vue-vben-admin/commit/54af5bb42ddd04a56a7da3becf325dd9cfbccc48))
- **BasicTable:** 滑动表格内容合计行不跟随滑动bug ([#3438](https://github.com/vbenjs/vue-vben-admin/issues/3438)) resolve [#2166](https://github.com/vbenjs/vue-vben-admin/issues/2166) ([7ba83e7](https://github.com/vbenjs/vue-vben-admin/commit/7ba83e71bf718b6c896eac892f3b66cd266747af))
- **BasicTable:** 修复BasicTable数据为空时重置后高度不能自适应问题 ([#3724](https://github.com/vbenjs/vue-vben-admin/issues/3724)) ([6054fa2](https://github.com/vbenjs/vue-vben-admin/commit/6054fa2ffac7ff0206a4e0138da16a548d2d25a2))
- **BasicTable:** avoid select when edit cell ([#3484](https://github.com/vbenjs/vue-vben-admin/issues/3484)) ([2f921cf](https://github.com/vbenjs/vue-vben-admin/commit/2f921cfb88b969fb8bd361c46ddf2f41a9e363b0))
- **BasicTable:** BasicTable resize wrong in modal ([#3549](https://github.com/vbenjs/vue-vben-admin/issues/3549)) ([a121b32](https://github.com/vbenjs/vue-vben-admin/commit/a121b32252cf4b0570c937a1ab86d8b924b229ce))
- **BasicTable:** column setting about action fixed and default not cache ([#3441](https://github.com/vbenjs/vue-vben-admin/issues/3441)) ([86ecb27](https://github.com/vbenjs/vue-vben-admin/commit/86ecb2729ef15bb0bb3fc7347a84ffa83487eec8))
- **BasicTable:** ColumnSetting about selectedRowKeys override ([#3446](https://github.com/vbenjs/vue-vben-admin/issues/3446)) ([65122ea](https://github.com/vbenjs/vue-vben-admin/commit/65122ea1a52e2f06463dc15f7ee06aba4e29d104))
- **BasicTable:** ColumnSetting mistake when use setColumns ([#3408](https://github.com/vbenjs/vue-vben-admin/issues/3408)) ([fec67b4](https://github.com/vbenjs/vue-vben-admin/commit/fec67b4d53ce82d156f4683f2c436f31dd3b4f7a))
- **BasicTable:** getSelectRows return duplicate records ([#3545](https://github.com/vbenjs/vue-vben-admin/issues/3545)) ([974c1fa](https://github.com/vbenjs/vue-vben-admin/commit/974c1fad7fb2767429eeb50680cbae8e17b80f1f))
- **BasicTable:** headerCell slot title not exist ([8df2590](https://github.com/vbenjs/vue-vben-admin/commit/8df2590aae8d646880e8c064e6b4ba48cb54086d))
- **BasicTable:** index still show when set showIndexColumn false ([#3455](https://github.com/vbenjs/vue-vben-admin/issues/3455)) ([75f5b7a](https://github.com/vbenjs/vue-vben-admin/commit/75f5b7ac4dda840ce0098ed528e0b161d99d9b09))
- **BasicTable:** keep rowSelection onChange call outside ([#3461](https://github.com/vbenjs/vue-vben-admin/issues/3461)). resolve [#3453](https://github.com/vbenjs/vue-vben-admin/issues/3453) ([a7b2f14](https://github.com/vbenjs/vue-vben-admin/commit/a7b2f14b900771186ee126cf60e8841ecc0cb8c1))
- **BasicTable:** pagination exceeds page height. close [#3185](https://github.com/vbenjs/vue-vben-admin/issues/3185) ([41451f4](https://github.com/vbenjs/vue-vben-admin/commit/41451f4fa3495be1d1ea4088cad77322dcde57de))
- **BasicTable:** ref table ([#3327](https://github.com/vbenjs/vue-vben-admin/issues/3327)) ([c8744a0](https://github.com/vbenjs/vue-vben-admin/commit/c8744a057e0da407ab929c91b46e638d196d82cc))
- **BasicTable:** selection wrong by click input when cross pages ([#3540](https://github.com/vbenjs/vue-vben-admin/issues/3540)). resolve [#3539](https://github.com/vbenjs/vue-vben-admin/issues/3539) ([69c3602](https://github.com/vbenjs/vue-vben-admin/commit/69c36021fa5558097c4fc7b9f63e29816e478cb9))
- **BasicTable:** showIndexColumn/showRowSelection cache should by route name ([#3489](https://github.com/vbenjs/vue-vben-admin/issues/3489)) ([d88f455](https://github.com/vbenjs/vue-vben-admin/commit/d88f455cd3530cd7cc7450e8f0fe7744ca0cb313))
- **BasicTable:** table表格宽度自适应隐藏的列导致宽度增加 ([#3388](https://github.com/vbenjs/vue-vben-admin/issues/3388)) ([bca5154](https://github.com/vbenjs/vue-vben-admin/commit/bca5154a9d3d020a70cd332ac19c853ea94405e2))
- **BasicTree:** not inherit slot and not show icon slot. close [#1902](https://github.com/vbenjs/vue-vben-admin/issues/1902) ([a0b2a9e](https://github.com/vbenjs/vue-vben-admin/commit/a0b2a9e949dbf1e149da8be757f78fa6b1cebec0))
- breadcrumb is displayed despite the menu being hidden ([#3733](https://github.com/vbenjs/vue-vben-admin/issues/3733)) ([e8a86ec](https://github.com/vbenjs/vue-vben-admin/commit/e8a86ec8b996387c9c2d167344eb1e7a010d94fb)), closes [#3690](https://github.com/vbenjs/vue-vben-admin/issues/3690)
- **breadcrumb:** 修复面包屑跳转外链时导致当前页面404问题 ([#3337](https://github.com/vbenjs/vue-vben-admin/issues/3337)). close [#3336](https://github.com/vbenjs/vue-vben-admin/issues/3336) ([895352a](https://github.com/vbenjs/vue-vben-admin/commit/895352ad221f91bdb57fdfd0396925fb7901c2df))
- breakpoint ([#3242](https://github.com/vbenjs/vue-vben-admin/issues/3242)) ([b6f8379](https://github.com/vbenjs/vue-vben-admin/commit/b6f8379e936df3743c5b9514e88a02148b08a5d1))
- bug RangePicker with componentProps valueFormat ('YYYY-MM-DD') does not return the formatted value when using form validate() method [#3690](https://github.com/vbenjs/vue-vben-admin/issues/3690) ([#3691](https://github.com/vbenjs/vue-vben-admin/issues/3691)) ([09f795e](https://github.com/vbenjs/vue-vben-admin/commit/09f795e00ed8d56d6b1e028fc40974d3292eed5f))
- change salesProductPie.vue's data name to '成交占比'. ([#3524](https://github.com/vbenjs/vue-vben-admin/issues/3524)) ([0589458](https://github.com/vbenjs/vue-vben-admin/commit/0589458b2d120b5c6ee0ab10cd8b2d3f13318911))
- checkedKeys use unref bug ([#3198](https://github.com/vbenjs/vue-vben-admin/issues/3198)) ([ae61fa1](https://github.com/vbenjs/vue-vben-admin/commit/ae61fa11865b2d7b0337b1fd2edcb20bf559a71f))
- **ci:** update node version for linter ([a5565bf](https://github.com/vbenjs/vue-vben-admin/commit/a5565bf9cf361e38057d8ca34fe2542ea1c39873))
- **ci:** update use pnpm version for deploy ([83455a0](https://github.com/vbenjs/vue-vben-admin/commit/83455a07a0821142864b4668d89a51057d74330b))
- column setting index column sort ([#3463](https://github.com/vbenjs/vue-vben-admin/issues/3463)) ([fc002d3](https://github.com/vbenjs/vue-vben-admin/commit/fc002d3db327a432259eb02e2a72b9b81381eb6e))
- **component->markdown:** 浏览器媒体获取兼容 ([#3470](https://github.com/vbenjs/vue-vben-admin/issues/3470)) ([f0ca8d5](https://github.com/vbenjs/vue-vben-admin/commit/f0ca8d5a03e994c9948b055dc5f69dad40d96922))
- **component:** insertNextAt is not a function ([#3656](https://github.com/vbenjs/vue-vben-admin/issues/3656)) ([#3657](https://github.com/vbenjs/vue-vben-admin/issues/3657)) ([c827ffb](https://github.com/vbenjs/vue-vben-admin/commit/c827ffb8e680df13dae0c75b19634b6474aa5897))
- **component:** resolve the defaultValue error in setting the date type ([#3652](https://github.com/vbenjs/vue-vben-admin/issues/3652)) ([d42acb4](https://github.com/vbenjs/vue-vben-admin/commit/d42acb477c577c0f855403bff371e0780e630cdc)), closes [#3651](https://github.com/vbenjs/vue-vben-admin/issues/3651)
- **component:** resolve the error when clicking on a row when clickRowToExpand is true ([#3714](https://github.com/vbenjs/vue-vben-admin/issues/3714)) ([38d58ab](https://github.com/vbenjs/vue-vben-admin/commit/38d58ab47af3611cebade960dbcbd60f165f3a72))
- **component:** resolve the issue of "vxe-table" export function not being able to be used ([#3646](https://github.com/vbenjs/vue-vben-admin/issues/3646)) ([bc5e5fa](https://github.com/vbenjs/vue-vben-admin/commit/bc5e5fa015f8c5f1d69f3f8572a1957d83cfe44e)), closes [#3614](https://github.com/vbenjs/vue-vben-admin/issues/3614)
- **component:** resovle fullscreen content issues with "fixedHeight" and "contentFullHeight" combined ([#3721](https://github.com/vbenjs/vue-vben-admin/issues/3721)) ([212e78f](https://github.com/vbenjs/vue-vben-admin/commit/212e78fa76132b4239e81d3432f7f3c15d7e5254))
- **components->Upload:** 修复文件上传过程中删除文件终止上传时上传状态未改变不能关闭Modal的bug ([#3761](https://github.com/vbenjs/vue-vben-admin/issues/3761)) ([04d4c5c](https://github.com/vbenjs/vue-vben-admin/commit/04d4c5cd665f52cb287b5059b301e71aed75b3df))
- **config:** vite:html warning ([#3518](https://github.com/vbenjs/vue-vben-admin/issues/3518)) ([6978517](https://github.com/vbenjs/vue-vben-admin/commit/6978517a3a0b522a466fc248d0ed4384cdcfecb7))
- content fixed mode with blank page ([#3523](https://github.com/vbenjs/vue-vben-admin/issues/3523)) ([49fdb6c](https://github.com/vbenjs/vue-vben-admin/commit/49fdb6c986f36e45fc9f9e206af371f8eb3581f6))
- contextmenu location not right when body with scroll ([#3516](https://github.com/vbenjs/vue-vben-admin/issues/3516)) ([c2c9f4f](https://github.com/vbenjs/vue-vben-admin/commit/c2c9f4f556d65eb768a5202a398dc9684c08d577))
- Correct spelling error in comments ([#3678](https://github.com/vbenjs/vue-vben-admin/issues/3678)) ([54f8584](https://github.com/vbenjs/vue-vben-admin/commit/54f85844436d95ce290a2f3b5db5b7c4fd14cc0d))
- **CropperAvatar:** wrong type about the prop size ([#3635](https://github.com/vbenjs/vue-vben-admin/issues/3635)) ([aef90aa](https://github.com/vbenjs/vue-vben-admin/commit/aef90aa2a0b43c3fc72596d9aecf408a594cb6fd))
- **CropperModal:** beforeUpload should return false ([#3601](https://github.com/vbenjs/vue-vben-admin/issues/3601)) ([b6bcf8d](https://github.com/vbenjs/vue-vben-admin/commit/b6bcf8d36dc348af7b51782e43c09c5e1cfeed68))
- **customExport:** Failure to export ([#3137](https://github.com/vbenjs/vue-vben-admin/issues/3137)) ([4d02205](https://github.com/vbenjs/vue-vben-admin/commit/4d02205839aad840bbb247b26b7e1dcdbc8b3a67))
- **dark:** fix --text-color light color not work ([#3228](https://github.com/vbenjs/vue-vben-admin/issues/3228)) ([2e632e4](https://github.com/vbenjs/vue-vben-admin/commit/2e632e4d4d8af4b8766396b340f9996832310853))
- **DatePicker:** date show is wrong and setup script defineExpose ([#3324](https://github.com/vbenjs/vue-vben-admin/issues/3324)) ([f62043b](https://github.com/vbenjs/vue-vben-admin/commit/f62043b1fca82234e04aa04629ba4bbcc624b0ee))
- **DatePicker:** zh-CN is not work in DatePicker ([#3273](https://github.com/vbenjs/vue-vben-admin/issues/3273)) ([6d047fb](https://github.com/vbenjs/vue-vben-admin/commit/6d047fb53fb113a4c6fc5c46c5b4195e50744eb0))
- defaultValue类型为number时的bug ([#3288](https://github.com/vbenjs/vue-vben-admin/issues/3288)) ([3b2760c](https://github.com/vbenjs/vue-vben-admin/commit/3b2760ca3ae5b51989ea7e97713f629a567fe53a))
- **demo->customerForm:** FormItem下有多个受控组件控制台显示错误提示的bug ([#3238](https://github.com/vbenjs/vue-vben-admin/issues/3238)) ([ec646c5](https://github.com/vbenjs/vue-vben-admin/commit/ec646c57b8c2d365f5ce298c496e1efaad8456b7))
- **demo:** 修复引导页文件名问题 ([#3352](https://github.com/vbenjs/vue-vben-admin/issues/3352)) ([be935eb](https://github.com/vbenjs/vue-vben-admin/commit/be935eb44e363665b99288f78f03cb3053274200))
- **demo:** 修复form demo的远程搜索不会触发的bug ([#3770](https://github.com/vbenjs/vue-vben-admin/issues/3770)) ([44b1877](https://github.com/vbenjs/vue-vben-admin/commit/44b1877eaedca1716aa40b8d819d5fe7cbd26ba0))
- **demo:** account page table without dept ([#3164](https://github.com/vbenjs/vue-vben-admin/issues/3164)) ([40aac65](https://github.com/vbenjs/vue-vben-admin/commit/40aac6544cb9b22e2362f2a2d99c0a9cc2f7fb57))
- **demo:** useForm中DatePickerRangePicker 日期控件位置不对 ([ae58ada](https://github.com/vbenjs/vue-vben-admin/commit/ae58ada82e2f62cea8e89a18c9f2ab18d6dba52a))
- **dept:** no parentDept can edit parentDept ([#3255](https://github.com/vbenjs/vue-vben-admin/issues/3255)) ([2142506](https://github.com/vbenjs/vue-vben-admin/commit/2142506ce5225dbe19118fcedb2cb48612c58fa7))
- Docker 打包逻辑改进,彻底解决缓存问题 ([#3473](https://github.com/vbenjs/vue-vben-admin/issues/3473)) ([dcbe551](https://github.com/vbenjs/vue-vben-admin/commit/dcbe5510d42c3dc5e93b68704a5fa24c88d4de69))
- EditableCell about checked/unChecked Value, getDisable, rowKey missing for updating ([#3418](https://github.com/vbenjs/vue-vben-admin/issues/3418)). resolve [#3419](https://github.com/vbenjs/vue-vben-admin/issues/3419) ([404a472](https://github.com/vbenjs/vue-vben-admin/commit/404a4720b016abb6da93cb0b03271ebea6cca976))
- **EditCellTable:** 表格编辑行在使用Switch,checkedValue为数字时无法切换开关.close [#2560](https://github.com/vbenjs/vue-vben-admin/issues/2560) ([71c4394](https://github.com/vbenjs/vue-vben-admin/commit/71c43945a5e95fda6daddbb90af51f6d149547f5))
- **Editor:** ts类型错误 ([8b13f62](https://github.com/vbenjs/vue-vben-admin/commit/8b13f62995cb7f080eabf2e22d530959d4b79e0b))
- Failed to resolve component EllipsisText ([#3330](https://github.com/vbenjs/vue-vben-admin/issues/3330)) ([42e9de5](https://github.com/vbenjs/vue-vben-admin/commit/42e9de50a2bb150556a0eb8098acb2d2d3662c3c))
- FormItem won't render when a component is not provided ([9e055ad](https://github.com/vbenjs/vue-vben-admin/commit/9e055ad2734819c2778c0db1990e69b67c95022f))
- **FormItem:** use getPopupContainer default value ([#3215](https://github.com/vbenjs/vue-vben-admin/issues/3215)) ([ed267d9](https://github.com/vbenjs/vue-vben-admin/commit/ed267d9c016e50b4d9a7886209bad2432a88ad9b))
- **FormTable:** Invert select bug ([#3412](https://github.com/vbenjs/vue-vben-admin/issues/3412)) ([595b1ce](https://github.com/vbenjs/vue-vben-admin/commit/595b1ce680d8b315589d98036a70333055123b18))
- **full-screen:** dom fullscreen status text ([#3130](https://github.com/vbenjs/vue-vben-admin/issues/3130)) ([e161c14](https://github.com/vbenjs/vue-vben-admin/commit/e161c1449ac3d097cd6eab9441b25de25d3aa27e))
- fullscreen-modal width wrong ([#3321](https://github.com/vbenjs/vue-vben-admin/issues/3321)) ([617b013](https://github.com/vbenjs/vue-vben-admin/commit/617b01338cf4a8d88da529dae7da878b52b30c3b))
- handleFormValues 不再将所有空字符串转换为undefined ([#3496](https://github.com/vbenjs/vue-vben-admin/issues/3496)) ([6fbb576](https://github.com/vbenjs/vue-vben-admin/commit/6fbb57621e6ff79f93830969ab388549cbec5d32))
- **koa->upload:** fix the error that occurs when uploading files in the `test server` of Koa. ([#3698](https://github.com/vbenjs/vue-vben-admin/issues/3698)) ([954f04f](https://github.com/vbenjs/vue-vben-admin/commit/954f04f1c8e941e45c2bd4ab55df331ba13cb89c))
- **layout->menu:** can`t hover when menu is colappsed ([#3499](https://github.com/vbenjs/vue-vben-admin/issues/3499)) resolve [#3492](https://github.com/vbenjs/vue-vben-admin/issues/3492) ([7ffe172](https://github.com/vbenjs/vue-vben-admin/commit/7ffe1726b9ac0ac1f90c20b53996636f31af5c31))
- **layout->user-dropdown:** resolve warning "Invalid prop name: key is a reserved property" ([#3640](https://github.com/vbenjs/vue-vben-admin/issues/3640)) ([eae68bb](https://github.com/vbenjs/vue-vben-admin/commit/eae68bb029864d5f1af4e0c6b57038d0c96e4faf)), closes [#3639](https://github.com/vbenjs/vue-vben-admin/issues/3639)
- **layout:** 修复切换导航栏模式,分割菜单的状态不同步,导致页面内容区域存在被遮挡的问题 ([#3519](https://github.com/vbenjs/vue-vben-admin/issues/3519)) ([50276cb](https://github.com/vbenjs/vue-vben-admin/commit/50276cb60275d15c2d370c5a1be2705067c7b275))
- **LayoutSidre:** resolve the breakpoint conflict. resolve [#3605](https://github.com/vbenjs/vue-vben-admin/issues/3605) ([1a7ae0e](https://github.com/vbenjs/vue-vben-admin/commit/1a7ae0e81071876fe6a5cf2ef00bb61cbca70736))
- **LockModal:** Cannot unlock ([#3143](https://github.com/vbenjs/vue-vben-admin/issues/3143)) ([cdac147](https://github.com/vbenjs/vue-vben-admin/commit/cdac147bc8d09fba6ac14ff1ed31ab4d5b5cb28b))
- **Login:** avoid infinite loop when query redirect to next route redirect ([#3630](https://github.com/vbenjs/vue-vben-admin/issues/3630)). resolve [#3620](https://github.com/vbenjs/vue-vben-admin/issues/3620) [#3627](https://github.com/vbenjs/vue-vben-admin/issues/3627) ([ab55cbf](https://github.com/vbenjs/vue-vben-admin/commit/ab55cbf99bd9891f10546176e203eb4ea8cafaa4))
- **Menu:** tab标签切换选中状态焦点重复. fix [#1681](https://github.com/vbenjs/vue-vben-admin/issues/1681) ([2ec5f63](https://github.com/vbenjs/vue-vben-admin/commit/2ec5f6322d036ea5d6968c16961d2c253e1cef06))
- **menu:** top menu and breadcrumb show wrong ([#3703](https://github.com/vbenjs/vue-vben-admin/issues/3703)) ([573fd53](https://github.com/vbenjs/vue-vben-admin/commit/573fd53b4e287524ffa6ec205b68812b657dde71))
- modal open logic missing ([#3462](https://github.com/vbenjs/vue-vben-admin/issues/3462)) ([cc97f06](https://github.com/vbenjs/vue-vben-admin/commit/cc97f0635438c102b97102a1e0a9d5550961d6fa))
- **Modal:** 修复BasicModal跟原生Modal样式冲突问题 ([#3720](https://github.com/vbenjs/vue-vben-admin/issues/3720)) ([ade6d4c](https://github.com/vbenjs/vue-vben-admin/commit/ade6d4c22dd62aa666fe934a747e2a3764feb7cd))
- modalElIterator可能为空导致报错 ([#3738](https://github.com/vbenjs/vue-vben-admin/issues/3738)) ([162a0d0](https://github.com/vbenjs/vue-vben-admin/commit/162a0d025252ff954f081d126c381e5fefd06e83))
- navigator.clipboard 兼容问题 [#3372](https://github.com/vbenjs/vue-vben-admin/issues/3372) ([#3403](https://github.com/vbenjs/vue-vben-admin/issues/3403)) ([d3600da](https://github.com/vbenjs/vue-vben-admin/commit/d3600daf5c55cc884f4a0311ee7335bdad529a1a))
- **PageWrapper:** 修复headerSticky样式 ([#3569](https://github.com/vbenjs/vue-vben-admin/issues/3569)) ([778ebe1](https://github.com/vbenjs/vue-vben-admin/commit/778ebe1f44bc4929f34fad41b5fec13e9270b517))
- **PopConfirmButton:** avoid type lint error ([#3600](https://github.com/vbenjs/vue-vben-admin/issues/3600)) ([5ec4446](https://github.com/vbenjs/vue-vben-admin/commit/5ec444644384c6a1b8d559e0e21dfa814e5af635))
- remove duplicate code ([#3674](https://github.com/vbenjs/vue-vben-admin/issues/3674)) ([c33ee66](https://github.com/vbenjs/vue-vben-admin/commit/c33ee66473159a0322b7c4489538dd5309587e45))
- repair login about redirect query ([#3592](https://github.com/vbenjs/vue-vben-admin/issues/3592)) ([236ddf3](https://github.com/vbenjs/vue-vben-admin/commit/236ddf3471a7851ff6541f5709e9cbb6105b58f7))
- resolve conflicts between eslint and prettier and bump prettier-plugin-packagejson version to 2.4.6([#3328](https://github.com/vbenjs/vue-vben-admin/issues/3328)) ([8a00070](https://github.com/vbenjs/vue-vben-admin/commit/8a000705d1c89194647a11d01a620c1a893d2643))
- **router:** resolve menu loading failure when permission is in "role mode" ([#3660](https://github.com/vbenjs/vue-vben-admin/issues/3660)) ([c7631fe](https://github.com/vbenjs/vue-vben-admin/commit/c7631fed681da0dd51583cf3ecba60ebfd76ec4d)), closes [#3655](https://github.com/vbenjs/vue-vben-admin/issues/3655)
- **router:** resolve the next function being called twice ([#3643](https://github.com/vbenjs/vue-vben-admin/issues/3643)) ([7ec9344](https://github.com/vbenjs/vue-vben-admin/commit/7ec9344be8e80899749f41d173c1a11db267354e)), closes [#3642](https://github.com/vbenjs/vue-vben-admin/issues/3642)
- **router:** the issue of blank page navigation during repair of non-LAYOUT first-level route component ([#3764](https://github.com/vbenjs/vue-vben-admin/issues/3764)) ([c58c192](https://github.com/vbenjs/vue-vben-admin/commit/c58c1929c1e8a41c15ff2f4f4398eba0fd375b69))
- scroll back to top when tab switch ([#3498](https://github.com/vbenjs/vue-vben-admin/issues/3498)). resolve [#3490](https://github.com/vbenjs/vue-vben-admin/issues/3490) ([d709dd6](https://github.com/vbenjs/vue-vben-admin/commit/d709dd67b50a2e2b88cbcce48f19085ce528f971))
- scrollbar is obscured ([#3331](https://github.com/vbenjs/vue-vben-admin/issues/3331)) ([3f65baf](https://github.com/vbenjs/vue-vben-admin/commit/3f65baf503bee677bde70535525ae514d0585d69))
- ScrollContainer的一个问题 [#3046](https://github.com/vbenjs/vue-vben-admin/issues/3046) ([#3119](https://github.com/vbenjs/vue-vben-admin/issues/3119)) ([aa03c87](https://github.com/vbenjs/vue-vben-admin/commit/aa03c87383c703ddce7759bd7ba114709f2f5241))
- **ScrollContainer:** enable x scroll ([#3564](https://github.com/vbenjs/vue-vben-admin/issues/3564)) ([a1e862b](https://github.com/vbenjs/vue-vben-admin/commit/a1e862bde7a29420fd1de6083c5bde02bef8e9fd))
- **SimpleMenuTag:** SimpleMenuTag的引用都改为动态组件引用,以消除打包警告.close [#3121](https://github.com/vbenjs/vue-vben-admin/issues/3121) ([6e33c26](https://github.com/vbenjs/vue-vben-admin/commit/6e33c268930ad2a99311f0f2b6eb4b90f3cf61ce))
- **StrengthMeter:** change事件应随handleChange一起抛出。close [#3118](https://github.com/vbenjs/vue-vben-admin/issues/3118) ([f5ce480](https://github.com/vbenjs/vue-vben-admin/commit/f5ce480f0fb2f97de57e26a01945b715938f6e18))
- **style:** 修复黑暗模式下弹框、demo目录下、按钮样式问题 ([#3208](https://github.com/vbenjs/vue-vben-admin/issues/3208)) ([06a6c94](https://github.com/vbenjs/vue-vben-admin/commit/06a6c947a980530be6654f05357bc3c721c1140b))
- tabel取消编辑单元格后会回到初始值. close [#2739](https://github.com/vbenjs/vue-vben-admin/issues/2739) ([#3108](https://github.com/vbenjs/vue-vben-admin/issues/3108)) ([9864305](https://github.com/vbenjs/vue-vben-admin/commit/986430513bc2da9a2ad88d40c026b0373bf22d07))
- table height calc when fullcontent and footer visible change ([#3392](https://github.com/vbenjs/vue-vben-admin/issues/3392)) ([20698c0](https://github.com/vbenjs/vue-vben-admin/commit/20698c052c2b696587ac77ba7c85d74abc974ed5))
- table index column width is not enough in english ([#3342](https://github.com/vbenjs/vue-vben-admin/issues/3342)) ([0f13758](https://github.com/vbenjs/vue-vben-admin/commit/0f137585542ee2cf3b542a4ca4d94e76aadfb3d0))
- TableAction设置icon显示iconify关键字 ([#3608](https://github.com/vbenjs/vue-vben-admin/issues/3608)) ([b233973](https://github.com/vbenjs/vue-vben-admin/commit/b2339739746740eaaf4adee3ef16757f3b05ec86))
- **test-server:** test-server can not lanuch ([#3554](https://github.com/vbenjs/vue-vben-admin/issues/3554)) ([e679704](https://github.com/vbenjs/vue-vben-admin/commit/e6797043c53abb8280ff9c86e32663450a650076))
- **tree:** remove expandedKeys prop default value ([#3184](https://github.com/vbenjs/vue-vben-admin/issues/3184)) ([92875cb](https://github.com/vbenjs/vue-vben-admin/commit/92875cbeccf6213bcad9acd4e322cdee59e35266))
- turbo run lint ([#3332](https://github.com/vbenjs/vue-vben-admin/issues/3332)) ([064922d](https://github.com/vbenjs/vue-vben-admin/commit/064922dd4c3ae674a463e4b9453a4ca8bf2a52a0)), closes [#3277](https://github.com/vbenjs/vue-vben-admin/issues/3277)
- **type:** type:check error ([#3309](https://github.com/vbenjs/vue-vben-admin/issues/3309)) ([2cd5a40](https://github.com/vbenjs/vue-vben-admin/commit/2cd5a40322e9b7946e789d7c5023fda0e712af4d))
- typo in locale ([#3659](https://github.com/vbenjs/vue-vben-admin/issues/3659)) ([a4cc1d5](https://github.com/vbenjs/vue-vben-admin/commit/a4cc1d53169bc26e01862ca4ff88e28d5329ab8f))
- typo substract -> subtract ([#3551](https://github.com/vbenjs/vue-vben-admin/issues/3551)) ([f3fbb57](https://github.com/vbenjs/vue-vben-admin/commit/f3fbb57dc944a11a06be2eff376d77f9cef29813))
- **typo:** fileservice class name ([#3625](https://github.com/vbenjs/vue-vben-admin/issues/3625)) ([b794469](https://github.com/vbenjs/vue-vben-admin/commit/b7944690d118377a32e694fa30081b1e43c71719))
- Update TableAction.vue ([#3619](https://github.com/vbenjs/vue-vben-admin/issues/3619)) ([76ffd8f](https://github.com/vbenjs/vue-vben-admin/commit/76ffd8fdf1ecc37a30f33c901ff199ba21f88ad4))
- **Upload:** The file name is too long bug ([#3182](https://github.com/vbenjs/vue-vben-admin/issues/3182)) ([e7fbd74](https://github.com/vbenjs/vue-vben-admin/commit/e7fbd742287928112b318bf966e57c74f6a8ee72))
- **useFormEvent:** 修复表单项存在defaultValue时,updateSchema方法会将setFieldsValue设置的值覆盖问题 ([#3287](https://github.com/vbenjs/vue-vben-admin/issues/3287)) ([72ef3df](https://github.com/vbenjs/vue-vben-admin/commit/72ef3df57fe978c0b8e185f0d632a59e128a390f))
- **useFormEvents:** 修复setFieldsValue 方法设置完值后,函数 componentProps丢失formActionType 的bug ([#3301](https://github.com/vbenjs/vue-vben-admin/issues/3301)) ([82671d0](https://github.com/vbenjs/vue-vben-admin/commit/82671d07502adbaa06decbe0caa51ca2ba2e5149))
- **util:** resolve executing retry even when HTTP status code is 401 ([#3756](https://github.com/vbenjs/vue-vben-admin/issues/3756)) ([3627402](https://github.com/vbenjs/vue-vben-admin/commit/36274025d6a19de978bcaaae3f0ddb42f31ecd2f))
- validateFields await missing ([#3254](https://github.com/vbenjs/vue-vben-admin/issues/3254)) ([71c3fea](https://github.com/vbenjs/vue-vben-admin/commit/71c3fea88afa9209f080458bbd7429b1d37baa2c))
- **VFormDesign:** findIndex === -1 ([#3305](https://github.com/vbenjs/vue-vben-admin/issues/3305)) ([d7472b8](https://github.com/vbenjs/vue-vben-admin/commit/d7472b8a2e480299888ffeac6ac95466b27afa0f))
- **vxe-table:** theme dark is not work ([#3239](https://github.com/vbenjs/vue-vben-admin/issues/3239)) ([031d613](https://github.com/vbenjs/vue-vben-admin/commit/031d613b18125c877ebaa4a3241c3b4bf9c7624a))
- watch open logic lost after build ([#3421](https://github.com/vbenjs/vue-vben-admin/issues/3421)) ([089a989](https://github.com/vbenjs/vue-vben-admin/commit/089a98953e01d6b7cb0003f33d321035e19311c5))
### Features
- 解决Form updateSchema后执行setProps导致schemaRef被重置的问题 ([#3354](https://github.com/vbenjs/vue-vben-admin/issues/3354)) ([b0e8154](https://github.com/vbenjs/vue-vben-admin/commit/b0e8154f9f23db71dba7302395cc7d3db4b4a339))
- 新增表单只读功能 ([#3335](https://github.com/vbenjs/vue-vben-admin/issues/3335)) ([342328c](https://github.com/vbenjs/vue-vben-admin/commit/342328ce5f06b33dabdbd4a3bdd2c846f011eb03))
- 修复 vxetable 实例中缺少的 getRefMaps 和 getComputeMaps 方法 ([#3361](https://github.com/vbenjs/vue-vben-admin/issues/3361)) ([2376e8f](https://github.com/vbenjs/vue-vben-admin/commit/2376e8f67d154fe902452c6c1af19248402602b7))
- 增加文本省略组件 ([#3180](https://github.com/vbenjs/vue-vben-admin/issues/3180)) ([8722471](https://github.com/vbenjs/vue-vben-admin/commit/87224715c3983227866f148d858276c1234f77e0))
- 支持设置多重水印,增加清除所有水印方法. close [#2610](https://github.com/vbenjs/vue-vben-admin/issues/2610) ([#3084](https://github.com/vbenjs/vue-vben-admin/issues/3084)) ([64b8128](https://github.com/vbenjs/vue-vben-admin/commit/64b812802f5ca053c8f0ae9c9f159cbfedb32d5d))
- add pinia persist plugin ([#3173](https://github.com/vbenjs/vue-vben-admin/issues/3173)) ([2152b3f](https://github.com/vbenjs/vue-vben-admin/commit/2152b3f779b47f70e4442ff4c850db10048733d3))
- **ApiTree:** 完善ApiTree组件的重置回显功能. close [#2307](https://github.com/vbenjs/vue-vben-admin/issues/2307) ([a0d4b10](https://github.com/vbenjs/vue-vben-admin/commit/a0d4b10a1f0f858925ce7fff3f9b686308fd3ada))
- **BasicButton:** BasicButton组件支持icon插槽. close [#1377](https://github.com/vbenjs/vue-vben-admin/issues/1377) ([5aac032](https://github.com/vbenjs/vue-vben-admin/commit/5aac032acc294e087e45d5787cbae843d5a86f28))
- **BasicForm:** 新增监听表单收缩方法传值进行判断 ([#3745](https://github.com/vbenjs/vue-vben-admin/issues/3745)) ([e9c6dd8](https://github.com/vbenjs/vue-vben-admin/commit/e9c6dd83b1b21bd46fbb7b16f159733761b49fd2))
- **BasicForm:** Improve ts types for BasicForm ([#3426](https://github.com/vbenjs/vue-vben-admin/issues/3426)) ([6bb7918](https://github.com/vbenjs/vue-vben-admin/commit/6bb79180fc798b1a0b1a6c22f7c13ddb3a45a3b5))
- **BasicTable:** 新增表格搜索获取参数的方法 ([#3715](https://github.com/vbenjs/vue-vben-admin/issues/3715)) ([de5f9e3](https://github.com/vbenjs/vue-vben-admin/commit/de5f9e304791ce131a589683282b42f77d10238c))
- **BasicTable:** table enable accordion expand ([#3533](https://github.com/vbenjs/vue-vben-admin/issues/3533)). resolve [#3525](https://github.com/vbenjs/vue-vben-admin/issues/3525) ([abae7f3](https://github.com/vbenjs/vue-vben-admin/commit/abae7f3295846f10b69c591739bbec22d176b6fe))
- **BasicTree:** BasicTree组件暴露treeData数据 ([caf1783](https://github.com/vbenjs/vue-vben-admin/commit/caf178352537650f603aca441386b377f7cf8821))
- ColumnSetting and SizeSetting persist ([#3398](https://github.com/vbenjs/vue-vben-admin/issues/3398)) ([f4df2d5](https://github.com/vbenjs/vue-vben-admin/commit/f4df2d5a4bd23f346af10580e5ab7de64933bb4c))
- **components->Upload:** 修正图片上传组件允许自定义上传格式限制 ([#3755](https://github.com/vbenjs/vue-vben-admin/issues/3755)) ([302e212](https://github.com/vbenjs/vue-vben-admin/commit/302e2125ba1c7e63e7db47ef6e1ee256da9f81d4))
- **demo->BasicTable:** add TableSelectionBar and enable checkbox rowSelection demo ([#3477](https://github.com/vbenjs/vue-vben-admin/issues/3477)) ([816553b](https://github.com/vbenjs/vue-vben-admin/commit/816553bfcd5a88988c6e7b93cc3378f4a5b17fee))
- **demo->useRequest:** 更新错误重试示例 ([#3456](https://github.com/vbenjs/vue-vben-admin/issues/3456)) ([7fa2578](https://github.com/vbenjs/vue-vben-admin/commit/7fa2578e6d578e7ab44793fcb2b41189a7ba9af3))
- **demo->useRequest:** 更新useRequest 依赖 Effect 函数案例 ([#3460](https://github.com/vbenjs/vue-vben-admin/issues/3460)) ([b57d9fc](https://github.com/vbenjs/vue-vben-admin/commit/b57d9fc60dd113607cd381dff1f88c47671fc434))
- **demo:** hooks useRequest 异步数据管理 ([#3447](https://github.com/vbenjs/vue-vben-admin/issues/3447)) ([d6d1120](https://github.com/vbenjs/vue-vben-admin/commit/d6d1120d00a24b7a97bd37f6a0786c1265fa870d))
- **deps:** update vite version to 5.x ([#3508](https://github.com/vbenjs/vue-vben-admin/issues/3508)) ([e6c7b5f](https://github.com/vbenjs/vue-vben-admin/commit/e6c7b5f9282adbdd9429495d5918c1eafbffde7d))
- fix ellipsis bug ([#3644](https://github.com/vbenjs/vue-vben-admin/issues/3644)) ([9372f1d](https://github.com/vbenjs/vue-vben-admin/commit/9372f1d159bb3236810e469defe6986b924d2264))
- **Form:** 新增Transfer、CropperAvatar、BasicTitle 组件至Form中并添加至演示页面 ([#3362](https://github.com/vbenjs/vue-vben-admin/issues/3362)) ([f6147fa](https://github.com/vbenjs/vue-vben-admin/commit/f6147fa44985d149692b5c6053a49b76d24767cc))
- **Form:** 在Form将BasicTitle识做为Divider一样的处理 ([#3371](https://github.com/vbenjs/vue-vben-admin/issues/3371)) ([cd71e60](https://github.com/vbenjs/vue-vben-admin/commit/cd71e60dd16e87706deb2d06310bc507c55d6a99))
- Form增加ImageUpload组件 ([#3172](https://github.com/vbenjs/vue-vben-admin/issues/3172)) ([b776ac4](https://github.com/vbenjs/vue-vben-admin/commit/b776ac4cd8a4895804b554949f39c82c03382006))
- **hooks:** useWatermark添加水印防篡改功能([#3395](https://github.com/vbenjs/vue-vben-admin/issues/3395)) ([#3397](https://github.com/vbenjs/vue-vben-admin/issues/3397)) ([0a1a5ff](https://github.com/vbenjs/vue-vben-admin/commit/0a1a5ffedc58190529617c9267c6510dc7e17ca9))
- **IconPicker:** IconPicker could allowClear and readonly for form ([#3414](https://github.com/vbenjs/vue-vben-admin/issues/3414)) ([e23f294](https://github.com/vbenjs/vue-vben-admin/commit/e23f29464bd609d6bc7228a5940032d693b006aa))
- iframe expose postmessage function ([#3368](https://github.com/vbenjs/vue-vben-admin/issues/3368)) ([05bc4ac](https://github.com/vbenjs/vue-vben-admin/commit/05bc4acb9b2107bfad8200c0f1942a76367d7a00))
- **input:** add auto-trimming for vxe-table input components ([#3684](https://github.com/vbenjs/vue-vben-admin/issues/3684)) ([9882e8d](https://github.com/vbenjs/vue-vben-admin/commit/9882e8df86cc68373cf0f1fa4f4aa04a9773825e))
- **layout->tabs:** support insert new tab after current tab ([#3471](https://github.com/vbenjs/vue-vben-admin/issues/3471)) ([1e34d3e](https://github.com/vbenjs/vue-vben-admin/commit/1e34d3e9e4c79a62a16c6209639f5394dea61148))
- **layout:** move setting button to tabs when fold ([#3264](https://github.com/vbenjs/vue-vben-admin/issues/3264)) ([83426b5](https://github.com/vbenjs/vue-vben-admin/commit/83426b5c96a88c3a6aa399eb6100ea5fb494fd0e))
- **Menu:** Add custom images to menu ([#3158](https://github.com/vbenjs/vue-vben-admin/issues/3158)) ([b3a6ef6](https://github.com/vbenjs/vue-vben-admin/commit/b3a6ef63bb500d8103bde17d588b3c0c4c77efd6))
- **menu:** Restore side bar settings and added menu mouse move in mode light style ([#3295](https://github.com/vbenjs/vue-vben-admin/issues/3295)) ([003a951](https://github.com/vbenjs/vue-vben-admin/commit/003a951befb9ef2878a35fbe3054252d0bc8e77e))
- **MultipleTab:** add tabs auto collapse interaction in fold mode and setting ([#3256](https://github.com/vbenjs/vue-vben-admin/issues/3256)) ([191e809](https://github.com/vbenjs/vue-vben-admin/commit/191e809b6d696d6e0b72c67ba1c7e89c721f2642))
- pinia persist plugin custom serializer ([#3244](https://github.com/vbenjs/vue-vben-admin/issues/3244)) ([ea51c49](https://github.com/vbenjs/vue-vben-admin/commit/ea51c492c2ba56aa6693217e24f60dc143f124f1))
- RefForm页面新增只读功能按钮 ([#3346](https://github.com/vbenjs/vue-vben-admin/issues/3346)) ([97b76ea](https://github.com/vbenjs/vue-vben-admin/commit/97b76ea6bc902d00c87c5cbd1cb2d67aa9a88347))
- **search:** adjust the menu search function to recognize lowercase input ([#3736](https://github.com/vbenjs/vue-vben-admin/issues/3736)) ([96ac362](https://github.com/vbenjs/vue-vben-admin/commit/96ac362fa6a89af256cf8a84e4b667c195c6ea2e))
- **Table-> CustomerCell:** helpMessage支持传递 tsx 和 h函数的数据 ([c373ffd](https://github.com/vbenjs/vue-vben-admin/commit/c373ffd3bfb7db454e0501b2f7b138ed1a9ec657))
- table搜索表单值发生改变可以触发reload ([#3378](https://github.com/vbenjs/vue-vben-admin/issues/3378)) ([1ca3f7c](https://github.com/vbenjs/vue-vben-admin/commit/1ca3f7c2c0c0c00e8395e26c59796c875d34e12c))
- **treeTable:** add function collapseRows and demo ([#3375](https://github.com/vbenjs/vue-vben-admin/issues/3375)) ([e656b5d](https://github.com/vbenjs/vue-vben-admin/commit/e656b5d8dcde38deeedc73d713d2367e54d2893b))
- **type->api:** resultField推断api的返回值应该包含recordbale类型 ([#3699](https://github.com/vbenjs/vue-vben-admin/issues/3699)) ([c7ab4a5](https://github.com/vbenjs/vue-vben-admin/commit/c7ab4a52989256ccae996191cc249d9cbb36e6d6))
- **Upload:** file list add drag func ([#3227](https://github.com/vbenjs/vue-vben-admin/issues/3227)). resolve [#3179](https://github.com/vbenjs/vue-vben-admin/issues/3179) ([beed7f2](https://github.com/vbenjs/vue-vben-admin/commit/beed7f2e1172531fe691384a50c8b0457f3a80d8))
- **VirtualScroll:** 虚拟滚动增加滚动到顶部, 底部, 指定项方法 ([#3687](https://github.com/vbenjs/vue-vben-admin/issues/3687)) ([7c52f08](https://github.com/vbenjs/vue-vben-admin/commit/7c52f083db30f7e68c3e10a88cbc47d41cf9de20))
- vxeTable searchInfo demo ([#3223](https://github.com/vbenjs/vue-vben-admin/issues/3223)) close [#3011](https://github.com/vbenjs/vue-vben-admin/issues/3011) ([59145ad](https://github.com/vbenjs/vue-vben-admin/commit/59145ade255ee752a7c8d8995634ec172a7f60c8))
- **vxetable:** 新增 clearEdit 方法 ([#3369](https://github.com/vbenjs/vue-vben-admin/issues/3369)) ([522e892](https://github.com/vbenjs/vue-vben-admin/commit/522e892d7947807f7d500a2bace23880729df204))
- **watermark:** support custom style ([#3634](https://github.com/vbenjs/vue-vben-admin/issues/3634)) ([ca3ddd1](https://github.com/vbenjs/vue-vben-admin/commit/ca3ddd19f7811cbf32fd87b6c1cfd6681c08fc69))
### Performance Improvements
- 解决ts文件通过alias引入vue文件后, vscode调转不到正确vue文件路径 ([#3099](https://github.com/vbenjs/vue-vben-admin/issues/3099)) ([033d882](https://github.com/vbenjs/vue-vben-admin/commit/033d8828a9545770e98909291dcb6fd8db90ee41))
- 优化水印在控制台可以hide的问题 ([#3732](https://github.com/vbenjs/vue-vben-admin/issues/3732)) ([9784cdc](https://github.com/vbenjs/vue-vben-admin/commit/9784cdc840336d5c2bb006fa3ababfa7fa4056af))
- **BasicTree:** 获取treeData改写成函数 ([748b99b](https://github.com/vbenjs/vue-vben-admin/commit/748b99b18f5fc4e313add38ad457f0a5f064db70))
- **BasicTree:** 外部获取treeData不必通过treeDataRef.value ([#3353](https://github.com/vbenjs/vue-vben-admin/issues/3353)) ([943f500](https://github.com/vbenjs/vue-vben-admin/commit/943f50051ca80b6646ed44a2117b7c9ef632ed6d))
- **breakpointEnum:** 修改enum与breakpoint.less内一致 ([#3276](https://github.com/vbenjs/vue-vben-admin/issues/3276)) ([8932318](https://github.com/vbenjs/vue-vben-admin/commit/89323186b56b06b148664ae7483c490cf7eadefa))
- **component:** formItem: label支持函数渲染 ([#3504](https://github.com/vbenjs/vue-vben-admin/issues/3504)) ([e6a7e4c](https://github.com/vbenjs/vue-vben-admin/commit/e6a7e4c4fcdc5ad94f55c4f19000d6767773691e))
- **ConfigProvider:** 配置antdv主题色, 使其与modifyVars配置一致 ([#3219](https://github.com/vbenjs/vue-vben-admin/issues/3219)) ([bb3d5b8](https://github.com/vbenjs/vue-vben-admin/commit/bb3d5b8ae8e8ae0e91acb3022f51572daf3210c6))
- **darkMode:** 深色模式颜色定义以及切换方式优化 ([#3436](https://github.com/vbenjs/vue-vben-admin/issues/3436)) ([b008c44](https://github.com/vbenjs/vue-vben-admin/commit/b008c44246bec32def74c6ae1dd3522bf8c1ca2e))
- **darkMode:** 优化深色模式颜色切换相关方法; 增加根据主题更新自定义颜色方法和示例 ([#3216](https://github.com/vbenjs/vue-vben-admin/issues/3216)) ([e497721](https://github.com/vbenjs/vue-vben-admin/commit/e497721e9b3d03de07a61808012d0d6e04fd9663))
- **IconPicker:** input trigger popover by click ([#3278](https://github.com/vbenjs/vue-vben-admin/issues/3278)) ([2bbc2d2](https://github.com/vbenjs/vue-vben-admin/commit/2bbc2d28119c7f7cadbf5411b9ea886fb8965de0))
- **ImageUpload:** 根据官方示例设置图片回显格式 ([#3252](https://github.com/vbenjs/vue-vben-admin/issues/3252)) ([2991bb1](https://github.com/vbenjs/vue-vben-admin/commit/2991bb1670d44633d1f571374553d027e0dad8a2))
- Modify i18 file format to JSON ([#3171](https://github.com/vbenjs/vue-vben-admin/issues/3171)) ([c24e0ef](https://github.com/vbenjs/vue-vben-admin/commit/c24e0efd1d2c7148a3df9c8b12a2a500910a3590))
- **useForm:** If the args of the setFieldsValue is empty, it will not be executed. close [#3209](https://github.com/vbenjs/vue-vben-admin/issues/3209) ([8f90087](https://github.com/vbenjs/vue-vben-admin/commit/8f900871ace30895d9fee84c4eb9018c0ad0450e))
### Reverts
- Revert "chore(deps): update ant-design-vue version to 4.1.0. resolve #3495" ([f9fc369](https://github.com/vbenjs/vue-vben-admin/commit/f9fc369637d1588aa5eebf5fee1f3526de14e0cb)), closes [#3495](https://github.com/vbenjs/vue-vben-admin/issues/3495)
- Revert "feat: table搜索表单值发生改变可以触发reload (#3378)" (#3407) ([2828ed3](https://github.com/vbenjs/vue-vben-admin/commit/2828ed304a778bb16b52223607428dac926d73bf)), closes [#3378](https://github.com/vbenjs/vue-vben-admin/issues/3378) [#3407](https://github.com/vbenjs/vue-vben-admin/issues/3407)
- Revert "chore: update `unplugin-config` (#3116)" (#3117) ([f0550f2](https://github.com/vbenjs/vue-vben-admin/commit/f0550f20438a4c11f51fcf3e4a4286692bcf7d9f)), closes [#3116](https://github.com/vbenjs/vue-vben-admin/issues/3116) [#3117](https://github.com/vbenjs/vue-vben-admin/issues/3117)
- Revert "chore: Update Dependencies" ([ae09d3c](https://github.com/vbenjs/vue-vben-admin/commit/ae09d3cfd6b11689620565b57b506826626d09e9))
- Revert "refactor: use `unplugin-config` (#3106)" ([694dead](https://github.com/vbenjs/vue-vben-admin/commit/694dead3115a535782b7dd3a3c2dc4eaa9f32d76)), closes [#3106](https://github.com/vbenjs/vue-vben-admin/issues/3106)
## [2.8.0](https://github.com/anncwb/vue-vben-admin/compare/v2.7.2...v2.8.0) (2021-11-03)
### Bug Fixes

25
Dockerfile Normal file
View File

@@ -0,0 +1,25 @@
# node 构建
FROM node:16-alpine as build-stage
# 署名
MAINTAINER Adoin 'adoin@qq.com'
WORKDIR /app
COPY . ./
# 设置 node 阿里镜像
RUN npm config set registry https://registry.npmmirror.com
# 设置--max-old-space-size
ENV NODE_OPTIONS=--max-old-space-size=16384
# 设置阿里镜像、pnpm、依赖、编译
RUN npm install pnpm -g && \
pnpm install --frozen-lockfile && \
pnpm build:docker
# node部分结束
RUN echo "🎉 编 🎉 译 🎉 成 🎉 功 🎉"
# nginx 部署
FROM nginx:1.23.3-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html/dist
COPY --from=build-stage /app/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
## 将/usr/share/nginx/html/dist/assets/index.js 和/usr/share/nginx/html/dist/_app.config.js中的"$vg_base_url"替换为环境变量中的VG_BASE_URL,$vg_sub_domain 替换成VG_SUB_DOMAIN$vg_default_user替换成VG_DEFAULT_USER$vg_default_password替换成VG_DEFAULT_PASSWORD 而后启动nginx
CMD sed -i "s|__vg_base_url|$VG_BASE_URL|g" /usr/share/nginx/html/dist/assets/entry/index-*.js /usr/share/nginx/html/dist/_app.config.js && \
nginx -g 'daemon off;'
RUN echo "🎉 架 🎉 设 🎉 成 🎉 功 🎉"

View File

@@ -9,24 +9,24 @@
## Introduction
Vue Vben Admin is a free and open source middle and back-end template. Using the latest `vue3`, `vite2`, `TypeScript` and other mainstream technology development, the out-of-the-box middle and back-end front-end solutions can also be used for learning reference.
Vue Vben Admin is a free and open source middle platform/back-end template. Using the latest `vue3`, `vite4`, `TypeScript` and other mainstream technology, Vben is the out-of-the-box front-end solution for both production and learning purpose.
## Feature
## Features
- **State of The Art Development**Use front-end front-end technology development such as Vue3/vite2
- **State-of-art Techinical Stack**Using the latest and popular front-end technology such as Vue3/vite2
- **TypeScript**: Application-level JavaScript language
- **Theming**: Configurable themes
- **International**Built-in complete internationalization program
- **Mock Server** Built-in mock data scheme
- **Authority** Built-in complete dynamic routing permission generation scheme.
- **Component** Multiple commonly used components are encapsulated twice
- **International**Built-in i18n support
- **Response Mock**: Built-in response mock ability
- **Authority**: Built-in permission system based on dynamic routes.
- **Component**: Extracted and encapsulated components for various scenarios.
## Preview
- [vue-vben-admin](https://vben.vvbin.cn/) - Full version Chinese site
- [vue-vben-admin-gh-pages](https://anncwb.github.io/vue-vben-admin/) - Full version of the github site
- [vben-admin-thin-next](https://vben.vvbin.cn/thin/next/) - Simplified Chinese site
- [vben-admin-thin-gh-pages](https://anncwb.github.io/vben-admin-thin-next/) -Simplified github site
- [vue-vben-admin](https://vben.vvbin.cn/) - Full version (Chinese)
- [vue-vben-admin-gh-pages](https://anncwb.github.io/vue-vben-admin/) - Full version (github hosted)
- [vben-admin-thin-next](https://vben.vvbin.cn/thin/next/) - Simplified Version (Chinese)
- [vben-admin-thin-gh-pages](https://anncwb.github.io/vben-admin-thin-next/) -Simplified Version (github hosted)
Test account: vben/123456
@@ -54,7 +54,7 @@ Open the project in Gitpod (free online dev environment for GitHub) and start co
- [TypeScript](https://www.typescriptlang.org/) - Familiar with the basic syntax of `TypeScript`
- [Es6+](http://es6.ruanyifeng.com/) - Familiar with es6 basic syntax
- [Vue-Router-Next](https://next.router.vuejs.org/) - Familiar with the basic use of vue-router
- [Ant-Design-Vue](https://2x.antdv.com/docs/vue/introduce-cn/) - ui basic use
- [Ant-Design-Vue](https://antdv.com/docs/vue/introduce-cn/) - ui basic use
- [Mock.js](https://github.com/nuysoft/Mock) - mockjs basic syntax
## Install and use
@@ -65,7 +65,7 @@ Open the project in Gitpod (free online dev environment for GitHub) and start co
git clone https://github.com/anncwb/vue-vben-admin.git
```
- Installation dependencies
- Install dependencies
```bash
cd vue-vben-admin
@@ -86,6 +86,24 @@ pnpm serve
pnpm build
```
- docker
### The dockerFile is located in the project root directory and supports differential deployment
#### build image
```bash
docker build -t vue-vben-admin .
```
#### Use environment variables to achieve differentiated container deployment. Specify service endpoint by assigning `VG_BASE_URL`. In the following example, `http://localhost:3333` is used as the back-end service address and the container is mapped to port `6666`:
```bash
docker run --name vue-vben-admin -d -p 6666:80 -e VG_BASE_URL=http://localhost:3333 vue-vben-admin
```
Then you can navigate to `http://localhost:6666`
## Change Log
[CHANGELOG](./CHANGELOG.zh_CN.md)
@@ -97,7 +115,7 @@ pnpm build
## How to contribute
You are very welcome to join[Raise an issue](https://github.com/anncwb/vue-vben-admin/issues/new/choose) Or submit a Pull Request。
You are very welcome to join[Raise an issue](https://github.com/anncwb/vue-vben-admin/issues/new/choose) or submit a Pull Request。
**Pull Request:**
@@ -113,7 +131,7 @@ You are very welcome to join[Raise an issue](https://github.com/anncwb/vue-vb
- `feat` Add new features
- `fix` Fix the problem/BUG
- `style` The code style is related and does not affect the running result
- `style` Modify the code style/format that does not affect the feature
- `perf` Optimization/performance improvement
- `refactor` Refactor
- `revert` Undo edit
@@ -127,7 +145,7 @@ You are very welcome to join[Raise an issue](https://github.com/anncwb/vue-vb
## Related warehouse
If these plugins are helpful to you, you can give a star support
If these plugins are helpful to you, you can show support by leaving a star!
- [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - Used for local and development environment data mock
- [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - Used for html template conversion and compression
@@ -138,7 +156,7 @@ If these plugins are helpful to you, you can give a star support
The `Chrome 80+` browser is recommended for local development
Support modern browsers, not IE
Support modern browsers, doesn't include IE
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| :-: | :-: | :-: | :-: | :-: |
@@ -146,20 +164,15 @@ Support modern browsers, not IE
## Maintainer
[@Vben](https://github.com/anncwb)
[@Vben](https://github.com/anncwb) [@Jinmao](https://github.com/jinmao88)
## Donate
## Thanks
If you think this project is helpful to you, you can help the author buy a cup of coffee to show your support!
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png" alt="JetBrains Logo (Main) logo." height="120">
![donate](https://anncwb.github.io/anncwb/images/sponsor.png)
## Star History Chart
<a style="display: block;width: 100px;height: 50px;line-height: 50px; color: #fff;text-align: center; background: #408aed;border-radius: 4px;" href="https://www.paypal.com/paypalme/cvvben">Paypal Me</a>
## Discord
- [github discussions](https://github.com/anncwb/vue-vben-admin/discussions)
- [Discord](https://discord.gg/8GuAdwDhj6)
[![Star History Chart](https://api.star-history.com/svg?repos=vbenjs/vue-vben-admin&type=Date)](https://star-history.com/#vbenjs/vue-vben-admin&Date)
## License

View File

@@ -9,11 +9,11 @@
## 简介
Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3`,`vite2`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,也可用于学习参考。
Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3`,`vite5`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,也可用于学习参考。
## 特性
- **最新技术栈**:使用 Vue3/vite2 等前端前沿技术开发
- **最新技术栈**:使用 Vue3/vite5 等前端前沿技术开发
- **TypeScript**: 应用程序级 JavaScript 的语言
- **主题**:可配置的主题
- **国际化**:内置完善的国际化方案
@@ -54,7 +54,7 @@ Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3
- [TypeScript](https://www.typescriptlang.org/) - 熟悉`TypeScript`基本语法
- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
- [Ant-Design-Vue](https://2x.antdv.com/docs/vue/introduce-cn/) - ui 基本使用
- [Ant-Design-Vue](https://antdv.com/docs/vue/introduce-cn/) - ui 基本使用
- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法
## 安装使用
@@ -86,6 +86,24 @@ pnpm serve
pnpm build
```
- docker
### dockerFile 位于项目根目录下 并且支持差异化部署
#### 构建镜像
```bash
docker build -t vue-vben-admin .
```
#### 动态使用环境变量实现容器差异化部署,通过不同的 VG_BASE_URL 环境变量,指向不同的后端服务地址,下面例子使用 http://localhost:3333 作为后端服务地址,并且将容器映射到 6666 端口
```bash
docker run --name vue-vben-admin -d -p 6666:80 -e VG_BASE_URL=http://localhost:3333 vue-vben-admin
```
而后可以打开 http://localhost:6666 访问
## 更新日志
[CHANGELOG](./CHANGELOG.zh_CN.md)
@@ -151,15 +169,11 @@ pnpm build
## 维护者
[@Vben](https://github.com/anncwb)
[@Vben](https://github.com/anncwb) [@Jinmao](https://github.com/jinmao88)
## 捐赠
## 感谢
如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持!
![donate](https://anncwb.github.io/anncwb/images/sponsor.png)
<a style="display: block;width: 100px;height: 50px;line-height: 50px; color: #fff;text-align: center; background: #408aed;border-radius: 4px;" href="https://www.paypal.com/paypalme/cvvben">Paypal Me</a>
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png" alt="JetBrains Logo (Main) logo." height='120'>
## 交流
@@ -167,6 +181,10 @@ pnpm build
- QQ 群 `569291866`
## Star 历史
[![Star History Chart](https://api.star-history.com/svg?repos=vbenjs/vue-vben-admin&type=Date)](https://star-history.com/#vbenjs/vue-vben-admin&Date)
## License
[MIT © Vben-2020](./LICENSE)

View File

@@ -4,16 +4,16 @@
"license": "MIT",
"scripts": {
"compile": "rimraf ./dist && tsup ./index.ts --dts --format cjs,esm ",
"prod": "npx pm2 start ecosystem.config.js --env production",
"restart": "pm2 restart ecosystem.config.js --env production",
"prod": "npx pm2 start ecosystem.config.cjs --env production",
"restart": "pm2 restart ecosystem.config.cjs --env production",
"start": "nodemon",
"stop": "npx pm2 stop ecosystem.config.js"
"stop": "npx pm2 stop ecosystem.config.cjs"
},
"dependencies": {
"fs-extra": "^11.1.1",
"koa": "^2.14.1",
"koa": "^2.14.2",
"koa-body": "^6.0.1",
"koa-bodyparser": "^4.4.0",
"koa-bodyparser": "^4.4.1",
"koa-route": "^3.2.0",
"koa-router": "^12.0.0",
"koa-static": "^5.0.0",
@@ -24,13 +24,13 @@
"@types/koa": "^2.13.6",
"@types/koa-bodyparser": "^5.0.2",
"@types/koa-router": "^7.4.4",
"@types/node": "^18.15.11",
"@types/node": "^20.4.0",
"nodemon": "^2.0.22",
"pm2": "^5.3.0",
"rimraf": "^4.4.1",
"rimraf": "^5.0.1",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.2.0",
"tsup": "^6.7.0",
"typescript": "^5.0.3"
"tsup": "^7.1.0",
"typescript": "^5.1.6"
}
}

View File

@@ -5,13 +5,13 @@ const uploadUrl = 'http://localhost:3300/static/upload';
const filePath = path.join(__dirname, '../static/upload/');
fs.ensureDir(filePath);
export default class UserService {
export default class FileService {
async upload(ctx, files, isMultiple) {
let fileReader, fileResource, writeStream;
const fileFunc = function (file) {
fileReader = fs.createReadStream(file.path);
fileResource = filePath + `/${file.name}`;
fileReader = fs.createReadStream(file.filepath);
fileResource = filePath + `/${file.originalFilename}`;
console.log(fileResource);
writeStream = fs.createWriteStream(fileResource);
@@ -22,7 +22,7 @@ export default class UserService {
if (flag) {
let url = '';
for (let i = 0; i < files.length; i++) {
url += uploadUrl + `/${files[i].name},`;
url += uploadUrl + `/${files[i].originalFilename},`;
}
url = url.replace(/,$/gi, '');
ctx.body = {
@@ -32,7 +32,7 @@ export default class UserService {
};
} else {
ctx.body = {
url: uploadUrl + `/${files.name}`,
url: uploadUrl + `/${files.originalFilename}`,
code: 0,
message: 'upload Success!',
};

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" id="htmlRoot">
<!doctype html>
<html lang="zh" id="htmlRoot">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
@@ -14,6 +14,11 @@
<body>
<div id="app">
<style>
html {
/* same as ant-design-vue/dist/reset.css setting, avoid the title line-height changed */
line-height: 1.15;
}
html[data-theme='dark'] .app-loading {
background-color: #2c344a;
}
@@ -120,18 +125,6 @@
}
}
@keyframes ant-rotate {
to {
transform: rotate(405deg);
}
}
@keyframes ant-spin-move {
to {
opacity: 1;
}
}
@keyframes ant-spin-move {
to {
opacity: 1;

View File

@@ -0,0 +1,9 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.turbo
dist
package.json

View File

@@ -12,6 +12,7 @@
"directory": "internal/eslint-config"
},
"license": "MIT",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
@@ -36,14 +37,14 @@
"stub": "pnpm unbuild --stub"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.57.1",
"@typescript-eslint/parser": "^5.57.1",
"eslint": "^8.37.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-simple-import-sort": "^10.0.0",
"eslint-plugin-vue": "^9.10.0",
"vue-eslint-parser": "^9.1.1"
"@typescript-eslint/eslint-plugin": "^7.0.1",
"@typescript-eslint/parser": "^7.0.1",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-simple-import-sort": "^12.0.0",
"eslint-plugin-vue": "^9.21.1",
"vue-eslint-parser": "^9.4.2"
}
}

View File

@@ -0,0 +1,9 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.turbo
dist
package.json

View File

@@ -12,6 +12,7 @@
"directory": "internal/stylelint-config"
},
"license": "MIT",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
@@ -31,19 +32,18 @@
"stub": "pnpm unbuild --stub"
},
"devDependencies": {
"postcss": "^8.4.21",
"postcss-html": "^1.5.0",
"postcss": "^8.4.38",
"postcss-html": "^1.6.0",
"postcss-less": "^6.0.0",
"postcss-scss": "^4.0.6",
"prettier": "^2.8.7",
"stylelint": "^15.4.0",
"stylelint-config-property-sort-order-smacss": "^9.1.0",
"stylelint-config-recommended": "^11.0.0",
"stylelint-config-recommended-scss": "^9.0.1",
"stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^32.0.0",
"stylelint-config-standard-scss": "^7.0.1",
"stylelint-order": "^6.0.3",
"stylelint-prettier": "^3.0.0"
"postcss-scss": "^4.0.9",
"prettier": "^3.2.5",
"stylelint": "^16.3.1",
"stylelint-config-property-sort-order-smacss": "^10.0.0",
"stylelint-config-recommended-scss": "^14.0.0",
"stylelint-config-recommended-vue": "^1.5.0",
"stylelint-config-standard": "^36.0.0",
"stylelint-config-standard-scss": "^13.1.0",
"stylelint-order": "^6.0.4",
"stylelint-prettier": "^5.0.0"
}
}

View File

@@ -22,6 +22,8 @@ export default {
},
],
rules: {
'prettier/prettier': true,
'media-feature-range-notation': null,
'selector-not-notation': null,
'import-notation': null,
'function-no-unknown': null,
@@ -57,7 +59,6 @@ export default {
},
],
'no-empty-source': null,
'string-quotes': null,
'named-grid-areas-no-invalid': null,
'no-descending-specificity': null,
'font-family-no-missing-generic-family-keyword': null,

View File

@@ -4,7 +4,7 @@
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"moduleResolution": "bundler",
"strict": true,
"declaration": true,
"noImplicitOverride": true,

View File

@@ -12,15 +12,15 @@
"directory": "internal/ts-config"
},
"license": "MIT",
"type": "module",
"files": [
"base.json",
"node.json",
"vue.json",
"vue-app.json",
"node-server.json"
],
"dependencies": {
"@types/node": "^18.15.11",
"unplugin-vue-define-options": "^1.3.3",
"vite": "^4.3.0-beta.2"
"@types/node": "^20.12.7",
"vite": "^5.2.9"
}
}

View File

@@ -6,6 +6,5 @@
"jsx": "preserve",
"lib": ["ESNext", "DOM"],
"noImplicitAny": false
}
}

View File

@@ -0,0 +1,9 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.turbo
dist
package.json

View File

@@ -12,6 +12,7 @@
"directory": "internal/vite-config"
},
"license": "MIT",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
@@ -31,29 +32,28 @@
"stub": "pnpm unbuild --stub"
},
"dependencies": {
"@ant-design/colors": "^7.0.0",
"vite": "^4.3.0-beta.2"
"@ant-design/colors": "^7.0.2",
"vite": "^5.2.9"
},
"devDependencies": {
"@types/fs-extra": "^11.0.1",
"@vitejs/plugin-vue": "^4.1.0",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"ant-design-vue": "^3.2.17",
"dayjs": "^1.11.7",
"dotenv": "^16.0.3",
"fs-extra": "^11.1.1",
"less": "^4.1.3",
"@types/fs-extra": "^11.0.4",
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"ant-design-vue": "^4.1.2",
"dayjs": "^1.11.10",
"dotenv": "^16.4.5",
"fs-extra": "^11.2.0",
"less": "^4.2.0",
"picocolors": "^1.0.0",
"pkg-types": "^1.0.2",
"rollup-plugin-visualizer": "^5.9.0",
"sass": "^1.60.0",
"unocss": "^0.50.6",
"unplugin-vue-define-options": "^1.3.3",
"pkg-types": "^1.0.3",
"rollup-plugin-visualizer": "^5.12.0",
"sass": "^1.75.0",
"unocss": "0.59.4",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-dts": "^2.2.0",
"vite-plugin-html": "^3.2.0",
"vite-plugin-dts": "^3.8.3",
"vite-plugin-html": "^3.2.2",
"vite-plugin-mock": "^2.9.6",
"vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-purge-icons": "^0.10.0",
"vite-plugin-svg-icons": "^2.0.1"
}
}

View File

@@ -21,7 +21,10 @@ function defineApplicationConfig(defineOptions: DefineOptions = {}) {
return defineConfig(async ({ command, mode }) => {
const root = process.cwd();
const isBuild = command === 'build';
const { VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_ENABLE_ANALYZE } = loadEnv(mode, root);
const { VITE_PUBLIC_PATH, VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_ENABLE_ANALYZE } = loadEnv(
mode,
root,
);
const defineData = await createDefineData(root);
const plugins = await createPlugins({
@@ -33,24 +36,15 @@ function defineApplicationConfig(defineOptions: DefineOptions = {}) {
});
const pathResolve = (pathname: string) => resolve(root, '.', pathname);
const timestamp = new Date().getTime();
const applicationConfig: UserConfig = {
base: VITE_PUBLIC_PATH,
resolve: {
alias: [
{
find: 'vue-i18n',
replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
},
// /@/xxxx => src/xxxx
{
find: /\/@\//,
replacement: pathResolve('src') + '/',
},
// /#/xxxx => types/xxxx
{
find: /\/#\//,
replacement: pathResolve('types') + '/',
},
// @/xxxx => src/xxxx
{
find: /@\//,
@@ -69,6 +63,8 @@ function defineApplicationConfig(defineOptions: DefineOptions = {}) {
cssTarget: 'chrome80',
rollupOptions: {
output: {
// 入口文件名
entryFileNames: `assets/entry/[name]-[hash]-${timestamp}.js`,
manualChunks: {
vue: ['vue', 'pinia', 'vue-router'],
antd: ['ant-design-vue', '@ant-design/icons-vue'],
@@ -87,7 +83,7 @@ function defineApplicationConfig(defineOptions: DefineOptions = {}) {
plugins,
};
const mergedConfig = mergeConfig(commonConfig, applicationConfig);
const mergedConfig = mergeConfig(commonConfig(mode), applicationConfig);
return mergeConfig(mergedConfig, overrides);
});

View File

@@ -1,13 +1,12 @@
import { presetTypography, presetUno } from 'unocss';
import UnoCSS from 'unocss/vite';
import { type UserConfig } from 'vite';
const commonConfig: UserConfig = {
const commonConfig: (mode: string) => UserConfig = (mode) => ({
server: {
host: true,
},
esbuild: {
drop: ['console', 'debugger'],
drop: mode === 'production' ? ['console', 'debugger'] : [],
},
build: {
reportCompressedSize: false,
@@ -17,11 +16,7 @@ const commonConfig: UserConfig = {
maxParallelFileOps: 3,
},
},
plugins: [
UnoCSS({
presets: [presetUno(), presetTypography()],
}),
],
};
plugins: [UnoCSS()],
});
export { commonConfig };

View File

@@ -14,7 +14,7 @@ interface DefineOptions {
function definePackageConfig(defineOptions: DefineOptions = {}) {
const { overrides = {} } = defineOptions;
const root = process.cwd();
return defineConfig(async () => {
return defineConfig(async ({ mode }) => {
const { dependencies = {}, peerDependencies = {} } = await readPackageJSON(root);
const packageConfig: UserConfig = {
build: {
@@ -33,7 +33,7 @@ function definePackageConfig(defineOptions: DefineOptions = {}) {
}),
],
};
const mergedConfig = mergeConfig(commonConfig, packageConfig);
const mergedConfig = mergeConfig(commonConfig(mode), packageConfig);
return mergeConfig(mergedConfig, overrides);
});

View File

@@ -27,8 +27,8 @@ async function createAppConfigPlugin({
return {
name: PLUGIN_NAME,
async configResolved(_config) {
let appTitle = _config?.env?.VITE_GLOB_APP_TITLE ?? '';
appTitle = appTitle.replace(/\s/g, '_');
const appTitle = _config?.env?.VITE_GLOB_APP_TITLE ?? '';
// appTitle = appTitle.replace(/\s/g, '_').replace(/-/g, '_');
publicPath = _config.base;
source = await getConfigSource(appTitle);
},
@@ -37,7 +37,7 @@ async function createAppConfigPlugin({
const appConfigSrc = `${
publicPath || '/'
}${GLOBAL_CONFIG_FILE_NAME}?v=${version}-${createContentHash(source)}}`;
}${GLOBAL_CONFIG_FILE_NAME}?v=${version}-${createContentHash(source)}`;
return {
html,
@@ -74,7 +74,15 @@ async function createAppConfigPlugin({
* @param env
*/
const getVariableName = (title: string) => {
return `__PRODUCTION__${title || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, '');
function strToHex(str: string) {
const result: string[] = [];
for (let i = 0; i < str.length; ++i) {
const hex = str.charCodeAt(i).toString(16);
result.push(('000' + hex).slice(-4));
}
return result.join('').toUpperCase();
}
return `__PRODUCTION__${strToHex(title) || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, '');
};
async function getConfigSource(appTitle: string) {

View File

@@ -1,7 +1,5 @@
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
// @ts-ignore: type unless
import DefineOptions from 'unplugin-vue-define-options/vite';
import { type PluginOption } from 'vite';
import purgeIcons from 'vite-plugin-purge-icons';
@@ -21,7 +19,7 @@ interface Options {
}
async function createPlugins({ isBuild, root, enableMock, compress, enableAnalyze }: Options) {
const vitePlugins: (PluginOption | PluginOption[])[] = [vue(), vueJsx(), DefineOptions()];
const vitePlugins: (PluginOption | PluginOption[])[] = [vue(), vueJsx()];
const appConfigPlugin = await createAppConfigPlugin({ root, isBuild });
vitePlugins.push(appConfigPlugin);

View File

@@ -22,7 +22,12 @@ function getConfFiles() {
* @param match prefix
* @param confFiles ext
*/
export async function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) {
export async function getEnvConfig(
match = 'VITE_GLOB_',
confFiles = getConfFiles(),
): Promise<{
[key: string]: string;
}> {
let envConfig = {};
for (const confFile of confFiles) {

View File

@@ -4,5 +4,13 @@ function createContentHash(content: string, hashLSize = 12) {
const hash = createHash('sha256').update(content);
return hash.digest('hex').slice(0, hashLSize);
}
function strToHex(str: string) {
const result: string[] = [];
for (let i = 0; i < str.length; ++i) {
const hex = str.charCodeAt(i).toString(16);
result.push(('000' + hex).slice(-4));
}
return result.join('').toUpperCase();
}
export { createContentHash };
export { createContentHash, strToHex };

View File

@@ -2,8 +2,11 @@ import { resolve } from 'node:path';
import { generate } from '@ant-design/colors';
// @ts-ignore: typo
import { getThemeVariables } from 'ant-design-vue/dist/theme';
/* import { getThemeVariables } from 'ant-design-vue/dist/theme'; */
import { theme } from 'ant-design-vue/lib';
import convertLegacyToken from 'ant-design-vue/lib/theme/convertLegacyToken';
const { defaultAlgorithm, defaultSeed } = theme;
const primaryColor = '#0960bd';
function generateAntColors(color: string, theme: 'default' | 'dark' = 'default') {
@@ -18,18 +21,18 @@ function generateAntColors(color: string, theme: 'default' | 'dark' = 'default')
export function generateModifyVars() {
const palettes = generateAntColors(primaryColor);
const primary = palettes[5];
const primaryColorObj: Record<string, string> = {};
for (let index = 0; index < 10; index++) {
primaryColorObj[`primary-${index + 1}`] = palettes[index];
}
const modifyVars = getThemeVariables();
// const modifyVars = getThemeVariables();
const mapToken = defaultAlgorithm(defaultSeed);
const v3Token = convertLegacyToken(mapToken);
return {
...modifyVars,
...v3Token,
// reference: Avoid repeated references
hack: `${modifyVars.hack} @import (reference) "${resolve('src/design/config.less')}";`,
hack: `true; @import (reference) "${resolve('src/design/config.less')}";`,
'primary-color': primary,
...primaryColorObj,
'info-color': primary,
@@ -40,6 +43,5 @@ export function generateModifyVars() {
'font-size-base': '14px', // Main font size
'border-radius-base': '2px', // Component/float fillet
'link-color': primary, // Link color
'app-content-background': '#fafafa', // Link color
};
}

View File

@@ -16,14 +16,14 @@ import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';
// return pre;
// }, [] as any[]);
const modules = import.meta.globEager('./**/*.ts');
const modules = import.meta.glob('./**/*.ts', { eager: true });
const mockModules: any[] = [];
Object.keys(modules).forEach((key) => {
if (key.includes('/_')) {
return;
}
mockModules.push(...modules[key].default);
mockModules.push(...(modules as Recordable)[key].default);
});
/**

View File

@@ -1,5 +1,5 @@
// Interface data format used to return a unified format
import { ResultEnum } from '/@/enums/httpEnum';
import { ResultEnum } from '@/enums/httpEnum';
export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {
return {

View File

@@ -12,6 +12,7 @@ const accountList = (() => {
role: '@first',
createTime: '@datetime',
remark: '@cword(10,20)',
'dept|0-2': 1,
'status|1': ['0', '1'],
});
}

View File

@@ -267,4 +267,4 @@ export default [
return resultSuccess(menu);
},
},
] as MockMethod[];
] as unknown as MockMethod[];

39
nginx.conf Normal file
View File

@@ -0,0 +1,39 @@
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
location / {
root /usr/share/nginx/html/dist;
try_files $uri $uri/ /index.html;
index index.html;
# Enable CORS
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
# docker 改造之后不再需要
# if ($request_filename ~* ^.*?.(html|htm|js)$) {
# add_header Cache-Control no-cache;
# }
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "vben-admin",
"version": "2.10.0",
"version": "2.11.1",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": {
"url": "https://github.com/vbenjs/vue-vben-admin/issues"
@@ -15,12 +15,14 @@
"email": "anncwb@126.com",
"url": "https://github.com/anncwb"
},
"type": "module",
"scripts": {
"bootstrap": "pnpm install",
"build": "cross-env NODE_ENV=production pnpm vite build",
"build:analyze": "pnpm vite build --mode analyze",
"build:no-cache": "pnpm clean:cache && npm run build",
"build:test": "pnpm vite build --mode test",
"build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 pnpm vite build",
"build:analyze": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm vite build --mode analyze",
"build:docker": "vite build --mode docker",
"build:no-cache": "pnpm store prune && npm run build",
"build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm vite build --mode test",
"commit": "czg",
"dev": "pnpm vite",
"preinstall": "npx only-allow pnpm",
@@ -28,7 +30,8 @@
"lint": "turbo run lint",
"lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
"lint:prettier": "prettier --write .",
"lint:stylelint": "stylelint \"**/*.{vue,css,less.scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/",
"lint:stylelint": "stylelint \"**/*.{vue,css,less,scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/",
"log": "conventional-changelog -p angular -i CHANGELOG.md -s",
"prepare": "husky install",
"preview": "npm run build && vite preview",
"reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
@@ -66,89 +69,90 @@
}
},
"dependencies": {
"@ant-design/icons-vue": "^6.1.0",
"@iconify/iconify": "^3.1.0",
"@logicflow/core": "^1.2.1",
"@logicflow/extension": "^1.2.1",
"@ant-design/icons-vue": "^7.0.1",
"@iconify/iconify": "^3.1.1",
"@logicflow/core": "^1.2.26",
"@logicflow/extension": "^1.2.26",
"@vben/hooks": "workspace:*",
"@vue/shared": "^3.2.47",
"@vueuse/core": "^9.13.0",
"@vueuse/shared": "^9.13.0",
"@zxcvbn-ts/core": "^2.2.1",
"ant-design-vue": "^3.2.17",
"axios": "^1.3.5",
"codemirror": "^5.65.12",
"cropperjs": "^1.5.13",
"crypto-js": "^4.1.1",
"dayjs": "^1.11.7",
"echarts": "^5.4.2",
"exceljs": "^4.3.0",
"intro.js": "^7.0.1",
"@vue/shared": "^3.4.23",
"@vueuse/core": "^10.9.0",
"@zxcvbn-ts/core": "^3.0.4",
"ant-design-vue": "^4.1.2",
"axios": "^1.6.8",
"codemirror": "^5.65.16",
"cropperjs": "^1.6.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.10",
"driver.js": "^1.3.1",
"echarts": "^5.5.0",
"exceljs": "^4.4.0",
"lodash-es": "^4.17.21",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.1",
"pinia": "2.0.33",
"path-to-regexp": "^6.2.2",
"pinia": "2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"print-js": "^1.6.0",
"qrcode": "^1.5.1",
"qs": "^6.11.1",
"qrcode": "^1.5.3",
"qs": "^6.12.1",
"resize-observer-polyfill": "^1.5.1",
"showdown": "^2.1.0",
"sortablejs": "^1.15.0",
"tinymce": "^5.10.7",
"vditor": "^3.9.1",
"vue": "^3.2.47",
"vue-i18n": "^9.2.2",
"vue-json-pretty": "^2.2.4",
"vue-router": "^4.1.6",
"vue-types": "^5.0.2",
"sortablejs": "^1.15.2",
"tinymce": "^5.10.9",
"unocss": "^0.59.4",
"vditor": "^3.10.4",
"vue": "^3.4.23",
"vue-i18n": "^9.13.0",
"vue-json-pretty": "^2.4.0",
"vue-router": "^4.3.2",
"vue-types": "^5.1.1",
"vuedraggable": "^4.1.0",
"vxe-table": "^4.3.11",
"vxe-table-plugin-export-xlsx": "^3.0.4",
"xe-utils": "^3.5.7",
"vxe-table": "^4.5.22",
"vxe-table-plugin-export-xlsx": "^4.0.1",
"xe-utils": "^3.5.24",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^17.5.1",
"@commitlint/config-conventional": "^17.4.4",
"@iconify/json": "^2.2.46",
"@purge-icons/generated": "^0.9.0",
"@types/codemirror": "^5.60.7",
"@types/crypto-js": "^4.1.1",
"@types/intro.js": "^5.1.1",
"@types/lodash-es": "^4.17.7",
"@types/mockjs": "^1.0.7",
"@types/nprogress": "^0.2.0",
"@types/qrcode": "^1.5.0",
"@types/qs": "^6.9.7",
"@types/showdown": "^2.0.0",
"@types/sortablejs": "^1.15.1",
"@commitlint/cli": "^19.2.2",
"@commitlint/config-conventional": "^19.2.2",
"@iconify/json": "^2.2.202",
"@purge-icons/generated": "^0.10.0",
"@types/codemirror": "^5.60.15",
"@types/crypto-js": "^4.2.2",
"@types/lodash-es": "^4.17.12",
"@types/mockjs": "^1.0.10",
"@types/nprogress": "^0.2.3",
"@types/qrcode": "^1.5.5",
"@types/qs": "^6.9.15",
"@types/showdown": "^2.0.6",
"@types/sortablejs": "^1.15.8",
"@vben/eslint-config": "workspace:*",
"@vben/stylelint-config": "workspace:*",
"@vben/ts-config": "workspace:*",
"@vben/types": "workspace:*",
"@vben/vite-config": "workspace:*",
"@vue/compiler-sfc": "^3.2.47",
"@vue/test-utils": "^2.3.2",
"@vue/compiler-sfc": "^3.4.23",
"@vue/test-utils": "^2.4.5",
"conventional-changelog-cli": "^4.1.0",
"cross-env": "^7.0.3",
"cz-git": "^1.6.1",
"czg": "^1.6.1",
"husky": "^8.0.3",
"lint-staged": "13.2.0",
"prettier": "^2.8.7",
"prettier-plugin-packagejson": "^2.4.3",
"rimraf": "^4.4.1",
"turbo": "^1.8.8",
"typescript": "^5.0.3",
"unbuild": "^1.2.0",
"unplugin-vue-define-options": "^1.3.3",
"vite": "^4.3.0-beta.2",
"cz-git": "^1.9.1",
"czg": "^1.9.1",
"husky": "^9.0.11",
"lint-staged": "15.2.2",
"prettier": "^3.2.5",
"prettier-plugin-packagejson": "^2.5.0",
"rimraf": "^5.0.5",
"turbo": "^1.13.2",
"typescript": "^5.4.5",
"unbuild": "^2.0.0",
"vite": "^5.2.9",
"vite-plugin-mock": "^2.9.6",
"vue-tsc": "^1.2.0"
"vite-plugin-vue-inspector": "^5.0.0",
"vue-tsc": "^2.0.13"
},
"packageManager": "pnpm@8.1.0",
"packageManager": "pnpm@9.0.4",
"engines": {
"node": ">=16.15.1",
"pnpm": ">=8.1.0"
"node": ">=18.12.0",
"pnpm": ">=9.0.2"
}
}

View File

@@ -12,6 +12,7 @@
},
"license": "MIT",
"sideEffects": false,
"type": "module",
"exports": {
".": {
"default": "./src/index.ts"
@@ -29,8 +30,9 @@
"lint": "pnpm eslint ."
},
"dependencies": {
"@vueuse/core": "^9.13.0",
"vue": "^3.2.47"
"@vueuse/core": "^10.9.0",
"lodash-es": "^4.17.21",
"vue": "^3.4.23"
},
"devDependencies": {
"@vben/types": "workspace:*"

View File

@@ -1,6 +1,7 @@
export * from './onMountedOrActivated';
export * from './useAttrs';
export * from './useRefs';
export * from './useRequest';
export * from './useScrollTo';
export * from './useWindowSizeFn';
export { useTimeoutFn } from '@vueuse/core';

View File

@@ -1,18 +1,18 @@
import type { Ref } from 'vue';
import type { ComponentPublicInstance, Ref } from 'vue';
import { onBeforeUpdate, shallowRef } from 'vue';
function useRefs(): {
refs: Ref<HTMLElement[]>;
setRefs: (index: number) => (el: HTMLElement) => void;
function useRefs<T = HTMLElement>(): {
refs: Ref<T[]>;
setRefs: (index: number) => (el: Element | ComponentPublicInstance | null) => void;
} {
const refs = shallowRef([]) as Ref<HTMLElement[]>;
const refs = shallowRef([]) as Ref<T[]>;
onBeforeUpdate(() => {
refs.value = [];
});
const setRefs = (index: number) => (el: HTMLElement) => {
refs.value[index] = el;
const setRefs = (index: number) => (el: Element | ComponentPublicInstance | null) => {
refs.value[index] = el as T;
};
return {

View File

@@ -0,0 +1,147 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { reactive } from 'vue';
import type { FetchState, PluginReturn, Service, Subscribe, UseRequestOptions } from './types';
import { isFunction } from './utils/isFunction';
export default class Fetch<TData, TParams extends any[]> {
pluginImpls: PluginReturn<TData, TParams>[] = [];
count: number = 0;
state: FetchState<TData, TParams> = reactive({
loading: false,
params: undefined,
data: undefined,
error: undefined,
});
constructor(
public serviceRef: Service<TData, TParams>,
public options: UseRequestOptions<TData, TParams>,
public subscribe: Subscribe,
public initState: Partial<FetchState<TData, TParams>> = {},
) {
this.setState({ loading: !options.manual, ...initState });
}
setState(s: Partial<FetchState<TData, TParams>> = {}) {
Object.assign(this.state, s);
this.subscribe();
}
runPluginHandler(event: keyof PluginReturn<TData, TParams>, ...rest: any[]) {
// @ts-ignore
const r = this.pluginImpls.map((i) => i[event]?.(...rest)).filter(Boolean);
return Object.assign({}, ...r);
}
async runAsync(...params: TParams): Promise<TData> {
this.count += 1;
const currentCount = this.count;
const {
stopNow = false,
returnNow = false,
...state
} = this.runPluginHandler('onBefore', params);
// stop request
if (stopNow) {
return new Promise(() => {});
}
this.setState({
loading: true,
params,
...state,
});
// return now
if (returnNow) {
return Promise.resolve(state.data);
}
this.options.onBefore?.(params);
try {
// replace service
let { servicePromise } = this.runPluginHandler('onRequest', this.serviceRef, params);
if (!servicePromise) {
servicePromise = this.serviceRef(...params);
}
const res = await servicePromise;
if (currentCount !== this.count) {
// prevent run.then when request is canceled
return new Promise(() => {});
}
// const formattedResult = this.options.formatResultRef.current ? this.options.formatResultRef.current(res) : res;
this.setState({ data: res, error: undefined, loading: false });
this.options.onSuccess?.(res, params);
this.runPluginHandler('onSuccess', res, params);
this.options.onFinally?.(params, res, undefined);
if (currentCount === this.count) {
this.runPluginHandler('onFinally', params, res, undefined);
}
return res;
} catch (error) {
if (currentCount !== this.count) {
// prevent run.then when request is canceled
return new Promise(() => {});
}
this.setState({ error, loading: false });
this.options.onError?.(error, params);
this.runPluginHandler('onError', error, params);
this.options.onFinally?.(params, undefined, error);
if (currentCount === this.count) {
this.runPluginHandler('onFinally', params, undefined, error);
}
throw error;
}
}
run(...params: TParams) {
this.runAsync(...params).catch((error) => {
if (!this.options.onError) {
console.error(error);
}
});
}
cancel() {
this.count += 1;
this.setState({ loading: false });
this.runPluginHandler('onCancel');
}
refresh() {
// @ts-ignore
this.run(...(this.state.params || []));
}
refreshAsync() {
// @ts-ignore
return this.runAsync(...(this.state.params || []));
}
mutate(data?: TData | ((oldData?: TData) => TData | undefined)) {
const targetData = isFunction(data) ? data(this.state.data) : data;
this.runPluginHandler('onMutate', targetData);
this.setState({ data: targetData });
}
}

View File

@@ -0,0 +1,30 @@
import useAutoRunPlugin from './plugins/useAutoRunPlugin';
import useCachePlugin from './plugins/useCachePlugin';
import useDebouncePlugin from './plugins/useDebouncePlugin';
import useLoadingDelayPlugin from './plugins/useLoadingDelayPlugin';
import usePollingPlugin from './plugins/usePollingPlugin';
import useRefreshOnWindowFocusPlugin from './plugins/useRefreshOnWindowFocusPlugin';
import useRetryPlugin from './plugins/useRetryPlugin';
import useThrottlePlugin from './plugins/useThrottlePlugin';
import type { Service, UseRequestOptions, UseRequestPlugin } from './types';
import { useRequestImplement } from './useRequestImplement';
export { clearCache } from './utils/cache';
export function useRequest<TData, TParams extends any[]>(
service: Service<TData, TParams>,
options?: UseRequestOptions<TData, TParams>,
plugins?: UseRequestPlugin<TData, TParams>[],
) {
return useRequestImplement<TData, TParams>(service, options, [
...(plugins || []),
useDebouncePlugin,
useLoadingDelayPlugin,
usePollingPlugin,
useRefreshOnWindowFocusPlugin,
useThrottlePlugin,
useAutoRunPlugin,
useCachePlugin,
useRetryPlugin,
] as UseRequestPlugin<TData, TParams>[]);
}

View File

@@ -0,0 +1,52 @@
import { ref, unref, watch } from 'vue';
import type { UseRequestPlugin } from '../types';
// support refreshDeps & ready
const useAutoRunPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ manual, ready = true, defaultParams = [], refreshDeps = [], refreshDepsAction },
) => {
const hasAutoRun = ref(false);
watch(
() => unref(ready),
(readyVal) => {
if (!unref(manual) && readyVal) {
hasAutoRun.value = true;
fetchInstance.run(...defaultParams);
}
},
);
if (refreshDeps.length) {
watch(refreshDeps, () => {
if (hasAutoRun.value) {
return;
}
if (!manual) {
if (refreshDepsAction) {
refreshDepsAction();
} else {
fetchInstance.refresh();
}
}
});
}
return {
onBefore: () => {
if (!unref(ready)) {
return { stopNow: true };
}
},
};
};
useAutoRunPlugin.onInit = ({ ready = true, manual }) => {
return {
loading: !unref(manual) && unref(ready),
};
};
export default useAutoRunPlugin;

View File

@@ -0,0 +1,127 @@
import { onUnmounted, ref, watchEffect } from 'vue';
import type { UseRequestPlugin } from '../types';
import type { CachedData } from '../utils/cache';
import { getCache, setCache } from '../utils/cache';
import { getCachePromise, setCachePromise } from '../utils/cachePromise';
import { subscribe, trigger } from '../utils/cacheSubscribe';
const useCachePlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{
cacheKey,
cacheTime = 5 * 60 * 1000,
staleTime = 0,
setCache: customSetCache,
getCache: customGetCache,
},
) => {
const unSubscribeRef = ref<() => void>();
const currentPromiseRef = ref<Promise<any>>();
const _setCache = (key: string, cachedData: CachedData) => {
customSetCache ? customSetCache(cachedData) : setCache(key, cacheTime, cachedData);
trigger(key, cachedData.data);
};
const _getCache = (key: string, params: any[] = []) => {
return customGetCache ? customGetCache(params) : getCache(key);
};
watchEffect(() => {
if (!cacheKey) return;
// get data from cache when init
const cacheData = _getCache(cacheKey);
if (cacheData && Object.hasOwnProperty.call(cacheData, 'data')) {
fetchInstance.state.data = cacheData.data;
fetchInstance.state.params = cacheData.params;
if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {
fetchInstance.state.loading = false;
}
}
// subscribe same cachekey update, trigger update
unSubscribeRef.value = subscribe(cacheKey, (data) => {
fetchInstance.setState({ data });
});
});
onUnmounted(() => {
unSubscribeRef.value?.();
});
if (!cacheKey) {
return {};
}
return {
onBefore: (params) => {
const cacheData = _getCache(cacheKey, params);
if (!cacheData || !Object.hasOwnProperty.call(cacheData, 'data')) {
return {};
}
// If the data is fresh, stop request
if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {
return {
loading: false,
data: cacheData?.data,
error: undefined,
returnNow: true,
};
} else {
// If the data is stale, return data, and request continue
return { data: cacheData?.data, error: undefined };
}
},
onRequest: (service, args) => {
let servicePromise = getCachePromise(cacheKey);
// If has servicePromise, and is not trigger by self, then use it
if (servicePromise && servicePromise !== currentPromiseRef.value) {
return { servicePromise };
}
servicePromise = service(...args);
currentPromiseRef.value = servicePromise;
setCachePromise(cacheKey, servicePromise);
return { servicePromise };
},
onSuccess: (data, params) => {
if (cacheKey) {
// cancel subscribe, avoid trgger self
unSubscribeRef.value?.();
_setCache(cacheKey, { data, params, time: new Date().getTime() });
// resubscribe
unSubscribeRef.value = subscribe(cacheKey, (d) => {
fetchInstance.setState({ data: d });
});
}
},
onMutate: (data) => {
if (cacheKey) {
// cancel subscribe, avoid trigger self
unSubscribeRef.value?.();
_setCache(cacheKey, {
data,
params: fetchInstance.state.params,
time: new Date().getTime(),
});
// resubscribe
unSubscribeRef.value = subscribe(cacheKey, (d) => {
fetchInstance.setState({ data: d });
});
}
},
};
};
export default useCachePlugin;

View File

@@ -0,0 +1,71 @@
import type { DebouncedFunc, DebounceSettings } from 'lodash-es';
import { debounce } from 'lodash-es';
import { computed, ref, watchEffect } from 'vue';
import type { UseRequestPlugin } from '../types';
const useDebouncePlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ debounceWait, debounceLeading, debounceTrailing, debounceMaxWait },
) => {
const debouncedRef = ref<DebouncedFunc<any>>();
const options = computed(() => {
const ret: DebounceSettings = {};
if (debounceLeading !== undefined) {
ret.leading = debounceLeading;
}
if (debounceTrailing !== undefined) {
ret.trailing = debounceTrailing;
}
if (debounceMaxWait !== undefined) {
ret.maxWait = debounceMaxWait;
}
return ret;
});
watchEffect(() => {
if (debounceWait) {
const _originRunAsync = fetchInstance.runAsync.bind(fetchInstance);
debouncedRef.value = debounce(
(callback) => {
callback();
},
debounceWait,
options.value,
);
// debounce runAsync should be promise
// https://github.com/lodash/lodash/issues/4400#issuecomment-834800398
fetchInstance.runAsync = (...args) => {
return new Promise((resolve, reject) => {
debouncedRef.value?.(() => {
_originRunAsync(...args)
.then(resolve)
.catch(reject);
});
});
};
return () => {
debouncedRef.value?.cancel();
fetchInstance.runAsync = _originRunAsync;
};
}
});
if (!debounceWait) {
return {};
}
return {
onCancel: () => {
debouncedRef.value?.cancel();
},
};
};
export default useDebouncePlugin;

View File

@@ -0,0 +1,45 @@
import { ref, unref } from 'vue';
import type { UseRequestPlugin, UseRequestTimeout } from '../types';
const useLoadingDelayPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ loadingDelay, ready },
) => {
const timerRef = ref<UseRequestTimeout>();
if (!loadingDelay) {
return {};
}
const cancelTimeout = () => {
if (timerRef.value) {
clearTimeout(timerRef.value);
}
};
return {
onBefore: () => {
cancelTimeout();
// Two cases:
// 1. ready === undefined
// 2. ready === true
if (unref(ready) !== false) {
timerRef.value = setTimeout(() => {
fetchInstance.setState({ loading: true });
}, loadingDelay);
}
return { loading: false };
},
onFinally: () => {
cancelTimeout();
},
onCancel: () => {
cancelTimeout();
},
};
};
export default useLoadingDelayPlugin;

View File

@@ -0,0 +1,71 @@
import { ref, watch } from 'vue';
import type { UseRequestPlugin, UseRequestTimeout } from '../types';
import { isDocumentVisible } from '../utils/isDocumentVisible';
import subscribeReVisible from '../utils/subscribeReVisible';
const usePollingPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ pollingInterval, pollingWhenHidden = true, pollingErrorRetryCount = -1 },
) => {
const timerRef = ref<UseRequestTimeout>();
const unsubscribeRef = ref<() => void>();
const countRef = ref<number>(0);
const stopPolling = () => {
if (timerRef.value) {
clearTimeout(timerRef.value);
}
unsubscribeRef.value?.();
};
watch(
() => pollingInterval,
() => {
if (!pollingInterval) {
stopPolling();
}
},
);
if (!pollingInterval) {
return {};
}
return {
onBefore: () => {
stopPolling();
},
onError: () => {
countRef.value += 1;
},
onSuccess: () => {
countRef.value = 0;
},
onFinally: () => {
if (
pollingErrorRetryCount === -1 ||
// When an error occurs, the request is not repeated after pollingErrorRetryCount retries
(pollingErrorRetryCount !== -1 && countRef.value <= pollingErrorRetryCount)
) {
timerRef.value = setTimeout(() => {
// if pollingWhenHidden = false && document is hidden, then stop polling and subscribe revisible
if (!pollingWhenHidden && !isDocumentVisible()) {
unsubscribeRef.value = subscribeReVisible(() => {
fetchInstance.refresh();
});
} else {
fetchInstance.refresh();
}
}, pollingInterval);
} else {
countRef.value = 0;
}
},
onCancel: () => {
stopPolling();
},
};
};
export default usePollingPlugin;

View File

@@ -0,0 +1,37 @@
import { onUnmounted, ref, watchEffect } from 'vue';
import type { UseRequestPlugin } from '../types';
import { limit } from '../utils/limit';
import subscribeFocus from '../utils/subscribeFocus';
const useRefreshOnWindowFocusPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ refreshOnWindowFocus, focusTimespan = 5000 },
) => {
const unsubscribeRef = ref<() => void>();
const stopSubscribe = () => {
unsubscribeRef.value?.();
};
watchEffect(() => {
if (refreshOnWindowFocus) {
const limitRefresh = limit(fetchInstance.refresh.bind(fetchInstance), focusTimespan);
unsubscribeRef.value = subscribeFocus(() => {
limitRefresh();
});
}
return () => {
stopSubscribe();
};
});
onUnmounted(() => {
stopSubscribe();
});
return {};
};
export default useRefreshOnWindowFocusPlugin;

View File

@@ -0,0 +1,54 @@
import { ref } from 'vue';
import type { UseRequestPlugin, UseRequestTimeout } from '../types';
const useRetryPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ retryInterval, retryCount },
) => {
const timerRef = ref<UseRequestTimeout>();
const countRef = ref(0);
const triggerByRetry = ref(false);
if (!retryCount) {
return {};
}
return {
onBefore: () => {
if (!triggerByRetry.value) {
countRef.value = 0;
}
triggerByRetry.value = false;
if (timerRef.value) {
clearTimeout(timerRef.value);
}
},
onSuccess: () => {
countRef.value = 0;
},
onError: () => {
countRef.value += 1;
if (retryCount === -1 || countRef.value <= retryCount) {
// Exponential backoff
const timeout = retryInterval ?? Math.min(1000 * 2 ** countRef.value, 30000);
timerRef.value = setTimeout(() => {
triggerByRetry.value = true;
fetchInstance.refresh();
}, timeout);
} else {
countRef.value = 0;
}
},
onCancel: () => {
countRef.value = 0;
if (timerRef.value) {
clearTimeout(timerRef.value);
}
},
};
};
export default useRetryPlugin;

View File

@@ -0,0 +1,63 @@
import type { DebouncedFunc, ThrottleSettings } from 'lodash-es';
import { throttle } from 'lodash-es';
import { ref, watchEffect } from 'vue';
import type { UseRequestPlugin } from '../types';
const useThrottlePlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ throttleWait, throttleLeading, throttleTrailing },
) => {
const throttledRef = ref<DebouncedFunc<any>>();
const options: ThrottleSettings = {};
if (throttleLeading !== undefined) {
options.leading = throttleLeading;
}
if (throttleTrailing !== undefined) {
options.trailing = throttleTrailing;
}
watchEffect(() => {
if (throttleWait) {
const _originRunAsync = fetchInstance.runAsync.bind(fetchInstance);
throttledRef.value = throttle(
(callback) => {
callback();
},
throttleWait,
options,
);
// throttle runAsync should be promise
// https://github.com/lodash/lodash/issues/4400#issuecomment-834800398
fetchInstance.runAsync = (...args) => {
return new Promise((resolve, reject) => {
throttledRef.value?.(() => {
_originRunAsync(...args)
.then(resolve)
.catch(reject);
});
});
};
return () => {
fetchInstance.runAsync = _originRunAsync;
throttledRef.value?.cancel();
};
}
});
if (!throttleWait) {
return {};
}
return {
onCancel: () => {
throttledRef.value?.cancel();
},
};
};
export default useThrottlePlugin;

View File

@@ -0,0 +1,124 @@
import type { MaybeRef, Ref, WatchSource } from 'vue';
import type Fetch from './Fetch';
import type { CachedData } from './utils/cache';
export type Service<TData, TParams extends any[]> = (...args: TParams) => Promise<TData>;
export type Subscribe = () => void;
// for Fetch
export interface FetchState<TData, TParams extends any[]> {
loading: boolean;
params?: TParams;
data?: TData;
error?: Error;
}
export interface PluginReturn<TData, TParams extends any[]> {
onBefore?: (params: TParams) =>
| ({
stopNow?: boolean;
returnNow?: boolean;
} & Partial<FetchState<TData, TParams>>)
| void;
onRequest?: (
service: Service<TData, TParams>,
params: TParams,
) => {
servicePromise?: Promise<TData>;
};
onSuccess?: (data: TData, params: TParams) => void;
onError?: (e: Error, params: TParams) => void;
onFinally?: (params: TParams, data?: TData, e?: Error) => void;
onCancel?: () => void;
onMutate?: (data: TData) => void;
}
// for useRequestImplement
export interface UseRequestOptions<TData, TParams extends any[]> {
manual?: MaybeRef<boolean>;
onBefore?: (params: TParams) => void;
onSuccess?: (data: TData, params: TParams) => void;
onError?: (e: Error, params: TParams) => void;
// formatResult?: (res: any) => TData;
onFinally?: (params: TParams, data?: TData, e?: Error) => void;
defaultParams?: TParams;
// refreshDeps
refreshDeps?: WatchSource<any>[];
refreshDepsAction?: () => void;
// loading delay
loadingDelay?: number;
// polling
pollingInterval?: number;
pollingWhenHidden?: boolean;
pollingErrorRetryCount?: number;
// refresh on window focus
refreshOnWindowFocus?: boolean;
focusTimespan?: number;
// debounce
debounceWait?: number;
debounceLeading?: boolean;
debounceTrailing?: boolean;
debounceMaxWait?: number;
// throttle
throttleWait?: number;
throttleLeading?: boolean;
throttleTrailing?: boolean;
// cache
cacheKey?: string;
cacheTime?: number;
staleTime?: number;
setCache?: (data: CachedData<TData, TParams>) => void;
getCache?: (params: TParams) => CachedData<TData, TParams> | undefined;
// retry
retryCount?: number;
retryInterval?: number;
// ready
ready?: MaybeRef<boolean>;
// [key: string]: any;
}
export interface UseRequestPlugin<TData, TParams extends any[]> {
// eslint-disable-next-line prettier/prettier
(
fetchInstance: Fetch<TData, TParams>,
options: UseRequestOptions<TData, TParams>,
): PluginReturn<TData, TParams>;
onInit?: (options: UseRequestOptions<TData, TParams>) => Partial<FetchState<TData, TParams>>;
}
// for index
// export type OptionsWithoutFormat<TData, TParams extends any[]> = Omit<Options<TData, TParams>, 'formatResult'>;
// export interface OptionsWithFormat<TData, TParams extends any[], TFormated, TTFormated extends TFormated = any> extends Omit<Options<TTFormated, TParams>, 'formatResult'> {
// formatResult: (res: TData) => TFormated;
// };
export interface UseRequestResult<TData, TParams extends any[]> {
loading: Ref<boolean>;
data: Ref<TData>;
error: Ref<Error>;
params: Ref<TParams | []>;
cancel: Fetch<TData, TParams>['cancel'];
refresh: Fetch<TData, TParams>['refresh'];
refreshAsync: Fetch<TData, TParams>['refreshAsync'];
run: Fetch<TData, TParams>['run'];
runAsync: Fetch<TData, TParams>['runAsync'];
mutate: Fetch<TData, TParams>['mutate'];
}
export type UseRequestTimeout = ReturnType<typeof setTimeout>;

View File

@@ -0,0 +1,49 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { onMounted, onUnmounted, toRefs } from 'vue';
import Fetch from './Fetch';
import type { Service, UseRequestOptions, UseRequestPlugin, UseRequestResult } from './types';
export function useRequestImplement<TData, TParams extends any[]>(
service: Service<TData, TParams>,
options: UseRequestOptions<TData, TParams> = {},
plugins: UseRequestPlugin<TData, TParams>[] = [],
) {
const { manual = false, ...rest } = options;
const fetchOptions = { manual, ...rest };
const initState = plugins.map((p) => p?.onInit?.(fetchOptions)).filter(Boolean);
const fetchInstance = new Fetch<TData, TParams>(
service,
fetchOptions,
() => {},
Object.assign({}, ...initState),
);
fetchInstance.options = fetchOptions;
// run all plugins hooks
fetchInstance.pluginImpls = plugins.map((p) => p(fetchInstance, fetchOptions));
onMounted(() => {
if (!manual) {
const params = fetchInstance.state.params || options.defaultParams || [];
// @ts-ignore
fetchInstance.run(...params);
}
});
onUnmounted(() => {
fetchInstance.cancel();
});
return {
...toRefs(fetchInstance.state),
cancel: fetchInstance.cancel.bind(fetchInstance),
mutate: fetchInstance.mutate.bind(fetchInstance),
refresh: fetchInstance.refresh.bind(fetchInstance),
refreshAsync: fetchInstance.refreshAsync.bind(fetchInstance),
run: fetchInstance.run.bind(fetchInstance),
runAsync: fetchInstance.runAsync.bind(fetchInstance),
} as UseRequestResult<TData, TParams>;
}

View File

@@ -0,0 +1,48 @@
type Timer = ReturnType<typeof setTimeout>;
type CachedKey = string | number;
export interface CachedData<TData = any, TParams = any> {
data: TData;
params: TParams;
time: number;
}
interface RecordData extends CachedData {
timer: Timer | undefined;
}
const cache = new Map<CachedKey, RecordData>();
export const setCache = (key: CachedKey, cacheTime: number, cachedData: CachedData) => {
const currentCache = cache.get(key);
if (currentCache?.timer) {
clearTimeout(currentCache.timer);
}
let timer: Timer | undefined = undefined;
if (cacheTime > -1) {
// if cache out, clear it
timer = setTimeout(() => {
cache.delete(key);
}, cacheTime);
}
cache.set(key, {
...cachedData,
timer,
});
};
export const getCache = (key: CachedKey) => {
return cache.get(key);
};
export const clearCache = (key?: string | string[]) => {
if (key) {
const cacheKeys = Array.isArray(key) ? key : [key];
cacheKeys.forEach((cacheKey) => cache.delete(cacheKey));
} else {
cache.clear();
}
};

View File

@@ -0,0 +1,23 @@
type CachedKey = string | number;
const cachePromise = new Map<CachedKey, Promise<any>>();
export const getCachePromise = (cacheKey: CachedKey) => {
return cachePromise.get(cacheKey);
};
export const setCachePromise = (cacheKey: CachedKey, promise: Promise<any>) => {
// Should cache the same promise, cannot be promise.finally
// Because the promise.finally will change the reference of the promise
cachePromise.set(cacheKey, promise);
// no use promise.finally for compatibility
promise
.then((res) => {
cachePromise.delete(cacheKey);
return res;
})
.catch(() => {
cachePromise.delete(cacheKey);
});
};

View File

@@ -0,0 +1,22 @@
type Listener = (data: any) => void;
const listeners: Record<string, Listener[]> = {};
export const trigger = (key: string, data: any) => {
if (listeners[key]) {
listeners[key].forEach((item) => item(data));
}
};
export const subscribe = (key: string, listener: Listener) => {
if (!listeners[key]) {
listeners[key] = [];
}
listeners[key].push(listener);
return function unsubscribe() {
const index = listeners[key].indexOf(listener);
listeners[key].splice(index, 1);
};
};

View File

@@ -0,0 +1,5 @@
export const isBrowser = !!(
typeof window !== 'undefined' &&
window.document &&
window.document.createElement
);

View File

@@ -0,0 +1,8 @@
import { isBrowser } from './isBrowser';
export function isDocumentVisible(): boolean {
if (isBrowser) {
return document.visibilityState !== 'hidden';
}
return true;
}

View File

@@ -0,0 +1,2 @@
export const isFunction = (value: unknown): value is (...args: any) => any =>
typeof value === 'function';

View File

@@ -0,0 +1,8 @@
import { isBrowser } from './isBrowser';
export function isOnline(): boolean {
if (isBrowser && typeof navigator.onLine !== 'undefined') {
return navigator.onLine;
}
return true;
}

View File

@@ -0,0 +1,12 @@
export function limit(fn: any, timespan: number) {
let pending = false;
return (...args: any[]) => {
if (pending) return;
pending = true;
fn(...args);
setTimeout(() => {
pending = false;
}, timespan);
};
}

View File

@@ -0,0 +1,30 @@
import { isBrowser } from './isBrowser';
import { isDocumentVisible } from './isDocumentVisible';
import { isOnline } from './isOnline';
type Listener = () => void;
const listeners: Listener[] = [];
if (isBrowser) {
const revalidate = () => {
if (!isDocumentVisible() || !isOnline()) return;
for (let i = 0; i < listeners.length; i++) {
const listener = listeners[i];
listener();
}
};
window.addEventListener('visibilitychange', revalidate, false);
window.addEventListener('focus', revalidate, false);
}
export default function subscribe(listener: Listener) {
listeners.push(listener);
return function unsubscribe() {
const index = listeners.indexOf(listener);
if (index > -1) {
listeners.splice(index, 1);
}
};
}

View File

@@ -0,0 +1,25 @@
import { isBrowser } from './isBrowser';
import { isDocumentVisible } from './isDocumentVisible';
type Listener = () => void;
const listeners: Listener[] = [];
if (isBrowser) {
const revalidate = () => {
if (!isDocumentVisible()) return;
for (let i = 0; i < listeners.length; i++) {
const listener = listeners[i];
listener();
}
};
window.addEventListener('visibilitychange', revalidate, false);
}
export default function subscribe(listener: Listener) {
listeners.push(listener);
return function unsubscribe() {
const index = listeners.indexOf(listener);
listeners.splice(index, 1);
};
}

View File

@@ -12,6 +12,7 @@
},
"license": "MIT",
"sideEffects": false,
"type": "module",
"exports": {
".": {
"default": "./src/index.ts"

View File

@@ -26,7 +26,7 @@ type NonNullable<T> = T extends null | undefined ? never : T;
/**
* 字符串类型对象
*/
type Recordable<T> = Record<string, T>;
type Recordable<T = any> = Record<string, T>;
/**
* 字符串类型对象(只读)

18614
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
<template>
<ConfigProvider :locale="getAntdLocale">
<ConfigProvider :locale="getAntdLocale" :theme="themeConfig">
<AppProvider>
<RouterView />
</AppProvider>
@@ -7,15 +7,34 @@
</template>
<script lang="ts" setup>
import { ConfigProvider } from 'ant-design-vue';
import { AppProvider } from '@/components/Application';
import { useTitle } from '@/hooks/web/useTitle';
import { useLocale } from '@/locales/useLocale';
import { ConfigProvider } from 'ant-design-vue';
import { useDarkModeTheme } from '@/hooks/setting/useDarkModeTheme';
import 'dayjs/locale/zh-cn';
import { computed } from 'vue';
// support Multi-language
const { getAntdLocale } = useLocale();
const { isDark, darkTheme } = useDarkModeTheme();
const themeConfig = computed(() =>
Object.assign(
{
token: {
colorPrimary: '#0960bd',
colorSuccess: '#55D187',
colorWarning: '#EFBD47',
colorError: '#ED6F6F',
colorInfo: '#0960bd',
},
},
isDark.value ? darkTheme : {},
),
);
// Listening to page changes and dynamically changing site titles
useTitle();
</script>

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
import { GetAccountInfoModel } from './model/accountModel';
enum Api {

View File

@@ -1,9 +1,9 @@
import { defHttp } from '/@/utils/http/axios';
import { AreaModel, AreaParams } from '/@/api/demo/model/areaModel';
import { defHttp } from '@/utils/http/axios';
import { AreaModel, AreaParams } from '@/api/demo/model/areaModel';
enum Api {
AREA_RECORD = '/cascader/getAreaRecord',
}
export const areaRecord = (data: AreaParams) =>
defHttp.post<AreaModel>({ url: Api.AREA_RECORD, data });
defHttp.post<AreaModel[]>({ url: Api.AREA_RECORD, data });

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
enum Api {
// The address does not exist

View File

@@ -1,8 +1,8 @@
import { BasicFetchResult } from '/@/api/model/baseModel';
import { BasicFetchResult } from '@/api/model/baseModel';
export interface DemoOptionsItem {
label: string;
value: string;
name: string;
id: string;
}
export interface selectParams {

View File

@@ -1,8 +1,9 @@
import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel';
export type AccountParams = BasicPageParams & {
account?: string;
nickname?: string;
[key: string]: any;
};
export type RoleParams = {

View File

@@ -1,8 +1,8 @@
import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel';
/**
* @description: Request list interface parameters
*/
export type DemoParams = BasicPageParams;
export type DemoParams = Partial<BasicPageParams>;
export interface DemoListItem {
id: string;

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
import { DemoOptionsItem, selectParams } from './model/optionsModel';
enum Api {

View File

@@ -10,7 +10,7 @@ import {
RolePageListGetResultModel,
RoleListGetResultModel,
} from './model/systemModel';
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
enum Api {
AccountList = '/system/getAccountList',

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
import { DemoParams, DemoListGetResultModel } from './model/tableModel';
enum Api {

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
enum Api {
TREE_OPTIONS_LIST = '/tree/getDemoOptions',

View File

@@ -1,4 +1,4 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
import { getMenuListResultModel } from './model/menuModel';
enum Api {

View File

@@ -17,7 +17,7 @@ export interface RoleInfo {
export interface LoginResultModel {
userId: string | number;
token: string;
role: RoleInfo;
roles: RoleInfo[];
}
/**

View File

@@ -1,7 +1,8 @@
import { UploadApiResult } from './model/uploadModel';
import { defHttp } from '/@/utils/http/axios';
import { UploadFileParams } from '/#/axios';
import { useGlobSetting } from '/@/hooks/setting';
import { defHttp } from '@/utils/http/axios';
import { UploadFileParams } from '#/axios';
import { useGlobSetting } from '@/hooks/setting';
import { AxiosProgressEvent } from 'axios';
const { uploadUrl = '' } = useGlobSetting();
@@ -10,7 +11,7 @@ const { uploadUrl = '' } = useGlobSetting();
*/
export function uploadApi(
params: UploadFileParams,
onUploadProgress: (progressEvent: ProgressEvent) => void,
onUploadProgress: (progressEvent: AxiosProgressEvent) => void,
) {
return defHttp.uploadFile<UploadApiResult>(
{

View File

@@ -1,7 +1,7 @@
import { defHttp } from '/@/utils/http/axios';
import { defHttp } from '@/utils/http/axios';
import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel';
import { ErrorMessageMode } from '/#/axios';
import { ErrorMessageMode } from '#/axios';
enum Api {
Login = '/login',

View File

@@ -1,10 +1,10 @@
import { withInstall } from '/@/utils';
import { withInstall } from '@/utils';
import appLogo from './src/AppLogo.vue';
import appProvider from './src/AppProvider.vue';
import appSearch from './src/search/AppSearch.vue';
import appLocalePicker from './src/AppLocalePicker.vue';
// import appDarkModeToggle from './src/AppDarkModeToggle.vue';
import appDarkModeToggle from './src/AppDarkModeToggle.vue';
export { useAppProviderContext } from './src/useAppContext';
@@ -12,4 +12,4 @@ export const AppLogo = withInstall(appLogo);
export const AppProvider = withInstall(appProvider);
export const AppSearch = withInstall(appSearch);
export const AppLocalePicker = withInstall(appLocalePicker);
// export const AppDarkModeToggle = withInstall(appDarkModeToggle);
export const AppDarkModeToggle = withInstall(appDarkModeToggle);

View File

@@ -7,12 +7,12 @@
</template>
<script lang="ts" setup>
import { computed, unref } from 'vue';
import { SvgIcon } from '/@/components/Icon';
import { useDesign } from '/@/hooks/web/useDesign';
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
import { updateDarkTheme } from '/@/logics/theme/dark';
import { ThemeEnum } from '/@/enums/appEnum';
import { SvgIcon } from '@/components/Icon';
import { ThemeEnum } from '@/enums/appEnum';
import { useRootSetting } from '@/hooks/setting/useRootSetting';
import { useDesign } from '@/hooks/web/useDesign';
import { updateDarkTheme } from '@/logics/theme/dark';
import { updateHeaderBgColor, updateSidebarBgColor } from '@/logics/theme/updateBackground';
const { prefixCls } = useDesign('dark-switch');
const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();
@@ -61,7 +61,9 @@
z-index: 1;
width: 18px;
height: 18px;
transition: transform 0.5s, background-color 0.5s;
transition:
transform 0.5s,
background-color 0.5s;
border-radius: 50%;
background-color: #fff;
will-change: transform;

View File

@@ -18,13 +18,13 @@
</Dropdown>
</template>
<script lang="ts" setup>
import type { LocaleType } from '/#/config';
import type { DropMenu } from '/@/components/Dropdown';
import type { LocaleType } from '#/config';
import type { DropMenu } from '@/components/Dropdown';
import { ref, watchEffect, unref, computed } from 'vue';
import { Dropdown } from '/@/components/Dropdown';
import { Dropdown } from '@/components/Dropdown';
import Icon from '@/components/Icon/Icon.vue';
import { useLocale } from '/@/locales/useLocale';
import { localeList } from '/@/settings/localeSetting';
import { useLocale } from '@/locales/useLocale';
import { localeList } from '@/settings/localeSetting';
const props = defineProps({
/**

View File

@@ -12,12 +12,12 @@
</template>
<script lang="ts" setup>
import { computed, unref } from 'vue';
import { useGlobSetting } from '/@/hooks/setting';
import { useGo } from '/@/hooks/web/usePage';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useDesign } from '/@/hooks/web/useDesign';
import { PageEnum } from '/@/enums/pageEnum';
import { useUserStore } from '/@/store/modules/user';
import { useGlobSetting } from '@/hooks/setting';
import { useGo } from '@/hooks/web/usePage';
import { useMenuSetting } from '@/hooks/setting/useMenuSetting';
import { useDesign } from '@/hooks/web/useDesign';
import { PageEnum } from '@/enums/pageEnum';
import { useUserStore } from '@/store/modules/user';
const props = defineProps({
/**

View File

@@ -1,10 +1,10 @@
<script lang="ts">
import { defineComponent, toRefs, ref, unref } from 'vue';
import { createAppProviderContext } from './useAppContext';
import { createBreakpointListen } from '/@/hooks/event/useBreakpoint';
import { prefixCls } from '/@/settings/designSetting';
import { useAppStore } from '/@/store/modules/app';
import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
import { createBreakpointListen } from '@/hooks/event/useBreakpoint';
import { prefixCls } from '@/settings/designSetting';
import { useAppStore } from '@/store/modules/app';
import { MenuModeEnum, MenuTypeEnum } from '@/enums/menuEnum';
const props = {
/**

View File

@@ -3,7 +3,7 @@
import { Tooltip } from 'ant-design-vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import AppSearchModal from './AppSearchModal.vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { useI18n } from '@/hooks/web/useI18n';
export default defineComponent({
name: 'AppSearch',

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