Commit 893b6cf4f235a2cb54e1b2c940a8b28b722d6b69

Authored by 芋道源码
Committed by Gitee
2 parents b5e0b168 1bb1da58

!338 vue3 重构头像上传

Merge pull request !338 from xingyu/dev
README.md
@@ -169,21 +169,21 @@ ps:核心功能已经实现,正在对接微信小程序中... @@ -169,21 +169,21 @@ ps:核心功能已经实现,正在对接微信小程序中...
169 169
170 ## 🐨 技术栈 170 ## 🐨 技术栈
171 171
172 -| 项目 | 说明 |  
173 -|-----------------------|--------------------|  
174 -| `yudao-dependencies` | Maven 依赖版本管理 |  
175 -| `yudao-framework` | Java 框架拓展 |  
176 -| `yudao-server` | 管理后台 + 用户 APP 的服务端 |  
177 -| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |  
178 -| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |  
179 -| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |  
180 -| `yudao-ui-app` | 用户 APP 的 UI 界面 |  
181 -| `yudao-module-system` | 系统功能的 Module 模块 |  
182 -| `yudao-module-member` | 会员中心的 Module 模块 |  
183 -| `yudao-module-infra` | 基础设施的 Module 模块 |  
184 -| `yudao-module-tool` | 研发工具的 Module 模块 |  
185 -| `yudao-module-bpm` | 工作流程的 Module 模块 |  
186 -| `yudao-module-pay` | 支付系统的 Module 模块 | 172 +| 项目 | 说明 |
  173 +|-------------------------|-----------------------|
  174 +| `yudao-dependencies` | Maven 依赖版本管理 |
  175 +| `yudao-framework` | Java 框架拓展 |
  176 +| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
  177 +| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |
  178 +| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |
  179 +| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |
  180 +| `yudao-ui-app` | 用户 APP 的 UI 界面 |
  181 +| `yudao-module-system` | 系统功能的 Module 模块 |
  182 +| `yudao-module-member` | 会员中心的 Module 模块 |
  183 +| `yudao-module-infra` | 基础设施的 Module 模块 |
  184 +| `yudao-module-tool` | 研发工具的 Module 模块 |
  185 +| `yudao-module-bpm` | 工作流程的 Module 模块 |
  186 +| `yudao-module-pay` | 支付系统的 Module 模块 |
187 187
188 ### 后端 188 ### 后端
189 189
@@ -223,7 +223,7 @@ ps:核心功能已经实现,正在对接微信小程序中... @@ -223,7 +223,7 @@ ps:核心功能已经实现,正在对接微信小程序中...
223 | 框架 | 说明 | 版本 | 223 | 框架 | 说明 | 版本 |
224 |----------------------------------------------------------------------|:------------:|:------:| 224 |----------------------------------------------------------------------|:------------:|:------:|
225 | [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.2.45 | 225 | [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.2.45 |
226 -| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.2 | 226 +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.3 |
227 | [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 | 227 | [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 |
228 | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 | 228 | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 |
229 | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 | 229 | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 |
@@ -242,15 +242,15 @@ ps:核心功能已经实现,正在对接微信小程序中... @@ -242,15 +242,15 @@ ps:核心功能已经实现,正在对接微信小程序中...
242 ### 系统功能 242 ### 系统功能
243 243
244 | 模块 | biu | biu | biu | 244 | 模块 | biu | biu | biu |
245 -|----------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------| 245 +|------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|
246 | 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) | 246 | 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) |
247 -| 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) | 247 +| 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) |
248 | 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - | 248 | 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - |
249 | 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - | 249 | 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - |
250 | 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - | 250 | 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - |
251 | 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - | 251 | 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - |
252 | 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) | 252 | 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) |
253 -| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) | 253 +| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) |
254 | 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - | 254 | 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - |
255 255
256 ### 工作流程 256 ### 工作流程
yudao-ui-admin-vue3/README.md
1 -<h1>🌈 yudao-ui-admin-vue3</h1>  
2 -  
3 -<p align="center">  
4 - <img src="https://img.shields.io/badge/-Vue3.2-34495e?logo=vue.j" />  
5 - <img src="https://img.shields.io/badge/-Vite4-646cff?logo=vite&logoColor=white" />  
6 - <img src="https://img.shields.io/badge/-TypeScript4.9-blue?logo=typescript&logoColor=white" />  
7 - <img src="https://img.shields.io/badge/-Pinia2-yellow?logo=picpay&logoColor=white" />  
8 - <img src="https://img.shields.io/badge/-ESLint-4b32c3?logo=eslint&logoColor=white" />  
9 - <img src="https://img.shields.io/badge/-pnpm7-F69220?logo=pnpm&logoColor=white" />  
10 - <img src="https://img.shields.io/badge/-Axios-008fc7?logo=axios.js&logoColor=white" /> 1 +# 🌈 yudao-ui-admin-vue3 #
  2 +
  3 +<p style="text-align: center">
  4 + <img src="https://img.shields.io/badge/-Vue3.2-34495e?logo=vue.j" alt="vue" />
  5 + <img src="https://img.shields.io/badge/-Vite4-646cff?logo=vite&logoColor=white" alt="vite" />
  6 + <img src="https://img.shields.io/badge/-TypeScript4.9-blue?logo=typescript&logoColor=white" alt="typescript" />
  7 + <img src="https://img.shields.io/badge/-Pinia2-yellow?logo=picpay&logoColor=white" alt="Pinia2" />
  8 + <img src="https://img.shields.io/badge/-ESLint-4b32c3?logo=eslint&logoColor=white" alt="eslint" />
  9 + <img src="https://img.shields.io/badge/-pnpm7-F69220?logo=pnpm&logoColor=white" alt="pnpm" />
