Commit 893b6cf4f235a2cb54e1b2c940a8b28b722d6b69
Committed by
Gitee
!338 vue3 重构头像上传
Merge pull request !338 from xingyu/dev
Showing
26 changed files
with
948 additions
and
369 deletions
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 | | 登录 & 首页 |  |  |  | | 246 | | 登录 & 首页 |  |  |  | |
| 247 | -| 用户 & 应用 |  |  |  | | 247 | +| 用户 & 应用 |  |  |  | |
| 248 | | 租户 & 套餐 |  |  | - | | 248 | | 租户 & 套餐 |  |  | - | |
| 249 | | 部门 & 岗位 |  |  | - | | 249 | | 部门 & 岗位 |  |  | - | |
| 250 | | 菜单 & 角色 |  |  | - | | 250 | | 菜单 & 角色 |  |  | - | |
| 251 | | 审计日志 |  |  | - | | 251 | | 审计日志 |  |  | - | |
| 252 | | 短信 |  |  |  | | 252 | | 短信 |  |  |  | |
| 253 | -| 字典 & 敏感词 |  |  |  | | 253 | +| 字典 & 敏感词 |  |  |  | |
| 254 | | 错误码 & 通知 |  |  | - | | 254 | | 错误码 & 通知 |  |  | - | |
| 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) => { | @@ -73,5 +73,5 @@ export const updateUserPwdApi = (oldPassword: string, newPassword: string) => { | ||
| 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
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
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
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 () => { | @@ -122,6 +122,8 @@ const copyConfig = async () => { | ||
| 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) => { | @@ -57,6 +57,13 @@ const localeChange = (show: boolean) => { | ||
| 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(() => appStore.getLayout) | @@ -33,6 +34,9 @@ const layout = computed(() => 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('app', { | @@ -53,6 +54,7 @@ export const useAppStore = defineStore('app', { | ||
| 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('app', { | @@ -121,6 +123,9 @@ export const useAppStore = defineStore('app', { | ||
| 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('app', { | @@ -195,6 +200,9 @@ export const useAppStore = defineStore('app', { | ||
| 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> |