mirror of
				https://gitee.com/hhyykk/ipms-sjy-ui.git
				synced 2025-11-01 02:38:44 +08:00 
			
		
		
		
	Merge remote-tracking branch 'yudao/dev' into dev-to-dev
This commit is contained in:
		
							
								
								
									
										15
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								README.md
									
									
									
									
									
								
							| @@ -11,6 +11,7 @@ | |||||||
|  |  | ||||||
| * nodejs > 16.0.0 && pnpm > 7.30.0 | * nodejs > 16.0.0 && pnpm > 7.30.0 | ||||||
| * 演示地址【Vue3 + element-plus】:<http://dashboard-vue3.yudao.iocoder.cn> | * 演示地址【Vue3 + element-plus】:<http://dashboard-vue3.yudao.iocoder.cn> | ||||||
|  | * 演示地址【Vue3 + vben(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn> | ||||||
| * 演示地址【Vue2 + element-ui】:<http://dashboard.yudao.iocoder.cn> | * 演示地址【Vue2 + element-ui】:<http://dashboard.yudao.iocoder.cn> | ||||||
| * 启动文档:<https://doc.iocoder.cn/quick-start/> | * 启动文档:<https://doc.iocoder.cn/quick-start/> | ||||||
| * 视频教程:<https://doc.iocoder.cn/video/> | * 视频教程:<https://doc.iocoder.cn/video/> | ||||||
| @@ -19,8 +20,8 @@ | |||||||
|  |  | ||||||
| **芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 | **芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 | ||||||
|  |  | ||||||
| * 采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin)  | * 采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin) 实现 | ||||||
| * 改换saas,自动引入等功能 [vue-element-plus-admin](https://gitee.com/yudaocode/vue-element-plus-admin) | * 改换 saas,自动引入等功能 | ||||||
| * 使用 Element Plus 免费开源的中后台模版,具备如下特性: | * 使用 Element Plus 免费开源的中后台模版,具备如下特性: | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -38,11 +39,11 @@ | |||||||
| | 框架                                                                   | 说明               | 版本     | | | 框架                                                                   | 说明               | 版本     | | ||||||
| |----------------------------------------------------------------------|------------------|--------| | |----------------------------------------------------------------------|------------------|--------| | ||||||
| | [Vue](https://staging-cn.vuejs.org/)                                 | Vue 框架           | 3.2.47 | | | [Vue](https://staging-cn.vuejs.org/)                                 | Vue 框架           | 3.2.47 | | ||||||
| | [Vite](https://cn.vitejs.dev//)                                      | 开发与构建工具          | 4.1.4  | | | [Vite](https://cn.vitejs.dev//)                                      | 开发与构建工具          | 4.3.1  | | ||||||
| | [Element Plus](https://element-plus.org/zh-CN/)                      | Element Plus     | 2.2.34 | | | [Element Plus](https://element-plus.org/zh-CN/)                      | Element Plus     | 2.3.3 | | ||||||
| | [TypeScript](https://www.typescriptlang.org/docs/)                   | JavaScript 的超集   | 4.9.5  | | | [TypeScript](https://www.typescriptlang.org/docs/)                   | JavaScript 的超集   | 5.0.4  | | ||||||
| | [pinia](https://pinia.vuejs.org/)                                    | Vue 存储库 替代 vuex5 | 2.0.33 | | | [pinia](https://pinia.vuejs.org/)                                    | Vue 存储库 替代 vuex5 | 2.0.35 | | ||||||
| | [vueuse](https://vueuse.org/)                                        | 常用工具集            | 9.13.0 | | | [vueuse](https://vueuse.org/)                                        | 常用工具集            | 10.1.0 | | ||||||
| | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化              | 9.2.2  | | | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化              | 9.2.2  | | ||||||
| | [vue-router](https://router.vuejs.org/)                              | Vue 路由           | 4.1.6  | | | [vue-router](https://router.vuejs.org/)                              | Vue 路由           | 4.1.6  | | ||||||
| | [windicss](https://cn.windicss.org/)                                 | 下一代工具优先的 CSS 框架  | 3.5.6  | | | [windicss](https://cn.windicss.org/)                                 | 下一代工具优先的 CSS 框架  | 3.5.6  | | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ const include = [ | |||||||
|   'cropperjs', |   'cropperjs', | ||||||
|   'lodash-es', |   'lodash-es', | ||||||
|   'nprogress', |   'nprogress', | ||||||
|   'animate.css', |  | ||||||
|   'web-storage-cache', |   'web-storage-cache', | ||||||
|   '@iconify/iconify', |   '@iconify/iconify', | ||||||
|   '@vueuse/core', |   '@vueuse/core', | ||||||
| @@ -33,38 +32,58 @@ const include = [ | |||||||
|   'element-plus/es', |   'element-plus/es', | ||||||
|   'element-plus/es/locale/lang/zh-cn', |   'element-plus/es/locale/lang/zh-cn', | ||||||
|   'element-plus/es/locale/lang/en', |   'element-plus/es/locale/lang/en', | ||||||
|   'element-plus/es/components/backtop/style/index', |   'element-plus/es/components/backtop/style/css', | ||||||
|   'element-plus/es/components/form/style/index', |   'element-plus/es/components/form/style/css', | ||||||
|   'element-plus/es/components/radio-group/style/index', |   'element-plus/es/components/radio-group/style/css', | ||||||
|   'element-plus/es/components/radio/style/index', |   'element-plus/es/components/radio/style/css', | ||||||
|   'element-plus/es/components/checkbox/style/index', |   'element-plus/es/components/checkbox/style/css', | ||||||
|   'element-plus/es/components/checkbox-group/style/index', |   'element-plus/es/components/checkbox-group/style/css', | ||||||
|   'element-plus/es/components/switch/style/index', |   'element-plus/es/components/switch/style/css', | ||||||
|   'element-plus/es/components/time-picker/style/index', |   'element-plus/es/components/time-picker/style/css', | ||||||
|   'element-plus/es/components/date-picker/style/index', |   'element-plus/es/components/date-picker/style/css', | ||||||
|   'element-plus/es/components/col/style/index', |   'element-plus/es/components/descriptions/style/css', | ||||||
|   'element-plus/es/components/form-item/style/index', |   'element-plus/es/components/descriptions-item/style/css', | ||||||
|   'element-plus/es/components/alert/style/index', |   'element-plus/es/components/link/style/css', | ||||||
|   'element-plus/es/components/breadcrumb/style/index', |   'element-plus/es/components/tooltip/style/css', | ||||||
|   'element-plus/es/components/select/style/index', |   'element-plus/es/components/drawer/style/css', | ||||||
|   'element-plus/es/components/input/style/index', |   'element-plus/es/components/dialog/style/css', | ||||||
|   'element-plus/es/components/breadcrumb-item/style/index', |   'element-plus/es/components/checkbox-button/style/css', | ||||||
|   'element-plus/es/components/tag/style/index', |   'element-plus/es/components/option-group/style/css', | ||||||
|   'element-plus/es/components/pagination/style/index', |   'element-plus/es/components/radio-button/style/css', | ||||||
|   'element-plus/es/components/table/style/index', |   'element-plus/es/components/cascader/style/css', | ||||||
|   'element-plus/es/components/table-column/style/index', |   'element-plus/es/components/color-picker/style/css', | ||||||
|   'element-plus/es/components/card/style/index', |   'element-plus/es/components/input-number/style/css', | ||||||
|   'element-plus/es/components/row/style/index', |   'element-plus/es/components/rate/style/css', | ||||||
|   'element-plus/es/components/button/style/index', |   'element-plus/es/components/select-v2/style/css', | ||||||
|   'element-plus/es/components/menu/style/index', |   'element-plus/es/components/tree-select/style/css', | ||||||
|   'element-plus/es/components/sub-menu/style/index', |   'element-plus/es/components/slider/style/css', | ||||||
|   'element-plus/es/components/menu-item/style/index', |   'element-plus/es/components/time-select/style/css', | ||||||
|   'element-plus/es/components/option/style/index', |   'element-plus/es/components/autocomplete/style/css', | ||||||
|   'element-plus/es/components/dropdown/style/index', |   'element-plus/es/components/image-viewer/style/css', | ||||||
|   'element-plus/es/components/dropdown-menu/style/index', |   'element-plus/es/components/upload/style/css', | ||||||
|   'element-plus/es/components/dropdown-item/style/index', |   'element-plus/es/components/col/style/css', | ||||||
|   'element-plus/es/components/skeleton/style/index', |   'element-plus/es/components/form-item/style/css', | ||||||
|  |   'element-plus/es/components/alert/style/css', | ||||||
|  |   'element-plus/es/components/breadcrumb/style/css', | ||||||
|  |   'element-plus/es/components/select/style/css', | ||||||
|  |   'element-plus/es/components/input/style/css', | ||||||
|  |   'element-plus/es/components/breadcrumb-item/style/css', | ||||||
|  |   'element-plus/es/components/tag/style/css', | ||||||
|  |   'element-plus/es/components/pagination/style/css', | ||||||
|  |   'element-plus/es/components/table/style/css', | ||||||
|  |   'element-plus/es/components/table-v2/style/css', | ||||||
|  |   'element-plus/es/components/table-column/style/css', | ||||||
|  |   'element-plus/es/components/card/style/css', | ||||||
|  |   'element-plus/es/components/row/style/css', | ||||||
|  |   'element-plus/es/components/button/style/css', | ||||||
|  |   'element-plus/es/components/menu/style/css', | ||||||
|  |   'element-plus/es/components/sub-menu/style/css', | ||||||
|  |   'element-plus/es/components/menu-item/style/css', | ||||||
|  |   'element-plus/es/components/option/style/css', | ||||||
|  |   'element-plus/es/components/dropdown/style/css', | ||||||
|  |   'element-plus/es/components/dropdown-menu/style/css', | ||||||
|  |   'element-plus/es/components/dropdown-item/style/css', | ||||||
|  |   'element-plus/es/components/skeleton/style/css', | ||||||
|   'element-plus/es/components/skeleton/style/css', |   'element-plus/es/components/skeleton/style/css', | ||||||
|   'element-plus/es/components/backtop/style/css', |   'element-plus/es/components/backtop/style/css', | ||||||
|   'element-plus/es/components/menu/style/css', |   'element-plus/es/components/menu/style/css', | ||||||
| @@ -78,20 +97,12 @@ const include = [ | |||||||
|   'element-plus/es/components/breadcrumb/style/css', |   'element-plus/es/components/breadcrumb/style/css', | ||||||
|   'element-plus/es/components/breadcrumb-item/style/css', |   'element-plus/es/components/breadcrumb-item/style/css', | ||||||
|   'element-plus/es/components/image/style/css', |   'element-plus/es/components/image/style/css', | ||||||
|   'element-plus/es/components/tag/style/css', |   'element-plus/es/components/collapse-transition/style/css', | ||||||
|   'element-plus/es/components/dialog/style/css', |   'element-plus/es/components/timeline/style/css', | ||||||
|   'element-plus/es/components/form/style/css', |   'element-plus/es/components/timeline-item/style/css', | ||||||
|   'element-plus/es/components/form-item/style/css', |   'element-plus/es/components/collapse/style/css', | ||||||
|   'element-plus/es/components/card/style/css', |   'element-plus/es/components/collapse-item/style/css', | ||||||
|   'element-plus/es/components/tooltip/style/css', |   'element-plus/es/components/button-group/style/css' | ||||||
|   'element-plus/es/components/radio-group/style/css', |  | ||||||
|   'element-plus/es/components/radio/style/css', |  | ||||||
|   'element-plus/es/components/input-number/style/css', |  | ||||||
|   'element-plus/es/components/tree-select/style/css', |  | ||||||
|   'element-plus/es/components/drawer/style/css', |  | ||||||
|   'element-plus/es/components/image-viewer/style/css', |  | ||||||
|   'element-plus/es/components/upload/style/css', |  | ||||||
|   'element-plus/es/components/switch/style/css' |  | ||||||
| ] | ] | ||||||
|  |  | ||||||
| const exclude = ['@iconify/json'] | const exclude = ['@iconify/json'] | ||||||
|   | |||||||
							
								
								
									
										67
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								package.json
									
									
									
									
									
								
							| @@ -33,12 +33,12 @@ | |||||||
|     "@form-create/element-ui": "^3.1.17", |     "@form-create/element-ui": "^3.1.17", | ||||||
|     "@iconify/iconify": "^3.1.0", |     "@iconify/iconify": "^3.1.0", | ||||||
|     "@videojs-player/vue": "^1.0.0", |     "@videojs-player/vue": "^1.0.0", | ||||||
|     "@vueuse/core": "^9.13.0", |     "@vueuse/core": "^10.1.0", | ||||||
|     "@wangeditor/editor": "^5.1.23", |     "@wangeditor/editor": "^5.1.23", | ||||||
|     "@wangeditor/editor-for-vue": "^5.1.10", |     "@wangeditor/editor-for-vue": "^5.1.10", | ||||||
|     "@zxcvbn-ts/core": "^2.2.1", |     "@zxcvbn-ts/core": "^2.2.1", | ||||||
|     "animate.css": "^4.1.1", |     "animate.css": "^4.1.1", | ||||||
|     "axios": "^1.3.5", |     "axios": "^1.3.6", | ||||||
|     "benz-amr-recorder": "^1.1.5", |     "benz-amr-recorder": "^1.1.5", | ||||||
|     "bpmn-js-token-simulation": "^0.10.0", |     "bpmn-js-token-simulation": "^0.10.0", | ||||||
|     "camunda-bpmn-moddle": "^7.0.1", |     "camunda-bpmn-moddle": "^7.0.1", | ||||||
| @@ -46,19 +46,19 @@ | |||||||
|     "crypto-js": "^4.1.1", |     "crypto-js": "^4.1.1", | ||||||
|     "dayjs": "^1.11.7", |     "dayjs": "^1.11.7", | ||||||
|     "diagram-js": "^11.6.0", |     "diagram-js": "^11.6.0", | ||||||
|     "echarts": "^5.4.1", |     "echarts": "^5.4.2", | ||||||
|     "echarts-wordcloud": "^2.1.0", |     "echarts-wordcloud": "^2.1.0", | ||||||
|     "element-plus": "2.3.3", |     "element-plus": "2.3.3", | ||||||
|     "fast-xml-parser": "^4.1.3", |     "fast-xml-parser": "^4.2.2", | ||||||
|     "highlight.js": "^11.7.0", |     "highlight.js": "^11.7.0", | ||||||
|     "intro.js": "^7.0.1", |     "intro.js": "^7.0.1", | ||||||
|     "jsencrypt": "^3.3.2", |     "jsencrypt": "^3.3.2", | ||||||
|     "lodash-es": "^4.17.21", |     "lodash-es": "^4.17.21", | ||||||
|     "min-dash": "^4.0.0", |     "min-dash": "^4.1.0", | ||||||
|     "mitt": "^3.0.0", |     "mitt": "^3.0.0", | ||||||
|     "nprogress": "^0.2.0", |     "nprogress": "^0.2.0", | ||||||
|     "pinia": "^2.0.34", |     "pinia": "^2.0.35", | ||||||
|     "qrcode": "^1.5.1", |     "qrcode": "^1.5.3", | ||||||
|     "qs": "^6.11.1", |     "qs": "^6.11.1", | ||||||
|     "steady-xml": "^0.1.0", |     "steady-xml": "^0.1.0", | ||||||
|     "url": "^0.11.0", |     "url": "^0.11.0", | ||||||
| @@ -73,61 +73,60 @@ | |||||||
|     "xml-js": "^1.6.11" |     "xml-js": "^1.6.11" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@commitlint/cli": "^17.5.0", |     "@commitlint/cli": "^17.6.1", | ||||||
|     "@commitlint/config-conventional": "^17.4.4", |     "@commitlint/config-conventional": "^17.6.1", | ||||||
|     "@iconify/json": "^2.2.38", |     "@iconify/json": "^2.2.54", | ||||||
|     "@intlify/unplugin-vue-i18n": "^0.10.0", |     "@intlify/unplugin-vue-i18n": "^0.10.0", | ||||||
|     "@purge-icons/generated": "^0.9.0", |     "@purge-icons/generated": "^0.9.0", | ||||||
|     "@types/intro.js": "^5.1.1", |     "@types/intro.js": "^5.1.1", | ||||||
|     "@types/lodash-es": "^4.17.7", |     "@types/lodash-es": "^4.17.7", | ||||||
|     "@types/node": "^18.15.5", |     "@types/node": "^18.16.0", | ||||||
|     "@types/nprogress": "^0.2.0", |     "@types/nprogress": "^0.2.0", | ||||||
|     "@types/qrcode": "^1.5.0", |     "@types/qrcode": "^1.5.0", | ||||||
|     "@types/qs": "^6.9.7", |     "@types/qs": "^6.9.7", | ||||||
|     "@typescript-eslint/eslint-plugin": "^5.56.0", |     "@typescript-eslint/eslint-plugin": "^5.59.0", | ||||||
|     "@typescript-eslint/parser": "^5.56.0", |     "@typescript-eslint/parser": "^5.59.0", | ||||||
|     "@vitejs/plugin-legacy": "^4.0.2", |     "@vitejs/plugin-legacy": "^4.0.2", | ||||||
|     "@vitejs/plugin-vue": "^4.1.0", |     "@vitejs/plugin-vue": "^4.1.0", | ||||||
|     "@vitejs/plugin-vue-jsx": "^3.0.1", |     "@vitejs/plugin-vue-jsx": "^3.0.1", | ||||||
|     "autoprefixer": "^10.4.14", |     "autoprefixer": "^10.4.14", | ||||||
|     "bpmn-js": "^8.9.0", |     "bpmn-js": "^8.9.0", | ||||||
|     "bpmn-js-properties-panel": "^0.46.0", |     "bpmn-js-properties-panel": "^0.46.0", | ||||||
|     "consola": "^2.15.3", |     "consola": "^3.1.0", | ||||||
|     "eslint": "^8.36.0", |     "eslint": "^8.39.0", | ||||||
|     "eslint-config-prettier": "^8.8.0", |     "eslint-config-prettier": "^8.8.0", | ||||||
|     "eslint-define-config": "^1.17.0", |     "eslint-define-config": "^1.18.0", | ||||||
|     "eslint-plugin-prettier": "^4.2.1", |     "eslint-plugin-prettier": "^4.2.1", | ||||||
|     "eslint-plugin-vue": "^9.9.0", |     "eslint-plugin-vue": "^9.11.0", | ||||||
|     "lint-staged": "^13.2.0", |     "lint-staged": "^13.2.1", | ||||||
|     "postcss": "^8.4.21", |     "postcss": "^8.4.23", | ||||||
|     "postcss-html": "^1.5.0", |     "postcss-html": "^1.5.0", | ||||||
|     "postcss-scss": "^4.0.6", |     "postcss-scss": "^4.0.6", | ||||||
|     "prettier": "^2.8.6", |     "prettier": "^2.8.8", | ||||||
|     "rimraf": "^4.4.1", |     "rimraf": "^5.0.0", | ||||||
|     "rollup": "^3.20.0", |     "rollup": "^3.20.7", | ||||||
|     "sass": "^1.59.3", |     "sass": "^1.62.0", | ||||||
|     "stylelint": "^15.3.0", |     "stylelint": "^15.6.0", | ||||||
|     "stylelint-config-html": "^1.1.0", |     "stylelint-config-html": "^1.1.0", | ||||||
|     "stylelint-config-prettier": "^9.0.5", |     "stylelint-config-recommended": "^12.0.0", | ||||||
|     "stylelint-config-recommended": "^11.0.0", |     "stylelint-config-standard": "^33.0.0", | ||||||
|     "stylelint-config-standard": "^31.0.0", |  | ||||||
|     "stylelint-order": "^6.0.3", |     "stylelint-order": "^6.0.3", | ||||||
|     "terser": "^5.16.6", |     "terser": "^5.17.1", | ||||||
|     "typescript": "5.0.2", |     "typescript": "5.0.4", | ||||||
|     "unplugin-auto-import": "^0.15.1", |     "unplugin-auto-import": "^0.15.3", | ||||||
|     "unplugin-element-plus": "^0.7.0", |     "unplugin-element-plus": "^0.7.1", | ||||||
|     "unplugin-vue-components": "^0.24.1", |     "unplugin-vue-components": "^0.24.1", | ||||||
|     "vite": "4.2.1", |     "vite": "4.3.1", | ||||||
|     "vite-plugin-compression": "^0.5.1", |     "vite-plugin-compression": "^0.5.1", | ||||||
|     "vite-plugin-ejs": "^1.6.4", |     "vite-plugin-ejs": "^1.6.4", | ||||||
|     "vite-plugin-eslint": "^1.8.1", |     "vite-plugin-eslint": "^1.8.1", | ||||||
|     "vite-plugin-progress": "^0.0.6", |     "vite-plugin-progress": "^0.0.7", | ||||||
|     "vite-plugin-purge-icons": "^0.9.2", |     "vite-plugin-purge-icons": "^0.9.2", | ||||||
|     "vite-plugin-svg-icons": "^2.0.1", |     "vite-plugin-svg-icons": "^2.0.1", | ||||||
|     "vite-plugin-top-level-await": "^1.3.0", |     "vite-plugin-top-level-await": "^1.3.0", | ||||||
|     "vite-plugin-vue-setup-extend-plus": "^0.1.0", |     "vite-plugin-vue-setup-extend-plus": "^0.1.0", | ||||||
|     "vite-plugin-windicss": "^1.8.10", |     "vite-plugin-windicss": "^1.8.10", | ||||||
|     "vue-tsc": "^1.2.0", |     "vue-tsc": "^1.4.4", | ||||||
|     "windicss": "^3.5.6" |     "windicss": "^3.5.6" | ||||||
|   }, |   }, | ||||||
|   "engines": { |   "engines": { | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								src/api/mall/trade/delivery/express/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/api/mall/trade/delivery/express/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | import request from '@/config/axios' | ||||||
|  |  | ||||||
|  | export interface DeliveryExpressVO { | ||||||
|  |   id: number | ||||||
|  |   code: string | ||||||
|  |   name: string | ||||||
|  |   logo: string | ||||||
|  |   sort: number | ||||||
|  |   status: number | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 查询快递公司列表 | ||||||
|  | export const getDeliveryExpressPage = async (params: PageParam) => { | ||||||
|  |   return await request.get({ url: '/trade/delivery/express/page', params }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 查询快递公司详情 | ||||||
|  | export const getDeliveryExpress = async (id: number) => { | ||||||
|  |   return await request.get({ url: '/trade/delivery/express/get?id=' + id }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 新增快递公司 | ||||||
|  | export const createDeliveryExpress = async (data: DeliveryExpressVO) => { | ||||||
|  |   return await request.post({ url: '/trade/delivery/express/create', data }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 修改快递公司 | ||||||
|  | export const updateDeliveryExpress = async (data: DeliveryExpressVO) => { | ||||||
|  |   return await request.put({ url: '/trade/delivery/express/update', data }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除快递公司 | ||||||
|  | export const deleteDeliveryExpress = async (id: number) => { | ||||||
|  |   return await request.delete({ url: '/trade/delivery/express/delete?id=' + id }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出快递公司 Excel | ||||||
|  | export const exportDeliveryExpressApi = async (params) => { | ||||||
|  |   return await request.download({ url: '/trade/delivery/express/export-excel', params }) | ||||||
|  | } | ||||||
| @@ -39,7 +39,7 @@ export const updateNotifyTemplate = async (data: NotifyTemplateVO) => { | |||||||
| } | } | ||||||
|  |  | ||||||
| // 删除站内信模板 | // 删除站内信模板 | ||||||
| export const deleteNotifyTemplateApi = async (id: number) => { | export const deleteNotifyTemplate = async (id: number) => { | ||||||
|   return await request.delete({ url: '/system/notify-template/delete?id=' + id }) |   return await request.delete({ url: '/system/notify-template/delete?id=' + id }) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,6 +17,6 @@ export const getAccessTokenPage = (params: PageParam) => { | |||||||
| } | } | ||||||
|  |  | ||||||
| // 删除 token | // 删除 token | ||||||
| export const deleteAccessToken = (accessToken: number) => { | export const deleteAccessToken = (accessToken: string) => { | ||||||
|   return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) |   return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -87,7 +87,7 @@ | |||||||
|     <MyProcessViewer |     <MyProcessViewer | ||||||
|       key="designer" |       key="designer" | ||||||
|       v-model="bpmnXML" |       v-model="bpmnXML" | ||||||
|       :value="bpmnXML" |       :value="bpmnXML as any" | ||||||
|       v-bind="bpmnControlForm" |       v-bind="bpmnControlForm" | ||||||
|       :prefix="bpmnControlForm.prefix" |       :prefix="bpmnControlForm.prefix" | ||||||
|     /> |     /> | ||||||
|   | |||||||
| @@ -68,7 +68,7 @@ const formRules = reactive({ | |||||||
|   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }] |   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }] | ||||||
| }) | }) | ||||||
| const formRef = ref() // 表单 Ref | const formRef = ref() // 表单 Ref | ||||||
| const userList = ref([]) // 用户列表 | const userList = ref<any[]>([]) // 用户列表 | ||||||
|  |  | ||||||
| /** 打开弹窗 */ | /** 打开弹窗 */ | ||||||
| const open = async (type: string, id?: number) => { | const open = async (type: string, id?: number) => { | ||||||
|   | |||||||
| @@ -117,6 +117,7 @@ import { dateFormatter } from '@/utils/formatTime' | |||||||
| import * as UserGroupApi from '@/api/bpm/userGroup' | import * as UserGroupApi from '@/api/bpm/userGroup' | ||||||
| import * as UserApi from '@/api/system/user' | import * as UserApi from '@/api/system/user' | ||||||
| import UserGroupForm from './UserGroupForm.vue' | import UserGroupForm from './UserGroupForm.vue' | ||||||
|  | import { UserVO } from '@/api/system/user' | ||||||
| const message = useMessage() // 消息弹窗 | const message = useMessage() // 消息弹窗 | ||||||
| const { t } = useI18n() // 国际化 | const { t } = useI18n() // 国际化 | ||||||
|  |  | ||||||
| @@ -131,7 +132,7 @@ const queryParams = reactive({ | |||||||
|   createTime: [] |   createTime: [] | ||||||
| }) | }) | ||||||
| const queryFormRef = ref() // 搜索的表单 | const queryFormRef = ref() // 搜索的表单 | ||||||
| const userList = ref([]) // 用户列表 | const userList = ref<UserVO[]>([]) // 用户列表 | ||||||
|  |  | ||||||
| /** 查询列表 */ | /** 查询列表 */ | ||||||
| const getList = async () => { | const getList = async () => { | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|     <!-- 流程属性器,负责编辑每个流程节点的属性 --> |     <!-- 流程属性器,负责编辑每个流程节点的属性 --> | ||||||
|     <MyProcessPenal |     <MyProcessPenal | ||||||
|       key="penal" |       key="penal" | ||||||
|       :bpmnModeler="modeler" |       :bpmnModeler="modeler as any" | ||||||
|       :prefix="controlForm.prefix" |       :prefix="controlForm.prefix" | ||||||
|       class="process-panel" |       class="process-panel" | ||||||
|       :model="model" |       :model="model" | ||||||
|   | |||||||
| @@ -219,7 +219,7 @@ | |||||||
|     <MyProcessViewer |     <MyProcessViewer | ||||||
|       key="designer" |       key="designer" | ||||||
|       v-model="bpmnXML" |       v-model="bpmnXML" | ||||||
|       :value="bpmnXML" |       :value="bpmnXML as any" | ||||||
|       v-bind="bpmnControlForm" |       v-bind="bpmnControlForm" | ||||||
|       :prefix="bpmnControlForm.prefix" |       :prefix="bpmnControlForm.prefix" | ||||||
|     /> |     /> | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ const props = defineProps({ | |||||||
|   id: propTypes.number.def(undefined) |   id: propTypes.number.def(undefined) | ||||||
| }) | }) | ||||||
| const detailLoading = ref(false) // 表单的加载中 | const detailLoading = ref(false) // 表单的加载中 | ||||||
| const detailData = ref({}) // 详情数据 | const detailData = ref<any>({}) // 详情数据 | ||||||
| const queryId = query.id as unknown as number // 从 URL 传递过来的 id 编号 | const queryId = query.id as unknown as number // 从 URL 传递过来的 id 编号 | ||||||
|  |  | ||||||
| /** 获得数据 */ | /** 获得数据 */ | ||||||
|   | |||||||
| @@ -43,7 +43,7 @@ | |||||||
|       </el-col> |       </el-col> | ||||||
|     </el-card> |     </el-card> | ||||||
|     <!-- 流程图预览 --> |     <!-- 流程图预览 --> | ||||||
|     <ProcessInstanceBpmnViewer :bpmn-xml="bpmnXML" /> |     <ProcessInstanceBpmnViewer :bpmn-xml="bpmnXML as any" /> | ||||||
|   </ContentWrap> |   </ContentWrap> | ||||||
| </template> | </template> | ||||||
| <script setup lang="ts" name="BpmProcessInstanceCreate"> | <script setup lang="ts" name="BpmProcessInstanceCreate"> | ||||||
|   | |||||||
| @@ -33,6 +33,12 @@ | |||||||
| import FcDesigner from '@form-create/designer' | import FcDesigner from '@form-create/designer' | ||||||
| import { useClipboard } from '@vueuse/core' | import { useClipboard } from '@vueuse/core' | ||||||
| import { isString } from '@/utils/is' | import { isString } from '@/utils/is' | ||||||
|  |  | ||||||
|  | import hljs from 'highlight.js' // 导入代码高亮文件 | ||||||
|  | import 'highlight.js/styles/github.css' // 导入代码高亮样式 | ||||||
|  | import xml from 'highlight.js/lib/languages/java' | ||||||
|  | import json from 'highlight.js/lib/languages/json' | ||||||
|  |  | ||||||
| const { t } = useI18n() // 国际化 | const { t } = useI18n() // 国际化 | ||||||
| const message = useMessage() // 消息 | const message = useMessage() // 消息 | ||||||
|  |  | ||||||
| @@ -112,10 +118,6 @@ const copy = async (text: string) => { | |||||||
| /** | /** | ||||||
|  * 代码高亮 |  * 代码高亮 | ||||||
|  */ |  */ | ||||||
| import hljs from 'highlight.js' // 导入代码高亮文件 |  | ||||||
| import 'highlight.js/styles/github.css' // 导入代码高亮样式 |  | ||||||
| import xml from 'highlight.js/lib/languages/java' |  | ||||||
| import json from 'highlight.js/lib/languages/json' |  | ||||||
| const highlightedCode = (code) => { | const highlightedCode = (code) => { | ||||||
|   // 处理语言和代码 |   // 处理语言和代码 | ||||||
|   let language = 'json' |   let language = 'json' | ||||||
|   | |||||||
| @@ -59,6 +59,14 @@ import { useClipboard } from '@vueuse/core' | |||||||
| import { handleTree2 } from '@/utils/tree' | import { handleTree2 } from '@/utils/tree' | ||||||
| import * as CodegenApi from '@/api/infra/codegen' | import * as CodegenApi from '@/api/infra/codegen' | ||||||
|  |  | ||||||
|  | import hljs from 'highlight.js' // 导入代码高亮文件 | ||||||
|  | import 'highlight.js/styles/github.css' // 导入代码高亮样式 | ||||||
|  | import java from 'highlight.js/lib/languages/java' | ||||||
|  | import xml from 'highlight.js/lib/languages/java' | ||||||
|  | import javascript from 'highlight.js/lib/languages/javascript' | ||||||
|  | import sql from 'highlight.js/lib/languages/sql' | ||||||
|  | import typescript from 'highlight.js/lib/languages/typescript' | ||||||
|  |  | ||||||
| const { t } = useI18n() // 国际化 | const { t } = useI18n() // 国际化 | ||||||
| const message = useMessage() // 消息弹窗 | const message = useMessage() // 消息弹窗 | ||||||
|  |  | ||||||
| @@ -184,13 +192,6 @@ const copy = async (text: string) => { | |||||||
| /** | /** | ||||||
|  * 代码高亮 |  * 代码高亮 | ||||||
|  */ |  */ | ||||||
| import hljs from 'highlight.js' // 导入代码高亮文件 |  | ||||||
| import 'highlight.js/styles/github.css' // 导入代码高亮样式 |  | ||||||
| import java from 'highlight.js/lib/languages/java' |  | ||||||
| import xml from 'highlight.js/lib/languages/java' |  | ||||||
| import javascript from 'highlight.js/lib/languages/javascript' |  | ||||||
| import sql from 'highlight.js/lib/languages/sql' |  | ||||||
| import typescript from 'highlight.js/lib/languages/typescript' |  | ||||||
| const highlightedCode = (item) => { | const highlightedCode = (item) => { | ||||||
|   const language = item.filePath.substring(item.filePath.lastIndexOf('.') + 1) |   const language = item.filePath.substring(item.filePath.lastIndexOf('.') + 1) | ||||||
|   const result = hljs.highlight(language, item.code || '', true) |   const result = hljs.highlight(language, item.code || '', true) | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| <template> | <template> | ||||||
|   <doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" /> |   <doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" /> | ||||||
|   <doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" /> |   <doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" /> | ||||||
|  |  | ||||||
|   <el-scrollbar height="calc(100vh - 88px - 40px - 50px)"> |   <el-scrollbar height="calc(100vh - 88px - 40px - 50px)"> | ||||||
|     <el-row> |     <el-row> | ||||||
|       <!-- 基本信息 --> |       <!-- 基本信息 --> | ||||||
| @@ -51,127 +50,224 @@ | |||||||
|       <!-- 命令统计 --> |       <!-- 命令统计 --> | ||||||
|       <el-col :span="12" class="mt-3"> |       <el-col :span="12" class="mt-3"> | ||||||
|         <el-card :gutter="12" shadow="hover"> |         <el-card :gutter="12" shadow="hover"> | ||||||
|           <div ref="commandStatsRef" class="h-88"></div> |           <Echart :options="commandStatsRefChika" :height="420" /> | ||||||
|         </el-card> |         </el-card> | ||||||
|       </el-col> |       </el-col> | ||||||
|       <!-- 内存使用量统计 --> |       <!-- 内存使用量统计 --> | ||||||
|       <el-col :span="12" class="mt-3"> |       <el-col :span="12" class="mt-3"> | ||||||
|         <el-card class="ml-3" :gutter="12" shadow="hover"> |         <el-card class="ml-3" :gutter="12" shadow="hover"> | ||||||
|           <div ref="usedmemory" class="h-88"></div> |           <Echart :options="usedmemoryEchartChika" :height="420" /> | ||||||
|         </el-card> |         </el-card> | ||||||
|       </el-col> |       </el-col> | ||||||
|     </el-row> |     </el-row> | ||||||
|   </el-scrollbar> |   </el-scrollbar> | ||||||
| </template> | </template> | ||||||
| <script setup lang="ts" name="InfraRedis"> | <script setup lang="ts"> | ||||||
| import * as echarts from 'echarts' | import echarts from '@/plugins/echarts' | ||||||
|  | import { GaugeChart } from 'echarts/charts' | ||||||
|  | import { ToolboxComponent } from 'echarts/components' | ||||||
| import * as RedisApi from '@/api/infra/redis' | import * as RedisApi from '@/api/infra/redis' | ||||||
| import { RedisMonitorInfoVO } from '@/api/infra/redis/types' | import { RedisMonitorInfoVO } from '@/api/infra/redis/types' | ||||||
|  |  | ||||||
| const cache = ref<RedisMonitorInfoVO>() | const cache = ref<RedisMonitorInfoVO>() | ||||||
|  |  | ||||||
| // 基本信息 | // 基本信息 | ||||||
| const readRedisInfo = async () => { | const readRedisInfo = async () => { | ||||||
|   const data = await RedisApi.getCache() |   const data = await RedisApi.getCache() | ||||||
|   cache.value = data |   cache.value = data | ||||||
|   loadEchartOptions(data.commandStats) |  | ||||||
| } | } | ||||||
| // 图表 |  | ||||||
| const commandStatsRef = ref<HTMLElement>() |  | ||||||
| const usedmemory = ref<HTMLDivElement>() |  | ||||||
|  |  | ||||||
| const loadEchartOptions = (stats) => { | // 内存使用情况 | ||||||
|   const commandStats = [] as any[] | const usedmemoryEchartChika = reactive({ | ||||||
|   const nameList = [] as string[] |   title: { | ||||||
|   stats.forEach((row) => { |     // 仪表盘标题。 | ||||||
|     commandStats.push({ |     text: '内存使用情况', | ||||||
|       name: row.command, |     left: 'center', | ||||||
|       value: row.calls |     show: true, // 是否显示标题,默认 true。 | ||||||
|     }) |     offsetCenter: [0, '20%'], //相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。 | ||||||
|     nameList.push(row.command) |     color: 'yellow', // 文字的颜色,默认 #333。 | ||||||
|   }) |     fontSize: 20 // 文字的字体大小,默认 15。 | ||||||
|  |   }, | ||||||
|   const commandStatsInstance = echarts.init(commandStatsRef.value!, 'macarons') |   toolbox: { | ||||||
|  |     show: false, | ||||||
|   commandStatsInstance.setOption({ |     feature: { | ||||||
|     title: { |       restore: { show: true }, | ||||||
|       text: '命令统计', |       saveAsImage: { show: true } | ||||||
|       left: 'center' |     } | ||||||
|     }, |   }, | ||||||
|     tooltip: { |   series: [ | ||||||
|       trigger: 'item', |     { | ||||||
|       formatter: '{a} <br/>{b} : {c} ({d}%)' |       name: '峰值', | ||||||
|     }, |       type: 'gauge', | ||||||
|     legend: { |       min: 0, | ||||||
|       type: 'scroll', |       max: 50, | ||||||
|       orient: 'vertical', |       splitNumber: 10, | ||||||
|       right: 30, |       //这是指针的颜色 | ||||||
|       top: 10, |       color: '#F5C74E', | ||||||
|       bottom: 20, |       radius: '85%', | ||||||
|       data: nameList, |       center: ['50%', '50%'], | ||||||
|       textStyle: { |       startAngle: 225, | ||||||
|         color: '#a1a1a1' |       endAngle: -45, | ||||||
|  |       axisLine: { | ||||||
|  |         // 坐标轴线 | ||||||
|  |         lineStyle: { | ||||||
|  |           // 属性lineStyle控制线条样式 | ||||||
|  |           color: [ | ||||||
|  |             [0.2, '#7FFF00'], | ||||||
|  |             [0.8, '#00FFFF'], | ||||||
|  |             [1, '#FF0000'] | ||||||
|  |           ], | ||||||
|  |           //width: 6 外框的大小(环的宽度) | ||||||
|  |           width: 10 | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       axisTick: { | ||||||
|  |         // 坐标轴小标记 | ||||||
|  |         //里面的线长是5(短线) | ||||||
|  |         length: 5, // 属性length控制线长 | ||||||
|  |         lineStyle: { | ||||||
|  |           // 属性lineStyle控制线条样式 | ||||||
|  |           color: '#76D9D7' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       splitLine: { | ||||||
|  |         // 分隔线 | ||||||
|  |         length: 20, // 属性length控制线长 | ||||||
|  |         lineStyle: { | ||||||
|  |           // 属性lineStyle(详见lineStyle)控制线条样式 | ||||||
|  |           color: '#76D9D7' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       axisLabel: { | ||||||
|  |         color: '#76D9D7', | ||||||
|  |         distance: 15, | ||||||
|  |         fontSize: 15 | ||||||
|  |       }, | ||||||
|  |       pointer: { | ||||||
|  |         // 指针的大小 | ||||||
|  |         width: 7, | ||||||
|  |         show: true | ||||||
|  |       }, | ||||||
|  |       detail: { | ||||||
|  |         textStyle: { | ||||||
|  |           fontWeight: 'normal', | ||||||
|  |           // 里面文字下的数值大小(50) | ||||||
|  |           fontSize: 15, | ||||||
|  |           color: '#FFFFFF' | ||||||
|  |         }, | ||||||
|  |         valueAnimation: true | ||||||
|  |       }, | ||||||
|  |       progress: { | ||||||
|  |         show: true | ||||||
|       } |       } | ||||||
|     }, |     } | ||||||
|     series: [ |   ] | ||||||
|       { | }) | ||||||
|         name: '命令', |  | ||||||
|         type: 'pie', | // 指令使用情况 | ||||||
|         radius: [20, 120], | const commandStatsRefChika = reactive({ | ||||||
|         center: ['40%', '60%'], |   title: { | ||||||
|         data: commandStats, |     text: '命令统计', | ||||||
|         roseType: 'radius', |     left: 'center' | ||||||
|  |   }, | ||||||
|  |   tooltip: { | ||||||
|  |     trigger: 'item', | ||||||
|  |     formatter: '{a} <br/>{b} : {c} ({d}%)' | ||||||
|  |   }, | ||||||
|  |   legend: { | ||||||
|  |     type: 'scroll', | ||||||
|  |     orient: 'vertical', | ||||||
|  |     right: 30, | ||||||
|  |     top: 10, | ||||||
|  |     bottom: 20, | ||||||
|  |     data: [] as any[], | ||||||
|  |     textStyle: { | ||||||
|  |       color: '#a1a1a1' | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   series: [ | ||||||
|  |     { | ||||||
|  |       name: '命令', | ||||||
|  |       type: 'pie', | ||||||
|  |       radius: [20, 120], | ||||||
|  |       center: ['40%', '60%'], | ||||||
|  |       data: [] as any[], | ||||||
|  |       roseType: 'radius', | ||||||
|  |       label: { | ||||||
|  |         show: true | ||||||
|  |       }, | ||||||
|  |       emphasis: { | ||||||
|         label: { |         label: { | ||||||
|           show: true |           show: true | ||||||
|         }, |         }, | ||||||
|         emphasis: { |         itemStyle: { | ||||||
|           label: { |           shadowBlur: 10, | ||||||
|             show: true |           shadowOffsetX: 0, | ||||||
|           }, |           shadowColor: 'rgba(0, 0, 0, 0.5)' | ||||||
|           itemStyle: { |  | ||||||
|             shadowBlur: 10, |  | ||||||
|             shadowOffsetX: 0, |  | ||||||
|             shadowColor: 'rgba(0, 0, 0, 0.5)' |  | ||||||
|           } |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     ] |     } | ||||||
|   }) |   ] | ||||||
|  | }) | ||||||
|  |  | ||||||
|   const usedMemoryInstance = echarts.init(usedmemory.value!, 'macarons') | /** 加载数据 */ | ||||||
|   usedMemoryInstance.setOption({ | const getSummary = () => { | ||||||
|     title: { |   // 初始化命令图表 | ||||||
|       text: '内存使用情况', |   initCommandStatsChart() | ||||||
|       left: 'center' |   usedMemoryInstance() | ||||||
|     }, |  | ||||||
|     tooltip: { |  | ||||||
|       formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human |  | ||||||
|     }, |  | ||||||
|     series: [ |  | ||||||
|       { |  | ||||||
|         name: '峰值', |  | ||||||
|         type: 'gauge', |  | ||||||
|         min: 0, |  | ||||||
|         max: 100, |  | ||||||
|         progress: { |  | ||||||
|           show: true |  | ||||||
|         }, |  | ||||||
|         detail: { |  | ||||||
|           formatter: cache.value!.info.used_memory_human |  | ||||||
|         }, |  | ||||||
|         data: [ |  | ||||||
|           { |  | ||||||
|             value: parseFloat(cache.value!.info.used_memory_human), |  | ||||||
|             name: '内存消耗' |  | ||||||
|           } |  | ||||||
|         ] |  | ||||||
|       } |  | ||||||
|     ] |  | ||||||
|   }) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| onBeforeMount(() => { | /** 命令使用情况 */ | ||||||
|   // TODO @hiiwbs 微信,优化使用 Echart 组件 | const initCommandStatsChart = async () => { | ||||||
|  |   usedmemoryEchartChika.series[0].data = [] | ||||||
|  |   // 发起请求 | ||||||
|  |   try { | ||||||
|  |     const data = await RedisApi.getCache() | ||||||
|  |     cache.value = data | ||||||
|  |     // 处理数据 | ||||||
|  |     const commandStats = [] as any[] | ||||||
|  |     const nameList = [] as string[] | ||||||
|  |     data.commandStats.forEach((row) => { | ||||||
|  |       commandStats.push({ | ||||||
|  |         name: row.command, | ||||||
|  |         value: row.calls | ||||||
|  |       }) | ||||||
|  |       nameList.push(row.command) | ||||||
|  |     }) | ||||||
|  |     commandStatsRefChika.legend.data = nameList | ||||||
|  |     commandStatsRefChika.series[0].data = commandStats | ||||||
|  |   } catch {} | ||||||
|  | } | ||||||
|  | const usedMemoryInstance = async () => { | ||||||
|  |   try { | ||||||
|  |     const data = await RedisApi.getCache() | ||||||
|  |     cache.value = data | ||||||
|  |     // 仪表盘详情,用于显示数据。 | ||||||
|  |     usedmemoryEchartChika.series[0].detail = { | ||||||
|  |       show: true, // 是否显示详情,默认 true。 | ||||||
|  |       offsetCenter: [0, '50%'], // 相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。 | ||||||
|  |       color: 'auto', // 文字的颜色,默认 auto。 | ||||||
|  |       fontSize: 30, // 文字的字体大小,默认 15。 | ||||||
|  |       formatter: cache.value!.info.used_memory_human // 格式化函数或者字符串 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     usedmemoryEchartChika.series[0].data[0] = { | ||||||
|  |       value: cache.value!.info.used_memory_human, | ||||||
|  |       name: '内存消耗' | ||||||
|  |     } | ||||||
|  |     console.log(cache.value!.info) | ||||||
|  |     usedmemoryEchartChika.tooltip = { | ||||||
|  |       formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human | ||||||
|  |     } | ||||||
|  |   } catch {} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 初始化 **/ | ||||||
|  | onMounted(() => { | ||||||
|  |   echarts.use([ToolboxComponent]) | ||||||
|  |   echarts.use([GaugeChart]) | ||||||
|  |   // 读取 redis 信息 | ||||||
|   readRedisInfo() |   readRedisInfo() | ||||||
|  |   // 加载数据 | ||||||
|  |   getSummary() | ||||||
| }) | }) | ||||||
| </script> | </script> | ||||||
|   | |||||||
							
								
								
									
										125
									
								
								src/views/mall/trade/delivery/express/ExpressForm.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/views/mall/trade/delivery/express/ExpressForm.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | |||||||
|  | <template> | ||||||
|  |   <Dialog :title="dialogTitle" v-model="dialogVisible"> | ||||||
|  |     <el-form | ||||||
|  |       ref="formRef" | ||||||
|  |       :model="formData" | ||||||
|  |       :rules="formRules" | ||||||
|  |       label-width="120px" | ||||||
|  |       v-loading="formLoading" | ||||||
|  |     > | ||||||
|  |       <el-form-item label="快递公司编码" prop="code"> | ||||||
|  |         <el-input v-model="formData.code" placeholder="请输入快递编码" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="快递公司名称" prop="name"> | ||||||
|  |         <el-input v-model="formData.name" placeholder="请输入快递名称" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="快递公司logo" prop="logo"> | ||||||
|  |         <UploadImg v-model="formData.logo" :limit="1" :is-show-tip="false" /> | ||||||
|  |         <div style="font-size: 10px" class="pl-10px">推荐 180x180 图片分辨率</div> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="分类排序" prop="sort"> | ||||||
|  |         <el-input-number v-model="formData.sort" controls-position="right" :min="0" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="开启状态" prop="status"> | ||||||
|  |         <el-radio-group v-model="formData.status"> | ||||||
|  |           <el-radio | ||||||
|  |             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" | ||||||
|  |             :key="dict.value" | ||||||
|  |             :label="dict.value" | ||||||
|  |           > | ||||||
|  |             {{ dict.label }} | ||||||
|  |           </el-radio> | ||||||
|  |         </el-radio-group> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |     <template #footer> | ||||||
|  |       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> | ||||||
|  |       <el-button @click="dialogVisible = false">取 消</el-button> | ||||||
|  |     </template> | ||||||
|  |   </Dialog> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script setup lang="ts" name="ExpressForm"> | ||||||
|  | import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | ||||||
|  | import { CommonStatusEnum } from '@/utils/constants' | ||||||
|  | import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express' | ||||||
|  | const { t } = useI18n() // 国际化 | ||||||
|  | const message = useMessage() // 消息弹窗 | ||||||
|  |  | ||||||
|  | const dialogVisible = ref(false) // 弹窗的是否展示 | ||||||
|  | const dialogTitle = ref('') // 弹窗的标题 | ||||||
|  | const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 | ||||||
|  | const formType = ref('') // 表单的类型:create - 新增;update - 修改 | ||||||
|  | const formData = ref({ | ||||||
|  |   id: undefined, | ||||||
|  |   code: '', | ||||||
|  |   name: '', | ||||||
|  |   logo: '', | ||||||
|  |   sort: 0, | ||||||
|  |   status: CommonStatusEnum.ENABLE | ||||||
|  | }) | ||||||
|  | const formRules = reactive({ | ||||||
|  |   code: [{ required: true, message: '快递编码不能为空', trigger: 'blur' }], | ||||||
|  |   name: [{ required: true, message: '分类名称不能为空', trigger: 'blur' }], | ||||||
|  |   logo: [{ required: true, message: '分类图片不能为空', trigger: 'blur' }], | ||||||
|  |   sort: [{ required: true, message: '分类排序不能为空', trigger: 'blur' }], | ||||||
|  |   status: [{ required: true, message: '开启状态不能为空', trigger: 'blur' }] | ||||||
|  | }) | ||||||
|  | const formRef = ref() // 表单 Ref | ||||||
|  |  | ||||||
|  | /** 打开弹窗 */ | ||||||
|  | const open = async (type: string, id?: number) => { | ||||||
|  |   dialogVisible.value = true | ||||||
|  |   dialogTitle.value = t('action.' + type) | ||||||
|  |   formType.value = type | ||||||
|  |   resetForm() | ||||||
|  |   // 修改时,设置数据 | ||||||
|  |   if (id) { | ||||||
|  |     formLoading.value = true | ||||||
|  |     try { | ||||||
|  |       formData.value = await DeliveryExpressApi.getDeliveryExpress(id) | ||||||
|  |     } finally { | ||||||
|  |       formLoading.value = false | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | defineExpose({ open }) // 提供 open 方法,用于打开弹窗 | ||||||
|  |  | ||||||
|  | /** 提交表单 */ | ||||||
|  | const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 | ||||||
|  | const submitForm = async () => { | ||||||
|  |   // 校验表单 | ||||||
|  |   if (!formRef) return | ||||||
|  |   const valid = await formRef.value.validate() | ||||||
|  |   if (!valid) return | ||||||
|  |   // 提交请求 | ||||||
|  |   formLoading.value = true | ||||||
|  |   try { | ||||||
|  |     const data = formData.value as DeliveryExpressApi.DeliveryExpressVO | ||||||
|  |     if (formType.value === 'create') { | ||||||
|  |       await DeliveryExpressApi.createDeliveryExpress(data) | ||||||
|  |       message.success(t('common.createSuccess')) | ||||||
|  |     } else { | ||||||
|  |       await DeliveryExpressApi.updateDeliveryExpress(data) | ||||||
|  |       message.success(t('common.updateSuccess')) | ||||||
|  |     } | ||||||
|  |     dialogVisible.value = false | ||||||
|  |     // 发送操作成功的事件 | ||||||
|  |     emit('success') | ||||||
|  |   } finally { | ||||||
|  |     formLoading.value = false | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 重置表单 */ | ||||||
|  | const resetForm = () => { | ||||||
|  |   formData.value = { | ||||||
|  |     id: undefined, | ||||||
|  |     name: '', | ||||||
|  |     picUrl: '', | ||||||
|  |     bigPicUrl: '', | ||||||
|  |     status: CommonStatusEnum.ENABLE | ||||||
|  |   } | ||||||
|  |   formRef.value?.resetFields() | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										183
									
								
								src/views/mall/trade/delivery/express/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								src/views/mall/trade/delivery/express/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | |||||||
|  | <template> | ||||||
|  |   <!-- 搜索工作栏 --> | ||||||
|  |   <ContentWrap> | ||||||
|  |     <el-form | ||||||
|  |       class="-mb-15px" | ||||||
|  |       :model="queryParams" | ||||||
|  |       ref="queryFormRef" | ||||||
|  |       :inline="true" | ||||||
|  |       label-width="100px" | ||||||
|  |     > | ||||||
|  |       <el-form-item label="快递公司编码" prop="code"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.code" | ||||||
|  |           placeholder="请输快递公司编码" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter="handleQuery" | ||||||
|  |           class="!w-240px" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="快递公司名称" prop="name"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.name" | ||||||
|  |           placeholder="请输快递公司名称" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter="handleQuery" | ||||||
|  |           class="!w-240px" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item> | ||||||
|  |         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> | ||||||
|  |         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> | ||||||
|  |         <el-button | ||||||
|  |           type="primary" | ||||||
|  |           plain | ||||||
|  |           @click="openForm('create')" | ||||||
|  |           v-hasPermi="['trade:delivery:express:create']" | ||||||
|  |         > | ||||||
|  |           <Icon icon="ep:plus" class="mr-5px" /> 新增 | ||||||
|  |         </el-button> | ||||||
|  |         <el-button | ||||||
|  |           type="success" | ||||||
|  |           plain | ||||||
|  |           @click="handleExport" | ||||||
|  |           :loading="exportLoading" | ||||||
|  |           v-hasPermi="['trade:delivery:express:export']" | ||||||
|  |         > | ||||||
|  |           <Icon icon="ep:download" class="mr-5px" /> 导出 | ||||||
|  |         </el-button> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |   </ContentWrap> | ||||||
|  |  | ||||||
|  |   <!-- 列表 --> | ||||||
|  |   <ContentWrap> | ||||||
|  |     <el-table v-loading="loading" :data="list"> | ||||||
|  |       <el-table-column label="快递公司编号" prop="code" /> | ||||||
|  |       <el-table-column label="快递公司名称" prop="name" /> | ||||||
|  |       <el-table-column label="快递公司 logo " prop="logo"> | ||||||
|  |         <template #default="scope"> | ||||||
|  |           <img v-if="scope.row.logo" :src="scope.row.logo" alt="快递公司logo" class="h-25px" /> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |       <el-table-column label="排序" align="center" prop="sort" /> | ||||||
|  |       <el-table-column label="开启状态" align="center" prop="status"> | ||||||
|  |         <template #default="scope"> | ||||||
|  |           <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |       <el-table-column | ||||||
|  |         label="创建时间" | ||||||
|  |         align="center" | ||||||
|  |         prop="createTime" | ||||||
|  |         width="180" | ||||||
|  |         :formatter="dateFormatter" | ||||||
|  |       /> | ||||||
|  |       <el-table-column label="操作" align="center"> | ||||||
|  |         <template #default="scope"> | ||||||
|  |           <el-button | ||||||
|  |             link | ||||||
|  |             type="primary" | ||||||
|  |             @click="openForm('update', scope.row.id)" | ||||||
|  |             v-hasPermi="['trade:delivery:express:update']" | ||||||
|  |           > | ||||||
|  |             编辑 | ||||||
|  |           </el-button> | ||||||
|  |           <el-button | ||||||
|  |             link | ||||||
|  |             type="danger" | ||||||
|  |             @click="handleDelete(scope.row.id)" | ||||||
|  |             v-hasPermi="['trade:delivery:express:delete']" | ||||||
|  |           > | ||||||
|  |             删除 | ||||||
|  |           </el-button> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |     </el-table> | ||||||
|  |   </ContentWrap> | ||||||
|  |  | ||||||
|  |   <!-- 表单弹窗:添加/修改 --> | ||||||
|  |   <ExpressForm ref="formRef" @success="getList" /> | ||||||
|  | </template> | ||||||
|  | <script setup lang="ts" name="Express"> | ||||||
|  | import { DICT_TYPE } from '@/utils/dict' | ||||||
|  | import { dateFormatter } from '@/utils/formatTime' | ||||||
|  | import download from '@/utils/download' | ||||||
|  | import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express' | ||||||
|  | import ExpressForm from './ExpressForm.vue' | ||||||
|  | const message = useMessage() // 消息弹窗 | ||||||
|  | const { t } = useI18n() // 国际化 | ||||||
|  | const total = ref(0) // 列表的总页数 | ||||||
|  | const loading = ref(true) // 列表的加载中 | ||||||
|  | const list = ref<any[]>([]) // 列表的数据 | ||||||
|  | const queryParams = reactive({ | ||||||
|  |   pageNo: 1, | ||||||
|  |   pageSize: 10, | ||||||
|  |   code: '', | ||||||
|  |   name: '' | ||||||
|  | }) | ||||||
|  | const queryFormRef = ref() // 搜索的表单 | ||||||
|  | const exportLoading = ref(false) // 导出的加载中 | ||||||
|  | /** 查询列表 */ | ||||||
|  | const getList = async () => { | ||||||
|  |   loading.value = true | ||||||
|  |   try { | ||||||
|  |     const data = await DeliveryExpressApi.getDeliveryExpressPage(queryParams) | ||||||
|  |     list.value = data.list | ||||||
|  |     total.value = data.total | ||||||
|  |   } finally { | ||||||
|  |     loading.value = false | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 搜索按钮操作 */ | ||||||
|  | const handleQuery = () => { | ||||||
|  |   queryParams.pageNo = 1 | ||||||
|  |   getList() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 重置按钮操作 */ | ||||||
|  | const resetQuery = () => { | ||||||
|  |   queryFormRef.value.resetFields() | ||||||
|  |   handleQuery() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 添加/修改操作 */ | ||||||
|  | const formRef = ref() | ||||||
|  | const openForm = (type: string, id?: number) => { | ||||||
|  |   formRef.value.open(type, id) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 删除按钮操作 */ | ||||||
|  | const handleDelete = async (id: number) => { | ||||||
|  |   try { | ||||||
|  |     // 删除的二次确认 | ||||||
|  |     await message.delConfirm() | ||||||
|  |     // 发起删除 | ||||||
|  |     await DeliveryExpressApi.deleteDeliveryExpress(id) | ||||||
|  |     message.success(t('common.delSuccess')) | ||||||
|  |     // 刷新列表 | ||||||
|  |     await getList() | ||||||
|  |   } catch {} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 导出按钮操作 */ | ||||||
|  | const handleExport = async () => { | ||||||
|  |   try { | ||||||
|  |     // 导出的二次确认 | ||||||
|  |     await message.exportConfirm() | ||||||
|  |     // 发起导出 | ||||||
|  |     exportLoading.value = true | ||||||
|  |     const data = await DeliveryExpressApi.exportDeliveryExpressApi(queryParams) | ||||||
|  |     download.excel(data, '快递公司.xls') | ||||||
|  |   } catch { | ||||||
|  |   } finally { | ||||||
|  |     exportLoading.value = false | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** 初始化 **/ | ||||||
|  | onMounted(() => { | ||||||
|  |   getList() | ||||||
|  | }) | ||||||
|  | </script> | ||||||
							
								
								
									
										78
									
								
								src/views/mp/autoReply/components/ReplyForm.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/views/mp/autoReply/components/ReplyForm.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <el-form ref="formRef" :model="replyForm" :rules="rules" label-width="80px"> | ||||||
|  |       <el-form-item label="消息类型" prop="requestMessageType" v-if="msgType === MsgType.Message"> | ||||||
|  |         <el-select v-model="replyForm.requestMessageType" placeholder="请选择"> | ||||||
|  |           <template v-for="dict in getDictOptions(DICT_TYPE.MP_MESSAGE_TYPE)" :key="dict.value"> | ||||||
|  |             <el-option | ||||||
|  |               v-if="RequestMessageTypes.includes(dict.value)" | ||||||
|  |               :label="dict.label" | ||||||
|  |               :value="dict.value" | ||||||
|  |             /> | ||||||
|  |           </template> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="匹配类型" prop="requestMatch" v-if="msgType === MsgType.Keyword"> | ||||||
|  |         <el-select v-model="replyForm.requestMatch" placeholder="请选择匹配类型" clearable> | ||||||
|  |           <el-option | ||||||
|  |             v-for="dict in getIntDictOptions(DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH)" | ||||||
|  |             :key="dict.value" | ||||||
|  |             :label="dict.label" | ||||||
|  |             :value="dict.value" | ||||||
|  |           /> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="关键词" prop="requestKeyword" v-if="msgType === MsgType.Keyword"> | ||||||
|  |         <el-input v-model="replyForm.requestKeyword" placeholder="请输入内容" clearable /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="回复消息"> | ||||||
|  |         <WxReplySelect v-model="reply" /> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script setup lang="ts" name="ReplyForm"> | ||||||
|  | import WxReplySelect, { type Reply } from '@/views/mp/components/wx-reply' | ||||||
|  | import type { FormInstance } from 'element-plus' | ||||||
|  | import { MsgType } from './types' | ||||||
|  | import { DICT_TYPE, getDictOptions, getIntDictOptions } from '@/utils/dict' | ||||||
|  |  | ||||||
|  | const props = defineProps<{ | ||||||
|  |   modelValue: any | ||||||
|  |   reply: Reply | ||||||
|  |   msgType: MsgType | ||||||
|  | }>() | ||||||
|  |  | ||||||
|  | const emit = defineEmits<{ | ||||||
|  |   (e: 'update:reply', v: Reply) | ||||||
|  |   (e: 'update:modelValue', v: any) | ||||||
|  | }>() | ||||||
|  |  | ||||||
|  | const reply = computed<Reply>({ | ||||||
|  |   get: () => props.reply, | ||||||
|  |   set: (val) => emit('update:reply', val) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const replyForm = computed<any>({ | ||||||
|  |   get: () => props.modelValue, | ||||||
|  |   set: (val) => emit('update:modelValue', val) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const formRef = ref<FormInstance | null>(null) // 表单 ref | ||||||
|  |  | ||||||
|  | const RequestMessageTypes = ['text', 'image', 'voice', 'video', 'shortvideo', 'location', 'link'] // 允许选择的请求消息类型 | ||||||
|  |  | ||||||
|  | // 表单校验 | ||||||
|  | const rules = { | ||||||
|  |   requestKeyword: [{ required: true, message: '请求的关键字不能为空', trigger: 'blur' }], | ||||||
|  |   requestMatch: [{ required: true, message: '请求的关键字的匹配不能为空', trigger: 'blur' }] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | defineExpose({ | ||||||
|  |   resetFields: () => formRef.value?.resetFields(), | ||||||
|  |   validate: async () => formRef.value?.validate() | ||||||
|  | }) | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped></style> | ||||||
| @@ -53,38 +53,13 @@ | |||||||
|       @on-delete="onDelete" |       @on-delete="onDelete" | ||||||
|     /> |     /> | ||||||
|  |  | ||||||
|     <!-- 添加或修改自动回复的对话框 --> |     <el-dialog | ||||||
|     <!-- TODO @Dhb52 --> |       :title="isCreating ? '新增自动回复' : '修改自动回复'" | ||||||
|     <el-dialog :title="dialogTitle" v-model="showFormDialog" width="800px" destroy-on-close> |       v-model="showDialog" | ||||||
|       <el-form ref="formRef" :model="replyForm" :rules="rules" label-width="80px"> |       width="800px" | ||||||
|         <el-form-item label="消息类型" prop="requestMessageType" v-if="msgType === MsgType.Message"> |       destroy-on-close | ||||||
|           <el-select v-model="replyForm.requestMessageType" placeholder="请选择"> |     > | ||||||
|             <template v-for="dict in getDictOptions(DICT_TYPE.MP_MESSAGE_TYPE)" :key="dict.value"> |       <ReplyForm v-model="replyForm" v-model:reply="reply" :msg-type="msgType" ref="formRef" /> | ||||||
|               <el-option |  | ||||||
|                 v-if="RequestMessageTypes.includes(dict.value)" |  | ||||||
|                 :label="dict.label" |  | ||||||
|                 :value="dict.value" |  | ||||||
|               /> |  | ||||||
|             </template> |  | ||||||
|           </el-select> |  | ||||||
|         </el-form-item> |  | ||||||
|         <el-form-item label="匹配类型" prop="requestMatch" v-if="msgType === MsgType.Keyword"> |  | ||||||
|           <el-select v-model="replyForm.requestMatch" placeholder="请选择匹配类型" clearable> |  | ||||||
|             <el-option |  | ||||||
|               v-for="dict in getIntDictOptions(DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH)" |  | ||||||
|               :key="dict.value" |  | ||||||
|               :label="dict.label" |  | ||||||
|               :value="dict.value" |  | ||||||
|             /> |  | ||||||
|           </el-select> |  | ||||||
|         </el-form-item> |  | ||||||
|         <el-form-item label="关键词" prop="requestKeyword" v-if="msgType === MsgType.Keyword"> |  | ||||||
|           <el-input v-model="replyForm.requestKeyword" placeholder="请输入内容" clearable /> |  | ||||||
|         </el-form-item> |  | ||||||
|         <el-form-item label="回复消息"> |  | ||||||
|           <WxReplySelect v-model="reply" /> |  | ||||||
|         </el-form-item> |  | ||||||
|       </el-form> |  | ||||||
|       <template #footer> |       <template #footer> | ||||||
|         <el-button @click="cancel">取 消</el-button> |         <el-button @click="cancel">取 消</el-button> | ||||||
|         <el-button type="primary" @click="onSubmit">确 定</el-button> |         <el-button type="primary" @click="onSubmit">确 定</el-button> | ||||||
| @@ -93,23 +68,22 @@ | |||||||
|   </ContentWrap> |   </ContentWrap> | ||||||
| </template> | </template> | ||||||
| <script setup lang="ts" name="MpAutoReply"> | <script setup lang="ts" name="MpAutoReply"> | ||||||
| import WxReplySelect, { type Reply, ReplyType } from '@/views/mp/components/wx-reply' | import ReplyForm from '@/views/mp/autoReply/components/ReplyForm.vue' | ||||||
|  | import { type Reply, ReplyType } from '@/views/mp/components/wx-reply' | ||||||
| import WxAccountSelect from '@/views/mp/components/wx-account-select' | import WxAccountSelect from '@/views/mp/components/wx-account-select' | ||||||
| import * as MpAutoReplyApi from '@/api/mp/autoReply' | import * as MpAutoReplyApi from '@/api/mp/autoReply' | ||||||
| import { DICT_TYPE, getDictOptions, getIntDictOptions } from '@/utils/dict' |  | ||||||
| import { ContentWrap } from '@/components/ContentWrap' | import { ContentWrap } from '@/components/ContentWrap' | ||||||
| import type { FormInstance, TabPaneName } from 'element-plus' | import type { TabPaneName } from 'element-plus' | ||||||
| import ReplyTable from './components/ReplyTable.vue' | import ReplyTable from './components/ReplyTable.vue' | ||||||
| import { MsgType } from './components/types' | import { MsgType } from './components/types' | ||||||
| const message = useMessage() // 消息 | const message = useMessage() // 消息 | ||||||
|  |  | ||||||
| const accountId = ref(-1) // 公众号ID | const accountId = ref(-1) // 公众号ID | ||||||
| const msgType = ref<MsgType>(MsgType.Keyword) // 消息类型 | const msgType = ref<MsgType>(MsgType.Keyword) // 消息类型 | ||||||
| const RequestMessageTypes = ['text', 'image', 'voice', 'video', 'shortvideo', 'location', 'link'] // 允许选择的请求消息类型 |  | ||||||
| const loading = ref(true) // 遮罩层 | const loading = ref(true) // 遮罩层 | ||||||
| const total = ref(0) // 总条数 | const total = ref(0) // 总条数 | ||||||
| const list = ref<any[]>([]) // 自动回复列表 | const list = ref<any[]>([]) // 自动回复列表 | ||||||
| const formRef = ref<FormInstance | null>(null) // 表单 ref | const formRef = ref<InstanceType<typeof ReplyForm> | null>(null) // 表单 ref | ||||||
| // 查询参数 | // 查询参数 | ||||||
| const queryParams = reactive({ | const queryParams = reactive({ | ||||||
|   pageNo: 1, |   pageNo: 1, | ||||||
| @@ -117,19 +91,14 @@ const queryParams = reactive({ | |||||||
|   accountId: accountId |   accountId: accountId | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const dialogTitle = ref('') // 弹出层标题 | const isCreating = ref(false) // 是否新建(否则编辑) | ||||||
| const showFormDialog = ref(false) // 是否显示弹出层 | const showDialog = ref(false) // 是否显示弹出层 | ||||||
| const replyForm = ref<any>({}) // 表单参数 | const replyForm = ref<any>({}) // 表单参数 | ||||||
| // 回复消息 | // 回复消息 | ||||||
| const reply = ref<Reply>({ | const reply = ref<Reply>({ | ||||||
|   type: ReplyType.Text, |   type: ReplyType.Text, | ||||||
|   accountId: -1 |   accountId: -1 | ||||||
| }) | }) | ||||||
| // 表单校验 |  | ||||||
| const rules = { |  | ||||||
|   requestKeyword: [{ required: true, message: '请求的关键字不能为空', trigger: 'blur' }], |  | ||||||
|   requestMatch: [{ required: true, message: '请求的关键字的匹配不能为空', trigger: 'blur' }] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** 侦听账号变化 */ | /** 侦听账号变化 */ | ||||||
| const onAccountChanged = (id: number) => { | const onAccountChanged = (id: number) => { | ||||||
| @@ -174,8 +143,8 @@ const onCreate = () => { | |||||||
|     accountId: queryParams.accountId |     accountId: queryParams.accountId | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   dialogTitle.value = '新增自动回复' |   isCreating.value = true | ||||||
|   showFormDialog.value = true |   showDialog.value = true | ||||||
| } | } | ||||||
|  |  | ||||||
| /** 修改按钮操作 */ | /** 修改按钮操作 */ | ||||||
| @@ -207,8 +176,8 @@ const onUpdate = async (id: number) => { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   // 打开表单 |   // 打开表单 | ||||||
|   dialogTitle.value = '修改自动回复' |   isCreating.value = false | ||||||
|   showFormDialog.value = true |   showDialog.value = true | ||||||
| } | } | ||||||
|  |  | ||||||
| /** 删除按钮操作 */ | /** 删除按钮操作 */ | ||||||
| @@ -220,8 +189,7 @@ const onDelete = async (id: number) => { | |||||||
| } | } | ||||||
|  |  | ||||||
| const onSubmit = async () => { | const onSubmit = async () => { | ||||||
|   const valid = await formRef.value?.validate() |   await formRef.value?.validate() | ||||||
|   if (!valid) return |  | ||||||
|  |  | ||||||
|   // 处理回复消息 |   // 处理回复消息 | ||||||
|   const submitForm: any = { ...replyForm.value } |   const submitForm: any = { ...replyForm.value } | ||||||
| @@ -245,7 +213,7 @@ const onSubmit = async () => { | |||||||
|     message.success('新增成功') |     message.success('新增成功') | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   showFormDialog.value = false |   showDialog.value = false | ||||||
|   await getList() |   await getList() | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -264,7 +232,7 @@ const reset = () => { | |||||||
|  |  | ||||||
| // 取消按钮 | // 取消按钮 | ||||||
| const cancel = () => { | const cancel = () => { | ||||||
|   showFormDialog.value = false |   showDialog.value = false | ||||||
|   reset() |   reset() | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|   | |||||||
| @@ -122,7 +122,9 @@ const open = async (type: string, id?: number, dictType?: string) => { | |||||||
|   dialogTitle.value = t('action.' + type) |   dialogTitle.value = t('action.' + type) | ||||||
|   formType.value = type |   formType.value = type | ||||||
|   resetForm() |   resetForm() | ||||||
|   formData.value.dictType = dictType |   if (dictType) { | ||||||
|  |     formData.value.dictType = dictType | ||||||
|  |   } | ||||||
|   // 修改时,设置数据 |   // 修改时,设置数据 | ||||||
|   if (id) { |   if (id) { | ||||||
|     formLoading.value = true |     formLoading.value = true | ||||||
|   | |||||||
| @@ -17,9 +17,9 @@ | |||||||
|         <el-select v-model="formData.type" clearable placeholder="请选择公告类型"> |         <el-select v-model="formData.type" clearable placeholder="请选择公告类型"> | ||||||
|           <el-option |           <el-option | ||||||
|             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_NOTICE_TYPE)" |             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_NOTICE_TYPE)" | ||||||
|             :key="parseInt(dict.value)" |             :key="parseInt(dict.value as any)" | ||||||
|             :label="dict.label" |             :label="dict.label" | ||||||
|             :value="parseInt(dict.value)" |             :value="parseInt(dict.value as any)" | ||||||
|           /> |           /> | ||||||
|         </el-select> |         </el-select> | ||||||
|       </el-form-item> |       </el-form-item> | ||||||
| @@ -27,9 +27,9 @@ | |||||||
|         <el-select v-model="formData.status" clearable placeholder="请选择状态"> |         <el-select v-model="formData.status" clearable placeholder="请选择状态"> | ||||||
|           <el-option |           <el-option | ||||||
|             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" |             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" | ||||||
|             :key="parseInt(dict.value)" |             :key="parseInt(dict.value as any)" | ||||||
|             :label="dict.label" |             :label="dict.label" | ||||||
|             :value="parseInt(dict.value)" |             :value="parseInt(dict.value as any)" | ||||||
|           /> |           /> | ||||||
|         </el-select> |         </el-select> | ||||||
|       </el-form-item> |       </el-form-item> | ||||||
|   | |||||||
| @@ -44,7 +44,6 @@ | |||||||
|   </Dialog> |   </Dialog> | ||||||
| </template> | </template> | ||||||
| <script lang="ts" name="SystemNotifyTemplateSendForm" setup> | <script lang="ts" name="SystemNotifyTemplateSendForm" setup> | ||||||
| import * as SmsTemplateApi from '@/api/system/sms/smsTemplate' |  | ||||||
| import * as UserApi from '@/api/system/user' | import * as UserApi from '@/api/system/user' | ||||||
| import * as NotifyTemplateApi from '@/api/system/notify/template' | import * as NotifyTemplateApi from '@/api/system/notify/template' | ||||||
| const message = useMessage() // 消息弹窗 | const message = useMessage() // 消息弹窗 | ||||||
| @@ -102,8 +101,8 @@ const submitForm = async () => { | |||||||
|   // 提交请求 |   // 提交请求 | ||||||
|   formLoading.value = true |   formLoading.value = true | ||||||
|   try { |   try { | ||||||
|     const data = formData.value as SmsTemplateApi.SendSmsReqVO |     const data = formData.value as unknown as NotifyTemplateApi.NotifySendReqVO | ||||||
|     const logId = await SmsTemplateApi.sendSms(data) |     const logId = await NotifyTemplateApi.sendNotify(data) | ||||||
|     if (logId) { |     if (logId) { | ||||||
|       message.success('提交发送成功!发送结果,见发送日志编号:' + logId) |       message.success('提交发送成功!发送结果,见发送日志编号:' + logId) | ||||||
|     } |     } | ||||||
| @@ -121,7 +120,7 @@ const resetForm = () => { | |||||||
|     mobile: '', |     mobile: '', | ||||||
|     templateCode: '', |     templateCode: '', | ||||||
|     templateParams: new Map() |     templateParams: new Map() | ||||||
|   } |   } as any | ||||||
|   formRef.value?.resetFields() |   formRef.value?.resetFields() | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|   | |||||||
| @@ -80,7 +80,7 @@ | |||||||
|           <el-button |           <el-button | ||||||
|             link |             link | ||||||
|             type="danger" |             type="danger" | ||||||
|             @click="handleForceLogout(scope.row.id)" |             @click="handleForceLogout(scope.row.accessToken)" | ||||||
|             v-hasPermi="['system:oauth2-token:delete']" |             v-hasPermi="['system:oauth2-token:delete']" | ||||||
|           > |           > | ||||||
|             强退 |             强退 | ||||||
| @@ -142,12 +142,12 @@ const resetQuery = () => { | |||||||
| } | } | ||||||
|  |  | ||||||
| /** 强制退出操作 */ | /** 强制退出操作 */ | ||||||
| const handleForceLogout = async (id: number) => { | const handleForceLogout = async (accessToken: string) => { | ||||||
|   try { |   try { | ||||||
|     // 删除的二次确认 |     // 删除的二次确认 | ||||||
|     await message.confirm('是否要强制退出用户') |     await message.confirm('是否要强制退出用户') | ||||||
|     // 发起删除 |     // 发起删除 | ||||||
|     await OAuth2AccessTokenApi.deleteAccessToken(id) |     await OAuth2AccessTokenApi.deleteAccessToken(accessToken) | ||||||
|     message.success(t('common.success')) |     message.success(t('common.success')) | ||||||
|     // 刷新列表 |     // 刷新列表 | ||||||
|     await getList() |     await getList() | ||||||
|   | |||||||
| @@ -117,7 +117,7 @@ const resetForm = () => { | |||||||
|     sort: undefined, |     sort: undefined, | ||||||
|     status: CommonStatusEnum.ENABLE, |     status: CommonStatusEnum.ENABLE, | ||||||
|     remark: '' |     remark: '' | ||||||
|   } |   } as any | ||||||
|   formRef.value?.resetFields() |   formRef.value?.resetFields() | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ module.exports = { | |||||||
|   root: true, |   root: true, | ||||||
|   plugins: ['stylelint-order'], |   plugins: ['stylelint-order'], | ||||||
|   customSyntax: 'postcss-html', |   customSyntax: 'postcss-html', | ||||||
|   extends: ['stylelint-config-standard', 'stylelint-config-prettier'], |   extends: ['stylelint-config-standard'], | ||||||
|   rules: { |   rules: { | ||||||
|     'selector-pseudo-class-no-unknown': [ |     'selector-pseudo-class-no-unknown': [ | ||||||
|       true, |       true, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999