11 <img src="https://img.shields.io/badge/-Prettier-ef9421?logo=Prettier&logoColor=white" alt="Prettier"> 10 <img src="https://img.shields.io/badge/-Prettier-ef9421?logo=Prettier&logoColor=white" alt="Prettier">
12 <img src="https://img.shields.io/badge/-Sass-1D365D?logo=Sass&logoColor=white" alt="Sass"> 11 <img src="https://img.shields.io/badge/-Sass-1D365D?logo=Sass&logoColor=white" alt="Sass">
13 - <img src="https://img.shields.io/badge/-Wind%20CSS-06B6D4?logo=Tailwind%20CSS&logoColor=white" alt="Taiwind"> 12 + <img src="https://img.shields.io/badge/-Wind%20CSS-06B6D4?logo=Tailwind%20CSS&logoColor=white" alt="WindCSS">
14 </p> 13 </p>
15 14
16 ## 介绍 15 ## 介绍
@@ -30,11 +29,11 @@ @@ -30,11 +29,11 @@
30 | 框架 | 说明 | 版本 | 29 | 框架 | 说明 | 版本 |
31 | --- | --- | --- | 30 | --- | --- | --- |
32 | [Vue](https://staging-cn.vuejs.org/) | vue 框架 | 3.2.45 | 31 | [Vue](https://staging-cn.vuejs.org/) | vue 框架 | 3.2.45 |
33 -| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.2 | 32 +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.3 |
34 | [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 | 33 | [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 |
35 | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 | 34 | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 |
36 | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 | 35 | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 |
37 -| [vueuse](https://vueuse.org/) | 常用工具集 | 9.6.0 | 36 +| [vueuse](https://vueuse.org/) | 常用工具集 | 9.8.2 |
38 | [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.7 | 37 | [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.7 |
39 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | 38 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 |
40 | [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 | 39 | [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 |
yudao-ui-admin-vue3/package.json
1 { 1 {
2 "name": "yudao-ui-admin-vue3", 2 "name": "yudao-ui-admin-vue3",
3 - "version": "1.6.5.1877", 3 + "version": "1.6.5.1878",
4 "description": "基于vue3、vite4、element-plus、typesScript", 4 "description": "基于vue3、vite4、element-plus、typesScript",
5 "author": "xingyu", 5 "author": "xingyu",
6 "private": false, 6 "private": false,
@@ -25,12 +25,13 @@ @@ -25,12 +25,13 @@
25 }, 25 },
26 "dependencies": { 26 "dependencies": {
27 "@iconify/iconify": "^3.0.1", 27 "@iconify/iconify": "^3.0.1",
28 - "@vueuse/core": "^9.7.0", 28 + "@vueuse/core": "^9.8.2",
29 "@wangeditor/editor": "^5.1.23", 29 "@wangeditor/editor": "^5.1.23",
30 "@wangeditor/editor-for-vue": "^5.1.10", 30 "@wangeditor/editor-for-vue": "^5.1.10",
31 "@zxcvbn-ts/core": "^2.1.0", 31 "@zxcvbn-ts/core": "^2.1.0",
32 "animate.css": "^4.1.1", 32 "animate.css": "^4.1.1",
33 "axios": "^1.2.1", 33 "axios": "^1.2.1",
  34 + "cropperjs": "^1.5.13",
34 "crypto-js": "^4.1.1", 35 "crypto-js": "^4.1.1",
35 "dayjs": "^1.11.7", 36 "dayjs": "^1.11.7",
36 "echarts": "^5.4.1", 37 "echarts": "^5.4.1",
@@ -46,10 +47,9 @@ @@ -46,10 +47,9 @@
46 "qs": "^6.11.0", 47 "qs": "^6.11.0",
47 "url": "^0.11.0", 48 "url": "^0.11.0",
48 "vue": "3.2.45", 49 "vue": "3.2.45",
49 - "vue-cropper": "^1.0.3",  
50 "vue-i18n": "9.2.2", 50 "vue-i18n": "9.2.2",
51 "vue-router": "^4.1.6", 51 "vue-router": "^4.1.6",
52 - "vue-types": "^5.0.1", 52 + "vue-types": "^5.0.2",
53 "vxe-table": "^4.3.7", 53 "vxe-table": "^4.3.7",
54 "web-storage-cache": "^1.1.1", 54 "web-storage-cache": "^1.1.1",
55 "xe-utils": "^3.5.7" 55 "xe-utils": "^3.5.7"
@@ -57,7 +57,7 @@ @@ -57,7 +57,7 @@
57 "devDependencies": { 57 "devDependencies": {
58 "@commitlint/cli": "^17.3.0", 58 "@commitlint/cli": "^17.3.0",
59 "@commitlint/config-conventional": "^17.3.0", 59 "@commitlint/config-conventional": "^17.3.0",
60 - "@iconify/json": "^2.1.154", 60 + "@iconify/json": "^2.1.155",
61 "@intlify/unplugin-vue-i18n": "^0.8.1", 61 "@intlify/unplugin-vue-i18n": "^0.8.1",
62 "@purge-icons/generated": "^0.9.0", 62 "@purge-icons/generated": "^0.9.0",
63 "@types/intro.js": "^5.1.0", 63 "@types/intro.js": "^5.1.0",
@@ -84,7 +84,7 @@ @@ -84,7 +84,7 @@
84 "postcss-scss": "^4.0.6", 84 "postcss-scss": "^4.0.6",
85 "prettier": "^2.8.1", 85 "prettier": "^2.8.1",
86 "rimraf": "^3.0.2", 86 "rimraf": "^3.0.2",
87 - "rollup": "^3.7.5", 87 + "rollup": "^3.8.0",
88 "sass": "^1.57.1", 88 "sass": "^1.57.1",
89 "stylelint": "^14.16.0", 89 "stylelint": "^14.16.0",
90 "stylelint-config-html": "^1.1.0", 90 "stylelint-config-html": "^1.1.0",
@@ -94,7 +94,7 @@ @@ -94,7 +94,7 @@
94 "stylelint-order": "^5.0.0", 94 "stylelint-order": "^5.0.0",
95 "terser": "^5.16.1", 95 "terser": "^5.16.1",
96 "typescript": "4.9.4", 96 "typescript": "4.9.4",
97 - "vite": "4.0.2", 97 + "vite": "4.0.3",
98 "vite-plugin-compression": "^0.5.1", 98 "vite-plugin-compression": "^0.5.1",
99 "vite-plugin-ejs": "^1.6.4", 99 "vite-plugin-ejs": "^1.6.4",
100 "vite-plugin-eslint": "^1.8.1", 100 "vite-plugin-eslint": "^1.8.1",
@@ -104,7 +104,7 @@ @@ -104,7 +104,7 @@
104 "vite-plugin-svg-icons": "^2.0.1", 104 "vite-plugin-svg-icons": "^2.0.1",
105 "vite-plugin-vue-setup-extend": "^0.4.0", 105 "vite-plugin-vue-setup-extend": "^0.4.0",
106 "vite-plugin-windicss": "^1.8.10", 106 "vite-plugin-windicss": "^1.8.10",
107 - "vue-tsc": "^1.0.14", 107 + "vue-tsc": "^1.0.16",
108 "windicss": "^3.5.6" 108 "windicss": "^3.5.6"
109 }, 109 },
110 "engines": { 110 "engines": {
yudao-ui-admin-vue3/pnpm-lock.yaml
@@ -4,7 +4,7 @@ specifiers: @@ -4,7 +4,7 @@ specifiers:
4 '@commitlint/cli': ^17.3.0 4 '@commitlint/cli': ^17.3.0
5 '@commitlint/config-conventional': ^17.3.0 5 '@commitlint/config-conventional': ^17.3.0
6 '@iconify/iconify': ^3.0.1 6 '@iconify/iconify': ^3.0.1
7 - '@iconify/json': ^2.1.154 7 + '@iconify/json': ^2.1.155
8 '@intlify/unplugin-vue-i18n': ^0.8.1 8 '@intlify/unplugin-vue-i18n': ^0.8.1
9 '@purge-icons/generated': ^0.9.0 9 '@purge-icons/generated': ^0.9.0
10 '@types/intro.js': ^5.1.0 10 '@types/intro.js': ^5.1.0
@@ -18,7 +18,7 @@ specifiers: @@ -18,7 +18,7 @@ specifiers:
18 '@vitejs/plugin-legacy': ^3.0.1 18 '@vitejs/plugin-legacy': ^3.0.1
19 '@vitejs/plugin-vue': ^4.0.0 19 '@vitejs/plugin-vue': ^4.0.0
20 '@vitejs/plugin-vue-jsx': ^3.0.0 20 '@vitejs/plugin-vue-jsx': ^3.0.0
21 - '@vueuse/core': ^9.7.0 21 + '@vueuse/core': ^9.8.2
22 '@wangeditor/editor': ^5.1.23 22 '@wangeditor/editor': ^5.1.23
23 '@wangeditor/editor-for-vue': ^5.1.10 23 '@wangeditor/editor-for-vue': ^5.1.10
24 '@zxcvbn-ts/core': ^2.1.0 24 '@zxcvbn-ts/core': ^2.1.0
@@ -26,6 +26,7 @@ specifiers: @@ -26,6 +26,7 @@ specifiers:
26 autoprefixer: ^10.4.13 26 autoprefixer: ^10.4.13
27 axios: ^1.2.1 27 axios: ^1.2.1
28 consola: ^2.15.3 28 consola: ^2.15.3
  29 + cropperjs: ^1.5.13
29 crypto-js: ^4.1.1 30 crypto-js: ^4.1.1
30 dayjs: ^1.11.7 31 dayjs: ^1.11.7
31 echarts: ^5.4.1 32 echarts: ^5.4.1
@@ -50,7 +51,7 @@ specifiers: @@ -50,7 +51,7 @@ specifiers:
50 qrcode: ^1.5.1 51 qrcode: ^1.5.1
51 qs: ^6.11.0 52 qs: ^6.11.0
52 rimraf: ^3.0.2 53 rimraf: ^3.0.2
53 - rollup: ^3.7.5 54 + rollup: ^3.8.0
54 sass: ^1.57.1 55 sass: ^1.57.1
55 stylelint: ^14.16.0 56 stylelint: ^14.16.0
56 stylelint-config-html: ^1.1.0 57 stylelint-config-html: ^1.1.0
@@ -61,7 +62,7 @@ specifiers: @@ -61,7 +62,7 @@ specifiers:
61 terser: ^5.16.1 62 terser: ^5.16.1
62 typescript: 4.9.4 63 typescript: 4.9.4
63 url: ^0.11.0 64 url: ^0.11.0
64 - vite: 4.0.2 65 + vite: 4.0.3
65 vite-plugin-compression: ^0.5.1 66 vite-plugin-compression: ^0.5.1
66 vite-plugin-ejs: ^1.6.4 67 vite-plugin-ejs: ^1.6.4
67 vite-plugin-eslint: ^1.8.1 68 vite-plugin-eslint: ^1.8.1
@@ -72,11 +73,10 @@ specifiers: @@ -72,11 +73,10 @@ specifiers:
72 vite-plugin-vue-setup-extend: ^0.4.0 73 vite-plugin-vue-setup-extend: ^0.4.0
73 vite-plugin-windicss: ^1.8.10 74 vite-plugin-windicss: ^1.8.10
74 vue: 3.2.45 75 vue: 3.2.45
75 - vue-cropper: ^1.0.3  
76 vue-i18n: 9.2.2 76 vue-i18n: 9.2.2
77 vue-router: ^4.1.6 77 vue-router: ^4.1.6
78 - vue-tsc: ^1.0.14  
79 - vue-types: ^5.0.1 78 + vue-tsc: ^1.0.16
  79 + vue-types: ^5.0.2
80 vxe-table: ^4.3.7 80 vxe-table: ^4.3.7
81 web-storage-cache: ^1.1.1 81 web-storage-cache: ^1.1.1
82 windicss: ^3.5.6 82 windicss: ^3.5.6
@@ -84,12 +84,13 @@ specifiers: @@ -84,12 +84,13 @@ specifiers:
84 84
85 dependencies: 85 dependencies:
86 '@iconify/iconify': 3.0.1 86 '@iconify/iconify': 3.0.1
87 - '@vueuse/core': 9.7.0_vue@3.2.45 87 + '@vueuse/core': 9.8.2_vue@3.2.45
88 '@wangeditor/editor': 5.1.23 88 '@wangeditor/editor': 5.1.23
89 '@wangeditor/editor-for-vue': 5.1.12_3apfu3xbp6awzuex7ed3sbrv6y 89 '@wangeditor/editor-for-vue': 5.1.12_3apfu3xbp6awzuex7ed3sbrv6y
90 '@zxcvbn-ts/core': 2.1.0 90 '@zxcvbn-ts/core': 2.1.0
91 animate.css: 4.1.1 91 animate.css: 4.1.1
92 axios: 1.2.1 92 axios: 1.2.1
  93 + cropperjs: 1.5.13
93 crypto-js: 4.1.1 94 crypto-js: 4.1.1
94 dayjs: 1.11.7 95 dayjs: 1.11.7
95 echarts: registry.npmmirror.com/echarts/5.4.1 96 echarts: registry.npmmirror.com/echarts/5.4.1
@@ -105,10 +106,9 @@ dependencies: @@ -105,10 +106,9 @@ dependencies:
105 qs: 6.11.0 106 qs: 6.11.0
106 url: 0.11.0 107 url: 0.11.0
107 vue: 3.2.45 108 vue: 3.2.45
108 - vue-cropper: 1.0.5  
109 vue-i18n: 9.2.2_vue@3.2.45 109 vue-i18n: 9.2.2_vue@3.2.45
110 vue-router: 4.1.6_vue@3.2.45 110 vue-router: 4.1.6_vue@3.2.45
111 - vue-types: 5.0.1_vue@3.2.45 111 + vue-types: 5.0.2_vue@3.2.45
112 vxe-table: registry.npmmirror.com/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7 112 vxe-table: registry.npmmirror.com/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7
113 web-storage-cache: 1.1.1 113 web-storage-cache: 1.1.1
114 xe-utils: 3.5.7 114 xe-utils: 3.5.7
@@ -116,7 +116,7 @@ dependencies: @@ -116,7 +116,7 @@ dependencies:
116 devDependencies: 116 devDependencies:
117 '@commitlint/cli': 17.3.0 117 '@commitlint/cli': 17.3.0
118 '@commitlint/config-conventional': 17.3.0 118 '@commitlint/config-conventional': 17.3.0
119 - '@iconify/json': 2.1.154 119 + '@iconify/json': 2.1.155
120 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2 120 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2
121 '@purge-icons/generated': 0.9.0 121 '@purge-icons/generated': 0.9.0
122 '@types/intro.js': 5.1.0 122 '@types/intro.js': 5.1.0
@@ -127,9 +127,9 @@ devDependencies: @@ -127,9 +127,9 @@ devDependencies:
127 '@types/qs': 6.9.7 127 '@types/qs': 6.9.7
128 '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym 128 '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym
129 '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa 129 '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa
130 - '@vitejs/plugin-legacy': registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.2  
131 - '@vitejs/plugin-vue': registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.2+vue@3.2.45  
132 - '@vitejs/plugin-vue-jsx': registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.2+vue@3.2.45 130 + '@vitejs/plugin-legacy': registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.3
  131 + '@vitejs/plugin-vue': registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45
  132 + '@vitejs/plugin-vue-jsx': registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.3+vue@3.2.45
133 autoprefixer: 10.4.13_postcss@8.4.20 133 autoprefixer: 10.4.13_postcss@8.4.20
134 consola: 2.15.3 134 consola: 2.15.3
135 eslint: 8.30.0 135 eslint: 8.30.0
@@ -143,7 +143,7 @@ devDependencies: @@ -143,7 +143,7 @@ devDependencies:
143 postcss-scss: 4.0.6_postcss@8.4.20 143 postcss-scss: 4.0.6_postcss@8.4.20
144 prettier: 2.8.1 144 prettier: 2.8.1
145 rimraf: 3.0.2 145 rimraf: 3.0.2
146 - rollup: 3.7.5 146 + rollup: 3.8.0
147 sass: 1.57.1 147 sass: 1.57.1
148 stylelint: 14.16.0 148 stylelint: 14.16.0
149 stylelint-config-html: 1.1.0_bto6pmslw3cibsiuq6smxboytq 149 stylelint-config-html: 1.1.0_bto6pmslw3cibsiuq6smxboytq
@@ -153,17 +153,17 @@ devDependencies: @@ -153,17 +153,17 @@ devDependencies:
153 stylelint-order: 5.0.0_stylelint@14.16.0 153 stylelint-order: 5.0.0_stylelint@14.16.0
154 terser: 5.16.1 154 terser: 5.16.1
155 typescript: 4.9.4 155 typescript: 4.9.4
156 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce  
157 - vite-plugin-compression: 0.5.1_vite@4.0.2 156 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
  157 + vite-plugin-compression: 0.5.1_vite@4.0.3
158 vite-plugin-ejs: 1.6.4 158 vite-plugin-ejs: 1.6.4
159 - vite-plugin-eslint: 1.8.1_eslint@8.30.0+vite@4.0.2  
160 - vite-plugin-progress: 0.0.6_vite@4.0.2  
161 - vite-plugin-purge-icons: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.2  
162 - vite-plugin-style-import: 2.0.0_vite@4.0.2  
163 - vite-plugin-svg-icons: 2.0.1_vite@4.0.2  
164 - vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.2  
165 - vite-plugin-windicss: registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.2  
166 - vue-tsc: 1.0.14_typescript@4.9.4 159 + vite-plugin-eslint: 1.8.1_eslint@8.30.0+vite@4.0.3
  160 + vite-plugin-progress: 0.0.6_vite@4.0.3
  161 + vite-plugin-purge-icons: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.3
  162 + vite-plugin-style-import: 2.0.0_vite@4.0.3
  163 + vite-plugin-svg-icons: 2.0.1_vite@4.0.3
  164 + vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.3
  165 + vite-plugin-windicss: registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.3
  166 + vue-tsc: 1.0.16_typescript@4.9.4
167 windicss: 3.5.6 167 windicss: 3.5.6
168 168
169 packages: 169 packages:
@@ -631,8 +631,8 @@ packages: @@ -631,8 +631,8 @@ packages:
631 dependencies: 631 dependencies:
632 '@iconify/types': 2.0.0 632 '@iconify/types': 2.0.0
633 633
634 - /@iconify/json/2.1.154:  
635 - resolution: {integrity: sha512-RpUu4zDoeqIAzD54t8mfCKca+fzASgFf+lFE7Y9OzvScrf+IbUrvyZZEcOkjEB1cB4emDgmWGTAAkVTihhaqxQ==} 634 + /@iconify/json/2.1.155:
  635 + resolution: {integrity: sha512-Zr0809RkIKB/0pX3jFfLX4TI8fv1aW6+FHXlfRiDhFKQSmhcs2x5xYhtxI5GUzl+9o6Le544uUCljmHBYJUFrA==}
636 dependencies: 636 dependencies:
637 '@iconify/types': 2.0.0 637 '@iconify/types': 2.0.0
638 pathe: 0.3.9 638 pathe: 0.3.9
@@ -1079,44 +1079,44 @@ packages: @@ -1079,44 +1079,44 @@ packages:
1079 nanoid: registry.npmmirror.com/nanoid/3.3.4 1079 nanoid: registry.npmmirror.com/nanoid/3.3.4
1080 dev: false 1080 dev: false
1081 1081
1082 - /@volar/language-core/1.0.14:  
1083 - resolution: {integrity: sha512-j1tMQgw0qCV2amM4qDJNG/zc0yj3ay8HoWNt05IaiCPsULtSSpF/9+F6Izvn0DF7nWOd6MUHTxaQAeZwLfr56Q==} 1082 + /@volar/language-core/1.0.16:
  1083 + resolution: {integrity: sha512-IGnOxWTs4DZ81TDcmxBAkCBxs97hUblwcjpBsTx/pOGGaSSDQRJPn0wL8NYTybEObU0i7lhEpKZ+0vJfdIy1Kg==}
1084 dependencies: 1084 dependencies:
1085 - '@volar/source-map': 1.0.14 1085 + '@volar/source-map': 1.0.16
1086 '@vue/reactivity': 3.2.45 1086 '@vue/reactivity': 3.2.45
1087 muggle-string: 0.1.0 1087 muggle-string: 0.1.0
1088 dev: true 1088 dev: true
1089 1089
1090 - /@volar/source-map/1.0.14:  
1091 - resolution: {integrity: sha512-8pHCbEWHWaSDGb/FM9zRIW1lY1OAo16MENVSQGCgTwz7PWf3Gw6WW3TFVKCtzaFhLjPH0i5e9hALy7vBPbSHoA==} 1090 + /@volar/source-map/1.0.16:
  1091 + resolution: {integrity: sha512-PKjzmQcg8QOGC/1V9tmGh2jcy6bKLhkW5bGidElSr83iDbCzLvldt2/La/QlDxaRCHYLT0MeyuGJBZIChB1dYQ==}
1092 dependencies: 1092 dependencies:
1093 muggle-string: 0.1.0 1093 muggle-string: 0.1.0
1094 dev: true 1094 dev: true
1095 1095
1096 - /@volar/typescript/1.0.14:  
1097 - resolution: {integrity: sha512-67qcjjz7KGFhMCG9EKMA9qJK3BRGQecO4dGyAKfMfClZ/PaVoKfDvJvYo89McGTQ8SeczD48I9TPnaJM0zK8JQ==} 1096 + /@volar/typescript/1.0.16:
  1097 + resolution: {integrity: sha512-Yov+n4oO3iYnuMt9QJAFpJabfTRCzc7KvjlAwBaSuZy+Gc/f9611MgtqAh5/SIGmltFN8dXn1Ijno8ro8I4lyw==}
1098 dependencies: 1098 dependencies:
1099 - '@volar/language-core': 1.0.14 1099 + '@volar/language-core': 1.0.16
1100 dev: true 1100 dev: true
1101 1101
1102 - /@volar/vue-language-core/1.0.14:  
1103 - resolution: {integrity: sha512-grJ4dQ7c/suZmBBmZtw2O2XeDX+rtgpdBtHxMug1NMPRDxj5EZ9WGphWtGnMQj8RyVgpz9ByvV5GbQjk4/wfBw==} 1102 + /@volar/vue-language-core/1.0.16:
  1103 + resolution: {integrity: sha512-sQ/aW1Vuiyy4OQuh2lthyYicruM3qh9VSk/aDh8/bFvM8GoohHZqVpMN3LYldEJ9eT/rN6u4xmYP54vc/EjX4Q==}
1104 dependencies: 1104 dependencies:
1105 - '@volar/language-core': 1.0.14  
1106 - '@volar/source-map': 1.0.14 1105 + '@volar/language-core': 1.0.16
  1106 + '@volar/source-map': 1.0.16
1107 '@vue/compiler-dom': 3.2.45 1107 '@vue/compiler-dom': 3.2.45
1108 '@vue/compiler-sfc': 3.2.45 1108 '@vue/compiler-sfc': 3.2.45
1109 '@vue/reactivity': 3.2.45 1109 '@vue/reactivity': 3.2.45
1110 '@vue/shared': 3.2.45 1110 '@vue/shared': 3.2.45
1111 - minimatch: 5.1.0 1111 + minimatch: 5.1.2
1112 vue-template-compiler: 2.7.14 1112 vue-template-compiler: 2.7.14
1113 dev: true 1113 dev: true
1114 1114
1115 - /@volar/vue-typescript/1.0.14:  
1116 - resolution: {integrity: sha512-2P0QeGLLY05fDTu8GqY8SR2+jldXRTrkQdD2Nc0sVOjMJ7j3RYYY0wJyZ9hCBDuxV4Micc6jdB8nKS0yxQgNvA==} 1115 + /@volar/vue-typescript/1.0.16:
  1116 + resolution: {integrity: sha512-M018Ulg/o2FVktAdlr5b/z4K69bYzekxNUA1o39y5Ur6CObc/o+5eDCCS7gIYijWnx9iNKkSQpWWWblJFv7kHQ==}
1117 dependencies: 1117 dependencies:
1118 - '@volar/typescript': 1.0.14  
1119 - '@volar/vue-language-core': 1.0.14 1118 + '@volar/typescript': 1.0.16
  1119 + '@volar/vue-language-core': 1.0.16
1120 dev: true 1120 dev: true
1121 1121
1122 /@vue/compiler-core/3.2.45: 1122 /@vue/compiler-core/3.2.45:
@@ -1196,24 +1196,24 @@ packages: @@ -1196,24 +1196,24 @@ packages:
1196 /@vue/shared/3.2.45: 1196 /@vue/shared/3.2.45:
1197 resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} 1197 resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
1198 1198
1199 - /@vueuse/core/9.7.0_vue@3.2.45:  
1200 - resolution: {integrity: sha512-/AGY/t7jJPxCyRoVTygNKoroTiCvRaaZIW+yeSlBCnI7QRpQ9cvXNTdNaSl3GvSyFbn83+XwZwEZvI1OpQfeGw==} 1199 + /@vueuse/core/9.8.2_vue@3.2.45:
  1200 + resolution: {integrity: sha512-aWiCmcYIpPt7xjuqYiceODEMHchDYthrJ4AqI+FXPZrR23PZOqdiktbUVyQl2kGlR3H4i9UJ/uimQrwhz9UouQ==}
1201 dependencies: 1201 dependencies:
1202 '@types/web-bluetooth': 0.0.16 1202 '@types/web-bluetooth': 0.0.16
1203 - '@vueuse/metadata': 9.7.0  
1204 - '@vueuse/shared': 9.7.0_vue@3.2.45 1203 + '@vueuse/metadata': 9.8.2
  1204 + '@vueuse/shared': 9.8.2_vue@3.2.45
1205 vue-demi: 0.13.11_vue@3.2.45 1205 vue-demi: 0.13.11_vue@3.2.45
1206 transitivePeerDependencies: 1206 transitivePeerDependencies:
1207 - '@vue/composition-api' 1207 - '@vue/composition-api'
1208 - vue 1208 - vue
1209 dev: false 1209 dev: false
1210 1210
1211 - /@vueuse/metadata/9.7.0:  
1212 - resolution: {integrity: sha512-M7WsAgw28FNtTH0bzsGuHEtJOPJqPpyeHS6PHq+8UesLgNjZ9waMAntiUrgUQlxt09M4i2lH7y9sRi0jkfeXGA==} 1211 + /@vueuse/metadata/9.8.2:
  1212 + resolution: {integrity: sha512-N4E/BKS+9VsUeD4WLVRU1J2kCOLh+iikBcMtipFcTyL204132vDYHs27zLAVabJYGnhC0dIVGdhg9pbOZiY2TQ==}
1213 dev: false 1213 dev: false
1214 1214
1215 - /@vueuse/shared/9.7.0_vue@3.2.45:  
1216 - resolution: {integrity: sha512-pwmt1y3TJ2s5KqWmkv9ZKEV59GwuZQZk8XLiU+hGswz0jej318ozbea9E4A/A50ksyM26swSFr7sZ9llNPsZHg==} 1215 + /@vueuse/shared/9.8.2_vue@3.2.45:
  1216 + resolution: {integrity: sha512-ACjrPQzowd5dnabNJt9EoGVobco9/ENiA5qP53vjiuxndlJYuc/UegwhXC7KdQbPX4F45a50+45K3g1wNqOzmA==}
1217 dependencies: 1217 dependencies:
1218 vue-demi: 0.13.11_vue@3.2.45 1218 vue-demi: 0.13.11_vue@3.2.45
1219 transitivePeerDependencies: 1219 transitivePeerDependencies:
@@ -2019,6 +2019,10 @@ packages: @@ -2019,6 +2019,10 @@ packages:
2019 resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 2019 resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
2020 dev: true 2020 dev: true
2021 2021
  2022 + /cropperjs/1.5.13:
  2023 + resolution: {integrity: sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==}
  2024 + dev: false
  2025 +
2022 /cross-spawn/7.0.3: 2026 /cross-spawn/7.0.3:
2023 resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 2027 resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
2024 engines: {node: '>= 8'} 2028 engines: {node: '>= 8'}
@@ -2319,7 +2323,7 @@ packages: @@ -2319,7 +2323,7 @@ packages:
2319 '@popperjs/core': /@sxzz/popperjs-es/2.11.7 2323 '@popperjs/core': /@sxzz/popperjs-es/2.11.7
2320 '@types/lodash': 4.14.189 2324 '@types/lodash': 4.14.189
2321 '@types/lodash-es': 4.17.6 2325 '@types/lodash-es': 4.17.6
2322 - '@vueuse/core': 9.7.0_vue@3.2.45 2326 + '@vueuse/core': 9.8.2_vue@3.2.45
2323 async-validator: 4.2.5 2327 async-validator: 4.2.5
2324 dayjs: 1.11.7 2328 dayjs: 1.11.7
2325 escape-html: 1.0.3 2329 escape-html: 1.0.3
@@ -3831,6 +3835,13 @@ packages: @@ -3831,6 +3835,13 @@ packages:
3831 brace-expansion: 2.0.1 3835 brace-expansion: 2.0.1
3832 dev: true 3836 dev: true
3833 3837
  3838 + /minimatch/5.1.2:
  3839 + resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==}
  3840 + engines: {node: '>=10'}
  3841 + dependencies:
  3842 + brace-expansion: 2.0.1
  3843 + dev: true
  3844 +
3834 /minimist-options/4.1.0: 3845 /minimist-options/4.1.0:
3835 resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 3846 resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
3836 engines: {node: '>= 6'} 3847 engines: {node: '>= 6'}
@@ -4544,8 +4555,8 @@ packages: @@ -4544,8 +4555,8 @@ packages:
4544 fsevents: 2.3.2 4555 fsevents: 2.3.2
4545 dev: true 4556 dev: true
4546 4557
4547 - /rollup/3.7.5:  
4548 - resolution: {integrity: sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ==} 4558 + /rollup/3.8.0:
  4559 + resolution: {integrity: sha512-+UR6PnUslneJNiJfLSzy4XH6R50ZGF0MS7UCv20ftXrktF/TkvZDwiBtXX65esblLR5p8w6LmXgPwt2f2B8SoQ==}
4549 engines: {node: '>=14.18.0', npm: '>=8.0.0'} 4560 engines: {node: '>=14.18.0', npm: '>=8.0.0'}
4550 hasBin: true 4561 hasBin: true
4551 optionalDependencies: 4562 optionalDependencies:
@@ -5338,7 +5349,7 @@ packages: @@ -5338,7 +5349,7 @@ packages:
5338 engines: {node: '>= 0.8'} 5349 engines: {node: '>= 0.8'}
5339 dev: true 5350 dev: true
5340 5351
5341 - /vite-plugin-compression/0.5.1_vite@4.0.2: 5352 + /vite-plugin-compression/0.5.1_vite@4.0.3:
5342 resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} 5353 resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
5343 peerDependencies: 5354 peerDependencies:
5344 vite: '>=2.0.0' 5355 vite: '>=2.0.0'
@@ -5346,7 +5357,7 @@ packages: @@ -5346,7 +5357,7 @@ packages:
5346 chalk: 4.1.2 5357 chalk: 4.1.2
5347 debug: 4.3.4 5358 debug: 4.3.4
5348 fs-extra: 10.1.0 5359 fs-extra: 10.1.0
5349 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5360 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5350 transitivePeerDependencies: 5361 transitivePeerDependencies:
5351 - supports-color 5362 - supports-color
5352 dev: true 5363 dev: true
@@ -5357,7 +5368,7 @@ packages: @@ -5357,7 +5368,7 @@ packages:
5357 ejs: 3.1.8 5368 ejs: 3.1.8
5358 dev: true 5369 dev: true
5359 5370
5360 - /vite-plugin-eslint/1.8.1_eslint@8.30.0+vite@4.0.2: 5371 + /vite-plugin-eslint/1.8.1_eslint@8.30.0+vite@4.0.3:
5361 resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} 5372 resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==}
5362 peerDependencies: 5373 peerDependencies:
5363 eslint: '>=7' 5374 eslint: '>=7'
@@ -5367,10 +5378,10 @@ packages: @@ -5367,10 +5378,10 @@ packages:
5367 '@types/eslint': 8.4.10 5378 '@types/eslint': 8.4.10
5368 eslint: 8.30.0 5379 eslint: 8.30.0
5369 rollup: 2.79.1 5380 rollup: 2.79.1
5370 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5381 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5371 dev: true 5382 dev: true
5372 5383
5373 - /vite-plugin-progress/0.0.6_vite@4.0.2: 5384 + /vite-plugin-progress/0.0.6_vite@4.0.3:
5374 resolution: {integrity: sha512-pIK2TVEY4XFGrz10CQDdEufBBCDaV0geRHfXV3abGTBr+OF9O0Zmd3ZDrHJXDv4Rl3qAQP4BTCuPYQ3XqstmqA==} 5385 resolution: {integrity: sha512-pIK2TVEY4XFGrz10CQDdEufBBCDaV0geRHfXV3abGTBr+OF9O0Zmd3ZDrHJXDv4Rl3qAQP4BTCuPYQ3XqstmqA==}
5375 engines: {node: '>=14', pnpm: '>=7.0.0'} 5386 engines: {node: '>=14', pnpm: '>=7.0.0'}
5376 peerDependencies: 5387 peerDependencies:
@@ -5379,10 +5390,10 @@ packages: @@ -5379,10 +5390,10 @@ packages:
5379 picocolors: 1.0.0 5390 picocolors: 1.0.0
5380 progress: 2.0.3 5391 progress: 2.0.3
5381 rd: 2.0.1 5392 rd: 2.0.1
5382 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5393 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5383 dev: true 5394 dev: true
5384 5395
5385 - /vite-plugin-style-import/2.0.0_vite@4.0.2: 5396 + /vite-plugin-style-import/2.0.0_vite@4.0.3:
5386 resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} 5397 resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==}
5387 peerDependencies: 5398 peerDependencies:
5388 vite: '>=2.0.0' 5399 vite: '>=2.0.0'
@@ -5394,10 +5405,10 @@ packages: @@ -5394,10 +5405,10 @@ packages:
5394 fs-extra: 10.1.0 5405 fs-extra: 10.1.0
5395 magic-string: 0.25.9 5406 magic-string: 0.25.9
5396 pathe: 0.2.0 5407 pathe: 0.2.0
5397 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5408 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5398 dev: true 5409 dev: true
5399 5410
5400 - /vite-plugin-svg-icons/2.0.1_vite@4.0.2: 5411 + /vite-plugin-svg-icons/2.0.1_vite@4.0.3:
5401 resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} 5412 resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
5402 peerDependencies: 5413 peerDependencies:
5403 vite: '>=2.0.0' 5414 vite: '>=2.0.0'
@@ -5410,23 +5421,23 @@ packages: @@ -5410,23 +5421,23 @@ packages:
5410 pathe: 0.2.0 5421 pathe: 0.2.0
5411 svg-baker: 1.7.0 5422 svg-baker: 1.7.0
5412 svgo: 2.8.0 5423 svgo: 2.8.0
5413 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5424 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5414 transitivePeerDependencies: 5425 transitivePeerDependencies:
5415 - supports-color 5426 - supports-color
5416 dev: true 5427 dev: true
5417 5428
5418 - /vite-plugin-vue-setup-extend/0.4.0_vite@4.0.2: 5429 + /vite-plugin-vue-setup-extend/0.4.0_vite@4.0.3:
5419 resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} 5430 resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==}
5420 peerDependencies: 5431 peerDependencies:
5421 vite: '>=2.0.0' 5432 vite: '>=2.0.0'
5422 dependencies: 5433 dependencies:
5423 '@vue/compiler-sfc': 3.2.45 5434 '@vue/compiler-sfc': 3.2.45
5424 magic-string: 0.25.9 5435 magic-string: 0.25.9
5425 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 5436 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
5426 dev: true 5437 dev: true
5427 5438
5428 - /vite/4.0.2_amyfslv6hdwxqbf7f4ldebbtce:  
5429 - resolution: {integrity: sha512-QJaY3R+tFlTagH0exVqbgkkw45B+/bXVBzF2ZD1KB5Z8RiAoiKo60vSUf6/r4c2Vh9jfGBKM4oBI9b4/1ZJYng==} 5439 + /vite/4.0.3_amyfslv6hdwxqbf7f4ldebbtce:
  5440 + resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==}
5430 engines: {node: ^14.18.0 || >=16.0.0} 5441 engines: {node: ^14.18.0 || >=16.0.0}
5431 hasBin: true 5442 hasBin: true
5432 peerDependencies: 5443 peerDependencies:
@@ -5454,17 +5465,13 @@ packages: @@ -5454,17 +5465,13 @@ packages:
5454 esbuild: 0.16.5 5465 esbuild: 0.16.5
5455 postcss: 8.4.20 5466 postcss: 8.4.20
5456 resolve: 1.22.1 5467 resolve: 1.22.1
5457 - rollup: 3.7.5 5468 + rollup: 3.8.0
5458 sass: 1.57.1 5469 sass: 1.57.1
5459 terser: 5.16.1 5470 terser: 5.16.1
5460 optionalDependencies: 5471 optionalDependencies:
5461 fsevents: 2.3.2 5472 fsevents: 2.3.2
5462 dev: true 5473 dev: true
5463 5474
5464 - /vue-cropper/1.0.5:  
5465 - resolution: {integrity: sha512-D4XXdqWmMWRLOIV9LIh7/mkH6OBOMQDFbRjwntkxmAtxOtwpC9U5ZZ6lSXw5F5cbd4g8znDjk6MuCwIL+fZSrA==}  
5466 - dev: false  
5467 -  
5468 /vue-demi/0.13.11_vue@3.2.45: 5475 /vue-demi/0.13.11_vue@3.2.45:
5469 resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} 5476 resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
5470 engines: {node: '>=12'} 5477 engines: {node: '>=12'}
@@ -5526,19 +5533,19 @@ packages: @@ -5526,19 +5533,19 @@ packages:
5526 he: 1.2.0 5533 he: 1.2.0
5527 dev: true 5534 dev: true
5528 5535
5529 - /vue-tsc/1.0.14_typescript@4.9.4:  
5530 - resolution: {integrity: sha512-HeqtyxMrSRUCnU5nxB0lQc3o7zirMppZ/V6HLL3l4FsObGepH3A3beNmNehpLQs0Gt7DkSWVi3CpVCFgrf+/sQ==} 5536 + /vue-tsc/1.0.16_typescript@4.9.4:
  5537 + resolution: {integrity: sha512-yZaiJBbcKR1rSLhiF9KryAFH7R63po+N/invr2EAHGXxMzZksE5j1zyQKvrYiqK47ZHLAlCR+re/PHqWp/UzTg==}
5531 hasBin: true 5538 hasBin: true
5532 peerDependencies: 5539 peerDependencies:
5533 typescript: '*' 5540 typescript: '*'
5534 dependencies: 5541 dependencies:
5535 - '@volar/vue-language-core': 1.0.14  
5536 - '@volar/vue-typescript': 1.0.14 5542 + '@volar/vue-language-core': 1.0.16
  5543 + '@volar/vue-typescript': 1.0.16
5537 typescript: 4.9.4 5544 typescript: 4.9.4
5538 dev: true 5545 dev: true
5539 5546
5540 - /vue-types/5.0.1_vue@3.2.45:  
5541 - resolution: {integrity: sha512-pHahh/Ht+mxAhSGXfFe0WQidZukYUoCevPoQtePpONrmNP+OjX3/ps/XjYLgw/Zbv4rks242eiVJcjE3EELsyw==} 5547 + /vue-types/5.0.2_vue@3.2.45:
  5548 + resolution: {integrity: sha512-+/5hnQ65XOYqPs+tEUF8GGTJX95UFVH0wPQo71IJJYh5TKMfik2tGKTLkZ42JqAczANA9hGu5FrZmPgxn20nnA==}
5542 engines: {node: '>=14.0.0'} 5549 engines: {node: '>=14.0.0'}
5543 peerDependencies: 5550 peerDependencies:
5544 vue: ^2.0.0 || ^3.0.0 5551 vue: ^2.0.0 || ^3.0.0
@@ -6239,7 +6246,7 @@ packages: @@ -6239,7 +6246,7 @@ packages:
6239 '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/3.0.1 6246 '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/3.0.1
6240 dev: true 6247 dev: true
6241 6248
6242 - registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.2: 6249 + registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.3:
6243 resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz} 6250 resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz}
6244 id: registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1 6251 id: registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1
6245 name: '@vitejs/plugin-legacy' 6252 name: '@vitejs/plugin-legacy'
@@ -6255,10 +6262,10 @@ packages: @@ -6255,10 +6262,10 @@ packages:
6255 regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11 6262 regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11
6256 systemjs: registry.npmmirror.com/systemjs/6.13.0 6263 systemjs: registry.npmmirror.com/systemjs/6.13.0
6257 terser: 5.16.1 6264 terser: 5.16.1
6258 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 6265 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
6259 dev: true 6266 dev: true
6260 6267
6261 - registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.2+vue@3.2.45: 6268 + registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.3+vue@3.2.45:
6262 resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz} 6269 resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz}
6263 id: registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0 6270 id: registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0
6264 name: '@vitejs/plugin-vue-jsx' 6271 name: '@vitejs/plugin-vue-jsx'
@@ -6271,13 +6278,13 @@ packages: @@ -6271,13 +6278,13 @@ packages:
6271 '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 6278 '@babel/core': registry.npmmirror.com/@babel/core/7.20.5
6272 '@babel/plugin-transform-typescript': registry.npmmirror.com/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5 6279 '@babel/plugin-transform-typescript': registry.npmmirror.com/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5
6273 '@vue/babel-plugin-jsx': registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5 6280 '@vue/babel-plugin-jsx': registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5
6274 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 6281 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
6275 vue: 3.2.45 6282 vue: 3.2.45
6276 transitivePeerDependencies: 6283 transitivePeerDependencies:
6277 - supports-color 6284 - supports-color
6278 dev: true 6285 dev: true
6279 6286
6280 - registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.2+vue@3.2.45: 6287 + registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45:
6281 resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz} 6288 resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz}
6282 id: registry.npmmirror.com/@vitejs/plugin-vue/4.0.0 6289 id: registry.npmmirror.com/@vitejs/plugin-vue/4.0.0
6283 name: '@vitejs/plugin-vue' 6290 name: '@vitejs/plugin-vue'
@@ -6287,7 +6294,7 @@ packages: @@ -6287,7 +6294,7 @@ packages:
6287 vite: ^4.0.0 6294 vite: ^4.0.0
6288 vue: ^3.2.25 6295 vue: ^3.2.25
6289 dependencies: 6296 dependencies:
6290 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 6297 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
6291 vue: 3.2.45 6298 vue: 3.2.45
6292 dev: true 6299 dev: true
6293 6300
@@ -7026,7 +7033,7 @@ packages: @@ -7026,7 +7033,7 @@ packages:
7026 picocolors: 1.0.0 7033 picocolors: 1.0.0
7027 dev: true 7034 dev: true
7028 7035
7029 - registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.2: 7036 + registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.3:
7030 resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.9.2.tgz} 7037 resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.9.2.tgz}
7031 id: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2 7038 id: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2
7032 name: vite-plugin-purge-icons 7039 name: vite-plugin-purge-icons
@@ -7038,13 +7045,13 @@ packages: @@ -7038,13 +7045,13 @@ packages:
7038 '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.9.1 7045 '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.9.1
7039 '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.9.0 7046 '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.9.0
7040 rollup-plugin-purge-icons: registry.npmmirror.com/rollup-plugin-purge-icons/0.9.1 7047 rollup-plugin-purge-icons: registry.npmmirror.com/rollup-plugin-purge-icons/0.9.1
7041 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 7048 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
7042 transitivePeerDependencies: 7049 transitivePeerDependencies:
7043 - encoding 7050 - encoding
7044 - supports-color 7051 - supports-color
7045 dev: true 7052 dev: true
7046 7053
7047 - registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.2: 7054 + registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.3:
7048 resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz} 7055 resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz}
7049 id: registry.npmmirror.com/vite-plugin-windicss/1.8.10 7056 id: registry.npmmirror.com/vite-plugin-windicss/1.8.10
7050 name: vite-plugin-windicss 7057 name: vite-plugin-windicss
@@ -7055,7 +7062,7 @@ packages: @@ -7055,7 +7062,7 @@ packages:
7055 '@windicss/plugin-utils': registry.npmmirror.com/@windicss/plugin-utils/1.8.10 7062 '@windicss/plugin-utils': registry.npmmirror.com/@windicss/plugin-utils/1.8.10
7056 debug: registry.npmmirror.com/debug/4.3.4 7063 debug: registry.npmmirror.com/debug/4.3.4
7057 kolorist: registry.npmmirror.com/kolorist/1.6.0 7064 kolorist: registry.npmmirror.com/kolorist/1.6.0
7058 - vite: 4.0.2_amyfslv6hdwxqbf7f4ldebbtce 7065 + vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce
7059 windicss: registry.npmmirror.com/windicss/3.5.6 7066 windicss: registry.npmmirror.com/windicss/3.5.6
7060 transitivePeerDependencies: 7067 transitivePeerDependencies:
7061 - supports-color 7068 - supports-color
yudao-ui-admin-vue3/src/api/system/user/profile.ts
@@ -73,5 +73,5 @@ export const updateUserPwdApi = (oldPassword: string, newPassword: string) =&gt; { @@ -73,5 +73,5 @@ export const updateUserPwdApi = (oldPassword: string, newPassword: string) =&gt; {
73 73
74 // 用户头像上传 74 // 用户头像上传
75 export const uploadAvatarApi = (data) => { 75 export const uploadAvatarApi = (data) => {
76 - return request.put({ url: '/system/user/profile/update-avatar', data }) 76 + return request.upload({ url: '/system/user/profile/update-avatar', data: data })
77 } 77 }
yudao-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 import { ElCard } from 'element-plus' 2 import { ElCard } from 'element-plus'
3 import { propTypes } from '@/utils/propTypes' 3 import { propTypes } from '@/utils/propTypes'
4 import { useDesign } from '@/hooks/web/useDesign' 4 import { useDesign } from '@/hooks/web/useDesign'
5 -import { ref, onMounted, defineEmits } from 'vue' 5 +import { ref, onMounted } from 'vue'
6 import { Sticky } from '@/components/Sticky' 6 import { Sticky } from '@/components/Sticky'
7 import { useI18n } from '@/hooks/web/useI18n' 7 import { useI18n } from '@/hooks/web/useI18n'
8 const { t } = useI18n() 8 const { t } = useI18n()
yudao-ui-admin-vue3/src/components/Cropper/index.ts 0 → 100644
  1 +import CropperImage from './src/Cropper.vue'
  2 +import CropperAvatar from './src/CropperAvatar.vue'
  3 +
  4 +export { CropperImage, CropperAvatar }
yudao-ui-admin-vue3/src/components/Cropper/src/CopperModal.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <Dialog
  4 + v-model="dialogVisible"
  5 + :title="t('cropper.modalTitle')"
  6 + width="800px"
  7 + maxHeight="380px"
  8 + :canFullscreen="false"
  9 + >
  10 + <div :class="prefixCls">
  11 + <div :class="`${prefixCls}-left`">
  12 + <div :class="`${prefixCls}-cropper`">
  13 + <CropperImage
  14 + v-if="src"
  15 + :src="src"
  16 + height="300px"
  17 + :circled="circled"
  18 + @cropend="handleCropend"
  19 + @ready="handleReady"
  20 + />
  21 + </div>
  22 +
  23 + <div :class="`${prefixCls}-toolbar`">
  24 + <el-upload :fileList="[]" accept="image/*" :beforeUpload="handleBeforeUpload">
  25 + <el-tooltip :content="t('cropper.selectImage')" placement="bottom">
  26 + <XButton preIcon="ant-design:upload-outlined" type="primary" />
  27 + </el-tooltip>
  28 + </el-upload>
  29 + <el-space>
  30 + <el-tooltip :content="t('cropper.btn_reset')" placement="bottom">
  31 + <XButton
  32 + type="primary"
  33 + preIcon="ant-design:reload-outlined"
  34 + size="small"
  35 + :disabled="!src"
  36 + @click="handlerToolbar('reset')"
  37 + />
  38 + </el-tooltip>
  39 + <el-tooltip :content="t('cropper.btn_rotate_left')" placement="bottom">
  40 + <XButton
  41 + type="primary"
  42 + preIcon="ant-design:rotate-left-outlined"
  43 + size="small"
  44 + :disabled="!src"
  45 + @click="handlerToolbar('rotate', -45)"
  46 + />
  47 + </el-tooltip>
  48 + <el-tooltip :content="t('cropper.btn_rotate_right')" placement="bottom">
  49 + <XButton
  50 + type="primary"
  51 + preIcon="ant-design:rotate-right-outlined"
  52 + size="small"
  53 + :disabled="!src"
  54 + @click="handlerToolbar('rotate', 45)"
  55 + />
  56 + </el-tooltip>
  57 + <el-tooltip :content="t('cropper.btn_scale_x')" placement="bottom">
  58 + <XButton
  59 + type="primary"
  60 + preIcon="vaadin:arrows-long-h"
  61 + size="small"
  62 + :disabled="!src"
  63 + @click="handlerToolbar('scaleX')"
  64 + />
  65 + </el-tooltip>
  66 + <el-tooltip :content="t('cropper.btn_scale_y')" placement="bottom">
  67 + <XButton
  68 + type="primary"
  69 + preIcon="vaadin:arrows-long-v"
  70 + size="small"
  71 + :disabled="!src"
  72 + @click="handlerToolbar('scaleY')"
  73 + />
  74 + </el-tooltip>
  75 + <el-tooltip :content="t('cropper.btn_zoom_in')" placement="bottom">
  76 + <XButton
  77 + type="primary"
  78 + preIcon="ant-design:zoom-in-outlined"
  79 + size="small"
  80 + :disabled="!src"
  81 + @click="handlerToolbar('zoom', 0.1)"
  82 + />
  83 + </el-tooltip>
  84 + <el-tooltip :content="t('cropper.btn_zoom_out')" placement="bottom">
  85 + <XButton
  86 + type="primary"
  87 + preIcon="ant-design:zoom-out-outlined"
  88 + size="small"
  89 + :disabled="!src"
  90 + @click="handlerToolbar('zoom', -0.1)"
  91 + />
  92 + </el-tooltip>
  93 + </el-space>
  94 + </div>
  95 + </div>
  96 + <div :class="`${prefixCls}-right`">
  97 + <div :class="`${prefixCls}-preview`">
  98 + <img :src="previewSource" v-if="previewSource" :alt="t('cropper.preview')" />
  99 + </div>
  100 + <template v-if="previewSource">
  101 + <div :class="`${prefixCls}-group`">
  102 + <el-avatar :src="previewSource" size="large" />
  103 + <el-avatar :src="previewSource" :size="48" />
  104 + <el-avatar :src="previewSource" :size="64" />
  105 + <el-avatar :src="previewSource" :size="80" />
  106 + </div>
  107 + </template>
  108 + </div>
  109 + </div>
  110 + <template #footer>
  111 + <el-button type="primary" @click="handleOk">{{ t('cropper.okText') }}</el-button>
  112 + </template>
  113 + </Dialog>
  114 + </div>
  115 +</template>
  116 +<script setup lang="ts">
  117 +import { useDesign } from '@/hooks/web/useDesign'
  118 +import { dataURLtoBlob } from '@/utils/filt'
  119 +import { ref } from 'vue'
  120 +import { useI18n } from 'vue-i18n'
  121 +import { ElUpload, ElAvatar, ElTooltip, ElSpace } from 'element-plus'
  122 +import { Dialog } from '@/components/Dialog'
  123 +import { CropperImage } from '@/components/Cropper'
  124 +import type { CropendResult, Cropper } from './types'
  125 +import { propTypes } from '@/utils/propTypes'
  126 +
  127 +const props = defineProps({
  128 + srcValue: propTypes.string.def(''),
  129 + circled: propTypes.bool.def(true)
  130 +})
  131 +const emit = defineEmits(['uploadSuccess'])
  132 +const { t } = useI18n()
  133 +const { getPrefixCls } = useDesign()
  134 +const prefixCls = getPrefixCls('cropper-am')
  135 +
  136 +const src = ref(props.srcValue)
  137 +const previewSource = ref('')
  138 +const cropper = ref<Cropper>()
  139 +const dialogVisible = ref(false)
  140 +let filename = ''
  141 +let scaleX = 1
  142 +let scaleY = 1
  143 +
  144 +// Block upload
  145 +function handleBeforeUpload(file: File) {
  146 + const reader = new FileReader()
  147 + reader.readAsDataURL(file)
  148 + src.value = ''
  149 + previewSource.value = ''
  150 + reader.onload = function (e) {
  151 + src.value = (e.target?.result as string) ?? ''
  152 + filename = file.name
  153 + }
  154 + return false
  155 +}
  156 +
  157 +function handleCropend({ imgBase64 }: CropendResult) {
  158 + previewSource.value = imgBase64
  159 +}
  160 +
  161 +function handleReady(cropperInstance: Cropper) {
  162 + cropper.value = cropperInstance
  163 +}
  164 +
  165 +function handlerToolbar(event: string, arg?: number) {
  166 + if (event === 'scaleX') {
  167 + scaleX = arg = scaleX === -1 ? 1 : -1
  168 + }
  169 + if (event === 'scaleY') {
  170 + scaleY = arg = scaleY === -1 ? 1 : -1
  171 + }
  172 + cropper?.value?.[event]?.(arg)
  173 +}
  174 +
  175 +async function handleOk() {
  176 + const blob = dataURLtoBlob(previewSource.value)
  177 + emit('uploadSuccess', { source: previewSource.value, data: blob, filename: filename })
  178 +}
  179 +function openModal() {
  180 + dialogVisible.value = true
  181 +}
  182 +function closeModal() {
  183 + dialogVisible.value = false
  184 +}
  185 +defineExpose({ openModal, closeModal })
  186 +</script>
  187 +<style lang="scss">
  188 +$prefix-cls: #{$namespace}-cropper-am;
  189 +
  190 +.#{$prefix-cls} {
  191 + display: flex;
  192 +
  193 + &-left,
  194 + &-right {
  195 + height: 340px;
  196 + }
  197 +
  198 + &-left {
  199 + width: 55%;
  200 + }
  201 +
  202 + &-right {
  203 + width: 45%;
  204 + }
  205 +
  206 + &-cropper {
  207 + height: 300px;
  208 + background: #eee;
  209 + background-image: linear-gradient(
  210 + 45deg,
  211 + rgb(0 0 0 / 25%) 25%,
  212 + transparent 0,
  213 + transparent 75%,
  214 + rgb(0 0 0 / 25%) 0
  215 + ),
  216 + linear-gradient(
  217 + 45deg,
  218 + rgb(0 0 0 / 25%) 25%,
  219 + transparent 0,
  220 + transparent 75%,
  221 + rgb(0 0 0 / 25%) 0
  222 + );
  223 + background-position: 0 0, 12px 12px;
  224 + background-size: 24px 24px;
  225 + }
  226 +
  227 + &-toolbar {
  228 + display: flex;
  229 + justify-content: space-between;
  230 + align-items: center;
  231 + margin-top: 10px;
  232 + }
  233 +
  234 + &-preview {
  235 + width: 220px;
  236 + height: 220px;
  237 + margin: 0 auto;
  238 + overflow: hidden;
  239 + border: 1px solid;
  240 + border-radius: 50%;
  241 +
  242 + img {
  243 + width: 100%;
  244 + height: 100%;
  245 + }
  246 + }
  247 +
  248 + &-group {
  249 + display: flex;
  250 + padding-top: 8px;
  251 + margin-top: 8px;
  252 + border-top: 1px solid;
  253 + justify-content: space-around;
  254 + align-items: center;
  255 + }
  256 +}
  257 +</style>
yudao-ui-admin-vue3/src/components/Cropper/src/Cropper.vue 0 → 100644
  1 +<template>
  2 + <div :class="getClass" :style="getWrapperStyle">
  3 + <img
  4 + v-show="isReady"
  5 + ref="imgElRef"
  6 + :src="src"
  7 + :alt="alt"
  8 + :crossorigin="crossorigin"
  9 + :style="getImageStyle"
  10 + />
  11 + </div>
  12 +</template>
  13 +<script setup lang="ts">
  14 +import {
  15 + computed,
  16 + CSSProperties,
  17 + onMounted,
  18 + onUnmounted,
  19 + PropType,
  20 + ref,
  21 + unref,
  22 + useAttrs
  23 +} from 'vue'
  24 +import Cropper from 'cropperjs'
  25 +import 'cropperjs/dist/cropper.css'
  26 +import { useDesign } from '@/hooks/web/useDesign'
  27 +import { useDebounceFn } from '@vueuse/core'
  28 +import { propTypes } from '@/utils/propTypes'
  29 +
  30 +type Options = Cropper.Options
  31 +
  32 +const defaultOptions: Options = {
  33 + aspectRatio: 1,
  34 + zoomable: true,
  35 + zoomOnTouch: true,
  36 + zoomOnWheel: true,
  37 + cropBoxMovable: true,
  38 + cropBoxResizable: true,
  39 + toggleDragModeOnDblclick: true,
  40 + autoCrop: true,
  41 + background: true,
  42 + highlight: true,
  43 + center: true,
  44 + responsive: true,
  45 + restore: true,
  46 + checkCrossOrigin: true,
  47 + checkOrientation: true,
  48 + scalable: true,
  49 + modal: true,
  50 + guides: true,
  51 + movable: true,
  52 + rotatable: true
  53 +}
  54 +
  55 +const props = defineProps({
  56 + src: propTypes.string.def(''),
  57 + alt: propTypes.string.def(''),
  58 + circled: propTypes.bool.def(false),
  59 + realTimePreview: propTypes.bool.def(true),
  60 + height: propTypes.string.def('360px'),
  61 + crossorigin: {
  62 + type: String as PropType<'' | 'anonymous' | 'use-credentials' | undefined>,
  63 + default: undefined
  64 + },
  65 + imageStyle: { type: Object as PropType<CSSProperties>, default: () => ({}) },
  66 + options: { type: Object as PropType<Options>, default: () => ({}) }
  67 +})
  68 +
  69 +const emit = defineEmits(['cropend', 'ready', 'cropendError'])
  70 +const attrs = useAttrs()
  71 +const imgElRef = ref<ElRef<HTMLImageElement>>()
  72 +const cropper = ref<Nullable<Cropper>>()
  73 +const isReady = ref(false)
  74 +
  75 +const { getPrefixCls } = useDesign()
  76 +const prefixCls = getPrefixCls('cropper-image')
  77 +const debounceRealTimeCroppered = useDebounceFn(realTimeCroppered, 80)
  78 +
  79 +const getImageStyle = computed((): CSSProperties => {
  80 + return {
  81 + height: props.height,
  82 + maxWidth: '100%',
  83 + ...props.imageStyle
  84 + }
  85 +})
  86 +
  87 +const getClass = computed(() => {
  88 + return [
  89 + prefixCls,
  90 + attrs.class,
  91 + {
  92 + [`${prefixCls}--circled`]: props.circled
  93 + }
  94 + ]
  95 +})
  96 +const getWrapperStyle = computed((): CSSProperties => {
  97 + return { height: `${props.height}`.replace(/px/, '') + 'px' }
  98 +})
  99 +
  100 +onMounted(init)
  101 +
  102 +onUnmounted(() => {
  103 + cropper.value?.destroy()
  104 +})
  105 +
  106 +async function init() {
  107 + const imgEl = unref(imgElRef)
  108 + if (!imgEl) {
  109 + return
  110 + }
  111 + cropper.value = new Cropper(imgEl, {
  112 + ...defaultOptions,
  113 + ready: () => {
  114 + isReady.value = true
  115 + realTimeCroppered()
  116 + emit('ready', cropper.value)
  117 + },
  118 + crop() {
  119 + debounceRealTimeCroppered()
  120 + },
  121 + zoom() {
  122 + debounceRealTimeCroppered()
  123 + },
  124 + cropmove() {
  125 + debounceRealTimeCroppered()
  126 + },
  127 + ...props.options
  128 + })
  129 +}
  130 +
  131 +// Real-time display preview
  132 +function realTimeCroppered() {
  133 + props.realTimePreview && croppered()
  134 +}
  135 +
  136 +// event: return base64 and width and height information after cropping
  137 +function croppered() {
  138 + if (!cropper.value) {
  139 + return
  140 + }
  141 + let imgInfo = cropper.value.getData()
  142 + const canvas = props.circled ? getRoundedCanvas() : cropper.value.getCroppedCanvas()
  143 + canvas.toBlob((blob) => {
  144 + if (!blob) {
  145 + return
  146 + }
  147 + let fileReader: FileReader = new FileReader()
  148 + fileReader.readAsDataURL(blob)
  149 + fileReader.onloadend = (e) => {
  150 + emit('cropend', {
  151 + imgBase64: e.target?.result ?? '',
  152 + imgInfo
  153 + })
  154 + }
  155 + fileReader.onerror = () => {
  156 + emit('cropendError')
  157 + }
  158 + }, 'image/png')
  159 +}
  160 +
  161 +// Get a circular picture canvas
  162 +function getRoundedCanvas() {
  163 + const sourceCanvas = cropper.value!.getCroppedCanvas()
  164 + const canvas = document.createElement('canvas')
  165 + const context = canvas.getContext('2d')!
  166 + const width = sourceCanvas.width
  167 + const height = sourceCanvas.height
  168 + canvas.width = width
  169 + canvas.height = height
  170 + context.imageSmoothingEnabled = true
  171 + context.drawImage(sourceCanvas, 0, 0, width, height)
  172 + context.globalCompositeOperation = 'destination-in'
  173 + context.beginPath()
  174 + context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true)
  175 + context.fill()
  176 + return canvas
  177 +}
  178 +</script>
  179 +<style lang="scss">
  180 +$prefix-cls: #{$namespace}-cropper-image;
  181 +
  182 +.#{$prefix-cls} {
  183 + &--circled {
  184 + .cropper-view-box,
  185 + .cropper-face {
  186 + border-radius: 50%;
  187 + }
  188 + }
  189 +}
  190 +</style>
yudao-ui-admin-vue3/src/components/Cropper/src/CropperAvatar.vue 0 → 100644
  1 +<template>
  2 + <div class="user-info-head" @click="open()">
  3 + <img :src="sourceValue" v-if="sourceValue" class="img-circle img-lg" alt="avatar" />
  4 + <el-button :class="`${prefixCls}-upload-btn`" @click="open()" v-if="showBtn">
  5 + {{ btnText ? btnText : t('cropper.selectImage') }}
  6 + </el-button>
  7 + <CopperModal
  8 + ref="cropperModelRef"
  9 + @upload-success="handleUploadSuccess"
  10 + :srcValue="sourceValue"
  11 + />
  12 + </div>
  13 +</template>
  14 +<script setup lang="ts">
  15 +import { useDesign } from '@/hooks/web/useDesign'
  16 +import { useMessage } from '@/hooks/web/useMessage'
  17 +import { propTypes } from '@/utils/propTypes'
  18 +import { ref, watch, watchEffect } from 'vue'
  19 +import { useI18n } from 'vue-i18n'
  20 +import CopperModal from './CopperModal.vue'
  21 +
  22 +const props = defineProps({
  23 + width: propTypes.string.def('200px'),
  24 + value: propTypes.string.def(''),
  25 + showBtn: propTypes.bool.def(true),
  26 + btnText: propTypes.string.def('')
  27 +})
  28 +
  29 +const emit = defineEmits(['update:value', 'change'])
  30 +const sourceValue = ref(props.value)
  31 +const { getPrefixCls } = useDesign()
  32 +const prefixCls = getPrefixCls('cropper-avatar')
  33 +const message = useMessage()
  34 +const { t } = useI18n()
  35 +
  36 +const cropperModelRef = ref()
  37 +
  38 +watchEffect(() => {
  39 + sourceValue.value = props.value
  40 +})
  41 +
  42 +watch(
  43 + () => sourceValue.value,
  44 + (v: string) => {
  45 + emit('update:value', v)
  46 + }
  47 +)
  48 +
  49 +function handleUploadSuccess({ source, data, filename }) {
  50 + sourceValue.value = source
  51 + emit('change', { source, data, filename })
  52 + message.success(t('cropper.uploadSuccess'))
  53 +}
  54 +
  55 +function open() {
  56 + cropperModelRef.value.openModal()
  57 +}
  58 +function close() {
  59 + cropperModelRef.value.closeModal()
  60 +}
  61 +defineExpose({
  62 + open,
  63 + close
  64 +})
  65 +</script>
  66 +<style lang="scss" scoped>
  67 +$prefix-cls: #{$namespace}--cropper-avatar;
  68 +
  69 +.#{$prefix-cls} {
  70 + display: inline-block;
  71 + text-align: center;
  72 +
  73 + &-image-wrapper {
  74 + overflow: hidden;
  75 + cursor: pointer;
  76 + border: 1px solid;
  77 + border-radius: 50%;
  78 +
  79 + img {
  80 + width: 100%;
  81 + }
  82 + }
  83 +
  84 + &-image-mask {
  85 + opacity: 0%;
  86 + position: absolute;
  87 + width: inherit;
  88 + height: inherit;
  89 + border-radius: inherit;
  90 + border: inherit;
  91 + background: rgb(0 0 0 / 40%);
  92 + cursor: pointer;
  93 + transition: opacity 0.4s;
  94 +
  95 + ::v-deep(svg) {
  96 + margin: auto;
  97 + }
  98 + }
  99 +
  100 + &-image-mask:hover {
  101 + opacity: 4000%;
  102 + }
  103 +
  104 + &-upload-btn {
  105 + margin: 10px auto;
  106 + }
  107 +}
  108 +.user-info-head {
  109 + position: relative;
  110 + display: inline-block;
  111 +}
  112 +.img-circle {
  113 + border-radius: 50%;
  114 +}
  115 +.img-lg {
  116 + width: 120px;
  117 + height: 120px;
  118 +}
  119 +.user-info-head:hover:after {
  120 + content: '+';
  121 + position: absolute;
  122 + left: 0;
  123 + right: 0;
  124 + top: 0;
  125 + bottom: 0;
  126 + color: #eee;
  127 + background: rgba(0, 0, 0, 0.5);
  128 + font-size: 24px;
  129 + font-style: normal;
  130 + -webkit-font-smoothing: antialiased;
  131 + -moz-osx-font-smoothing: grayscale;
  132 + cursor: pointer;
  133 + line-height: 110px;
  134 + border-radius: 50%;
  135 +}
  136 +</style>
yudao-ui-admin-vue3/src/components/Cropper/src/types.ts 0 → 100644
  1 +import type Cropper from 'cropperjs'
  2 +
  3 +export interface CropendResult {
  4 + imgBase64: string
  5 + imgInfo: Cropper.Data
  6 +}
  7 +
  8 +export type { Cropper }
yudao-ui-admin-vue3/src/config/axios/index.ts
@@ -44,7 +44,7 @@ export default { @@ -44,7 +44,7 @@ export default {
44 }, 44 },
45 upload: async <T = any>(option: any) => { 45 upload: async <T = any>(option: any) => {
46 option.headersType = 'multipart/form-data' 46 option.headersType = 'multipart/form-data'
47 - const res = await request({ method: 'PUT', ...option }) 47 + const res = await request({ method: 'POST', ...option })
48 return res as unknown as Promise<T> 48 return res as unknown as Promise<T>
49 } 49 }
50 } 50 }
yudao-ui-admin-vue3/src/layout/components/Menu/src/Menu.vue
@@ -161,6 +161,7 @@ $prefix-cls: #{$namespace}-menu; @@ -161,6 +161,7 @@ $prefix-cls: #{$namespace}-menu;
161 // 设置子菜单悬停的高亮和背景色 161 // 设置子菜单悬停的高亮和背景色
162 .#{$elNamespace}-sub-menu__title, 162 .#{$elNamespace}-sub-menu__title,
163 .#{$elNamespace}-menu-item { 163 .#{$elNamespace}-menu-item {
  164 + height: 59px;
164 &:hover { 165 &:hover {
165 color: var(--left-menu-text-active-color) !important; 166 color: var(--left-menu-text-active-color) !important;
166 background-color: var(--left-menu-bg-color) !important; 167 background-color: var(--left-menu-bg-color) !important;
@@ -170,6 +171,7 @@ $prefix-cls: #{$namespace}-menu; @@ -170,6 +171,7 @@ $prefix-cls: #{$namespace}-menu;
170 // 设置选中时的高亮背景和高亮颜色 171 // 设置选中时的高亮背景和高亮颜色
171 .#{$elNamespace}-sub-menu.is-active, 172 .#{$elNamespace}-sub-menu.is-active,
172 .#{$elNamespace}-menu-item.is-active { 173 .#{$elNamespace}-menu-item.is-active {
  174 + height: 59px;
173 color: var(--left-menu-text-active-color) !important; 175 color: var(--left-menu-text-active-color) !important;
174 background-color: var(--left-menu-bg-active-color) !important; 176 background-color: var(--left-menu-bg-active-color) !important;
175 177
yudao-ui-admin-vue3/src/layout/components/Message/index.ts 0 → 100644
  1 +import Message from './src/Message.vue'
  2 +
  3 +export { Message }
yudao-ui-admin-vue3/src/layout/components/Message/src/Message.vue 0 → 100644
  1 +<script setup lang="ts">
  2 +import { ref } from 'vue'
  3 +import { ElTabs, ElTabPane, ElPopover, ElBadge } from 'element-plus'
  4 +
  5 +const activeName = ref('notice')
  6 +
  7 +const noticeList = ref([
  8 + { id: 1, title: '版本升级1', date: '2022-12-12 10:00:00' },
  9 + { id: 2, title: '版本升级2', date: '2022-12-12 10:00:00' },
  10 + { id: 3, title: '版本升级3', date: '2022-12-12 10:00:00' },
  11 + { id: 4, title: '版本升级4', date: '2022-12-12 10:00:00' },
  12 + { id: 5, title: '版本升级5', date: '2022-12-12 10:00:00' }
  13 +])
  14 +const messageList = ref([
  15 + { id: 1, title: '加班1', date: '2022-12-12 10:00:00' },
  16 + { id: 2, title: '加班2', date: '2022-12-12 10:00:00' },
  17 + { id: 3, title: '加班3', date: '2022-12-12 10:00:00' },
  18 + { id: 4, title: '加班4', date: '2022-12-12 10:00:00' },
  19 + { id: 5, title: '加班5', date: '2022-12-12 10:00:00' }
  20 +])
  21 +const needList = ref([
  22 + { id: 1, title: '审批1', date: '2022-12-12 10:00:00' },
  23 + { id: 2, title: '审批2', date: '2022-12-12 10:00:00' },
  24 + { id: 3, title: '审批3', date: '2022-12-12 10:00:00' },
  25 + { id: 4, title: '审批4', date: '2022-12-12 10:00:00' },
  26 + { id: 5, title: '审批5', date: '2022-12-12 10:00:00' }
  27 +])
  28 +</script>
  29 +<template>
  30 + <div class="message">
  31 + <ElPopover placement="bottom" :width="310" trigger="click">
  32 + <template #reference>
  33 + <ElBadge :value="noticeList.length" class="item">
  34 + <Icon icon="ep:bell" :size="18" class="cursor-pointer" />
  35 + </ElBadge>
  36 + </template>
  37 + <ElTabs v-model="activeName">
  38 + <ElTabPane label="通知(5)" name="notice">
  39 + <div class="message-list">
  40 + <template v-for="item in noticeList" :key="item.id">
  41 + <div class="message-item">
  42 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  43 + <div class="message-content">
  44 + <span class="message-title">{{ item.title }}</span>
  45 + <span class="message-date">{{ item.date }}</span>
  46 + </div>
  47 + </div>
  48 + </template>
  49 + </div>
  50 + </ElTabPane>
  51 + <ElTabPane label="消息(0)" name="message">
  52 + <div class="message-list">
  53 + <template v-for="item in messageList" :key="item.id">
  54 + <div class="message-item">
  55 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  56 + <div class="message-content">
  57 + <span class="message-title">{{ item.title }}</span>
  58 + <span class="message-date">{{ item.date }}</span>
  59 + </div>
  60 + </div>
  61 + </template>
  62 + </div>
  63 + </ElTabPane>
  64 + <ElTabPane label="代办(0)" name="need">
  65 + <div class="message-list">
  66 + <template v-for="item in needList" :key="item.id">
  67 + <div class="message-item">
  68 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  69 + <div class="message-content">
  70 + <span class="message-title">{{ item.title }}</span>
  71 + <span class="message-date">{{ item.date }}</span>
  72 + </div>
  73 + </div>
  74 + </template>
  75 + </div>
  76 + </ElTabPane>
  77 + </ElTabs>
  78 + </ElPopover>
  79 + </div>
  80 +</template>
  81 +<style scoped lang="scss">
  82 +.message-empty {
  83 + display: flex;
  84 + flex-direction: column;
  85 + align-items: center;
  86 + justify-content: center;
  87 + height: 260px;
  88 + line-height: 45px;
  89 +}
  90 +.message-list {
  91 + display: flex;
  92 + flex-direction: column;
  93 + .message-item {
  94 + display: flex;
  95 + align-items: center;
  96 + padding: 20px 0;
  97 + border-bottom: 1px solid var(--el-border-color-light);
  98 + &:last-child {
  99 + border: none;
  100 + }
  101 + .message-icon {
  102 + width: 40px;
  103 + height: 40px;
  104 + margin: 0 20px 0 5px;
  105 + }
  106 + .message-content {
  107 + display: flex;
  108 + flex-direction: column;
  109 + .message-title {
  110 + margin-bottom: 5px;
  111 + }
  112 + .message-date {
  113 + font-size: 12px;
  114 + color: var(--el-text-color-secondary);
  115 + }
  116 + }
  117 + }
  118 +}
  119 +</style>
yudao-ui-admin-vue3/src/layout/components/Setting/src/Setting.vue
@@ -122,6 +122,8 @@ const copyConfig = async () =&gt; { @@ -122,6 +122,8 @@ const copyConfig = async () =&gt; {
122 size: ${appStore.getSize}, 122 size: ${appStore.getSize},
123 // 多语言图标 123 // 多语言图标
124 locale: ${appStore.getLocale}, 124 locale: ${appStore.getLocale},
  125 + // 消息图标
  126 + message: ${appStore.getMessage},
125 // 标签页 127 // 标签页
126 tagsView: ${appStore.getTagsView}, 128 tagsView: ${appStore.getTagsView},
127 // 标签页图标 129 // 标签页图标
yudao-ui-admin-vue3/src/layout/components/Setting/src/components/InterfaceDisplay.vue
@@ -57,6 +57,13 @@ const localeChange = (show: boolean) =&gt; { @@ -57,6 +57,13 @@ const localeChange = (show: boolean) =&gt; {
57 appStore.setLocale(show) 57 appStore.setLocale(show)
58 } 58 }
59 59
  60 +// 消息图标
  61 +const message = ref(appStore.getMessage)
  62 +
  63 +const messageChange = (show: boolean) => {
  64 + appStore.setMessage(show)
  65 +}
  66 +
60 // 标签页 67 // 标签页
61 const tagsView = ref(appStore.getTagsView) 68 const tagsView = ref(appStore.getTagsView)
62 69
@@ -165,6 +172,11 @@ watch( @@ -165,6 +172,11 @@ watch(
165 </div> 172 </div>
166 173
167 <div class="flex justify-between items-center"> 174 <div class="flex justify-between items-center">
  175 + <span class="text-14px">{{ t('setting.messageIcon') }}</span>
  176 + <ElSwitch v-model="message" @change="messageChange" />
  177 + </div>
  178 +
  179 + <div class="flex justify-between items-center">
168 <span class="text-14px">{{ t('setting.tagsView') }}</span> 180 <span class="text-14px">{{ t('setting.tagsView') }}</span>
169 <ElSwitch v-model="tagsView" @change="tagsViewChange" /> 181 <ElSwitch v-model="tagsView" @change="tagsViewChange" />
170 </div> 182 </div>
yudao-ui-admin-vue3/src/layout/components/ToolHeader.vue
1 <script lang="tsx"> 1 <script lang="tsx">
2 import { defineComponent, computed } from 'vue' 2 import { defineComponent, computed } from 'vue'
  3 +import { Message } from '@/layout/components//Message'
3 import { Collapse } from '@/layout/components/Collapse' 4 import { Collapse } from '@/layout/components/Collapse'
4 -import { LocaleDropdown } from '@/layout/components/LocaleDropdown'  
5 -import { SizeDropdown } from '@/layout/components/SizeDropdown'  
6 import { UserInfo } from '@/layout/components/UserInfo' 5 import { UserInfo } from '@/layout/components/UserInfo'
7 import { Screenfull } from '@/layout/components/Screenfull' 6 import { Screenfull } from '@/layout/components/Screenfull'
8 import { Breadcrumb } from '@/layout/components/Breadcrumb' 7 import { Breadcrumb } from '@/layout/components/Breadcrumb'
  8 +import { SizeDropdown } from '@/layout/components/SizeDropdown'
  9 +import { LocaleDropdown } from '@/layout/components/LocaleDropdown'
9 import { useAppStore } from '@/store/modules/app' 10 import { useAppStore } from '@/store/modules/app'
10 import { useDesign } from '@/hooks/web/useDesign' 11 import { useDesign } from '@/hooks/web/useDesign'
11 12
@@ -33,6 +34,9 @@ const layout = computed(() =&gt; appStore.getLayout) @@ -33,6 +34,9 @@ const layout = computed(() =&gt; appStore.getLayout)
33 // 多语言图标 34 // 多语言图标
34 const locale = computed(() => appStore.getLocale) 35 const locale = computed(() => appStore.getLocale)
35 36
  37 +// 消息图标
  38 +const message = computed(() => appStore.getMessage)
  39 +
36 export default defineComponent({ 40 export default defineComponent({
37 name: 'ToolHeader', 41 name: 'ToolHeader',
38 setup() { 42 setup() {
@@ -66,6 +70,9 @@ export default defineComponent({ @@ -66,6 +70,9 @@ export default defineComponent({
66 color="var(--top-header-text-color)" 70 color="var(--top-header-text-color)"
67 ></LocaleDropdown> 71 ></LocaleDropdown>
68 ) : undefined} 72 ) : undefined}
  73 + {message.value ? (
  74 + <Message class="hover-trigger" color="var(--top-header-text-color)"></Message>
  75 + ) : undefined}
69 <UserInfo class="hover-trigger"></UserInfo> 76 <UserInfo class="hover-trigger"></UserInfo>
70 </div> 77 </div>
71 </div> 78 </div>
yudao-ui-admin-vue3/src/locales/en.ts
@@ -80,6 +80,7 @@ export default { @@ -80,6 +80,7 @@ export default {
80 screenfullIcon: 'Screenfull icon', 80 screenfullIcon: 'Screenfull icon',
81 sizeIcon: 'Size icon', 81 sizeIcon: 'Size icon',
82 localeIcon: 'Locale icon', 82 localeIcon: 'Locale icon',
  83 + messageIcon: 'Message icon',
83 tagsView: 'Tags view', 84 tagsView: 'Tags view',
84 logo: 'Logo', 85 logo: 'Logo',
85 greyMode: 'Grey mode', 86 greyMode: 'Grey mode',
@@ -426,5 +427,19 @@ export default { @@ -426,5 +427,19 @@ export default {
426 cfPwdMsg: 'Please Enter Confirm Password', 427 cfPwdMsg: 'Please Enter Confirm Password',
427 diffPwd: 'The Passwords Entered Twice No Match' 428 diffPwd: 'The Passwords Entered Twice No Match'
428 } 429 }
  430 + },
  431 + cropper: {
  432 + selectImage: 'Select Image',
  433 + uploadSuccess: 'Uploaded success!',
  434 + modalTitle: 'Avatar upload',
  435 + okText: 'Confirm and upload',
  436 + btn_reset: 'Reset',
  437 + btn_rotate_left: 'Counterclockwise rotation',
  438 + btn_rotate_right: 'Clockwise rotation',
  439 + btn_scale_x: 'Flip horizontal',
  440 + btn_scale_y: 'Flip vertical',
  441 + btn_zoom_in: 'Zoom in',
  442 + btn_zoom_out: 'Zoom out',
  443 + preview: 'Preivew'
429 } 444 }
430 } 445 }
yudao-ui-admin-vue3/src/locales/zh-CN.ts
@@ -80,6 +80,7 @@ export default { @@ -80,6 +80,7 @@ export default {
80 screenfullIcon: '全屏图标', 80 screenfullIcon: '全屏图标',
81 sizeIcon: '尺寸图标', 81 sizeIcon: '尺寸图标',
82 localeIcon: '多语言图标', 82 localeIcon: '多语言图标',
  83 + messageIcon: '消息图标',
83 tagsView: '标签页', 84 tagsView: '标签页',
84 logo: '标志', 85 logo: '标志',
85 greyMode: '灰色模式', 86 greyMode: '灰色模式',
@@ -419,5 +420,19 @@ export default { @@ -419,5 +420,19 @@ export default {
419 pwdRules: '长度在 6 到 20 个字符', 420 pwdRules: '长度在 6 到 20 个字符',
420 diffPwd: '两次输入密码不一致' 421 diffPwd: '两次输入密码不一致'
421 } 422 }
  423 + },
  424 + cropper: {
  425 + selectImage: '选择图片',
  426 + uploadSuccess: '上传成功',
  427 + modalTitle: '头像上传',
  428 + okText: '确认并上传',
  429 + btn_reset: '重置',
  430 + btn_rotate_left: '逆时针旋转',
  431 + btn_rotate_right: '顺时针旋转',
  432 + btn_scale_x: '水平翻转',
  433 + btn_scale_y: '垂直翻转',
  434 + btn_zoom_in: '放大',
  435 + btn_zoom_out: '缩小',
  436 + preview: '预览'
422 } 437 }
423 } 438 }
yudao-ui-admin-vue3/src/router/modules/remaining.ts
@@ -85,7 +85,7 @@ const remainingRouter: AppRouteRecordRaw[] = [ @@ -85,7 +85,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
85 meta: { 85 meta: {
86 canTo: true, 86 canTo: true,
87 hidden: true, 87 hidden: true,
88 - noTagsView: true, 88 + noTagsView: false,
89 icon: 'ep:user', 89 icon: 'ep:user',
90 title: t('common.profile') 90 title: t('common.profile')
91 } 91 }
yudao-ui-admin-vue3/src/store/modules/app.ts
@@ -18,6 +18,7 @@ interface AppState { @@ -18,6 +18,7 @@ interface AppState {
18 screenfull: boolean 18 screenfull: boolean
19 size: boolean 19 size: boolean
20 locale: boolean 20 locale: boolean
  21 + message: boolean
21 tagsView: boolean 22 tagsView: boolean
22 tagsViewIcon: boolean 23 tagsViewIcon: boolean
23 logo: boolean 24 logo: boolean
@@ -53,6 +54,7 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -53,6 +54,7 @@ export const useAppStore = defineStore(&#39;app&#39;, {
53 screenfull: true, // 全屏图标 54 screenfull: true, // 全屏图标
54 size: true, // 尺寸图标 55 size: true, // 尺寸图标
55 locale: true, // 多语言图标 56 locale: true, // 多语言图标
  57 + message: true, // 消息图标
56 tagsView: true, // 标签页 58 tagsView: true, // 标签页
57 tagsViewIcon: true, // 是否显示标签图标 59 tagsViewIcon: true, // 是否显示标签图标
58 logo: true, // logo 60 logo: true, // logo
@@ -121,6 +123,9 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -121,6 +123,9 @@ export const useAppStore = defineStore(&#39;app&#39;, {
121 getLocale(): boolean { 123 getLocale(): boolean {
122 return this.locale 124 return this.locale
123 }, 125 },
  126 + getMessage(): boolean {
  127 + return this.message
  128 + },
124 getTagsView(): boolean { 129 getTagsView(): boolean {
125 return this.tagsView 130 return this.tagsView
126 }, 131 },
@@ -195,6 +200,9 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -195,6 +200,9 @@ export const useAppStore = defineStore(&#39;app&#39;, {
195 setLocale(locale: boolean) { 200 setLocale(locale: boolean) {
196 this.locale = locale 201 this.locale = locale
197 }, 202 },
  203 + setMessage(message: boolean) {
  204 + this.message = message
  205 + },
198 setTagsView(tagsView: boolean) { 206 setTagsView(tagsView: boolean) {
199 this.tagsView = tagsView 207 this.tagsView = tagsView
200 }, 208 },
yudao-ui-admin-vue3/src/views/Profile/components/UserAvatar.vue
1 <template> 1 <template>
2 - <div class="user-info-head" @click="editCropper()">  
3 - <img :src="props.img" title="点击上传头像" class="img-circle img-lg" alt="" /> 2 + <div class="change-avatar">
  3 + <CropperAvatar
  4 + ref="cropperRef"
  5 + :value="avatar"
  6 + :showBtn="false"
  7 + @change="handelUpload"
  8 + :btnProps="{ preIcon: 'ant-design:cloud-upload-outlined' }"
  9 + width="120px"
  10 + />
4 </div> 11 </div>
5 - <el-dialog  
6 - v-model="dialogVisible"  
7 - title="编辑头像"  
8 - :mask-closable="false"  
9 - width="800px"  
10 - append-to-body  
11 - @opened="cropperVisible = true"  
12 - >  
13 - <el-row>  
14 - <el-col :xs="24" :md="12" :style="{ height: '350px' }">  
15 - <VueCropper  
16 - ref="cropper"  
17 - v-if="cropperVisible"  
18 - :img="options.img"  
19 - :info="true"  
20 - :infoTrue="options.infoTrue"  
21 - :autoCrop="options.autoCrop"  
22 - :autoCropWidth="options.autoCropWidth"  
23 - :autoCropHeight="options.autoCropHeight"  
24 - :fixedNumber="options.fixedNumber"  
25 - :fixedBox="options.fixedBox"  
26 - :centerBox="options.centerBox"  
27 - @real-time="realTime"  
28 - />  
29 - </el-col>  
30 - <el-col :xs="24" :md="12" :style="{ height: '350px' }">  
31 - <div  
32 - class="avatar-upload-preview"  
33 - :style="{  
34 - width: previews.w + 'px',  
35 - height: previews.h + 'px',  
36 - overflow: 'hidden',  
37 - margin: '5px'  
38 - }"  
39 - >  
40 - <div :style="previews.div">  
41 - <img :src="previews.url" :style="previews.img" style="!max-width: 100%" alt="" />  
42 - </div>  
43 - </div>  
44 - </el-col>  
45 - </el-row>  
46 - <template #footer>  
47 - <el-row>  
48 - <el-col :lg="2" :md="2">  
49 - <el-upload  
50 - action="#"  
51 - :http-request="requestUpload"  
52 - :show-file-list="false"  
53 - :before-upload="beforeUpload"  
54 - >  
55 - <el-button size="small">  
56 - <Icon icon="ep:upload-filled" class="mr-5px" />  
57 - 选择  
58 - </el-button>  
59 - </el-upload>  
60 - </el-col>  
61 - <el-col :lg="{ span: 1, offset: 2 }" :md="2">  
62 - <el-button size="small" @click="changeScale(1)">  
63 - <Icon icon="ep:zoom-in" class="mr-5px" />  
64 - </el-button>  
65 - </el-col>  
66 - <el-col :lg="{ span: 1, offset: 1 }" :md="2">  
67 - <el-button size="small" @click="changeScale(-1)">  
68 - <Icon icon="ep:zoom-out" class="mr-5px" />  
69 - </el-button>  
70 - </el-col>  
71 - <el-col :lg="{ span: 1, offset: 1 }" :md="2">  
72 - <el-button size="small" @click="rotateLeft()">  
73 - <Icon icon="ep:arrow-left-bold" class="mr-5px" />  
74 - </el-button>  
75 - </el-col>  
76 - <el-col :lg="{ span: 1, offset: 1 }" :md="2">  
77 - <el-button size="small" @click="rotateRight()">  
78 - <Icon icon="ep:arrow-right-bold" class="mr-5px" />  
79 - </el-button>  
80 - </el-col>  
81 - <el-col :lg="{ span: 2, offset: 6 }" :md="2">  
82 - <el-button size="small" type="primary" @click="uploadImg()">提 交</el-button>  
83 - </el-col>  
84 - </el-row>  
85 - </template>  
86 - </el-dialog>  
87 </template> 12 </template>
88 <script setup lang="ts"> 13 <script setup lang="ts">
89 -import { ref, reactive, watch, Ref, UnwrapNestedRefs } from 'vue'  
90 -import VueCropper from 'vue-cropper/lib/vue-cropper.vue'  
91 -import 'vue-cropper/dist/index.css'  
92 -import { ElRow, ElCol, ElUpload, ElMessage, ElDialog } from 'element-plus' 14 +import { computed, ref } from 'vue'
93 import { propTypes } from '@/utils/propTypes' 15 import { propTypes } from '@/utils/propTypes'
  16 +import { CropperAvatar } from '@/components/Cropper'
94 import { uploadAvatarApi } from '@/api/system/user/profile' 17 import { uploadAvatarApi } from '@/api/system/user/profile'
95 -  
96 -const cropper = ref()  
97 -const dialogVisible = ref(false)  
98 -const cropperVisible = ref(false)  
99 const props = defineProps({ 18 const props = defineProps({
100 img: propTypes.string.def('') 19 img: propTypes.string.def('')
101 }) 20 })
102 -interface Options {  
103 - img: string | ArrayBuffer | null // 裁剪图片的地址  
104 - info: true // 裁剪框的大小信息  
105 - outputSize: number // 裁剪生成图片的质量 [1至0.1]  
106 - outputType: 'jpeg' // 裁剪生成图片的格式  
107 - canScale: boolean // 图片是否允许滚轮缩放  
108 - autoCrop: boolean // 是否默认生成截图框  
109 - autoCropWidth: number // 默认生成截图框宽度  
110 - autoCropHeight: number // 默认生成截图框高度  
111 - fixedBox: boolean // 固定截图框大小 不允许改变  
112 - fixed: boolean // 是否开启截图框宽高固定比例  
113 - fixedNumber: Array<number> // 截图框的宽高比例 需要配合centerBox一起使用才能生效  
114 - full: boolean // 是否输出原图比例的截图  
115 - canMoveBox: boolean // 截图框能否拖动  
116 - original: boolean // 上传图片按照原始比例渲染  
117 - centerBox: boolean // 截图框是否被限制在图片里面  
118 - infoTrue: boolean // true 为展示真实输出图片宽高 false 展示看到的截图框宽高  
119 -}  
120 -const options: UnwrapNestedRefs<Options> = reactive({  
121 - img: '', // 需要剪裁的图片  
122 - autoCrop: true, // 是否默认生成截图框  
123 - autoCropWidth: 200, // 默认生成截图框的宽度  
124 - autoCropHeight: 200, // 默认生成截图框的长度  
125 - fixedBox: false, // 是否固定截图框的大小 不允许改变  
126 - info: true, // 裁剪框的大小信息  
127 - outputSize: 1, // 裁剪生成图片的质量 [1至0.1]  
128 - outputType: 'jpeg', // 裁剪生成图片的格式  
129 - canScale: false, // 图片是否允许滚轮缩放  
130 - fixed: true, // 是否开启截图框宽高固定比例  
131 - fixedNumber: [1, 1], // 截图框的宽高比例 需要配合centerBox一起使用才能生效  
132 - full: true, // 是否输出原图比例的截图  
133 - canMoveBox: false, // 截图框能否拖动  
134 - original: false, // 上传图片按照原始比例渲染  
135 - centerBox: true, // 截图框是否被限制在图片里面  
136 - infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高 21 +const avatar = computed(() => {
  22 + return props.img
137 }) 23 })
138 -const previews: Ref<any> = ref({})  
139 -/** 编辑头像 */  
140 -const editCropper = () => {  
141 - dialogVisible.value = true  
142 -}  
143 -/** 向左旋转 */  
144 -const rotateLeft = () => {  
145 - cropper.value.rotateLeft()  
146 -}  
147 -/** 向右旋转 */  
148 -const rotateRight = () => {  
149 - cropper.value.rotateRight()  
150 -}  
151 -/** 图片缩放 */  
152 -const changeScale = (num: number) => {  
153 - num = num || 1  
154 - cropper.value.changeScale(num)  
155 -}  
156 -// 覆盖默认的上传行为  
157 -const requestUpload: any = () => {}  
158 -/** 上传预处理 */  
159 -const beforeUpload = (file: Blob) => {  
160 - if (file.type.indexOf('image/') == -1) {  
161 - ElMessage('文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。')  
162 - } else {  
163 - const reader = new FileReader()  
164 - // 转化为base64  
165 - reader.readAsDataURL(file)  
166 - reader.onload = () => {  
167 - if (reader.result) {  
168 - // 获取到需要剪裁的图片 展示到剪裁框中  
169 - options.img = reader.result as string  
170 - }  
171 - return false  
172 - }  
173 - }  
174 -}  
175 -/** 上传图片 */  
176 -const uploadImg = () => {  
177 - cropper.value.getCropBlob((data: any) => {  
178 - let formData = new FormData()  
179 - formData.append('avatarFile', data)  
180 - uploadAvatarApi(formData).then((res) => {  
181 - options.img = res  
182 - window.location.reload()  
183 - })  
184 - dialogVisible.value = false  
185 - cropperVisible.value = false  
186 - })  
187 -}  
188 -/** 实时预览 */  
189 -const realTime = (data: any) => {  
190 - previews.value = data 24 +
  25 +const cropperRef = ref()
  26 +const handelUpload = async ({ data }) => {
  27 + await uploadAvatarApi({ avatarFile: data })
  28 + cropperRef.value.close()
191 } 29 }
192 -watch(  
193 - () => props.img,  
194 - () => {  
195 - if (props.img) {  
196 - options.img = props.img  
197 - previews.value.img = props.img  
198 - previews.value.url = props.img  
199 - }  
200 - }  
201 -)  
202 </script> 30 </script>
203 31
204 -<style scoped>  
205 -.user-info-head {  
206 - position: relative;  
207 - display: inline-block;  
208 -}  
209 -.img-circle {  
210 - border-radius: 50%;  
211 -}  
212 -.img-lg {  
213 - width: 120px;  
214 - height: 120px;  
215 -}  
216 -.avatar-upload-preview {  
217 - position: absolute;  
218 - top: 50%;  
219 - -webkit-transform: translate(50%, -50%);  
220 - transform: translate(50%, -50%);  
221 - width: 200px;  
222 - height: 200px;  
223 - border-radius: 50%;  
224 - -webkit-box-shadow: 0 0 4px #ccc;  
225 - box-shadow: 0 0 4px #ccc;  
226 - overflow: hidden;  
227 -}  
228 -.user-info-head:hover:after {  
229 - content: '+';  
230 - position: absolute;  
231 - left: 0;  
232 - right: 0;  
233 - top: 0;  
234 - bottom: 0;  
235 - color: #eee;  
236 - background: rgba(0, 0, 0, 0.5);  
237 - font-size: 24px;  
238 - font-style: normal;  
239 - -webkit-font-smoothing: antialiased;  
240 - -moz-osx-font-smoothing: grayscale;  
241 - cursor: pointer;  
242 - line-height: 110px;  
243 - border-radius: 50%; 32 +<style scoped lang="scss">
  33 +.change-avatar {
  34 + img {
  35 + display: block;
  36 + margin-bottom: 15px;
  37 + border-radius: 50%;
  38 + }
244 } 39 }
245 </style> 40 </style>
yudao-ui-admin-vue3/src/views/infra/codegen/components/CloumInfoForm.vue
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 <el-option label="Integer" value="Integer" /> 22 <el-option label="Integer" value="Integer" />
23 <el-option label="Double" value="Double" /> 23 <el-option label="Double" value="Double" />
24 <el-option label="BigDecimal" value="BigDecimal" /> 24 <el-option label="BigDecimal" value="BigDecimal" />
25 - <el-option label="Date" value="Date" /> 25 + <el-option label="LocalDateTime" value="LocalDateTime" />
26 <el-option label="Boolean" value="Boolean" /> 26 <el-option label="Boolean" value="Boolean" />
27 </el-select> 27 </el-select>
28 </template> 28 </template>
yudao-ui-admin-vue3/src/views/system/menu/index.vue
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 </template> 90 </template>
91 <template v-if="menuForm.type === 2"> 91 <template v-if="menuForm.type === 2">
92 <el-col :span="16"> 92 <el-col :span="16">
93 - <el-form-item label="路由地址" prop="component"> 93 + <el-form-item label="组件地址" prop="component">
94 <el-input v-model="menuForm.component" placeholder="请输入组件地址" clearable /> 94 <el-input v-model="menuForm.component" placeholder="请输入组件地址" clearable />
95 </el-form-item> 95 </el-form-item>
96 </el-col> 96 </el-col>
yudao-ui-admin/src/views/infra/codegen/editTable.vue
@@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
31 <el-option label="Integer" value="Integer" /> 31 <el-option label="Integer" value="Integer" />
32 <el-option label="Double" value="Double" /> 32 <el-option label="Double" value="Double" />
33 <el-option label="BigDecimal" value="BigDecimal" /> 33 <el-option label="BigDecimal" value="BigDecimal" />
34 - <el-option label="Date" value="Date" /> 34 + <el-option label="LocalDateTime" value="LocalDateTime" />
35 <el-option label="Boolean" value="Boolean" /> 35 <el-option label="Boolean" value="Boolean" />
36 </el-select> 36 </el-select>
37 </template> 37 </template>