From 64494aadbcbdbe5c55d7260078479acba1d0e929 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 22 九月 2026 11:42:25 +0800
Subject: [PATCH] 江苏商贸职业学院:接入产教融合学生端(uni-app),替换原前端工程
---
src/shime-uni.d.ts | 6
shims-uni.d.ts | 10
src/pages.json | 46
.gitignore | 22
package-lock.json | 13421 +++++++++++++++++++++++++++++++++++++++++++++++++
src/static/logo.png | 0
src/pages/register/register.vue | 238
src/static/logo-emblem-white.png | 0
src/static/logo-navy.png | 0
src/pages/forgot/forgot.vue | 170
index.html | 238
src/manifest.json | 72
vite.config.js | 102
src/api/task.js | 24
src/static/logo-head-white.png | 0
src/uni.scss | 76
src/api/auth.js | 58
src/pages/index/index.vue | 259
src/pages/plan/form.vue | 597 ++
src/utils/region.js | 77
src/utils/request.js | 266
/dev/null | 10
src/pages/login/login.vue | 166
src/main.js | 121
package.json | 109
src/utils/site.js | 36
src/config.js | 12
src/App.vue | 39
src/pages/password/change.vue | 108
29 files changed, 15,635 insertions(+), 648 deletions(-)
diff --git a/.env.development b/.env.development
deleted file mode 100644
index 68fafb1..0000000
--- a/.env.development
+++ /dev/null
@@ -1,8 +0,0 @@
-# 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
-
-# 寮�鍙戠幆澧冮厤缃�
-VITE_APP_ENV = 'development'
-
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/寮�鍙戠幆澧�
-VITE_APP_BASE_API = '/dev-api'
diff --git a/.env.production b/.env.production
deleted file mode 100644
index cd8fc96..0000000
--- a/.env.production
+++ /dev/null
@@ -1,11 +0,0 @@
-# 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
-
-# 鐢熶骇鐜閰嶇疆
-VITE_APP_ENV = 'production'
-
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/鐢熶骇鐜
-VITE_APP_BASE_API = '/prod-api'
-
-# 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
-VITE_BUILD_COMPRESS = gzip
diff --git a/.env.staging b/.env.staging
deleted file mode 100644
index 22c164d..0000000
--- a/.env.staging
+++ /dev/null
@@ -1,11 +0,0 @@
-# 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
-
-# 鐢熶骇鐜閰嶇疆
-VITE_APP_ENV = 'staging'
-
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/鐢熶骇鐜
-VITE_APP_BASE_API = '/stage-api'
-
-# 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
-VITE_BUILD_COMPRESS = gzip
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index fbcab77..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html
diff --git a/.gitignore b/.gitignore
index 78a752d..7ce6e50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,23 +1,21 @@
-.DS_Store
-node_modules/
-dist/
+# Logs
+logs
+*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-**/*.log
+pnpm-debug.log*
+lerna-debug.log*
-tests/**/coverage/
-tests/e2e/reports
-selenium-debug.log
+node_modules
+.DS_Store
+dist
+*.local
# Editor directories and files
.idea
-.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
-*.local
-
-package-lock.json
-yarn.lock
+*.sw?
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 8564f29..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2018 RuoYi
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 2387eaf..0000000
--- a/README.md
+++ /dev/null
@@ -1,108 +0,0 @@
-<p align="center">
- <img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
-</p>
-<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.9</h1>
-<h4 align="center">鍩轰簬SpringBoot+Vue3鍓嶅悗绔垎绂荤殑Java蹇�熷紑鍙戞鏋�</h4>
-<p align="center">
- <a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
- <a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.9-brightgreen.svg"></a>
- <a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
-</p>
-
-## 骞冲彴绠�浠�
-
-* 鏈粨搴撲负鍓嶇鎶�鏈爤 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 鐗堟湰銆�
-* 閰嶅鍚庣浠g爜浠撳簱鍦板潃[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 鎴� [RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast) 鐗堟湰銆�
-* 鍓嶇鎶�鏈爤锛圼Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh)锛夛紝璇风Щ姝RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui)銆�
-* 闃块噷浜戞姌鎵e満锛歔鐐规垜杩涘叆](http://aly.ruoyi.vip)锛岃吘璁簯绉掓潃鍦猴細[鐐规垜杩涘叆](http://txy.ruoyi.vip)
-
-## 鍓嶇杩愯
-
-```bash
-# 鍏嬮殕椤圭洰
-git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git
-
-# 杩涘叆椤圭洰鐩綍
-cd RuoYi-Vue3
-
-# 瀹夎渚濊禆
-yarn --registry=https://registry.npmmirror.com
-
-# 鍚姩鏈嶅姟
-yarn dev
-
-# 鏋勫缓娴嬭瘯鐜 yarn build:stage
-# 鏋勫缓鐢熶骇鐜 yarn build:prod
-# 鍓嶇璁块棶鍦板潃 http://localhost:80
-```
-
-## 鍐呯疆鍔熻兘
-
-1. 鐢ㄦ埛绠$悊锛氱敤鎴锋槸绯荤粺鎿嶄綔鑰咃紝璇ュ姛鑳戒富瑕佸畬鎴愮郴缁熺敤鎴烽厤缃��
-2. 閮ㄩ棬绠$悊锛氶厤缃郴缁熺粍缁囨満鏋勶紙鍏徃銆侀儴闂ㄣ�佸皬缁勶級锛屾爲缁撴瀯灞曠幇鏀寔鏁版嵁鏉冮檺銆�
-3. 宀椾綅绠$悊锛氶厤缃郴缁熺敤鎴锋墍灞炴媴浠昏亴鍔°��
-4. 鑿滃崟绠$悊锛氶厤缃郴缁熻彍鍗曪紝鎿嶄綔鏉冮檺锛屾寜閽潈闄愭爣璇嗙瓑銆�
-5. 瑙掕壊绠$悊锛氳鑹茶彍鍗曟潈闄愬垎閰嶃�佽缃鑹叉寜鏈烘瀯杩涜鏁版嵁鑼冨洿鏉冮檺鍒掑垎銆�
-6. 瀛楀吀绠$悊锛氬绯荤粺涓粡甯镐娇鐢ㄧ殑涓�浜涜緝涓哄浐瀹氱殑鏁版嵁杩涜缁存姢銆�
-7. 鍙傛暟绠$悊锛氬绯荤粺鍔ㄦ�侀厤缃父鐢ㄥ弬鏁般��
-8. 閫氱煡鍏憡锛氱郴缁熼�氱煡鍏憡淇℃伅鍙戝竷缁存姢銆�
-9. 鎿嶄綔鏃ュ織锛氱郴缁熸甯告搷浣滄棩蹇楄褰曞拰鏌ヨ锛涚郴缁熷紓甯镐俊鎭棩蹇楄褰曞拰鏌ヨ銆�
-10. 鐧诲綍鏃ュ織锛氱郴缁熺櫥褰曟棩蹇楄褰曟煡璇㈠寘鍚櫥褰曞紓甯搞��
-11. 鍦ㄧ嚎鐢ㄦ埛锛氬綋鍓嶇郴缁熶腑娲昏穬鐢ㄦ埛鐘舵�佺洃鎺с��
-12. 瀹氭椂浠诲姟锛氬湪绾匡紙娣诲姞銆佷慨鏀广�佸垹闄�)浠诲姟璋冨害鍖呭惈鎵ц缁撴灉鏃ュ織銆�
-13. 浠g爜鐢熸垚锛氬墠鍚庣浠g爜鐨勭敓鎴愶紙java銆乭tml銆亁ml銆乻ql锛夋敮鎸丆RUD涓嬭浇 銆�
-14. 绯荤粺鎺ュ彛锛氭牴鎹笟鍔′唬鐮佽嚜鍔ㄧ敓鎴愮浉鍏崇殑api鎺ュ彛鏂囨。銆�
-15. 鏈嶅姟鐩戞帶锛氱洃瑙嗗綋鍓嶇郴缁烠PU銆佸唴瀛樸�佺鐩樸�佸爢鏍堢瓑鐩稿叧淇℃伅銆�
-16. 缂撳瓨鐩戞帶锛氬绯荤粺鐨勭紦瀛樹俊鎭煡璇紝鍛戒护缁熻绛夈��
-17. 鍦ㄧ嚎鏋勫缓鍣細鎷栧姩琛ㄥ崟鍏冪礌鐢熸垚鐩稿簲鐨凥TML浠g爜銆�
-18. 杩炴帴姹犵洃瑙嗭細鐩戣褰撳墠绯荤粺鏁版嵁搴撹繛鎺ユ睜鐘舵�侊紝鍙繘琛屽垎鏋怱QL鎵惧嚭绯荤粺鎬ц兘鐡堕銆�
-
-## 鍦ㄧ嚎浣撻獙
-
-- admin/admin123
-- 闄嗛檰缁画鏀跺埌涓�浜涙墦璧忥紝涓轰簡鏇村ソ鐨勪綋楠屽凡鐢ㄤ簬婕旂ず鏈嶅姟鍣ㄥ崌绾с�傝阿璋㈠悇浣嶅皬浼欎即銆�
-
-婕旂ず鍦板潃锛歨ttp://vue.ruoyi.vip
-鏂囨。鍦板潃锛歨ttp://doc.ruoyi.vip
-
-## 婕旂ず鍥�
-
-<table>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
- </tr>
- <tr>
- <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
- <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
- </tr>
-</table>
-
-
-## 鑻ヤ緷鍓嶅悗绔垎绂讳氦娴佺兢
-
-QQ缇わ細 [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ 鐐瑰嚮鎸夐挳鍏ョ兢銆�
\ No newline at end of file
diff --git a/bin/build.bat b/bin/build.bat
deleted file mode 100644
index 8868727..0000000
--- a/bin/build.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-@echo off
-echo.
-echo [信息] 打包Web工程,生成dist文件。
-echo.
-
-%~d0
-cd %~dp0
-
-cd ..
-yarn build:prod
-
-pause
\ No newline at end of file
diff --git a/bin/package.bat b/bin/package.bat
deleted file mode 100644
index 8693727..0000000
--- a/bin/package.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-@echo off
-echo.
-echo [信息] 安装Web工程,生成node_modules文件。
-echo.
-
-%~d0
-cd %~dp0
-
-cd ..
-yarn --registry=https://registry.npmmirror.com
-
-pause
\ No newline at end of file
diff --git a/bin/run-web.bat b/bin/run-web.bat
deleted file mode 100644
index f9d3ae8..0000000
--- a/bin/run-web.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-@echo off
-echo.
-echo [信息] 使用 Vite 命令运行 Web 工程。
-echo.
-
-%~d0
-cd %~dp0
-
-cd ..
-yarn dev
-
-pause
\ No newline at end of file
diff --git a/html/ie.html b/html/ie.html
deleted file mode 100644
index 390ce8a..0000000
--- a/html/ie.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
- <meta charset="UTF-8" />
- <title>璇峰崌绾ф偍鐨勬祻瑙堝櫒</title>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
- <meta name="renderer" content="webkit">
- <base target="_blank" />
- <style type="text/css">
- html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}
- a{text-decoration:none;color:#0072c6;}a:hover{text-decoration:none;color:#004d8c;}
- body{width:960px;margin:0 auto;padding:10px;font-size:14px;line-height:24px;color:#454545;font-family:'Microsoft YaHei UI','Microsoft YaHei',DengXian,SimSun,'Segoe UI',Tahoma,Helvetica,sans-serif;overflow-y:scroll}
- h1{font-size:40px;line-height:80px;font-weight:100;margin-bottom:10px;}
- h2{font-size:20px;line-height:25px;font-weight:100;margin:10px 0;}
- em{color:red}
- p{margin-bottom:10px;}
- hr{margin:20px 0;border:0;border-top:1px solid #dadada}
- span{display:block;font-size:12px;line-height:12px;}
- .clean{clear:both;}
- .browser{padding:10px 10px;}
- .browser li{width:auto;padding:0 80px;margin-top:30px;height:34px;line-height:22px;float:left;list-style:none;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAADMCAYAAAAWCXEwAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAC7ESURBVHja5Lx5dFRV1rBfgHwYRQQVtB26ZWhtabtfeUGxGxFbUGZF8RMHGkVbRkekVYiKisicVhE0gEwBokgDAhEMMSSQkAECwcxkrlRSqVTqJqnxzs/vj5t7qUyAvr9e37fWV2vtleSm6p6n9t5nn733OVU2RaUaEP5PiqJSbeMXPBTA5/Xhzk9Vnd9vo3HFx21E2LYJX9IRgh6npvyCe9uaqS4K4C3IpXHFx9S99CTuJ8Z0KLVjRlA7ZgTuJ8ZgXxmJL+kIlwAkXBQk6HFq9pWRVA8fSvXwodYgdS892a6EA1UNvouqwXdR99KTeAtyfz2IL+kI1cOHYh9wqwVwKWJqpXbMCOv19gG3Imzb1JF2OgZxfr/NukH4jcNVfyEAE8IU+4BbKet1PfaVke3BtA/i/H6b8aIBt7a4mWmaC0nr55vmqRp8F5V33Mm5LhHtwbQF8SUdsSDCb1I1+K42g1xIWgOYYh9wK+e6RCBs29QxSIWus37aJM51iWjx4so77mwD1d5AHQ1eecedlN9yuyVlva6nrNf14Q7cEmRn4W7u3T2E9ME3UX7L7W1uZg5Weced1s3sA2613ql5LXzQjuRclwjcT4wxTXQeRHC7GLdnHPeensiCVwa3e0PznZk3EbZtwluQa0kofz8NcVNxr++Ce30XnNuv61Bcu7viXt8Fvyu7JYipjfGHxzD+8Bh2j+7fAiZcC+Y0zPDIbCyD6DyV6DyVeDcIQR2C39J4oieNJ3oSOnkVcnZ35Ozu6MVdDHF0N6S4C43OqJYg/0ydzb27hzDx0FjuPT2R+asfa6OVsl7X40s6QoWus/CQk6fWZPHChhxe3lbMCxtyrN9TyxSQSwidvMoC0XK6tRGybPjSRmOuNUKVo4Zxe8YxIu4+Jh4ay/jDY7j39MQWWjnXJYLGFR9Toes8tSaLiavTrIHDxfxfapkCwW8hy9YuhCmhk1fR1FRnaCS1NM4yy8RDYy2tjIkZRXq/HtYsCnqc2sJDTkYsTrU00J6YkEJQR7M/eEGY0MmrcOenqjZA2JmyzTJLuJiOe65LBHUvPUmGR2bE4lQmrk7jqTVZHcrE1WkMWpRIdJ4KnpUXBCHLRl3e16EWIOEaMU00/vAY9na/gsYVH/NdgYe+8w9bMBeSQYsSWXjICcFvL2ga+dhlFwcJ10rjio/ZklprgbSWiavTWvzdd/5hXt5W/OtATC201sq9u4eQ+PVijmSW0nf+YQYtSmTQosR2gUYsTmXQokT6zj9saeRCpmkJ0hxD2gOZeGgsI+Lu45+ps7FXlFmDmDDtSd/5h+k7/zCpZQpa9cwOQciyIR+77LyzFhXlMyZmFOP2jLP8orVWRsTdR2ppHFtSa+k6ZZM1WHvSdcomwyxySceayO4OWTY88TdirygzUkWf18eL2//RQiutYcwYE/Q4tagDOUQ8uo6uUzbRZ3qMJV2nbCLi0XU8tSbrolNXzu6OfOyylgEN4NOkaO5acw/j9ozr0ET37h5imehIZimPL91rAfSZHsOQBfuISS7E7vaTETeX0MmrOoQInbwK+dhlNKWsahni0zPSuGvNPW1M1BrI1NrOwt0WkCn2ijJSS+MYt2ccuQk3oxd36RCi8URPY+HLT1VbgGiSzPsx71laCddMe2Yygf6ZOtuScXvG0XfJn/n8YL+LQnjibyQ34WZ8Xl/bfKSoKL+FVi4EYwKZcu/uIQzaPoExMaPQcrq1ADFX33AI1+6u1OV9HVI6ShU/TYqm75I/dwjTHtDEQ2MZt2ccg7ZPaGGScIDWEBlxc42UoSMQ00StYdoDCgcbtH0Cbx+8p40ZTIBwiFM7RmB3+y+exZvT2YRpDdR6ZoVrw1xRWwN44m/Euf06A6Ki7NLrmnDNmH7TEdSg7RP4/GA/yLK1GdwEKNzSk1M7RlDlqPl1JefOlG2MXTGmXaAxMaMsB/XE34h4tH+7ANlrB7T2iV8OAlDlqOH9mPcsIBPKlF3R16Ad7GwlxoVberYAKCrKv1ghfmkg5sPldLIzZVsLqLErxpC9doAlp3aMICNurlGyVpRdSAu/HqS1Q58rd1JUlI87P1UtKsrHXlGG3e1HCOoov+x2wiX3RxT+o49L1IgutXxVUCfDIxNfLraQDI+M3e3/NdCXbhohqBNfLrIsVzZqmoT6dmXG0SBLTrmJLxd/CVRLECXcDGFaSC1TmHE0yKg4B0P2uxiy38WoOAePHaptAfHYoVqG7HcxcGc5o+IcfFfgsbQUPoYoSa213BbE78oGucTSwpJTbobFFjNgbQHdvi6g8/Z6Om+vZ8h+VxsQE7T/97UMWFvA+Og0UvIryfDIZBQ4CeXvt8a5IAhAY/RImlJWUaHrPHaolhuXFXHN+8e58qNcbomq5P6t3xG973WePLzPgnnsUG0LiP7f1zJwZzk3LisyctfSOFxOJ4lfLzYToQubxu/KpmpWBFWzInguOokrP8ql7/zDRMxLpFfUabasHwlZNnITbmbgznI6b6+3Bu7/fa2lrW5fF9Ar6jQD1hYwLLaYx5fupdi+EiGok748koa4qa010xKkKWUV2UM7kd6vB7tH9yfpnUFkLzQiZOGWnmgHO9N4oie9ok5bA4YPbkqvqNNc8/5xIuYl8tSaLOLLRXambENXF+PxNJD0ziAanVHhYaEliH1lJD/1iqD0qSsIzu2M/N550TZ3QjvYmS3rR1qDtwdhgpgwnabGMj46zRjQsxJdXYw7P1X1pY0GuaRjkMKxPah5qxuV8y6nct7l1LzVDfdyo6miHexM+ou9mblwKfdv/Y77t37HNe8fbwMQDhIxL5FOU2PZklqLJjUYdU7wWxBuN+ricBAF0KQG6pcNovZpw0fCQao/MEBcu7tSOLYHjnu7EZzbmeDczqyfNokrP8ptMXi4XDnzAJ0n72TIgn1oUoMB4VlpgIjj24I0payi9KkrqHj+Ssth2wM5c38f8p68D2nbHKRtc3h86d42A/eZHsOVMw9Y0nXKJmxDvyS1NA70z8Gz0qh5hNvbzpr6ZYMofzyiBUwLkOVdjfR/eVcao0dSl/d1aHx0GhHzEi0TXDnzAJ2mxtJpaixdp2yypM/0GLrcs5D3Y94ztNDsK7qjuxmzDBBz2rYGqZoVQc1b3dr4yfppk+g8eWeLd91aAxGPrqPbyKV0G7mUiEfXMWdz+nmQ0Jsgn1AbT/SkMXrkeZC6vK9DpU9d0S5I5bzLqf6gq6UV7WBn5q9+zDJBuEQ8us4SE6LLPQvpcs9CjmSW4ndlo1XPNBxWLiE34WbSX+wNapEBEsrfT/njERSO7WGBmDA1b3Wj9KkrSO/Xg1WjBjJl/CT+8sQ8a0BT/eGDhwN0uWchXe94ia07YkE+oSLc3gxyQt2yfiSrRg0E+YRqgRSO7UHh2B4UT7ragqmcdznFk67mp14ROO7txpTxk7AN/bLFgN1GLsU29EvrejiACdG59xQjKgu3GzVP9UwIvcmCVwYb102NmBHVBDFNVDUrgjP39yF98E0E5xox5Dcj5lsDhwOYQObg4dK59xR2RV8D4njEo/0NIEd3dkVfgy9t9HkfMTWSO6pXG63kjupF8aSrqXj+SoJzO1M573KmjJ/Eb0bM5y9PzGPBK4Mp3GKUEFvWj+Q3I+a3AOjcewp/eWKesUQ0T1mz2att7oSU9+F5EE2SqXvpSbKHdrIGNmHCoapmRVgh33LezZ3QNncyloGDnVnwyuA2IFvWj0Q+dplREzu6Wy0r9/KubVvg9pWRpPfrwZn7+1haMSHCxdSM/J4RWWufjiC9Xw/m9PgtN9w0uo1JbrhpNI0njAXTrAIbT/TEvb4LjdEj2641vqQjpPfrQfrgm1qYKHxKlz51BbmjerFj4G2WtAYwtWDKglcGG2ZoXrldu43AWDUrAmnbnLaRVZMayHvyPn7qZThoa38pfeoKap+OIDi3M6tGDeSGm0a3GTT82g03jeaGm0bj3H4d8rHLrN0I93LDpDsG3kb68si2a425hfZTrwjSB9/UBiZcM+YM6ghoyvhJpL/Ym+yFhknc67tYQVF+z3gjc3r8Fuf32zpOFTMeHXpRGDNfMYF2j+7PqlEDWTVqIOkv9rZ8SNvcCff6LlTOu9yK1Okv9mZOj9+S8ehQNKmBDhs17vxU9adeES1gwoHKH49oFyhcwhfKynmXWzOu4vkryR7aieyhnQjl7+84QzNNJGzbxN7uV1gw7WmntYZaLw2mmNdrn44ge2gnztzfx9od7zBnDa9t0pdHtgsTDhRustaaCndwEyLj0aG481PVS9r3FSUJj6eBrConMZHvnodpntrh2gkHCgcLl/TBN7G3+xXGLMlIo0LXjU7ixeoaUZIQ3C7OlTtJya8kJvJddgy8DctvWgGFaylcHPd2Y2/3K5jT47esGjWQrTtiyapy4nI6jUrvUmpfUytFRfmkZ6SxdUcs66dNYsfA2ywNtQBrJeb/dgy8jZjId/kx4YgF4fP6Ln1L3uyhhWvnSGYpOw6lEBP5LuunTWLDAw+x4YGHrAi74YGHWD9tEuunTSIm8l227ohtAyBK0i8/pNDagTVJxuf1YXf7OVfuJKvKMF16RhrpGWkcySwlJb+SrCqn1awRgjqaJP9nO0b/Zxo1v+ahS0ZqKJ9QCX5rJMyhN42aRj6h/udB5BKjiAp+i64uNrJ2M0Vs3rUiy4aU92G42X49iCYZDZjUMoX4ctFIcILfGgVU6E0LwEyCxKP98aWNxpc2GvFof+RjlyHlfdjxWnOxh93tJya5kIWHnDx2qJbnopP4NCmaYvtKC0LL6WYkQps70RA3laaUVbjzU1V7RRn2ijK8BbkWUJsM7VIAog7k8MyuPKtD1AJA/9zQQpYN9/oubFk/kpkLl7J4a0KbtrdZa/vSRrfMWS8GcSSzlGd25TH5VIjptTpR9T5SS+OMsrHZD3RHd7SDnTm1YwSzY2KsTtL46DSei07iSGZpm/tKeR8a5gnf0+vI8zfE5zAstpjptTrvifBJeeZ5LTQDkGXDtbsr0fte59mjDmaWaUyv1ZlZpvH3XJlRcQ6Grj5OTHJhy/t7VhrpwMVAog7kMCrOwcs+nZWaccak2L7S0oLpC6d2jGDJiUyWN8E6FVZqsLwJ5ruwYO5O9jFoUSIb4nPOT+/gtxf3kZjkQobFFreAaHRGGZoQbm+hhWd25fHsUQevHilgbo7bAmoNM2S/i6Grj3Mks9Tolcgn1Hb39MzHuXInw9edZrJd4z3xPISuLrYgCrf0ZOuOWKLzVFLLFDIKmlfr5EJmHMxhfoWvDczkUyELxl5RduFUUZNkIvdm8+BpkZd9eocQPyYc6XDnocpRQ+TebObmuFmptdTK5FMhBqwt4K1vMi4cWTMKnIyKczDZrvFJeWaHEBdrbVc5aphxMIflTR1rJaPA2TFI1IEc7k72tZwdYRCLtyZc6h4MMcmF7WrlwRSRAWsLiNyb3T6Iz+vjmV15jIpztIHwxN/I7JgY4svFS47CHk9DG62Y5hm4s5zx0Wntb0CnlikMiy3m06ToFpFSO9iZnSnbeGZXHkcyS8kocF6SHMksZc7m9AuaJyW/si3IltRaZsfEGNM09KZVs2bEzWV5EyzLlXn1SEG7MuNgTruy5JS73dlzd7IvPMi1BIlJLmRnyjbLJFawar7ZHi5NdrSS9jRyd7KPXlGnzQDXyjSlcYY2mk1SuKUnS05kslI7f9M9/HKgdaoh74nn/cR02NV7M9t2A9A/t/qf2uZOvB/zHvNdxk3Mm0bV+36VzK8wxHTWVutPmEbkE6q1hjQ3/yefCvGeeB7k1SPGlLsUeeubDOtnezJnczpvfZPBuXJnGEjzAqSri9FyulG4pSf3b/3OCvErNQNmxsEczpU70ST5kuWXJc9yiZXemQ3du5N9TK/VedmnW1qZm+M+v3r+gpTS42nA42nA5XRa4vE0hFd8zSDBb63cInvtAAYtSuTuZB+T7ZoFYy7tz+zK6+igQZtHRoGTyL3ZLab4M7vyGB+dxpAF+1i8NaEliLmWyNndsa+MZPi60/T/vpaJhTKT7ZqllZWaoZW3vsnA42m4IMS5cifPRScxN8fNeyK87NOZXqszsdDITa55/3i4dgVb0OPUTG2IR/vjzk9Vt6Qau5R3J/uYWCi3MJEJM2dzOkcyS80Q3WKrPia50IIIX2cmnwrxYIpIr6jTPBed1Mo0apFgpv0NcVMR3C5ESWLO5nS6fV3Ag6fFdmHmV/iYcTCHyL3ZRB3IsSRybzbP7MpjfoWvXYj+39cyZME+c7aEgTQ36smy0RA31dostrv9DF193IIJ9xcTxgSam+O2xAQwg9fMMo2JhTIPnjYgBi1KbC+RPq8REyR8iT9X7rRgWptpvssYLBwqHGB6rc7fc2ULYsh+F4MWJbLjUErH09c8ytcaxNTMCxtyGLC2oIUDT6/VO5TJdkMLJsTAneUMWpTYNotvE0eaj3rKxy6zun2t69mdKdt4fOley4lN35ls11pIOIC51D8XnWQu9xcGUQCteibyscuM5n31TKNqD5fm1H9DfA7PRScxdPVxhsUWMyy22Dq4MGS/i2GxxQxfd9oC2HEopb1WVcdtCU2Sqcv7OmTWpGbRLOV9SCh/P0GPUwvPvDIKnMQkFxK5N5s5m9N5LjqJ56KTeOubDFbvzSQlv7LN1P5FxzZ8Xp918v8SWk5WsWStLbr0a5oLHRdY/+GjPP8vtq7+0yCiJOHz+hDcLlxOJ2bzxeV0Irhdlk/9x0B8Xh9VjhoEt6s5rZTaFU1qQHC7qHLU/PpZ05EGqhw1uJxO0CVESSIlv5KoAznM2ZxufTJgzuZ0og7kkJJfaR1mcjmdVDlqflkc6ahSs1eUWdMzJrmQQYsSrYMJNy4raiHmYQWzD2IC2SvKLpa/dAzi8/qsc6cZBU6GLNjHlTMPcEtUJVMSdd45qRGdp7KxDOvDPu+c1JhxNMgtUZVcOfMAQxbss0K7vaLsQqbq+GCtCbEhPodOU2O58qNcZhwNsrMK4t0Xlp1VMONokCs/yqXT1FgrE7sATPvbJK0hblxWxDsnNWugvc7zcqFry3JlbomqbANzSdskpk9kFDjpOmWTpQnzne6sMgbbWWWYY8kpN0tOuYnOU1v8z9TcOyc1blxWRNcpmwwz6dLFjxr7vD5rY+eO13YSMS+Rh/co1iAby4wBluXKLDnl5rsCD1lVxk7FdwUelpxysyxXbvHcjWUwYb9CxLxE7nhtp7X10spELUHMMiHqQA6dJ+9k8KYaJh1u6ZRLTrnZklrb+hS3lURtSa1lySm39fyNZTAlUWfwpho6T95p1rqtS5LzICapJsmWNkbEBpiSqLMs1/gY3DsntfAuT4tDlkrYtci92bxzUmNjmaG9KYk6I2IDbbTStsBqjhma1EBKfiVdp2xiwNoCHt6jMOmwxjsnNev46KWUkaIksfCQk2W5Mu+c1Jh0WGPCfoUBawvoOmWT1d4Miy3nQczIuXpvJp2mxjJ4Uw0T9hsg09KM6fhcdBIxyYWXJM9FJzHjaJBpaTDpsAEzeFMNnabGGhVec+RtA1LlqAFd4vGley0Q8wZTEnWmpWGdWX3sUC3PHnW0K+b/n0qoZ1oaTEszfCQc5PGle0GXwv0k7PxI87S9EMjMMo35rvMdILPDbErrzlA4iOmw4SBh0/iXgUxLg8mnQvw9V2Zmmdau/D1XtpoxpiYe3qPw8B6FW6IqreOCvwpkWhqMinMwaFEi46PTfrFMXG38HLr6OHe8ttPykXZNYzrr4q0JdJoay4C1BS2cdfCmGuZsTrd6Hv/T5ozZJ7no9L1xWZE1fU0bD193unXx3GESFZNcyIb4nDazaUN8Dh6PkTy1O307CmgT9itM2K9YWnkuOumi26wTV6dZR43NXOXKj3LpPHknEY+us0DaDWiWnwCr92bSdcomBm+q4eE9ShsThTXh2jRn5mxOZ/CmmjYzZkRsgE5TY40Q33bhu/iiF66VcJjh604TuTfbUnnk3myGrzttQZgzZtJhzQrvfabHWGNccNELnz2tfSUcJjxADVhbwIC1BdYsMyOp+fyH9yhWGnAks/TS0gDTV4qK8q2NxU5TY7klqrIFTDhQ6+gZ/hwzdoSbpKgo/9LPj5hnR8yUwEwVw810MRkRG7BSRXPpLyrKv/RUsT2YI5mlLZLnEbEBK1q2lhGxASt5vuO1nZY5ioryL5TJX7icENwuioryjV1rr4+oAzkMWbDvouXEkAX7iDqQg8/rQ5MaLgZxaQWWJslWSWkWWBkFzl9UYP2PvgjFPNrj8/osM/2YcIQfE46QnpFmfL7K7SLocWpBj1Mz6+D0jLQWzzPb3b/6aI8SVnCbvXTTVOZxno6kqCjfKlPNUH4pIP9XPGz/N319UFnrf2iKLGi6LmggqCBoIOi6JuiqIqCrgqIrgqyrgoYu6JpiiK4LKgigCpquCCEdQdVVAU0VdP2iMGW29tplmtbcQNQ1QEXXNDQdQGsWHZBbvdQsKkTQfaiaBJrc/PyLPpQ2zqqbL9U10GV0TUbTZUCyQAoaJPaVinx5RmbVKZnVWRpf56r8WKlQFww2Q4bf8VdMXwsEtfkdGb97xSAb8yRG7df4zYYQ3deEsK2WsK1UsK1U6LIqxJWfKQzcEODVw0GS7KbG1F8Pout6C7WuL5Dpv1PBtlLEFgWXfyHTY61Ery91rvkiwLWfB7h6jcxV/5LoskLF9gl0+tjLI7FesuuxzKnrHeqneQdL143Bjacj6wqg4ZFUph8JYvusCdsXIldvhGvXi/T+SuS6dQrXrZO4fp3Ib76UuH5NiD6fi1z/mcgNnwa5epWMbbHG1StEvsoSjbeoq2i60h6MYNN1XTAhNF1vdlBoVFSG7/Nh+1Ti2o1Brl8v03uDyDVfN3DDVz5u+FKh15cKvdbp9FoHvT5X6PW5wjVr4LrPda6NkugTJdL1EwXbIpkVx5sdGaXZ8S9gGgNIJ6ipPHgghO3TED23h+ixTafXZpmb1ofos0ml+9dw1VcaV3wapMvKIF1WSVz+qULPzxV6faZw9Wc613yq0Xt1iN9Ehei+WMG2QObz03JHDtxsGk07P2XRmZ/hx7ZG5rqtMjdubqTHFonrNov8doPMZRvA9pmPqz8X+MNWhb/tkrg/VuGWaJXLPmmk85Imen6m0+sz6BMlcsNqP9etVujysU63jwIcrwy1N6UFm6Zrgma4KKBxrE7lyq999PnaT58dcMNWjV5bFa7d6sP2lcj/+szP6/FNHK2SqQtpSKqIKItUN2psyJH52yYXtkV+uq9UuP5fMj1XqVy9WuWGFSE6LQgxbHMQv6kVXW92B12wKZouSEjGNNMVJvwgYdugcGOsym+2q/TZqnD9dh3bVz5u3h4guVJtnpJa808zkJlBMMS7SQG6vB/gimUKvVdK9Fmu0nu5zLXLZGzvaWzLDhggmoysqwYIKoKqG+rKqVO5douP62JUfvutxg2xCn1iZTpv0rgpRuF0XQAIgRJElSUURUWWZWRZRpFlgrIKeIEg7yaC7X2FXkslei+XDVkmY1sQ4pFNDaA3hwcdNF0XbGjNZwNQWXZaxrZV5XexMjftFLnpW4ne34rYNvjZUywBQUJqEEkMoEk6oqIgySqipCCKEt6Qis8fRNEaAB+TtijYInV6Lwtx7VKRPstkIj5S6PGBRGFtwFCgApquCDYFTQANXZeZkiARsVPnlu9kfhcr0/cbiYivA4w94DM0oet4VQVJUQiJGiFRIiTKBEMSAX+QhoBIvU/C1SQCfpIKGrl8kZerFitcu0Tkuk9ErlsiYXtDYuMpYyobE0gVbIouC6DiDsgMiwtx406Z/rs0+u6WGPCNSI8tIZbnSoCCEvITkBRkWSMUkAgEJbz+EE2+IA3eAPUNjTR6fNTWSni9PuoFN/d8KtBpkcg1n3jp82GQ3h/6sc33seAHb/P6pYOmCTY0VQCNEkHhrgMhfrdL5k/fafT/XqT/boU+sRI/2r0AhESFYFDCF1TwBSWa/CE8TQHcjQFcDX6cdQGq63w43PWU1AoEmup4emMjtvl+enzop/d7Aa57N4Btvo/Z37jCHBzBpuqaAHDOHWDo/iD99in8+XuZO/er/H6fxsB/h0irDgGqoYGAhOAL0eALUd/oo87TRK2nCUddI3anQKXTTUl1DUVVNXga6nh2mwvb6066L3Bz3btOekU2YXtd5MVNDmuVVtEFm6brAmiUu4OMPODnjv0idx+UGHpQ4q6DEnf928+h0iCg0egN0OgXqW8MUCd4cXm81LgbqHIJlDs9lFd5KK90U1hWQ3GlgLOqlrs/rsQ2q45rFjq57q0yukc6sL3iYc62akBDR0fRNcGmq5oAQYSAyuQEibsPhnjgkMYD8T4ePOTnv/ZrfJrtBTWE4A3ibvRTJ3hx1jdRXddApbOeMoebEruL3Ao3p8vqOVVSR1JuDZkFtbywvgDb0zl0eqmanm+Wct2bFdhmlvP2Po/hH6qIrmiCTdNUAVVElTVeyfTz10My435UGHNE5JGfJIYf1ZiV4kFo8uILBKirD+LwBHC43Dhq6ymurqfAUU9ORS05RSU0NHmQVRW/JCMqOho6354U6DEri04z8+nxWim2fxSx8ZgLEAlJCqoiCzZZUwVZVECDjUVNDD8s8sRRlSmJOs8mwbPHZJ466iO2yI8aDNJU56a8tpGqaicOZx2FVfWcLa8lq7CMBn8IHfAGZQKSik/SQAoBOjEZtdiezqTTS/l0fzmPrFIBNB9CUCcoSYJN0TTBKymgS5TXBXn8pwCTj8lMT1WZmarx+nGR2Rk680+GOFleh9/bgMtZR3V1HYWVLvJKajiTV0pVjRsV8IVEgrLaLApeERSCAAx5/xS2+48zZvlZAmKIQFMTHq+PppAi2DRdFQIyyKIfRImoMz6ePO7lpUyJl08r/PN0iMjTEh9kS6zNEUgp92GvaaDAXstZh4DLG0JoChAMyviDMn5Jxi/K+EISIVnFr0h4JWPZ33a8mNteSCI6vhpZbMDhaqChyYfHHxRsmhYURBECoRDoMvkukVfTFN7IlHk7W+aDXIlVOSHW5ob4qhi2F4v8WNLIiSov5wLgkVVERSUYMqa2LyTjF1UCkkpQ1vGLImJAxCsai2SdKFJQ6aG0ooqK+gBuVxOCTxBsuq4IkqQSFCVCkgyqzg8lXt5J9/H+WViVJ7G+KMSOEoVdJSp77DJxdRrH3Rq5goLDJyMERRqCIt6QbPiHqBAQFSRJJSCrhGSZJklDUs/nIefsNRRXe3DWefE0NjUf21BURFEiGDRWVH9I5Nu8Rt7Pk/lXocbWIpFvKzT2VSr8YJdIcEqk1Svke2TsPhV3SMYTEmkISngDCr6QTFBSCUkqQUnFL2kEJUNLflFF1aGuyUepow6HuxG34DdyVkVRkCQFUVLxBWR0ScEfFPmuuIG1hTIxpSr/rpA46FBIqJHJdGmcqVPJa1Co9MrUBiTcQQlPQKYhoNAUUvCJCn5JJSApBCTZEr8oEVJU/IpKiaOOmnov9Q1+QyOqqiErGqKiIYk6/mAATQ4QalRItPvZU+EnvkrmxxqJRJdIVp1KTr1GQaNChVei2idTE9BwBRTqAzKeoEyjKNMkKvglhaCkNAMZogAeX4DS6npcDQE8jYHmM0aajqLqyLJOSNbwSTJev0woEKCxyU9OdZCEkgAJ1UGSBYWsBo3cRihq0qj0KVT5ZBwBjdqQRn1IRhBVGiWVRlklqOiIikZQ1hAV4ytjJE2n0ummqt6LU/AjNAYEm64jaBqoqo6iaEiKhiirBESVhkAQr9eH0ChSUu3nVGkdGY4mUmt8ZLoC5DWoFDUplHpVKnw6VT6ZWn+IuqCEJ6TQEFINzUgSflXFJ8nUe304XALVdQ3UNwaob/TT5A0ZILoO4TCyrBKSZHxBGcEfxNPgpdETwO32U+ZoIKesnrPlHrLtbn6urCfPXk+B3U2R3cO5qgbOVTVQUilwrkKgtEqguLKe4sp6yhwNlNg9VLkEhKYgjd4QTX6RYFA+X2Dpuo6maaiqiqqqKIqGKKn4QwrekERjIIC70YenMUBjk0S9EKK23our3ovb48Xj8SI0BfD4ROq9IdyNQeoa/Lg8AZxuPzV1PuobRASfguAN0egP4Q1KBEMykqwKNkAxMnpDNM1oSxhQGrKiI6oqTapIkyTiDYUIiDLBkEwoICOGjHghKxqKqqCoEooqEVJFgkqIkBIiKIsEpBB+MYA/FMAXkgiICiHRmK2KoilWo6bZRIKu61bjRdd1QdEQVBVBkzRBlVRBFhVBVTRBUXRBknVB1hAUECQQNF0XUHVB13RB0XRBVDRBUjRBUTVBUlRBlBRBlGQhJGuCJOuCouiCpuqCqqpl/7Eemqor5HnS2Ja/hPezpvCP1PuYlfo3vvo5EnfA0baH9qs+CKZpBIIh7DUuyuw1lNprqHDU4mnwoqoamq5xyn2YVTkv8cKJO3n+TH+eTB7Ao/H9eSr+TnbmrfyfgdiddZzKKaK0yklhuYN6oWVfvabay+6Tu3gzaSJPpPZm9E9XMmnvH1n60wKSanZypuEg35WuZlrCMLb9vPSXgzicdWTkFLX7vya5Dq/spk62s8v1AW+cu53ns29kSd6z/Fi9mZ/L8tpqVFfZeHYxBe7MSwdJy85v8Xd1oJwDFRtZlTeTD88+wcKsMSzMGsv8rL8wNbMnc7LuJN6xg6AcsF6TW1xBkzfQct9P8pDrSkfT1QuDKKrKz8UV1t+V3kKi89/m1YyhvHlyMPOz/ouFZ4fwYe59fJAzjLfO3s66wuep8p7jbF0iUTkzOe76/rzZ6jxUVteGtch06gL2C4PIikJFtcv6e3/ZeuamDOHNU//NivwxfFY8jnXlE/iyYiKflz/Eh4WD2Gv/CL/YQIJjI2+dvJvXTt7FtJS+LPt5OvVBY383KEoUlFaGzSz5wqb5ubC0WSsyG3PfZUbKnXzw8wOsKX6EdWUT+NI+nq8cY1nrGMnikjuJd0Xhld1sr3iTt37+IyuLHmZN0WMszxnPzLSBvJnxMMWNPxv7vUITLrdw8VlzMswnNud+xD+O3cGy3LF8ce5R1pZN4IuKsXzlGM0X1SP4uPJ2jgpraJAcfFb+CJHnbuOz8pF8UT6OL0om8nnRJFblPcrLaXfxxolROHzGd2idq7xIHBEavTQFQwAcLNvMP5Lu5JOcsawpmsRnJROIKnuYtVWjWVP9Vz6q7McRz0pUTSa2Zh6LSgeytOJPfGa/j3UVY1lTMoFPz01kdcEjLM95hNmp/8UHmU+j6MYnlrJyz3UMknHW0IbDW8rLyfexIGs4nxU8zqqi8Xx07gGiKkfyheN+ltnvJEFYGdYOFWlUqjniWcGK8iFElQ1jTek4Pi2awOqCR1iZ9wgfnx3Hs4l9+aHc+BqH2voGRFFqC+JpaEKSjOR2Y84iZqX8majcx1ieN57Xc+/hvXPD+aziAZaX30VGY0yH0/1s00E+KR7KquL7+ezceFbnT2BFzkSW5Uzg7VP38UbKQ3hCdc1aKWoLktHsG06/nbnJ9/H+6VGsyJnIC9l38kreMNaUPsKSkkHsdy26aABMcK3lw4L/5l9FY1mdP56lOeP55Ox4Psh+mOeT7+BAyUZj17O8qiWIKMkUlNoBOFQaw4zkQSw+M5bZp+7in7mPsKnkFVade4DPSsfTJNVeFCSk+lhbPIVl+Q+wMnccS8+OY/GZsXxwZjTTj9/OkqwXACi3O/H5A+dBKhy1lFQac33t2bf5R/KdvJnxFxadnkSyYzuf5j3BssIR/Kt4DBvLp/NF2dOsqXiSNRVPsKbyCeNnxZN8XjaFz4ufJrr4Bf5V8Agr8h5iWc5YPs4ey4enR/P+6YeYnfZn3kh9CAUfqgz2Gtd5kLOFpZTYjUMHH516jmlJA3jjxHCO2XexteBtFpwZyqqC0awo+huLCv7Eu4W38V7x73mvtD/vl/Xl/bJ+vFfye94tuo2F+X/g3dw/szT/b6zIHcMnZ0fz0ZmHWXT6ISKzRvJq5mBeSh5MSeNZyzyyrBggWTlFlNsNssiMKYz9oQe7i/9FmmM/r6bezZKfx7Is5yGW5f+NFYUjWHXuflaXDmN12V+JKhtGVNkwVpX9lZXFw1lRNILl+Q/ySc6DfHRmFIuyRhF5ciRvZ/6NNzPvZ3baIJ5N+AM/1xsfXcg9V47XH2wLMidpFE/9eAcVQg7Lsp7j9fShfHTmIT4+M4rIrKG8ljGAeSf78eaZfszP7sc/z/bln9n9mH+mH29m9eO1jP7MPfF7ZibfxvSE3zP1UD+eiruVxw/cxIT9fRj+764Mje3M6bqjAOQVl+MPhgyQvHPllFQapnkhfgRf5y7haNV3PJvwe945+QDvnnyAf2bcQ0zR22S7fySzbj+Z7n2cdO/jZP1eTtbvI9O9j8y6fWS49pHm3Edq9T6OV+0luXIPRyt2k1C+i/jybzhYupUfSrfjV40wX1zhQNN0A8RR66bEbjjr5p+Xc9IRz9snJvJ88h94O/N+3s64j1dS7mJLXuT/v0e/vT6qa93nnVXXdXLOlRtJi6qSWLmL8Yd682rGvcxLG8qbJ4byRuoQXj56L+UNuRcdoDHk5kDJNvaXbuZA2Rb2l21hX9nX7C3byNaCKJKr4pqnbw3+QLBlQDttxn4dPsh4hseP3sjcjP/m5dRBvJYymNdTBjMtvh8rT865KMja0wsZvqsr4/f3ZNyBnjx88CpGxV3BiAM2bt5iY8PPKwz/KKlsG1lDooTgCRJAYPKR/jyb2pcZaQOZdfyPzDn+J145/l/MSfojU364lW05yzuE2F30FU/80JcZSQN5+fifmH38Tmam3MGM1Dt4LOE6pv90DyHFCGLZ+SXtL3pn88rJCR5hbPy1TEq6jqnJv2XGsduZdfwPzD52By8n/5FZSX9g8sGbeDflGU7VHMUTqKMhVM/Z2hMsSZ/JY3G38I/E25l77I/MOv4HZhy/nRkptzE1+Rbu+beNhMrvjLEKSi+cj0T+8AaPZfTi2eQ/8Gj89fz96C3MSB7AjOTfMzPpNmYn3c7MowN4/IdrmXKoPy8l3MtLP/2Fpw7fxiMHr+HFxH7MTrqNmUm/56XkAbyY3I/pyb/jr/tsRJ542hqnOGydaRdkxv6J/DXBxvflX/Fd0Rru2W3jmYTrmZnUnxlJ/ZhxtB+zjg5g1tH+vJBwM1Pjr+fZ+Ot5PuFmZiX2Y9ZR43kvJfXlpeR+PJ90M3/da2Nm4gME5MZ2c5F2QV5OeYA/7rZxrOYgANE/f8S933ViTFxXZiX1ZfbRvsxK7MusxFuZnXgrs8JkZuKtzEi8lZlHf8espL48Gd+Lu3fbeDVpLA1BY+kvc7T7ZTktQUQlyLQjg/nzv20cyo+zrsdX7OKR/bcybLeNp368hpd+uok5ib9lbuKtzfI75ib+jtmJv2PGT7fwfMJveOj7zty/O4JPs+YjKsYUdTc04Wloav/YRusLz/04lAeTIsgsPENewfnc0is1EH32Qx47MICH913F+O//F+O/t/H4wW7877gIHtnfhXHfd2Hs91cyZl9v3k19lgLPaev15TV1NDR6Oz4/0vrC26ceYVhcL45X/GB4d2Eljf7Q+cJI9pHqiGPVqVeZd+wRZicOZ0bCvbyS9DAfpD3PnnNfUuO3ny9NVI2T+eVI8oVPGrUB2ZsfzX1HehJTtMK6FgyJZOYW0+gXf1EIz8wro9LhvKTn2lrugkMoFOS5n/7C0APXYK8tb3GepMrh5HB8Cmknz5JbXEpBSQVlFbVU2N0UlVWRW1RK1s95/JCQzMkzPyPLMpqm4ff7CQQChEIhJElCURQ0TcPsVOm6fn6tCT+oUOkq4bGE27n/qzv4KeMIwVCQQCBAbV0ttXW1VFRWkJ19lrS0DJKSj5F4NInk5OOcPHmK/Px8amtrcbvd1NTU4HQ6cbvdNDU1WTCyLKOqaguYDmvfgNzE4bIYdpWv4UT5EezuMkQl9B877PT/DQC7cLwx8LR3hQAAAABJRU5ErkJggg==) no-repeat;padding-left:40px}
- .browser .browser-firefox{background-position:0 -34px}
- .browser .browser-ie{background-position:0 -68px;margin-left:0px}
- .browser .browser-360{background-position:0 -170px;margin-left: -27px}
- </style>
-</head>
-<body style="margin-top:50px">
-<h1>璇峰崌绾ф偍鐨勬祻瑙堝櫒锛屼互渚挎垜浠洿濂界殑涓烘偍鎻愪緵鏈嶅姟锛�</h1>
-<p>鎮ㄦ鍦ㄤ娇鐢� Internet Explorer 鐨勬棭鏈熺増鏈紙IE11浠ヤ笅鐗堟湰鎴栦娇鐢ㄨ鍐呮牳鐨勬祻瑙堝櫒锛夈�傝繖鎰忓懗鐫�鍦ㄥ崌绾ф祻瑙堝櫒鍓嶏紝鎮ㄥ皢鏃犳硶璁块棶姝ょ綉绔欍��</p>
-<hr>
-<h2>璇锋敞鎰忥細寰蒋鍏徃瀵筗indows XP 鍙� Internet Explorer 鏃╂湡鐗堟湰鐨勬敮鎸佸凡缁忕粨鏉�</h2>
-<p>鑷� 2016 骞� 1 鏈� 12 鏃ヨ捣锛孧icrosoft 涓嶅啀涓� IE 11 浠ヤ笅鐗堟湰鎻愪緵鐩稿簲鏀寔鍜屾洿鏂般�傛病鏈夊叧閿殑娴忚鍣ㄥ畨鍏ㄦ洿鏂帮紝鎮ㄧ殑鐢佃剳鍙兘鏄撳彈鏈夊鐥呮瘨銆侀棿璋嶈蒋浠跺拰鍏朵粬鎭舵剰杞欢鐨勬敾鍑伙紝瀹冧滑鍙互绐冨彇鎴栨崯瀹虫偍鐨勪笟鍔℃暟鎹拰淇℃伅銆傝鍙傞槄 <a href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support">寰蒋瀵� Internet Explorer 鏃╂湡鐗堟湰鐨勬敮鎸佸皢浜� 2016 骞� 1 鏈� 12 鏃ョ粨鏉熺殑璇存槑</a> 銆�</p>
-<hr>
-<h2>鎮ㄥ彲浠ラ�夋嫨鏇村厛杩涚殑娴忚鍣�</h2>
-<p>鎺ㄨ崘浣跨敤浠ヤ笅娴忚鍣ㄧ殑鏈�鏂扮増鏈�傚鏋滄偍鐨勭數鑴戝凡鏈変互涓嬫祻瑙堝櫒鐨勬渶鏂扮増鏈垯鐩存帴浣跨敤璇ユ祻瑙堝櫒璁块棶鍗冲彲銆�</p>
-<ul class="browser">
- <li class="browser-chrome"><a href="https://www.google.cn/chrome/browser/desktop/index.html?hl=zh-CN&standalone=1"> 璋锋瓕娴忚鍣�<span>Google Chrome</span></a></li>
- <li class="browser-firefox"><a href="https://www.mozilla.org/zh-CN/firefox/new/"> 鐏嫄娴忚鍣�<span>Mozilla Firefox</span></a></li>
- <li class="browser-ie"><a href="https://windows.microsoft.com/zh-cn/internet-explorer/download-ie"> IE 11 娴忚鍣�<span>Internet Explorer</span></a></li>
- <li class="browser-360"><a href="http://se.360.cn/"> 360瀹夊叏娴忚鍣�<span>360 Chrome</span></a></li>
- <div class="clean"></div>
-</ul>
-<hr>
-</body>
-</html>
\ No newline at end of file
diff --git a/index.html b/index.html
index b45cb21..162adcc 100644
--- a/index.html
+++ b/index.html
@@ -1,217 +1,21 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
- <meta name="renderer" content="webkit" />
- <meta
- name="viewport"
- content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
- />
- <link rel="icon" href="/DHDCico.ico" />
- <title>鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺</title>
- <!--[if lt IE 11
- ]><script>
- window.location.href = "/html/ie.html";
- </script><!
- [endif]-->
- <style>
- html,
- body,
- #app {
- height: 100%;
- margin: 0px;
- padding: 0px;
- }
-
- .chromeframe {
- margin: 0.2em 0;
- background: #ccc;
- color: #000;
- padding: 0.2em 0;
- }
-
- #loader-wrapper {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: 999999;
- }
-
- #loader {
- display: block;
- position: relative;
- left: 50%;
- top: 50%;
- width: 150px;
- height: 150px;
- margin: -75px 0 0 -75px;
- border-radius: 50%;
- border: 3px solid transparent;
- border-top-color: #fff;
- -webkit-animation: spin 2s linear infinite;
- -ms-animation: spin 2s linear infinite;
- -moz-animation: spin 2s linear infinite;
- -o-animation: spin 2s linear infinite;
- animation: spin 2s linear infinite;
- z-index: 1001;
- }
-
- #loader:before {
- content: "";
- position: absolute;
- top: 5px;
- left: 5px;
- right: 5px;
- bottom: 5px;
- border-radius: 50%;
- border: 3px solid transparent;
- border-top-color: #fff;
- -webkit-animation: spin 3s linear infinite;
- -moz-animation: spin 3s linear infinite;
- -o-animation: spin 3s linear infinite;
- -ms-animation: spin 3s linear infinite;
- animation: spin 3s linear infinite;
- }
-
- #loader:after {
- content: "";
- position: absolute;
- top: 15px;
- left: 15px;
- right: 15px;
- bottom: 15px;
- border-radius: 50%;
- border: 3px solid transparent;
- border-top-color: #fff;
- -moz-animation: spin 1.5s linear infinite;
- -o-animation: spin 1.5s linear infinite;
- -ms-animation: spin 1.5s linear infinite;
- -webkit-animation: spin 1.5s linear infinite;
- animation: spin 1.5s linear infinite;
- }
-
- @-webkit-keyframes spin {
- 0% {
- -webkit-transform: rotate(0deg);
- -ms-transform: rotate(0deg);
- transform: rotate(0deg);
- }
-
- 100% {
- -webkit-transform: rotate(360deg);
- -ms-transform: rotate(360deg);
- transform: rotate(360deg);
- }
- }
-
- @keyframes spin {
- 0% {
- -webkit-transform: rotate(0deg);
- -ms-transform: rotate(0deg);
- transform: rotate(0deg);
- }
-
- 100% {
- -webkit-transform: rotate(360deg);
- -ms-transform: rotate(360deg);
- transform: rotate(360deg);
- }
- }
-
- #loader-wrapper .loader-section {
- position: fixed;
- top: 0;
- width: 51%;
- height: 100%;
- background: #7171c6;
- z-index: 1000;
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0);
- }
-
- #loader-wrapper .loader-section.section-left {
- left: 0;
- }
-
- #loader-wrapper .loader-section.section-right {
- right: 0;
- }
-
- .loaded #loader-wrapper .loader-section.section-left {
- -webkit-transform: translateX(-100%);
- -ms-transform: translateX(-100%);
- transform: translateX(-100%);
- -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
- transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
- }
-
- .loaded #loader-wrapper .loader-section.section-right {
- -webkit-transform: translateX(100%);
- -ms-transform: translateX(100%);
- transform: translateX(100%);
- -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
- transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
- }
-
- .loaded #loader {
- opacity: 0;
- -webkit-transition: all 0.3s ease-out;
- transition: all 0.3s ease-out;
- }
-
- .loaded #loader-wrapper {
- visibility: hidden;
- -webkit-transform: translateY(-100%);
- -ms-transform: translateY(-100%);
- transform: translateY(-100%);
- -webkit-transition: all 0.3s 1s ease-out;
- transition: all 0.3s 1s ease-out;
- }
-
- .no-js #loader-wrapper {
- display: none;
- }
-
- .no-js h1 {
- color: #222222;
- }
-
- #loader-wrapper .load_title {
- font-family: "Open Sans";
- color: #fff;
- font-size: 19px;
- width: 100%;
- text-align: center;
- z-index: 9999999999999;
- position: absolute;
- top: 60%;
- opacity: 1;
- line-height: 30px;
- }
-
- #loader-wrapper .load_title span {
- font-weight: normal;
- font-style: italic;
- font-size: 13px;
- color: #fff;
- opacity: 0.5;
- }
- </style>
- </head>
-
- <body>
- <div id="app">
- <div id="loader-wrapper">
- <div id="loader"></div>
- <div class="loader-section section-left"></div>
- <div class="loader-section section-right"></div>
- <div class="load_title">姝e湪鍔犺浇绯荤粺璧勬簮锛岃鑰愬績绛夊緟</div>
- </div>
- </div>
- <script type="module" src="/src/main.js"></script>
- </body>
-</html>
+<!DOCTYPE html>
+<html lang="zh-CN">
+ <head>
+ <meta charset="UTF-8" />
+ <link rel="icon" type="image/png" href="/static/logo.png" />
+ <script>
+ var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+ CSS.supports('top: constant(a)'))
+ document.write(
+ '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+ (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+ </script>
+ <title>浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴 路 姹熻嫃鍟嗚锤鑱屼笟瀛﹂櫌</title>
+ <!--preload-links-->
+ <!--app-context-->
+ </head>
+ <body>
+ <div id="app"><!--app-html--></div>
+ <script type="module" src="/src/main.js"></script>
+ </body>
+</html>
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..425882c
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,13421 @@
+{
+ "name": "uni-preset-vue",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "uni-preset-vue",
+ "version": "0.0.0",
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-harmony": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-plus": "3.0.0-5020420260813003",
+ "@dcloudio/uni-components": "3.0.0-5020420260813003",
+ "@dcloudio/uni-h5": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-alipay": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-baidu": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-harmony": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-jd": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-kuaishou": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-lark": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-qq": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-weixin": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-xhs": "3.0.0-5020420260813003",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-5020420260813003",
+ "vue": "^3.4.21",
+ "vue-i18n": "^9.1.9"
+ },
+ "devDependencies": {
+ "@dcloudio/types": "^3.4.8",
+ "@dcloudio/uni-automator": "3.0.0-5020420260813003",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-stacktracey": "3.0.0-5020420260813003",
+ "@dcloudio/vite-plugin-uni": "3.0.0-5020420260813003",
+ "@vue/runtime-core": "^3.4.21",
+ "rollup": "4.14.3",
+ "vite": "5.2.8"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/highlight": "^7.24.7",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.25.2",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz",
+ "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.0",
+ "@babel/helper-compilation-targets": "^7.25.2",
+ "@babel/helper-module-transforms": "^7.25.2",
+ "@babel/helpers": "^7.25.0",
+ "@babel/parser": "^7.25.0",
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.2",
+ "@babel/types": "^7.25.2",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+ "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "regexpu-core": "^6.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+ "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.11"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+ "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+ "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-wrap-function": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+ "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+ "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
+ "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.25.9.tgz",
+ "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.6",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.6.tgz",
+ "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.6"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz",
+ "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz",
+ "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz",
+ "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz",
+ "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz",
+ "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-transform-optional-chaining": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz",
+ "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz",
+ "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz",
+ "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
+ "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
+ "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz",
+ "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
+ "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz",
+ "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
+ "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
+ "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
+ "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
+ "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz",
+ "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/template": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
+ "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz",
+ "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz",
+ "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz",
+ "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz",
+ "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz",
+ "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz",
+ "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
+ "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
+ "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz",
+ "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz",
+ "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz",
+ "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
+ "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz",
+ "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz",
+ "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
+ "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz",
+ "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz",
+ "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
+ "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz",
+ "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
+ "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz",
+ "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
+ "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7",
+ "@babel/plugin-transform-parameters": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz",
+ "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
+ "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
+ "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
+ "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
+ "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
+ "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz",
+ "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz",
+ "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz",
+ "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz",
+ "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz",
+ "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz",
+ "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz",
+ "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz",
+ "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz",
+ "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz",
+ "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-syntax-typescript": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz",
+ "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz",
+ "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
+ "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz",
+ "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.29.7.tgz",
+ "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7",
+ "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.29.7",
+ "@babel/plugin-syntax-import-attributes": "^7.29.7",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.29.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.29.7",
+ "@babel/plugin-transform-async-to-generator": "^7.29.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.29.7",
+ "@babel/plugin-transform-block-scoping": "^7.29.7",
+ "@babel/plugin-transform-class-properties": "^7.29.7",
+ "@babel/plugin-transform-class-static-block": "^7.29.7",
+ "@babel/plugin-transform-classes": "^7.29.7",
+ "@babel/plugin-transform-computed-properties": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7",
+ "@babel/plugin-transform-dotall-regex": "^7.29.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.29.7",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7",
+ "@babel/plugin-transform-dynamic-import": "^7.29.7",
+ "@babel/plugin-transform-explicit-resource-management": "^7.29.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.29.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.29.7",
+ "@babel/plugin-transform-for-of": "^7.29.7",
+ "@babel/plugin-transform-function-name": "^7.29.7",
+ "@babel/plugin-transform-json-strings": "^7.29.7",
+ "@babel/plugin-transform-literals": "^7.29.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.29.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.29.7",
+ "@babel/plugin-transform-modules-amd": "^7.29.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.29.7",
+ "@babel/plugin-transform-modules-systemjs": "^7.29.7",
+ "@babel/plugin-transform-modules-umd": "^7.29.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7",
+ "@babel/plugin-transform-new-target": "^7.29.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7",
+ "@babel/plugin-transform-numeric-separator": "^7.29.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.29.7",
+ "@babel/plugin-transform-object-super": "^7.29.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.29.7",
+ "@babel/plugin-transform-optional-chaining": "^7.29.7",
+ "@babel/plugin-transform-parameters": "^7.29.7",
+ "@babel/plugin-transform-private-methods": "^7.29.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.29.7",
+ "@babel/plugin-transform-property-literals": "^7.29.7",
+ "@babel/plugin-transform-regenerator": "^7.29.7",
+ "@babel/plugin-transform-regexp-modifiers": "^7.29.7",
+ "@babel/plugin-transform-reserved-words": "^7.29.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.29.7",
+ "@babel/plugin-transform-spread": "^7.29.7",
+ "@babel/plugin-transform-sticky-regex": "^7.29.7",
+ "@babel/plugin-transform-template-literals": "^7.29.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.29.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.29.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.29.7",
+ "@babel/plugin-transform-unicode-regex": "^7.29.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.29.7",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.15",
+ "babel-plugin-polyfill-corejs3": "^0.14.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.6",
+ "core-js-compat": "^3.48.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz",
+ "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js-pure": "^3.48.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template/node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.6",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz",
+ "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/types": {
+ "version": "3.4.31",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/types/-/types-3.4.31.tgz",
+ "integrity": "sha512-YAqOfJpcAwMs4Fagv2oP+iRHSCJOJoN8JUYyoRD6gwfANhsI9QaYj4/j22FzSopfHkqjX50B7YkG/VRAyz9OnA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-app": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-EQq23FHexCA8VrLMRgCed5LZFMF8VE23Zom9OcjkKULdcgbRMaFJ4aPAAmOB1teOV3Bi1KgneqjaAWwyVR3AQQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cloud": "3.0.0-5020420260813003",
+ "@dcloudio/uni-components": "3.0.0-5020420260813003",
+ "@dcloudio/uni-console": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-push": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-stat": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "@dcloudio/types": "3.4.31"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-harmony": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-harmony/-/uni-app-harmony-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-sHrc3bp9YTgoSl7eIbXV3fpgEfle9GmaRJXmErBRu66W0AhPBhwUuPqfXip+l+M5WexsMtnmaGRtQKld+oh4Vg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app-uts": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-vite": "3.0.0-5020420260813003",
+ "debug": "4.3.7",
+ "fs-extra": "10.1.0",
+ "licia": "1.41.1",
+ "postcss-selector-parser": "6.1.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-plus": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-hjwCRSxg2N5GWnAPnTW8EpFZ8tK3jP5QCWl4IKio0KQnbavIt6YzskSDeIczwuYchJeN7m40cuE4Sn+8U1SLsw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app-uts": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-vue": "3.0.0-5020420260813003",
+ "debug": "4.3.7",
+ "fs-extra": "10.1.0",
+ "licia": "1.41.1",
+ "postcss-selector-parser": "6.1.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-uts": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-SXomryZJiH+KCYMokIVlmaPcmjsEDGHJNEufF3TwoDsc75wrnMKTRNwy/yED6p4Jjnw+0YJfml1Ab7SoNaxTNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/parser": "7.25.6",
+ "@babel/types": "7.25.6",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-console": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@jridgewell/gen-mapping": "^0.3.3",
+ "@jridgewell/trace-mapping": "^0.3.19",
+ "@rollup/pluginutils": "5.1.0",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/consolidate": "1.0.0",
+ "@vue/shared": "3.4.21",
+ "debug": "4.3.7",
+ "es-module-lexer": "1.5.4",
+ "estree-walker": "2.0.2",
+ "fast-glob": "3.3.3",
+ "fs-extra": "10.1.0",
+ "magic-string": "0.30.11",
+ "picocolors": "1.1.0",
+ "source-map-js": "1.2.1",
+ "unimport": "4.1.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-vite": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-+R/sOmKebt4lZKDeq7/HGiLY8vgkNAhbtnJMZTylxsvDQlZP6C/PJA+pb2Cqf2DpURcQSiekFkXyY+CzoAHwAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@rollup/pluginutils": "5.1.0",
+ "@vitejs/plugin-vue": "5.2.4",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "debug": "4.3.7",
+ "fs-extra": "10.1.0",
+ "picocolors": "1.1.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-vue": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-lXS1NKsTGCjAP+hfbwE4X+4ssZ7VwOs/+JPhTksdhHy/PUwEbx3unmZsgIKMFK1ffAQiVgqa47A2B9Cia4WA5w==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-automator": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-automator/-/uni-automator-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-WesOU05kpPBQdC94LjrXvtFOeaCScVJtpQQUifwi5D33HcNkyiQf4mMXM11jWDC/a1jzmKmcRIJJw9UoFtxATQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "address": "^1.1.2",
+ "cross-env": "^7.0.3",
+ "debug": "4.3.7",
+ "default-gateway": "^6.0.3",
+ "fs-extra": "10.1.0",
+ "jsonc-parser": "3.3.1",
+ "licia": "1.41.1",
+ "merge": "2.1.1",
+ "qrcode-reader": "1.0.4",
+ "qrcode-terminal": "0.12.0",
+ "ws": "8.18.0"
+ },
+ "peerDependencies": {
+ "jest": "27.0.4",
+ "jest-environment-node": "27.5.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-Legir++K7FjIiDiZ+aN7LrzFCaRJxYc+5VFKCzg3loECHEeWgUJ9fx3mZSamsz+6h5/VB3v6AEuefe88tNkMVg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.2",
+ "@babel/code-frame": "7.24.7",
+ "@babel/core": "7.25.2",
+ "@babel/parser": "7.25.6",
+ "@babel/types": "7.25.6",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@intlify/core-base": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "@intlify/vue-devtools": "9.1.9",
+ "@rollup/pluginutils": "5.1.0",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "adm-zip": "0.5.16",
+ "autoprefixer": "10.4.20",
+ "base64url": "^3.0.1",
+ "chokidar": "3.6.0",
+ "compare-versions": "^3.6.0",
+ "debug": "4.3.7",
+ "entities": "^7.0.0",
+ "es-module-lexer": "1.5.4",
+ "esbuild": "0.20.2",
+ "estree-walker": "2.0.2",
+ "fast-glob": "3.3.3",
+ "fs-extra": "10.1.0",
+ "hash-sum": "2.0.0",
+ "isbinaryfile": "5.0.2",
+ "jsonc-parser": "3.3.1",
+ "lines-and-columns": "^2.0.4",
+ "magic-string": "0.30.11",
+ "merge": "2.1.1",
+ "mime": "3.0.0",
+ "module-alias": "2.2.3",
+ "os-locale-s-fix": "^1.0.8-fix-1",
+ "picocolors": "1.1.0",
+ "postcss-import": "^14.0.2",
+ "postcss-load-config": "^3.1.1",
+ "postcss-modules": "^4.3.0",
+ "postcss-selector-parser": "6.1.2",
+ "resolve": "1.22.8",
+ "source-map-js": "1.2.1",
+ "tapable": "^2.2.0",
+ "tinycolor2": "1.6.0",
+ "unimport": "4.1.1",
+ "unplugin-auto-import": "19.1.0",
+ "xregexp": "5.1.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
+ "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
+ "license": "MIT",
+ "dependencies": {
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "picomatch": "^4.0.2",
+ "unimport": "^4.1.1",
+ "unplugin": "^2.2.0",
+ "unplugin-utils": "^0.2.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import/node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/@dcloudio/uni-cloud": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-h2lIn+YycLOSUBQ60xfk6tSL51F6VeiXzIF63PoYE8NbQglNwFjoWF7SBzqQQj5ZgnqMV5FnS4O1xRtpwOg1Og==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21",
+ "fast-glob": "3.3.3"
+ }
+ },
+ "node_modules/@dcloudio/uni-components": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-Mcu0T367gZkOdrlTrGn3nl2DEL+mVHNRWlCmmDaNyklI2U5RVx5Bv/DmKN2mPQ+FBZNrzN5SRVIN85Y1cNgOpw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cloud": "3.0.0-5020420260813003",
+ "@dcloudio/uni-h5": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003"
+ }
+ },
+ "node_modules/@dcloudio/uni-console": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-cEYqiOrIrGnQqMaSCtooupFAkFbYWirFuAv9/Fref6xI3FFeY/gm4ECExjri5Xjq3W7oMs3BNMmFNQ20Q5ucdw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "fs-extra": "10.1.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5/-/uni-h5-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-CWNdB0uTdRj58k3N0uKqTNNv9gLnYK8vf81BLAk3sJe/gHqqxX1Dnu2gLLugAn0XXJOy4L2H0AfU/nZmlh7jPA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-h5-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-h5-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "4.3.7",
+ "localstorage-polyfill": "^1.0.1",
+ "postcss-selector-parser": "6.1.2",
+ "safe-area-insets": "1.4.1",
+ "vue-router": "4.4.4",
+ "xmlhttprequest": "^1.8.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5-vite": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-JfSUYoqLaZ0+2ikxeN0slszJZk0vROPAYKXc0iDGB0vO+j9B8ttN213swUgRv6MHvbz68tDdpvGCWSerfqbWOg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@rollup/pluginutils": "5.1.0",
+ "@vitejs/plugin-basic-ssl": "1.2.0",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "4.3.7",
+ "fs-extra": "10.1.0",
+ "mime": "3.0.0",
+ "module-alias": "2.2.3"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5-vue": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-yuf178r08Am5qCTGOHIuwJ8LpaF7Mx80TwuPDyWaTATEnY3YtevnqJxlW/3EcevRreZpq/j+SkCZEWyAUI7euA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/server-renderer": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-i18n": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-fVIdM+pj3N57rwGEVAdS1T5iXLCb4BMYcKM1cZp+9I3g80ehBdcTt8g4QO1N5JgQTNCYrrOMySjJ1j6HljVRiQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-mp-alipay": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-alipay/-/uni-mp-alipay-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-qXzoSLnNNbgFxa2TZnFYflq/EDfpRhIgzzUJaxtBaTMi36cQ1x8DMMf4Dt5o5mUVWpbBM9DGns5j/GX7ise/jw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-baidu": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-baidu/-/uni-mp-baidu-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-c5x6Yv6ncEdOec/0yTIOrnOvi/RKbD5qTA6gSB1lfbHfoHbH6Owgd3BzxUNkIUfMIBj0hSnL+XYedQzflzGwOA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-5020420260813003",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-weixin": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "jimp": "0.10.3",
+ "licia": "1.41.1",
+ "qrcode-reader": "1.0.4",
+ "qrcode-terminal": "0.12.0",
+ "ws": "8.18.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-compiler": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-compiler/-/uni-mp-compiler-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-Y18fSqiakMhL/NLLN9HQoCfZ1NhhAVahUXjcrTeQa0xUVXXxetbHeknJdL5nYuTvk7+qzO1XwK9EJffaUESjBg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/generator": "7.25.6",
+ "@babel/parser": "7.25.6",
+ "@babel/types": "7.25.6",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "estree-walker": "2.0.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-compiler/node_modules/@babel/generator": {
+ "version": "7.25.6",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.6.tgz",
+ "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.6",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-compiler/node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-harmony": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-harmony/-/uni-mp-harmony-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-/ybUv3kytjuZgfrhYJb83zep5D+QXHngHQ1lV8mHi0LI9dgZZRhW4p5epSPV5IC7GR98VaylNyr0716ydNcoxw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-jd": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-jd/-/uni-mp-jd-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-J87gG4v2IZ4So9Mfolek8fmW8qTF7zBgCPsjZXKqYLTY3p4eVgDilQWjqLG69LzQ9/RVi221Ltea62xLR8IzQQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-kuaishou": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-kuaishou/-/uni-mp-kuaishou-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-CJD/al6qaVd+x9NuxH/fdhw0mhHgF7DvhL1iiLIrLjC4245NLuxA/jA30L+USrsbnKRftSuKZUijiAz7row0LQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-weixin": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-lark": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-lark/-/uni-mp-lark-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-BkBK6kV3yG0o9MEXE5XRoS1RjnOdnYNp6tkWUseIam71en6pRBNqgndLidt2L6Y8B7dF59w46SBnBXeRX34h2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-qq": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-qq/-/uni-mp-qq-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-VUSUuHjdkkcStlfc48nJ5E8hYm/sQYh+JHbKlDgGApoOAJAqqJQ8DlbTavnLyj28KxcfUXl0h/7PH0lJrUfPTg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21",
+ "fs-extra": "10.1.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-toutiao": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-toutiao/-/uni-mp-toutiao-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-CqBgJazSSVPltkFyOOV2LKkgw8nXgJBxBVGf3uf0GfmIeeq28jr/lhOcxDE6INX4FnYqg46QIFJGW82ZaS2mWQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-vite": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-vite/-/uni-mp-vite-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-CUBQq8nhqDCzdW80APXzPiqDWBtV5b3o3WPMwY/o13Y6eClxyRbug3fXDfsyPm30vRvTjvQD6wQsQFKgEq08Sw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-i18n": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "4.3.7"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-vue": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-vue/-/uni-mp-vue-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-kN0xYbGqrBRwpL3eaXYyB/+iJPzEmieo7Y2nGMp69ZqnLHnCN7mSWEvYahS5jlD9rwczNosuf7lAclGqz7B8Hg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-weixin": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-qiXoWGQ2lAKx8YLfhc4DCMuS/uid+gYxE3m7sI93L4z+BMjqwL8Yi+Rz79nzU2COHzNrsXuwrtFpNfBXV72ePw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21",
+ "jimp": "0.10.3",
+ "licia": "1.41.1",
+ "qrcode-reader": "1.0.4",
+ "qrcode-terminal": "0.12.0",
+ "ws": "8.18.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-xhs": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-xhs/-/uni-mp-xhs-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-MQukDYgarGCuB5gtSuHZ6Soeovn3QIvoepQ12ETbajVTYoqkMynlwxofKdaRb6veRg7ZbB9/D1PACqeDroeQqg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-compiler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-nvue-styler": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-J2LdLVxgmFWOloPZYObVaBUTVYd/OBSq+N90qOU1ZrIgi58+mnmR3ZeGKSR1++Cbhk+kJfVl9gIuz+8Zx3TrSA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@vue/shared": "3.4.21",
+ "parse-css-font": "^4.0.0",
+ "postcss": "8.5.6",
+ "tinycolor2": "1.6.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-nvue-styler/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/@dcloudio/uni-nvue-styler/node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/@dcloudio/uni-push": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-uv5IzxUX1N5vrUOdMjmYarAePwabgra96JUxcCnHivNnRKJiNIxo8hHVizFbwOqL9+mvc89eeUK+eYPbhKWWug==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003"
+ }
+ },
+ "node_modules/@dcloudio/uni-quickapp-webview": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-quickapp-webview/-/uni-quickapp-webview-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-Bp9unZtwDLzlBprgHYyZd/e9dxd4Myc86z7CjhOPwESuCZtuajmw4mqpfYSC7Qsb1OfEHJt/Z/zu76zk9HNC+Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vite": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-vue": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-shared": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-U/osc72UGcoSWfdxZOPs9ftITACE/yXsNFheP74fypTtudNzcudkz/o3dN6ClOESVh/VE9dZeecNpoNhY8qPfQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-stacktracey": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-wYR5FyDvplffjKltj39KxpTdU0cE/kWHbgmo21B5UCMMsm9RvF2ARUMfld6pZ1NPlAxrqj322RovniDul+9gOw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-stat": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-I4RL+sq4/R3yjWowlCXsOeGyCP4cpW10Pk0bzKk6E7dy99mi5EDqOrPbmBSdwb3uU9qjG+ATh5lFqkWBQboxCA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "debug": "4.3.7"
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni": {
+ "version": "3.0.0-5020420260813003",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-5020420260813003.tgz",
+ "integrity": "sha512-aJ2/Dx0GykpfWU+LeA+7Vrv5KJM+qD4eX0mb3s3yVnfUr/Btn0cGT7WWvSeA+BtUg90SoHgONmsLnLgbSLNk8w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/core": "7.25.2",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.23.3",
+ "@babel/types": "7.25.6",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003",
+ "@dcloudio/uni-shared": "3.0.0-5020420260813003",
+ "@rollup/pluginutils": "5.1.0",
+ "@vitejs/plugin-legacy": "5.3.2",
+ "@vitejs/plugin-vue": "5.2.4",
+ "@vitejs/plugin-vue-jsx": "3.1.0",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "cac": "6.7.9",
+ "debug": "4.3.7",
+ "es-module-lexer": "1.5.4",
+ "estree-walker": "2.0.2",
+ "express": "4.20.0",
+ "fast-glob": "3.3.3",
+ "fs-extra": "10.1.0",
+ "hash-sum": "2.0.0",
+ "jsonc-parser": "3.3.1",
+ "magic-string": "0.30.11",
+ "picocolors": "1.1.0",
+ "source-map-js": "1.2.1",
+ "terser": "^5.4.0",
+ "unplugin-auto-import": "19.1.0"
+ },
+ "bin": {
+ "uni": "bin/uni.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "5.2.8"
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
+ "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "picomatch": "^4.0.2",
+ "unimport": "^4.1.1",
+ "unplugin": "^2.2.0",
+ "unplugin-utils": "^0.2.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import/node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.9.tgz",
+ "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/devtools-if": "9.1.9",
+ "@intlify/message-compiler": "9.1.9",
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/runtime": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "@intlify/vue-devtools": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/devtools-if": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
+ "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
+ "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/message-resolver": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
+ "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/runtime": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.9.tgz",
+ "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-compiler": "9.1.9",
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.9.tgz",
+ "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/vue-devtools": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
+ "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/runtime": "9.1.9",
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.6.tgz",
+ "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/console/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/console/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/console/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/core/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/core/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/core/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/core/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/core/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/reporters/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/transform/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/transform/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/types/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/types/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/types/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/types/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/types/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/types/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jimp/bmp": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/bmp/-/bmp-0.10.3.tgz",
+ "integrity": "sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "bmp-js": "^0.1.0",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/core": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/core/-/core-0.10.3.tgz",
+ "integrity": "sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "any-base": "^1.1.0",
+ "buffer": "^5.2.0",
+ "core-js": "^3.4.1",
+ "exif-parser": "^0.1.12",
+ "file-type": "^9.0.0",
+ "load-bmfont": "^1.3.1",
+ "mkdirp": "^0.5.1",
+ "phin": "^2.9.1",
+ "pixelmatch": "^4.0.2",
+ "tinycolor2": "^1.4.1"
+ }
+ },
+ "node_modules/@jimp/custom": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/custom/-/custom-0.10.3.tgz",
+ "integrity": "sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/core": "^0.10.3",
+ "core-js": "^3.4.1"
+ }
+ },
+ "node_modules/@jimp/gif": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/gif/-/gif-0.10.3.tgz",
+ "integrity": "sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "omggif": "^1.0.9"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/jpeg": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/jpeg/-/jpeg-0.10.3.tgz",
+ "integrity": "sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "jpeg-js": "^0.3.4"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-blit": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz",
+ "integrity": "sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-blur": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz",
+ "integrity": "sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-circle": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz",
+ "integrity": "sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-color": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-color/-/plugin-color-0.10.3.tgz",
+ "integrity": "sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "tinycolor2": "^1.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-contain": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz",
+ "integrity": "sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5",
+ "@jimp/plugin-scale": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-cover": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz",
+ "integrity": "sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-crop": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5",
+ "@jimp/plugin-scale": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-crop": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz",
+ "integrity": "sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-displace": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz",
+ "integrity": "sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-dither": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz",
+ "integrity": "sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-fisheye": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz",
+ "integrity": "sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-flip": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz",
+ "integrity": "sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-rotate": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-gaussian": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz",
+ "integrity": "sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-invert": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz",
+ "integrity": "sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-mask": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz",
+ "integrity": "sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-normalize": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz",
+ "integrity": "sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-print": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-print/-/plugin-print-0.10.3.tgz",
+ "integrity": "sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "load-bmfont": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-resize": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz",
+ "integrity": "sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-rotate": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz",
+ "integrity": "sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5",
+ "@jimp/plugin-crop": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-scale": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz",
+ "integrity": "sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-shadow": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz",
+ "integrity": "sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blur": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-threshold": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz",
+ "integrity": "sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-color": ">=0.8.0",
+ "@jimp/plugin-resize": ">=0.8.0"
+ }
+ },
+ "node_modules/@jimp/plugins": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/plugins/-/plugins-0.10.3.tgz",
+ "integrity": "sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/plugin-blit": "^0.10.3",
+ "@jimp/plugin-blur": "^0.10.3",
+ "@jimp/plugin-circle": "^0.10.3",
+ "@jimp/plugin-color": "^0.10.3",
+ "@jimp/plugin-contain": "^0.10.3",
+ "@jimp/plugin-cover": "^0.10.3",
+ "@jimp/plugin-crop": "^0.10.3",
+ "@jimp/plugin-displace": "^0.10.3",
+ "@jimp/plugin-dither": "^0.10.3",
+ "@jimp/plugin-fisheye": "^0.10.3",
+ "@jimp/plugin-flip": "^0.10.3",
+ "@jimp/plugin-gaussian": "^0.10.3",
+ "@jimp/plugin-invert": "^0.10.3",
+ "@jimp/plugin-mask": "^0.10.3",
+ "@jimp/plugin-normalize": "^0.10.3",
+ "@jimp/plugin-print": "^0.10.3",
+ "@jimp/plugin-resize": "^0.10.3",
+ "@jimp/plugin-rotate": "^0.10.3",
+ "@jimp/plugin-scale": "^0.10.3",
+ "@jimp/plugin-shadow": "^0.10.3",
+ "@jimp/plugin-threshold": "^0.10.3",
+ "core-js": "^3.4.1",
+ "timm": "^1.6.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/png": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/png/-/png-0.10.3.tgz",
+ "integrity": "sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "pngjs": "^3.3.3"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/tiff": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/tiff/-/tiff-0.10.3.tgz",
+ "integrity": "sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "core-js": "^3.4.1",
+ "utif": "^2.0.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/types": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/types/-/types-0.10.3.tgz",
+ "integrity": "sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/bmp": "^0.10.3",
+ "@jimp/gif": "^0.10.3",
+ "@jimp/jpeg": "^0.10.3",
+ "@jimp/png": "^0.10.3",
+ "@jimp/tiff": "^0.10.3",
+ "core-js": "^3.4.1",
+ "timm": "^1.6.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/utils": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/@jimp/utils/-/utils-0.10.3.tgz",
+ "integrity": "sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "core-js": "^3.4.1",
+ "regenerator-runtime": "^0.13.3"
+ }
+ },
+ "node_modules/@jimp/utils/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+ "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",
+ "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",
+ "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",
+ "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",
+ "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",
+ "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",
+ "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",
+ "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",
+ "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",
+ "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",
+ "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",
+ "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",
+ "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",
+ "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",
+ "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",
+ "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",
+ "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/babel__traverse/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "26.4.1",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-26.4.1.tgz",
+ "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "16.0.11",
+ "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.11.tgz",
+ "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vitejs/plugin-basic-ssl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz",
+ "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-legacy": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz",
+ "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/preset-env": "^7.23.9",
+ "browserslist": "^4.23.0",
+ "browserslist-to-esbuild": "^2.1.1",
+ "core-js": "^3.36.0",
+ "magic-string": "^0.30.7",
+ "regenerator-runtime": "^0.14.1",
+ "systemjs": "^6.14.3"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "peerDependencies": {
+ "terser": "^5.4.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue-jsx": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz",
+ "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.3",
+ "@babel/plugin-transform-typescript": "^7.23.3",
+ "@vue/babel-plugin-jsx": "^1.1.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz",
+ "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz",
+ "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.0",
+ "@babel/types": "^7.28.2",
+ "@vue/babel-helper-vue-transform-on": "1.5.0",
+ "@vue/babel-plugin-resolve-type": "1.5.0",
+ "@vue/shared": "^3.5.18"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-jsx/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-jsx/node_modules/@vue/shared": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.42.tgz",
+ "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz",
+ "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/parser": "^7.28.0",
+ "@vue/compiler-sfc": "^3.5.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.42.tgz",
+ "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/shared": "3.5.42",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz",
+ "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz",
+ "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/compiler-core": "3.5.42",
+ "@vue/compiler-dom": "3.5.42",
+ "@vue/compiler-ssr": "3.5.42",
+ "@vue/shared": "3.5.42",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz",
+ "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.42.tgz",
+ "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
+ "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/shared": "3.4.21",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
+ "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
+ "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.7",
+ "postcss": "^8.4.35",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
+ "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/consolidate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/@vue/consolidate/-/consolidate-1.0.0.tgz",
+ "integrity": "sha512-oTyUE+QHIzLw2PpV14GD/c7EohDyP64xCniWTcqcEmTd699eFqTIwOmtDYjcO1j3QgdXoJEoWv1/cCdLrRoOfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.42.tgz",
+ "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.42.tgz",
+ "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.42.tgz",
+ "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+ "version": "3.5.42",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.42.tgz",
+ "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+ "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/runtime-core": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+ "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/runtime-dom/node_modules/@vue/runtime-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+ "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+ "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "vue": "3.4.21"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz",
+ "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+ "license": "MIT"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmmirror.com/adm-zip/-/adm-zip-0.5.16.tgz",
+ "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/any-base": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/any-base/-/any-base-1.1.0.tgz",
+ "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/babel-jest/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/babel-jest/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/babel-jest/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-jest/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.17",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+ "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz",
+ "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "core-js-compat": "^3.48.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+ "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.20",
+ "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz",
+ "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bmp-js": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/bmp-js/-/bmp-js-0.1.0.tgz",
+ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.8",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.8.tgz",
+ "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.12",
+ "caniuse-lite": "^1.0.30001809",
+ "electron-to-chromium": "^1.5.402",
+ "node-releases": "^2.0.53",
+ "update-browserslist-db": "^1.3.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/browserslist-to-esbuild": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz",
+ "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "browserslist-to-esbuild": "cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "browserslist": "*"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-0.0.1.tgz",
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.9",
+ "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.9.tgz",
+ "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001810",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/centra": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/centra/-/centra-2.7.0.tgz",
+ "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz",
+ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.50.0.tgz",
+ "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.50.0.tgz",
+ "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.7"
+ },
+ "engines": {
+ "node": ">=6.4.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.50.0.tgz",
+ "integrity": "sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-font-size-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
+ "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-stretch-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
+ "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-style-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
+ "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-weight-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
+ "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==",
+ "license": "MIT"
+ },
+ "node_modules/css-list-helpers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/css-list-helpers/-/css-list-helpers-2.0.0.tgz",
+ "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==",
+ "license": "MIT"
+ },
+ "node_modules/css-system-font-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
+ "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==",
+ "license": "MIT"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.420",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz",
+ "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exif-parser": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmmirror.com/exif-parser/-/exif-parser-0.1.12.tgz",
+ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.20.0",
+ "resolved": "https://registry.npmmirror.com/express/-/express-4.20.0.tgz",
+ "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.6.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.10",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/exsolve": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.3.tgz",
+ "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmmirror.com/file-type/-/file-type-9.0.0.tgz",
+ "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.5.tgz",
+ "integrity": "sha512-j23EibVLnp4zNXGW7LjryXYa2X6U/M96yoOX+ybZxwkYajdxRNEqYY3zhh7y0i6kfISKS2jr+EJq1YTUDEv5+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generic-names": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/generic-names/-/generic-names-4.0.0.tgz",
+ "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^3.2.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "license": "MIT"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
+ "license": "ISC"
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/invert-kv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+ "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/invert-kv?sponsor=1"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/isbinaryfile": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz",
+ "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.0.4",
+ "resolved": "https://registry.npmmirror.com/jest/-/jest-27.0.4.tgz",
+ "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^27.0.4",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.0.4"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-circus/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-circus/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-circus/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-circus/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-cli/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-cli/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-cli/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-cli/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-cli/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-cli/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-config/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-config/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-config/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-config/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-diff/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-diff/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-each/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-each/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-each/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-each/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-jasmine2/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-matcher-utils/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-message-util/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-resolve/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-runner/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-runner/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-runner/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runner/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-runtime/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-snapshot/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-util/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-util/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-util/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-validate/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-validate/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-validate/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-validate/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jest-watcher/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jimp": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/jimp/-/jimp-0.10.3.tgz",
+ "integrity": "sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/custom": "^0.10.3",
+ "@jimp/plugins": "^0.10.3",
+ "@jimp/types": "^0.10.3",
+ "core-js": "^3.4.1",
+ "regenerator-runtime": "^0.13.3"
+ }
+ },
+ "node_modules/jimp/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmmirror.com/jpeg-js/-/jpeg-js-0.3.7.tgz",
+ "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.15.2",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.15.2.tgz",
+ "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsdom/node_modules/ws": {
+ "version": "7.5.13",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.13.tgz",
+ "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lcid": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+ "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+ "license": "MIT",
+ "dependencies": {
+ "invert-kv": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/licia": {
+ "version": "1.41.1",
+ "resolved": "https://registry.npmmirror.com/licia/-/licia-1.41.1.tgz",
+ "integrity": "sha512-XqObV8u1KEMdYWaNK0leRrTwhzKnLQEkhbnuUu7qGNH3zJoN7l9sfvF6PfHstSCuUOmpEP+0SBjRrk0I9uZs8g==",
+ "license": "MIT"
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
+ "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/load-bmfont": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/load-bmfont/-/load-bmfont-1.4.2.tgz",
+ "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal": "0.0.1",
+ "mime": "^1.3.4",
+ "parse-bmfont-ascii": "^1.0.3",
+ "parse-bmfont-binary": "^1.0.5",
+ "parse-bmfont-xml": "^1.1.4",
+ "phin": "^3.7.1",
+ "xhr": "^2.0.1",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/load-bmfont/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-bmfont/node_modules/phin": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmmirror.com/phin/-/phin-3.7.1.tgz",
+ "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT",
+ "dependencies": {
+ "centra": "^2.7.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.2.1.tgz",
+ "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/local-pkg/node_modules/confbox": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+ "license": "MIT"
+ },
+ "node_modules/local-pkg/node_modules/pkg-types": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz",
+ "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.4",
+ "exsolve": "^1.0.8",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/localstorage-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/localstorage-polyfill/-/localstorage-polyfill-1.0.1.tgz",
+ "integrity": "sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.11",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmmirror.com/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz",
+ "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+ "license": "MIT"
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-document": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.2.tgz",
+ "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
+ "license": "MIT",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/module-alias": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz",
+ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.54",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.54.tgz",
+ "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.27",
+ "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.27.tgz",
+ "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/omggif": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
+ "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-locale-s-fix": {
+ "version": "1.0.8-fix-1",
+ "resolved": "https://registry.npmmirror.com/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
+ "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==",
+ "license": "MIT",
+ "dependencies": {
+ "lcid": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": "^1.22.4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/parse-bmfont-ascii": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-bmfont-binary": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-bmfont-xml": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmmirror.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
+ "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-parse-from-string": "^1.0.0",
+ "xml2js": "^0.5.0"
+ }
+ },
+ "node_modules/parse-css-font": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/parse-css-font/-/parse-css-font-4.0.0.tgz",
+ "integrity": "sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-font-size-keywords": "^1.0.0",
+ "css-font-stretch-keywords": "^1.0.1",
+ "css-font-style-keywords": "^1.0.1",
+ "css-font-weight-keywords": "^1.0.0",
+ "css-list-helpers": "^2.0.0",
+ "css-system-font-keywords": "^1.0.0",
+ "unquote": "^1.1.1"
+ }
+ },
+ "node_modules/parse-headers": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.6.tgz",
+ "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==",
+ "license": "MIT"
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
+ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/phin": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmmirror.com/phin/-/phin-2.9.3.tgz",
+ "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pixelmatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/pixelmatch/-/pixelmatch-4.0.2.tgz",
+ "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+ "license": "ISC",
+ "dependencies": {
+ "pngjs": "^3.0.0"
+ },
+ "bin": {
+ "pixelmatch": "bin/pixelmatch"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-modules": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-modules/-/postcss-modules-4.3.1.tgz",
+ "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "generic-names": "^4.0.0",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/postcss/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode-reader": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/qrcode-reader/-/qrcode-reader-1.0.4.tgz",
+ "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+ "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.2.tgz",
+ "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.2.tgz",
+ "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.14.3",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.14.3.tgz",
+ "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.14.3",
+ "@rollup/rollup-android-arm64": "4.14.3",
+ "@rollup/rollup-darwin-arm64": "4.14.3",
+ "@rollup/rollup-darwin-x64": "4.14.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.14.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.14.3",
+ "@rollup/rollup-linux-arm64-musl": "4.14.3",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.14.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.14.3",
+ "@rollup/rollup-linux-x64-gnu": "4.14.3",
+ "@rollup/rollup-linux-x64-musl": "4.14.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.14.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.14.3",
+ "@rollup/rollup-win32-x64-msvc": "4.14.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup/node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "license": "MIT"
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-area-insets": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+ "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ==",
+ "license": "ISC"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.0.tgz",
+ "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-static/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-static/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serve-static/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/serve-static/node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/systemjs": {
+ "version": "6.15.1",
+ "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.15.1.tgz",
+ "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.51.2",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.51.2.tgz",
+ "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/timm": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmmirror.com/timm/-/timm-1.7.1.tgz",
+ "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==",
+ "license": "MIT"
+ },
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+ "license": "MIT"
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unimport": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.1.1.tgz",
+ "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.3",
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.2",
+ "picomatch": "^4.0.2",
+ "pkg-types": "^1.3.1",
+ "scule": "^1.3.0",
+ "strip-literal": "^3.0.0",
+ "unplugin": "^2.1.2",
+ "unplugin-utils": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unimport/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unimport/node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/unimport/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz",
+ "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "acorn": "^8.15.0",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unplugin-utils": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz",
+ "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==",
+ "license": "MIT",
+ "dependencies": {
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/unplugin-utils/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/unplugin/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
+ "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/update-browserslist-db/node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/utif": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/utif/-/utif-2.0.1.tgz",
+ "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+ "license": "MIT",
+ "dependencies": {
+ "pako": "^1.0.5"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/v8-to-istanbul/node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.2.8",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.2.8.tgz",
+ "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.20.1",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+ "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/runtime-dom": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-i18n": {
+ "version": "9.14.4",
+ "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.4.tgz",
+ "integrity": "sha512-B934C8yUyWLT0EMud3DySrwSUJI7ZNiWYsEEz2gknTthqKiG4dzWE/WSa8AzCuSQzwBEv4HtG1jZDhgzPfWSKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/core-base": "9.14.4",
+ "@intlify/shared": "9.14.4",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vue-i18n/node_modules/@intlify/core-base": {
+ "version": "9.14.4",
+ "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.4.tgz",
+ "integrity": "sha512-vtZCt7NqWhKEtHa3SD/322DlgP5uR9MqWxnE0y8Q0tjDs9H5Lxhss+b5wv8rmuXRoHKLESNgw9d+EN9ybBbj9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-compiler": "9.14.4",
+ "@intlify/shared": "9.14.4"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/vue-i18n/node_modules/@intlify/message-compiler": {
+ "version": "9.14.4",
+ "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.14.4.tgz",
+ "integrity": "sha512-vcyCLiVRN628U38c3PbahrhbbXrckrM9zpy0KZVlDk2Z0OnGwv8uQNNXP3twwGtfLsCf4gu3ci6FMIZnPaqZsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/shared": "9.14.4",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/vue-i18n/node_modules/@intlify/shared": {
+ "version": "9.14.4",
+ "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.14.4.tgz",
+ "integrity": "sha512-P9zv6i1WvMc9qDBWvIgKkymjY2ptIiQ065PjDv7z7fDqH3J/HBRBN5IoiR46r/ujRcU7hCuSIZWvCAFCyuOYZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.4.tgz",
+ "integrity": "sha512-3MlnDqwRwZwCQVbtVfpsU+nrNymNjnXSsQtXName5925NVC1+326VVfYH9vSrA0N13teGEo8z5x7gbRnGjCDiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmmirror.com/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "license": "MIT",
+ "dependencies": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/xml-parse-from-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
+ "license": "MIT"
+ },
+ "node_modules/xml2js": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz",
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/xregexp": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-5.1.2.tgz",
+ "integrity": "sha512-6hGgEMCGhqCTFEJbqmWrNIPqfpdirdGWkqshu7fFZddmTSfgv5Sn9D2SaKloR79s5VUiUlpwzg3CM3G6D3VIlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime-corejs3": "^7.26.9"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.2.tgz",
+ "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index ac73018..73ca2d5 100644
--- a/package.json
+++ b/package.json
@@ -1,57 +1,68 @@
{
- "name": "ruoyi",
- "version": "3.8.9",
- "description": "鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺",
- "author": "鑻ヤ緷",
- "license": "MIT",
- "type": "module",
+ "name": "uni-preset-vue",
+ "version": "0.0.0",
"scripts": {
- "dev": "vite",
- "build:prod": "vite build",
- "build:stage": "vite build --mode staging",
- "preview": "vite preview"
- },
- "repository": {
- "type": "git",
- "url": "https://gitee.com/y_project/RuoYi-Vue.git"
+ "dev:custom": "uni -p",
+ "dev:h5": "uni",
+ "dev:h5:ssr": "uni --ssr",
+ "dev:mp-alipay": "uni -p mp-alipay",
+ "dev:mp-baidu": "uni -p mp-baidu",
+ "dev:mp-jd": "uni -p mp-jd",
+ "dev:mp-kuaishou": "uni -p mp-kuaishou",
+ "dev:mp-lark": "uni -p mp-lark",
+ "dev:mp-qq": "uni -p mp-qq",
+ "dev:mp-toutiao": "uni -p mp-toutiao",
+ "dev:mp-harmony": "uni -p mp-harmony",
+ "dev:mp-weixin": "uni -p mp-weixin",
+ "dev:mp-xhs": "uni -p mp-xhs",
+ "dev:quickapp-webview": "uni -p quickapp-webview",
+ "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
+ "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
+ "build:custom": "uni build -p",
+ "build:h5": "uni build",
+ "build:h5:ssr": "uni build --ssr",
+ "build:mp-alipay": "uni build -p mp-alipay",
+ "build:mp-baidu": "uni build -p mp-baidu",
+ "build:mp-jd": "uni build -p mp-jd",
+ "build:mp-kuaishou": "uni build -p mp-kuaishou",
+ "build:mp-lark": "uni build -p mp-lark",
+ "build:mp-qq": "uni build -p mp-qq",
+ "build:mp-toutiao": "uni build -p mp-toutiao",
+ "build:mp-harmony": "uni build -p mp-harmony",
+ "build:mp-weixin": "uni build -p mp-weixin",
+ "build:mp-xhs": "uni build -p mp-xhs",
+ "build:quickapp-webview": "uni build -p quickapp-webview",
+ "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
+ "build:quickapp-webview-union": "uni build -p quickapp-webview-union"
},
"dependencies": {
- "@element-plus/icons-vue": "2.3.1",
- "@vue-office/docx": "^1.6.3",
- "@vue-office/excel": "^1.7.14",
- "@vueup/vue-quill": "1.2.0",
- "@vueuse/core": "10.11.0",
- "axios": "0.28.1",
- "clipboard": "2.0.11",
- "dayjs": "^1.11.13",
- "echarts": "5.5.1",
- "element-plus": "2.7.7",
- "file-saver": "2.0.5",
- "fuse.js": "6.6.2",
- "js-beautify": "1.14.11",
- "js-cookie": "3.0.5",
- "jsencrypt": "3.3.2",
- "nprogress": "0.2.0",
- "pinia": "2.1.7",
- "qrcode": "^1.5.4",
- "sortablejs": "^1.15.6",
- "splitpanes": "3.1.5",
- "vue": "3.4.31",
- "vue-cropper": "1.1.1",
- "vue-esign": "^1.1.4",
- "vue-router": "4.4.0",
- "vuedraggable": "4.1.0"
+ "@dcloudio/uni-app": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-harmony": "3.0.0-5020420260813003",
+ "@dcloudio/uni-app-plus": "3.0.0-5020420260813003",
+ "@dcloudio/uni-components": "3.0.0-5020420260813003",
+ "@dcloudio/uni-h5": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-alipay": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-baidu": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-harmony": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-jd": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-kuaishou": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-lark": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-qq": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-weixin": "3.0.0-5020420260813003",
+ "@dcloudio/uni-mp-xhs": "3.0.0-5020420260813003",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-5020420260813003",
+ "vue": "^3.4.21",
+ "vue-i18n": "^9.1.9"
},
"devDependencies": {
- "@vitejs/plugin-vue": "5.0.5",
- "sass": "1.77.5",
- "unplugin-auto-import": "0.17.6",
- "unplugin-vue-setup-extend-plus": "1.0.1",
- "vite": "5.3.2",
- "vite-plugin-compression": "0.5.1",
- "vite-plugin-svg-icons": "2.0.1"
- },
- "overrides": {
- "quill": "2.0.2"
+ "@dcloudio/types": "^3.4.8",
+ "@dcloudio/uni-automator": "3.0.0-5020420260813003",
+ "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003",
+ "@dcloudio/uni-stacktracey": "3.0.0-5020420260813003",
+ "@dcloudio/vite-plugin-uni": "3.0.0-5020420260813003",
+ "@vue/runtime-core": "^3.4.21",
+ "rollup": "4.14.3",
+ "vite": "5.2.8"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
deleted file mode 100644
index 871e5c2..0000000
--- a/pnpm-lock.yaml
+++ /dev/null
@@ -1,4316 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- '@element-plus/icons-vue':
- specifier: 2.3.1
- version: 2.3.1(vue@3.4.31)
- '@vueup/vue-quill':
- specifier: 1.2.0
- version: 1.2.0(vue@3.4.31)
- '@vueuse/core':
- specifier: 10.11.0
- version: 10.11.0(vue@3.4.31)
- axios:
- specifier: 0.28.1
- version: 0.28.1
- clipboard:
- specifier: 2.0.11
- version: 2.0.11
- dayjs:
- specifier: ^1.11.13
- version: 1.11.13
- echarts:
- specifier: 5.5.1
- version: 5.5.1
- element-plus:
- specifier: 2.7.7
- version: 2.7.7(vue@3.4.31)
- file-saver:
- specifier: 2.0.5
- version: 2.0.5
- fuse.js:
- specifier: 6.6.2
- version: 6.6.2
- js-beautify:
- specifier: 1.14.11
- version: 1.14.11
- js-cookie:
- specifier: 3.0.5
- version: 3.0.5
- jsencrypt:
- specifier: 3.3.2
- version: 3.3.2
- nprogress:
- specifier: 0.2.0
- version: 0.2.0
- pinia:
- specifier: 2.1.7
- version: 2.1.7(vue@3.4.31)
- sortablejs:
- specifier: ^1.15.6
- version: 1.15.6
- splitpanes:
- specifier: 3.1.5
- version: 3.1.5
- vue:
- specifier: 3.4.31
- version: 3.4.31
- vue-cropper:
- specifier: 1.1.1
- version: 1.1.1
- vue-router:
- specifier: 4.4.0
- version: 4.4.0(vue@3.4.31)
- vuedraggable:
- specifier: 4.1.0
- version: 4.1.0(vue@3.4.31)
- devDependencies:
- '@vitejs/plugin-vue':
- specifier: 5.0.5
- version: 5.0.5(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))(vue@3.4.31)
- sass:
- specifier: 1.77.5
- version: 1.77.5
- unplugin-auto-import:
- specifier: 0.17.6
- version: 0.17.6(@vueuse/core@10.11.0(vue@3.4.31))(rollup@4.40.2)
- unplugin-vue-setup-extend-plus:
- specifier: 1.0.1
- version: 1.0.1
- vite:
- specifier: 5.3.2
- version: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
- vite-plugin-compression:
- specifier: 0.5.1
- version: 0.5.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))
- vite-plugin-svg-icons:
- specifier: 2.0.1
- version: 2.0.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))
-
-packages:
-
- '@antfu/utils@0.7.10':
- resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
-
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.27.2':
- resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/types@7.27.1':
- resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
- engines: {node: '>=6.9.0'}
-
- '@ctrl/tinycolor@3.6.1':
- resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
- engines: {node: '>=10'}
-
- '@element-plus/icons-vue@2.3.1':
- resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
- peerDependencies:
- vue: ^3.2.0
-
- '@esbuild/aix-ppc64@0.21.5':
- resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/android-arm64@0.21.5':
- resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm@0.21.5':
- resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-x64@0.21.5':
- resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/darwin-arm64@0.21.5':
- resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.21.5':
- resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/freebsd-arm64@0.21.5':
- resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.21.5':
- resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/linux-arm64@0.21.5':
- resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm@0.21.5':
- resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-ia32@0.21.5':
- resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-loong64@0.21.5':
- resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.21.5':
- resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.21.5':
- resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.21.5':
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-s390x@0.21.5':
- resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-x64@0.21.5':
- resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/netbsd-x64@0.21.5':
- resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-x64@0.21.5':
- resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/sunos-x64@0.21.5':
- resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/win32-arm64@0.21.5':
- resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-ia32@0.21.5':
- resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-x64@0.21.5':
- resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
-
- '@floating-ui/core@1.7.0':
- resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==}
-
- '@floating-ui/dom@1.7.0':
- resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==}
-
- '@floating-ui/utils@0.2.9':
- resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
-
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
-
- '@jridgewell/sourcemap-codec@1.5.0':
- resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
-
- '@nodelib/fs.scandir@2.1.5':
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.stat@2.0.5':
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.walk@1.2.8':
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
-
- '@one-ini/wasm@0.1.1':
- resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
-
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
- '@rollup/pluginutils@5.1.4':
- resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
- peerDependenciesMeta:
- rollup:
- optional: true
-
- '@rollup/rollup-android-arm-eabi@4.40.2':
- resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.40.2':
- resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.40.2':
- resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-x64@4.40.2':
- resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.40.2':
- resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.40.2':
- resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
- resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm-musleabihf@4.40.2':
- resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-gnu@4.40.2':
- resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-musl@4.40.2':
- resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
- resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==}
- cpu: [loong64]
- os: [linux]
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
- resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==}
- cpu: [ppc64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-gnu@4.40.2':
- resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-musl@4.40.2':
- resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-s390x-gnu@4.40.2':
- resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==}
- cpu: [s390x]
- os: [linux]
-
- '@rollup/rollup-linux-x64-gnu@4.40.2':
- resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-linux-x64-musl@4.40.2':
- resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-win32-arm64-msvc@4.40.2':
- resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.40.2':
- resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.40.2':
- resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==}
- cpu: [x64]
- os: [win32]
-
- '@sxzz/popperjs-es@2.11.7':
- resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
-
- '@trysound/sax@0.2.0':
- resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
- engines: {node: '>=10.13.0'}
-
- '@types/estree@1.0.7':
- resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
-
- '@types/lodash-es@4.17.12':
- resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
-
- '@types/lodash@4.17.16':
- resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
-
- '@types/node@22.15.18':
- resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==}
-
- '@types/svgo@2.6.4':
- resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
-
- '@types/web-bluetooth@0.0.16':
- resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
-
- '@types/web-bluetooth@0.0.20':
- resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
-
- '@vitejs/plugin-vue@5.0.5':
- resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==}
- engines: {node: ^18.0.0 || >=20.0.0}
- peerDependencies:
- vite: ^5.0.0
- vue: ^3.2.25
-
- '@vue/compiler-core@3.4.31':
- resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==}
-
- '@vue/compiler-core@3.5.14':
- resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==}
-
- '@vue/compiler-dom@3.4.31':
- resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==}
-
- '@vue/compiler-dom@3.5.14':
- resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==}
-
- '@vue/compiler-sfc@3.4.31':
- resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==}
-
- '@vue/compiler-sfc@3.5.14':
- resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==}
-
- '@vue/compiler-ssr@3.4.31':
- resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==}
-
- '@vue/compiler-ssr@3.5.14':
- resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==}
-
- '@vue/devtools-api@6.6.4':
- resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
-
- '@vue/reactivity@3.4.31':
- resolution: {integrity: sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==}
-
- '@vue/runtime-core@3.4.31':
- resolution: {integrity: sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==}
-
- '@vue/runtime-dom@3.4.31':
- resolution: {integrity: sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==}
-
- '@vue/server-renderer@3.4.31':
- resolution: {integrity: sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==}
- peerDependencies:
- vue: 3.4.31
-
- '@vue/shared@3.4.31':
- resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==}
-
- '@vue/shared@3.5.14':
- resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==}
-
- '@vueup/vue-quill@1.2.0':
- resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==}
- peerDependencies:
- vue: ^3.2.41
-
- '@vueuse/core@10.11.0':
- resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==}
-
- '@vueuse/core@9.13.0':
- resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
-
- '@vueuse/metadata@10.11.0':
- resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==}
-
- '@vueuse/metadata@9.13.0':
- resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
-
- '@vueuse/shared@10.11.0':
- resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==}
-
- '@vueuse/shared@9.13.0':
- resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
-
- abbrev@2.0.0:
- resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- acorn@8.14.1:
- resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
- engines: {node: '>=0.4.0'}
- hasBin: true
-
- ansi-regex@2.1.1:
- resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.1.0:
- resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
- engines: {node: '>=12'}
-
- ansi-styles@2.2.1:
- resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
- engines: {node: '>=12'}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
- arr-diff@4.0.0:
- resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
- engines: {node: '>=0.10.0'}
-
- arr-flatten@1.1.0:
- resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
- engines: {node: '>=0.10.0'}
-
- arr-union@3.1.0:
- resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
- engines: {node: '>=0.10.0'}
-
- array-buffer-byte-length@1.0.2:
- resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
- engines: {node: '>= 0.4'}
-
- array-unique@0.3.2:
- resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
- engines: {node: '>=0.10.0'}
-
- arraybuffer.prototype.slice@1.0.4:
- resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
- engines: {node: '>= 0.4'}
-
- assign-symbols@1.0.0:
- resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
- engines: {node: '>=0.10.0'}
-
- async-function@1.0.0:
- resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
- engines: {node: '>= 0.4'}
-
- async-validator@4.2.5:
- resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
-
- asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-
- atob@2.1.2:
- resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
- engines: {node: '>= 4.5.0'}
- hasBin: true
-
- available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
-
- axios@0.28.1:
- resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==}
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- base@0.11.2:
- resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
- engines: {node: '>=0.10.0'}
-
- big.js@5.2.2:
- resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
-
- binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
-
- bluebird@3.7.2:
- resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
-
- boolbase@1.0.0:
- resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
-
- brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
-
- braces@2.3.2:
- resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
- engines: {node: '>=0.10.0'}
-
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
-
- cache-base@1.0.1:
- resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
- engines: {node: '>=0.10.0'}
-
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
-
- call-bind@1.0.8:
- resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
- engines: {node: '>= 0.4'}
-
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
-
- chalk@1.1.3:
- resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
- engines: {node: '>=0.10.0'}
-
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
-
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
-
- class-utils@0.3.6:
- resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
- engines: {node: '>=0.10.0'}
-
- clipboard@2.0.11:
- resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
-
- clone@2.1.2:
- resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
- engines: {node: '>=0.8'}
-
- collection-visit@1.0.0:
- resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
- engines: {node: '>=0.10.0'}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
- combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
-
- commander@10.0.1:
- resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
- engines: {node: '>=14'}
-
- commander@7.2.0:
- resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
- engines: {node: '>= 10'}
-
- component-emitter@1.3.1:
- resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
-
- confbox@0.1.8:
- resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
-
- confbox@0.2.2:
- resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
-
- config-chain@1.1.13:
- resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
-
- copy-descriptor@0.1.1:
- resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
- engines: {node: '>=0.10.0'}
-
- cors@2.8.5:
- resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
- engines: {node: '>= 0.10'}
-
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
- css-select@4.3.0:
- resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
-
- css-tree@1.1.3:
- resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
- engines: {node: '>=8.0.0'}
-
- css-what@6.1.0:
- resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
- engines: {node: '>= 6'}
-
- csso@4.2.0:
- resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
- engines: {node: '>=8.0.0'}
-
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
- data-view-buffer@1.0.2:
- resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-length@1.0.2:
- resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-offset@1.0.1:
- resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
- engines: {node: '>= 0.4'}
-
- dayjs@1.11.13:
- resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
-
- debug@2.6.9:
- resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- debug@4.4.1:
- resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- decode-uri-component@0.2.2:
- resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
- engines: {node: '>=0.10'}
-
- deep-equal@1.1.2:
- resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
- engines: {node: '>= 0.4'}
-
- define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
-
- define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
-
- define-property@0.2.5:
- resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
- engines: {node: '>=0.10.0'}
-
- define-property@1.0.0:
- resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
- engines: {node: '>=0.10.0'}
-
- define-property@2.0.2:
- resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
- engines: {node: '>=0.10.0'}
-
- delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
-
- delegate@3.2.0:
- resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
-
- dom-serializer@0.2.2:
- resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
-
- dom-serializer@1.4.1:
- resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
-
- domelementtype@1.3.1:
- resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
-
- domelementtype@2.3.0:
- resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
-
- domhandler@2.4.2:
- resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
-
- domhandler@4.3.1:
- resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
- engines: {node: '>= 4'}
-
- domutils@1.7.0:
- resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
-
- domutils@2.8.0:
- resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
-
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
- eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-
- echarts@5.5.1:
- resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==}
-
- editorconfig@1.0.4:
- resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
- engines: {node: '>=14'}
- hasBin: true
-
- element-plus@2.7.7:
- resolution: {integrity: sha512-7ucUiDAxevyBE8JbXBTe9ofHhS047VmWMLoksE45zZ08XSnhnyG7WUuk3gmDbAklfVMHedb9sEV3OovPUWt+Sw==}
- peerDependencies:
- vue: ^3.2.0
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
- emojis-list@3.0.0:
- resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
- engines: {node: '>= 4'}
-
- entities@1.1.2:
- resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
-
- entities@2.2.0:
- resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
-
- entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
-
- es-abstract@1.23.9:
- resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
- engines: {node: '>= 0.4'}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
- es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
- engines: {node: '>= 0.4'}
-
- es-set-tostringtag@2.1.0:
- resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
- engines: {node: '>= 0.4'}
-
- es-to-primitive@1.3.0:
- resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
- engines: {node: '>= 0.4'}
-
- esbuild@0.21.5:
- resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
- engines: {node: '>=12'}
- hasBin: true
-
- escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
- escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
- escape-string-regexp@5.0.0:
- resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
- engines: {node: '>=12'}
-
- estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-
- estree-walker@3.0.3:
- resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
-
- etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
-
- eventemitter3@2.0.3:
- resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
-
- expand-brackets@2.1.4:
- resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
- engines: {node: '>=0.10.0'}
-
- exsolve@1.0.5:
- resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==}
-
- extend-shallow@2.0.1:
- resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
- engines: {node: '>=0.10.0'}
-
- extend-shallow@3.0.2:
- resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
- engines: {node: '>=0.10.0'}
-
- extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
-
- extglob@2.0.4:
- resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
- engines: {node: '>=0.10.0'}
-
- fast-diff@1.1.2:
- resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
-
- fast-diff@1.2.0:
- resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
-
- fast-glob@3.3.3:
- resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
- engines: {node: '>=8.6.0'}
-
- fastq@1.19.1:
- resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
-
- file-saver@2.0.5:
- resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
-
- fill-range@4.0.0:
- resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
- engines: {node: '>=0.10.0'}
-
- fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
-
- follow-redirects@1.15.9:
- resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
-
- for-each@0.3.5:
- resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
- engines: {node: '>= 0.4'}
-
- for-in@1.0.2:
- resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
- engines: {node: '>=0.10.0'}
-
- foreground-child@3.3.1:
- resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
- engines: {node: '>=14'}
-
- form-data@4.0.2:
- resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
- engines: {node: '>= 6'}
-
- fragment-cache@0.2.1:
- resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
- engines: {node: '>=0.10.0'}
-
- fs-extra@10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
-
- fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
-
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- function.prototype.name@1.1.8:
- resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
- engines: {node: '>= 0.4'}
-
- functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
- fuse.js@6.6.2:
- resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
- engines: {node: '>=10'}
-
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
- get-symbol-description@1.1.0:
- resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
- engines: {node: '>= 0.4'}
-
- get-value@2.0.6:
- resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
- engines: {node: '>=0.10.0'}
-
- glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
-
- glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- hasBin: true
-
- globalthis@1.0.4:
- resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
- engines: {node: '>= 0.4'}
-
- good-listener@1.2.2:
- resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
-
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
-
- graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
- has-ansi@2.0.0:
- resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
- engines: {node: '>=0.10.0'}
-
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
- has-flag@1.0.0:
- resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
- engines: {node: '>=0.10.0'}
-
- has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
-
- has-property-descriptors@1.0.2:
- resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
- has-proto@1.2.0:
- resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
- engines: {node: '>= 0.4'}
-
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- has-tostringtag@1.0.2:
- resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
- engines: {node: '>= 0.4'}
-
- has-value@0.3.1:
- resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
- engines: {node: '>=0.10.0'}
-
- has-value@1.0.0:
- resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
- engines: {node: '>=0.10.0'}
-
- has-values@0.1.4:
- resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
- engines: {node: '>=0.10.0'}
-
- has-values@1.0.0:
- resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
- engines: {node: '>=0.10.0'}
-
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
-
- he@1.2.0:
- resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
- hasBin: true
-
- htmlparser2@3.10.1:
- resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
-
- image-size@0.5.5:
- resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
-
- immutable@4.3.7:
- resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- ini@1.3.8:
- resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
- is-accessor-descriptor@1.0.1:
- resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
- engines: {node: '>= 0.10'}
-
- is-arguments@1.2.0:
- resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
- engines: {node: '>= 0.4'}
-
- is-array-buffer@3.0.5:
- resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
- engines: {node: '>= 0.4'}
-
- is-async-function@2.1.1:
- resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
- engines: {node: '>= 0.4'}
-
- is-bigint@1.1.0:
- resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
- engines: {node: '>= 0.4'}
-
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
- is-boolean-object@1.2.2:
- resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
- engines: {node: '>= 0.4'}
-
- is-buffer@1.1.6:
- resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
-
- is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
-
- is-data-descriptor@1.0.1:
- resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
- engines: {node: '>= 0.4'}
-
- is-data-view@1.0.2:
- resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
- engines: {node: '>= 0.4'}
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
- is-descriptor@0.1.7:
- resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
- engines: {node: '>= 0.4'}
-
- is-descriptor@1.0.3:
- resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
- engines: {node: '>= 0.4'}
-
- is-extendable@0.1.1:
- resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
- engines: {node: '>=0.10.0'}
-
- is-extendable@1.0.1:
- resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
- engines: {node: '>=0.10.0'}
-
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-finalizationregistry@1.1.1:
- resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
- engines: {node: '>= 0.4'}
-
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- is-generator-function@1.1.0:
- resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
- engines: {node: '>= 0.4'}
-
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
-
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
- is-number-object@1.1.1:
- resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
- engines: {node: '>= 0.4'}
-
- is-number@3.0.0:
- resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
- engines: {node: '>=0.10.0'}
-
- is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- is-plain-obj@1.1.0:
- resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
- engines: {node: '>=0.10.0'}
-
- is-plain-object@2.0.4:
- resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
- engines: {node: '>=0.10.0'}
-
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
-
- is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
-
- is-shared-array-buffer@1.0.4:
- resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
- engines: {node: '>= 0.4'}
-
- is-string@1.1.1:
- resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
- engines: {node: '>= 0.4'}
-
- is-symbol@1.1.1:
- resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
- engines: {node: '>= 0.4'}
-
- is-typed-array@1.1.15:
- resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
- engines: {node: '>= 0.4'}
-
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakref@1.1.1:
- resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
- is-windows@1.0.2:
- resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
- engines: {node: '>=0.10.0'}
-
- isarray@1.0.0:
- resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- isobject@2.1.0:
- resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
- engines: {node: '>=0.10.0'}
-
- isobject@3.0.1:
- resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
- engines: {node: '>=0.10.0'}
-
- jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
-
- js-base64@2.6.4:
- resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
-
- js-beautify@1.14.11:
- resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==}
- engines: {node: '>=14'}
- hasBin: true
-
- js-cookie@3.0.5:
- resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
- engines: {node: '>=14'}
-
- js-tokens@9.0.1:
- resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
-
- jsencrypt@3.3.2:
- resolution: {integrity: sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==}
-
- json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
- hasBin: true
-
- jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
-
- kind-of@3.2.2:
- resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
- engines: {node: '>=0.10.0'}
-
- kind-of@4.0.0:
- resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
- engines: {node: '>=0.10.0'}
-
- kind-of@5.1.0:
- resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
- engines: {node: '>=0.10.0'}
-
- kind-of@6.0.3:
- resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
- engines: {node: '>=0.10.0'}
-
- loader-utils@1.4.2:
- resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
- engines: {node: '>=4.0.0'}
-
- local-pkg@0.5.1:
- resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
- engines: {node: '>=14'}
-
- local-pkg@1.1.1:
- resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
- engines: {node: '>=14'}
-
- lodash-es@4.17.21:
- resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
-
- lodash-unified@1.0.3:
- resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
- peerDependencies:
- '@types/lodash-es': '*'
- lodash: '*'
- lodash-es: '*'
-
- lodash.clonedeep@4.5.0:
- resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
-
- lodash.isequal@4.5.0:
- resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
- deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
-
- lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
- lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
-
- magic-string@0.26.7:
- resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
- engines: {node: '>=12'}
-
- magic-string@0.30.17:
- resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
-
- map-cache@0.2.2:
- resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
- engines: {node: '>=0.10.0'}
-
- map-visit@1.0.0:
- resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
- engines: {node: '>=0.10.0'}
-
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
- mdn-data@2.0.14:
- resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
-
- memoize-one@6.0.0:
- resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
-
- merge-options@1.0.1:
- resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
- engines: {node: '>=4'}
-
- merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
-
- micromatch@3.1.0:
- resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
- engines: {node: '>=0.10.0'}
-
- micromatch@4.0.8:
- resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
- engines: {node: '>=8.6'}
-
- mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
-
- mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
-
- minimatch@9.0.1:
- resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
- minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- mixin-deep@1.3.2:
- resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
- engines: {node: '>=0.10.0'}
-
- mlly@1.7.4:
- resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
-
- ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- nanomatch@1.2.13:
- resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
- engines: {node: '>=0.10.0'}
-
- nopt@7.2.1:
- resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- hasBin: true
-
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
- normalize-wheel-es@1.2.0:
- resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
-
- nprogress@0.2.0:
- resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
-
- nth-check@2.1.1:
- resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
-
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
-
- object-copy@0.1.0:
- resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
- engines: {node: '>=0.10.0'}
-
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
-
- object-is@1.1.6:
- resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
- engines: {node: '>= 0.4'}
-
- object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
-
- object-visit@1.0.1:
- resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
- engines: {node: '>=0.10.0'}
-
- object.assign@4.1.7:
- resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
- engines: {node: '>= 0.4'}
-
- object.pick@1.3.0:
- resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
- engines: {node: '>=0.10.0'}
-
- own-keys@1.0.1:
- resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
- engines: {node: '>= 0.4'}
-
- package-json-from-dist@1.0.1:
- resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
-
- parchment@1.1.4:
- resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
-
- pascalcase@0.1.1:
- resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
- engines: {node: '>=0.10.0'}
-
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
-
- pathe@0.2.0:
- resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
-
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
-
- picomatch@4.0.2:
- resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
- engines: {node: '>=12'}
-
- pinia@2.1.7:
- resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
- peerDependencies:
- '@vue/composition-api': ^1.4.0
- typescript: '>=4.4.4'
- vue: ^2.6.14 || ^3.3.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
- typescript:
- optional: true
-
- pkg-types@1.3.1:
- resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
-
- pkg-types@2.1.0:
- resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
-
- posix-character-classes@0.1.1:
- resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
- engines: {node: '>=0.10.0'}
-
- possible-typed-array-names@1.1.0:
- resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
- engines: {node: '>= 0.4'}
-
- postcss-prefix-selector@1.16.1:
- resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
- peerDependencies:
- postcss: '>4 <9'
-
- postcss@5.2.18:
- resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
- engines: {node: '>=0.12'}
-
- postcss@8.5.3:
- resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
- engines: {node: ^10 || ^12 || >=14}
-
- posthtml-parser@0.2.1:
- resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
-
- posthtml-rename-id@1.0.12:
- resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
-
- posthtml-render@1.4.0:
- resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
- engines: {node: '>=10'}
-
- posthtml-svg-mode@1.0.3:
- resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
-
- posthtml@0.9.2:
- resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
- engines: {node: '>=0.10.0'}
-
- proto-list@1.2.4:
- resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
-
- proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-
- quansync@0.2.10:
- resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
-
- query-string@4.3.4:
- resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
- engines: {node: '>=0.10.0'}
-
- queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-
- quill-delta@3.6.3:
- resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
- engines: {node: '>=0.10'}
-
- quill-delta@4.2.2:
- resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==}
-
- quill@1.3.7:
- resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
-
- readable-stream@3.6.2:
- resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
- engines: {node: '>= 6'}
-
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
- reflect.getprototypeof@1.0.10:
- resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
- engines: {node: '>= 0.4'}
-
- regex-not@1.0.2:
- resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
- engines: {node: '>=0.10.0'}
-
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
-
- repeat-element@1.1.4:
- resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
- engines: {node: '>=0.10.0'}
-
- repeat-string@1.6.1:
- resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
- engines: {node: '>=0.10'}
-
- resolve-url@0.2.1:
- resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
- deprecated: https://github.com/lydell/resolve-url#deprecated
-
- ret@0.1.15:
- resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
- engines: {node: '>=0.12'}
-
- reusify@1.1.0:
- resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
- rollup@4.40.2:
- resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-
- safe-array-concat@1.1.3:
- resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
- engines: {node: '>=0.4'}
-
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
- safe-push-apply@1.0.0:
- resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
- engines: {node: '>= 0.4'}
-
- safe-regex-test@1.1.0:
- resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
- engines: {node: '>= 0.4'}
-
- safe-regex@1.1.0:
- resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
-
- sass@1.77.5:
- resolution: {integrity: sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg==}
- engines: {node: '>=14.0.0'}
- hasBin: true
-
- scule@1.3.0:
- resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
-
- select@1.1.2:
- resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
-
- semver@7.7.2:
- resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
- engines: {node: '>=10'}
- hasBin: true
-
- set-function-length@1.2.2:
- resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
- engines: {node: '>= 0.4'}
-
- set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
-
- set-proto@1.0.0:
- resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
- engines: {node: '>= 0.4'}
-
- set-value@2.0.1:
- resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
- engines: {node: '>=0.10.0'}
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- side-channel-list@1.0.0:
- resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
- engines: {node: '>= 0.4'}
-
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
- snapdragon-node@2.1.1:
- resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
- engines: {node: '>=0.10.0'}
-
- snapdragon-util@3.0.1:
- resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
- engines: {node: '>=0.10.0'}
-
- snapdragon@0.8.2:
- resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
- engines: {node: '>=0.10.0'}
-
- sortablejs@1.14.0:
- resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==}
-
- sortablejs@1.15.6:
- resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==}
-
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
-
- source-map-resolve@0.5.3:
- resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
- deprecated: See https://github.com/lydell/source-map-resolve#deprecated
-
- source-map-url@0.4.1:
- resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
- deprecated: See https://github.com/lydell/source-map-url#deprecated
-
- source-map@0.5.7:
- resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
- engines: {node: '>=0.10.0'}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- sourcemap-codec@1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- deprecated: Please use @jridgewell/sourcemap-codec instead
-
- split-string@3.1.0:
- resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
- engines: {node: '>=0.10.0'}
-
- splitpanes@3.1.5:
- resolution: {integrity: sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==}
-
- stable@0.1.8:
- resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
- deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
-
- static-extend@0.1.2:
- resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
- engines: {node: '>=0.10.0'}
-
- strict-uri-encode@1.1.0:
- resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
- engines: {node: '>=0.10.0'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
-
- string.prototype.trim@1.2.10:
- resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimend@1.0.9:
- resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimstart@1.0.8:
- resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
- engines: {node: '>= 0.4'}
-
- string_decoder@1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
- strip-ansi@3.0.1:
- resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
- engines: {node: '>=0.10.0'}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
- engines: {node: '>=12'}
-
- strip-literal@2.1.1:
- resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
-
- supports-color@2.0.0:
- resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
- engines: {node: '>=0.8.0'}
-
- supports-color@3.2.3:
- resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
- engines: {node: '>=0.8.0'}
-
- supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
-
- svg-baker@1.7.0:
- resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
-
- svgo@2.8.0:
- resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
- engines: {node: '>=10.13.0'}
- hasBin: true
-
- tiny-emitter@2.1.0:
- resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
-
- to-object-path@0.3.0:
- resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
- engines: {node: '>=0.10.0'}
-
- to-regex-range@2.1.1:
- resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
- engines: {node: '>=0.10.0'}
-
- to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
-
- to-regex@3.0.2:
- resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
- engines: {node: '>=0.10.0'}
-
- traverse@0.6.11:
- resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
- engines: {node: '>= 0.4'}
-
- tslib@2.3.0:
- resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
-
- typed-array-buffer@1.0.3:
- resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-length@1.0.3:
- resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-offset@1.0.4:
- resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
- engines: {node: '>= 0.4'}
-
- typed-array-length@1.0.7:
- resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
- engines: {node: '>= 0.4'}
-
- typedarray.prototype.slice@1.0.5:
- resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
- engines: {node: '>= 0.4'}
-
- ufo@1.6.1:
- resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
-
- unbox-primitive@1.1.0:
- resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
- engines: {node: '>= 0.4'}
-
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
- unimport@3.14.6:
- resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==}
-
- union-value@1.0.1:
- resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
- engines: {node: '>=0.10.0'}
-
- universalify@2.0.1:
- resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
- engines: {node: '>= 10.0.0'}
-
- unplugin-auto-import@0.17.6:
- resolution: {integrity: sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==}
- engines: {node: '>=14'}
- peerDependencies:
- '@nuxt/kit': ^3.2.2
- '@vueuse/core': '*'
- peerDependenciesMeta:
- '@nuxt/kit':
- optional: true
- '@vueuse/core':
- optional: true
-
- unplugin-vue-setup-extend-plus@1.0.1:
- resolution: {integrity: sha512-mW2IzkyJITyspAV/LEdnEyE1CJip9jB5fCeaVv7Q6X0oJyDrOxXoB+jyet0q5pRJNjErbjQx950/8NPTvbqLTQ==}
-
- unplugin@1.16.1:
- resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
- engines: {node: '>=14.0.0'}
-
- unset-value@1.0.0:
- resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
- engines: {node: '>=0.10.0'}
-
- urix@0.1.0:
- resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
- deprecated: Please see https://github.com/lydell/urix#deprecated
-
- use@3.1.1:
- resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
- engines: {node: '>=0.10.0'}
-
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
-
- vite-plugin-compression@0.5.1:
- resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
- peerDependencies:
- vite: '>=2.0.0'
-
- vite-plugin-svg-icons@2.0.1:
- resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
- peerDependencies:
- vite: '>=2.0.0'
-
- vite@5.3.2:
- resolution: {integrity: sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
-
- vue-cropper@1.1.1:
- resolution: {integrity: sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==}
-
- vue-demi@0.14.10:
- resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
- engines: {node: '>=12'}
- hasBin: true
- peerDependencies:
- '@vue/composition-api': ^1.0.0-rc.1
- vue: ^3.0.0-0 || ^2.6.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
-
- vue-router@4.4.0:
- resolution: {integrity: sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==}
- peerDependencies:
- vue: ^3.2.0
-
- vue@3.4.31:
- resolution: {integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- vuedraggable@4.1.0:
- resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
- peerDependencies:
- vue: ^3.0.1
-
- webpack-virtual-modules@0.6.2:
- resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
-
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- engines: {node: '>= 0.4'}
-
- which-builtin-type@1.2.1:
- resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
- engines: {node: '>= 0.4'}
-
- which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.19:
- resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
- engines: {node: '>= 0.4'}
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
-
- zrender@5.6.0:
- resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==}
-
-snapshots:
-
- '@antfu/utils@0.7.10': {}
-
- '@babel/helper-string-parser@7.27.1': {}
-
- '@babel/helper-validator-identifier@7.27.1': {}
-
- '@babel/parser@7.27.2':
- dependencies:
- '@babel/types': 7.27.1
-
- '@babel/types@7.27.1':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
-
- '@ctrl/tinycolor@3.6.1': {}
-
- '@element-plus/icons-vue@2.3.1(vue@3.4.31)':
- dependencies:
- vue: 3.4.31
-
- '@esbuild/aix-ppc64@0.21.5':
- optional: true
-
- '@esbuild/android-arm64@0.21.5':
- optional: true
-
- '@esbuild/android-arm@0.21.5':
- optional: true
-
- '@esbuild/android-x64@0.21.5':
- optional: true
-
- '@esbuild/darwin-arm64@0.21.5':
- optional: true
-
- '@esbuild/darwin-x64@0.21.5':
- optional: true
-
- '@esbuild/freebsd-arm64@0.21.5':
- optional: true
-
- '@esbuild/freebsd-x64@0.21.5':
- optional: true
-
- '@esbuild/linux-arm64@0.21.5':
- optional: true
-
- '@esbuild/linux-arm@0.21.5':
- optional: true
-
- '@esbuild/linux-ia32@0.21.5':
- optional: true
-
- '@esbuild/linux-loong64@0.21.5':
- optional: true
-
- '@esbuild/linux-mips64el@0.21.5':
- optional: true
-
- '@esbuild/linux-ppc64@0.21.5':
- optional: true
-
- '@esbuild/linux-riscv64@0.21.5':
- optional: true
-
- '@esbuild/linux-s390x@0.21.5':
- optional: true
-
- '@esbuild/linux-x64@0.21.5':
- optional: true
-
- '@esbuild/netbsd-x64@0.21.5':
- optional: true
-
- '@esbuild/openbsd-x64@0.21.5':
- optional: true
-
- '@esbuild/sunos-x64@0.21.5':
- optional: true
-
- '@esbuild/win32-arm64@0.21.5':
- optional: true
-
- '@esbuild/win32-ia32@0.21.5':
- optional: true
-
- '@esbuild/win32-x64@0.21.5':
- optional: true
-
- '@floating-ui/core@1.7.0':
- dependencies:
- '@floating-ui/utils': 0.2.9
-
- '@floating-ui/dom@1.7.0':
- dependencies:
- '@floating-ui/core': 1.7.0
- '@floating-ui/utils': 0.2.9
-
- '@floating-ui/utils@0.2.9': {}
-
- '@isaacs/cliui@8.0.2':
- dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.0
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
-
- '@jridgewell/sourcemap-codec@1.5.0': {}
-
- '@nodelib/fs.scandir@2.1.5':
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
-
- '@nodelib/fs.stat@2.0.5': {}
-
- '@nodelib/fs.walk@1.2.8':
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.19.1
-
- '@one-ini/wasm@0.1.1': {}
-
- '@pkgjs/parseargs@0.11.0':
- optional: true
-
- '@rollup/pluginutils@5.1.4(rollup@4.40.2)':
- dependencies:
- '@types/estree': 1.0.7
- estree-walker: 2.0.2
- picomatch: 4.0.2
- optionalDependencies:
- rollup: 4.40.2
-
- '@rollup/rollup-android-arm-eabi@4.40.2':
- optional: true
-
- '@rollup/rollup-android-arm64@4.40.2':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.40.2':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.40.2':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.40.2':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-riscv64-musl@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.40.2':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.40.2':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.40.2':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.40.2':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.40.2':
- optional: true
-
- '@sxzz/popperjs-es@2.11.7': {}
-
- '@trysound/sax@0.2.0': {}
-
- '@types/estree@1.0.7': {}
-
- '@types/lodash-es@4.17.12':
- dependencies:
- '@types/lodash': 4.17.16
-
- '@types/lodash@4.17.16': {}
-
- '@types/node@22.15.18':
- dependencies:
- undici-types: 6.21.0
-
- '@types/svgo@2.6.4':
- dependencies:
- '@types/node': 22.15.18
-
- '@types/web-bluetooth@0.0.16': {}
-
- '@types/web-bluetooth@0.0.20': {}
-
- '@vitejs/plugin-vue@5.0.5(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))(vue@3.4.31)':
- dependencies:
- vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
- vue: 3.4.31
-
- '@vue/compiler-core@3.4.31':
- dependencies:
- '@babel/parser': 7.27.2
- '@vue/shared': 3.4.31
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.2.1
-
- '@vue/compiler-core@3.5.14':
- dependencies:
- '@babel/parser': 7.27.2
- '@vue/shared': 3.5.14
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.2.1
-
- '@vue/compiler-dom@3.4.31':
- dependencies:
- '@vue/compiler-core': 3.4.31
- '@vue/shared': 3.4.31
-
- '@vue/compiler-dom@3.5.14':
- dependencies:
- '@vue/compiler-core': 3.5.14
- '@vue/shared': 3.5.14
-
- '@vue/compiler-sfc@3.4.31':
- dependencies:
- '@babel/parser': 7.27.2
- '@vue/compiler-core': 3.4.31
- '@vue/compiler-dom': 3.4.31
- '@vue/compiler-ssr': 3.4.31
- '@vue/shared': 3.4.31
- estree-walker: 2.0.2
- magic-string: 0.30.17
- postcss: 8.5.3
- source-map-js: 1.2.1
-
- '@vue/compiler-sfc@3.5.14':
- dependencies:
- '@babel/parser': 7.27.2
- '@vue/compiler-core': 3.5.14
- '@vue/compiler-dom': 3.5.14
- '@vue/compiler-ssr': 3.5.14
- '@vue/shared': 3.5.14
- estree-walker: 2.0.2
- magic-string: 0.30.17
- postcss: 8.5.3
- source-map-js: 1.2.1
-
- '@vue/compiler-ssr@3.4.31':
- dependencies:
- '@vue/compiler-dom': 3.4.31
- '@vue/shared': 3.4.31
-
- '@vue/compiler-ssr@3.5.14':
- dependencies:
- '@vue/compiler-dom': 3.5.14
- '@vue/shared': 3.5.14
-
- '@vue/devtools-api@6.6.4': {}
-
- '@vue/reactivity@3.4.31':
- dependencies:
- '@vue/shared': 3.4.31
-
- '@vue/runtime-core@3.4.31':
- dependencies:
- '@vue/reactivity': 3.4.31
- '@vue/shared': 3.4.31
-
- '@vue/runtime-dom@3.4.31':
- dependencies:
- '@vue/reactivity': 3.4.31
- '@vue/runtime-core': 3.4.31
- '@vue/shared': 3.4.31
- csstype: 3.1.3
-
- '@vue/server-renderer@3.4.31(vue@3.4.31)':
- dependencies:
- '@vue/compiler-ssr': 3.4.31
- '@vue/shared': 3.4.31
- vue: 3.4.31
-
- '@vue/shared@3.4.31': {}
-
- '@vue/shared@3.5.14': {}
-
- '@vueup/vue-quill@1.2.0(vue@3.4.31)':
- dependencies:
- quill: 1.3.7
- quill-delta: 4.2.2
- vue: 3.4.31
-
- '@vueuse/core@10.11.0(vue@3.4.31)':
- dependencies:
- '@types/web-bluetooth': 0.0.20
- '@vueuse/metadata': 10.11.0
- '@vueuse/shared': 10.11.0(vue@3.4.31)
- vue-demi: 0.14.10(vue@3.4.31)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
-
- '@vueuse/core@9.13.0(vue@3.4.31)':
- dependencies:
- '@types/web-bluetooth': 0.0.16
- '@vueuse/metadata': 9.13.0
- '@vueuse/shared': 9.13.0(vue@3.4.31)
- vue-demi: 0.14.10(vue@3.4.31)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
-
- '@vueuse/metadata@10.11.0': {}
-
- '@vueuse/metadata@9.13.0': {}
-
- '@vueuse/shared@10.11.0(vue@3.4.31)':
- dependencies:
- vue-demi: 0.14.10(vue@3.4.31)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
-
- '@vueuse/shared@9.13.0(vue@3.4.31)':
- dependencies:
- vue-demi: 0.14.10(vue@3.4.31)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
-
- abbrev@2.0.0: {}
-
- acorn@8.14.1: {}
-
- ansi-regex@2.1.1: {}
-
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.1.0: {}
-
- ansi-styles@2.2.1: {}
-
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
-
- ansi-styles@6.2.1: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
- arr-diff@4.0.0: {}
-
- arr-flatten@1.1.0: {}
-
- arr-union@3.1.0: {}
-
- array-buffer-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- is-array-buffer: 3.0.5
-
- array-unique@0.3.2: {}
-
- arraybuffer.prototype.slice@1.0.4:
- dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- is-array-buffer: 3.0.5
-
- assign-symbols@1.0.0: {}
-
- async-function@1.0.0: {}
-
- async-validator@4.2.5: {}
-
- asynckit@0.4.0: {}
-
- atob@2.1.2: {}
-
- available-typed-arrays@1.0.7:
- dependencies:
- possible-typed-array-names: 1.1.0
-
- axios@0.28.1:
- dependencies:
- follow-redirects: 1.15.9
- form-data: 4.0.2
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
-
- balanced-match@1.0.2: {}
-
- base@0.11.2:
- dependencies:
- cache-base: 1.0.1
- class-utils: 0.3.6
- component-emitter: 1.3.1
- define-property: 1.0.0
- isobject: 3.0.1
- mixin-deep: 1.3.2
- pascalcase: 0.1.1
-
- big.js@5.2.2: {}
-
- binary-extensions@2.3.0: {}
-
- bluebird@3.7.2: {}
-
- boolbase@1.0.0: {}
-
- brace-expansion@2.0.1:
- dependencies:
- balanced-match: 1.0.2
-
- braces@2.3.2:
- dependencies:
- arr-flatten: 1.1.0
- array-unique: 0.3.2
- extend-shallow: 2.0.1
- fill-range: 4.0.0
- isobject: 3.0.1
- repeat-element: 1.1.4
- snapdragon: 0.8.2
- snapdragon-node: 2.1.1
- split-string: 3.1.0
- to-regex: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
- cache-base@1.0.1:
- dependencies:
- collection-visit: 1.0.0
- component-emitter: 1.3.1
- get-value: 2.0.6
- has-value: 1.0.0
- isobject: 3.0.1
- set-value: 2.0.1
- to-object-path: 0.3.0
- union-value: 1.0.1
- unset-value: 1.0.0
-
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
-
- call-bind@1.0.8:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- get-intrinsic: 1.3.0
- set-function-length: 1.2.2
-
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
-
- chalk@1.1.3:
- dependencies:
- ansi-styles: 2.2.1
- escape-string-regexp: 1.0.5
- has-ansi: 2.0.0
- strip-ansi: 3.0.1
- supports-color: 2.0.0
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- chokidar@3.6.0:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
-
- class-utils@0.3.6:
- dependencies:
- arr-union: 3.1.0
- define-property: 0.2.5
- isobject: 3.0.1
- static-extend: 0.1.2
-
- clipboard@2.0.11:
- dependencies:
- good-listener: 1.2.2
- select: 1.1.2
- tiny-emitter: 2.1.0
-
- clone@2.1.2: {}
-
- collection-visit@1.0.0:
- dependencies:
- map-visit: 1.0.0
- object-visit: 1.0.1
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
- combined-stream@1.0.8:
- dependencies:
- delayed-stream: 1.0.0
-
- commander@10.0.1: {}
-
- commander@7.2.0: {}
-
- component-emitter@1.3.1: {}
-
- confbox@0.1.8: {}
-
- confbox@0.2.2: {}
-
- config-chain@1.1.13:
- dependencies:
- ini: 1.3.8
- proto-list: 1.2.4
-
- copy-descriptor@0.1.1: {}
-
- cors@2.8.5:
- dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
-
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- css-select@4.3.0:
- dependencies:
- boolbase: 1.0.0
- css-what: 6.1.0
- domhandler: 4.3.1
- domutils: 2.8.0
- nth-check: 2.1.1
-
- css-tree@1.1.3:
- dependencies:
- mdn-data: 2.0.14
- source-map: 0.6.1
-
- css-what@6.1.0: {}
-
- csso@4.2.0:
- dependencies:
- css-tree: 1.1.3
-
- csstype@3.1.3: {}
-
- data-view-buffer@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-offset@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- dayjs@1.11.13: {}
-
- debug@2.6.9:
- dependencies:
- ms: 2.0.0
-
- debug@4.4.1:
- dependencies:
- ms: 2.1.3
-
- decode-uri-component@0.2.2: {}
-
- deep-equal@1.1.2:
- dependencies:
- is-arguments: 1.2.0
- is-date-object: 1.1.0
- is-regex: 1.2.1
- object-is: 1.1.6
- object-keys: 1.1.1
- regexp.prototype.flags: 1.5.4
-
- define-data-property@1.1.4:
- dependencies:
- es-define-property: 1.0.1
- es-errors: 1.3.0
- gopd: 1.2.0
-
- define-properties@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
-
- define-property@0.2.5:
- dependencies:
- is-descriptor: 0.1.7
-
- define-property@1.0.0:
- dependencies:
- is-descriptor: 1.0.3
-
- define-property@2.0.2:
- dependencies:
- is-descriptor: 1.0.3
- isobject: 3.0.1
-
- delayed-stream@1.0.0: {}
-
- delegate@3.2.0: {}
-
- dom-serializer@0.2.2:
- dependencies:
- domelementtype: 2.3.0
- entities: 2.2.0
-
- dom-serializer@1.4.1:
- dependencies:
- domelementtype: 2.3.0
- domhandler: 4.3.1
- entities: 2.2.0
-
- domelementtype@1.3.1: {}
-
- domelementtype@2.3.0: {}
-
- domhandler@2.4.2:
- dependencies:
- domelementtype: 1.3.1
-
- domhandler@4.3.1:
- dependencies:
- domelementtype: 2.3.0
-
- domutils@1.7.0:
- dependencies:
- dom-serializer: 0.2.2
- domelementtype: 1.3.1
-
- domutils@2.8.0:
- dependencies:
- dom-serializer: 1.4.1
- domelementtype: 2.3.0
- domhandler: 4.3.1
-
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
-
- eastasianwidth@0.2.0: {}
-
- echarts@5.5.1:
- dependencies:
- tslib: 2.3.0
- zrender: 5.6.0
-
- editorconfig@1.0.4:
- dependencies:
- '@one-ini/wasm': 0.1.1
- commander: 10.0.1
- minimatch: 9.0.1
- semver: 7.7.2
-
- element-plus@2.7.7(vue@3.4.31):
- dependencies:
- '@ctrl/tinycolor': 3.6.1
- '@element-plus/icons-vue': 2.3.1(vue@3.4.31)
- '@floating-ui/dom': 1.7.0
- '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
- '@types/lodash': 4.17.16
- '@types/lodash-es': 4.17.12
- '@vueuse/core': 9.13.0(vue@3.4.31)
- async-validator: 4.2.5
- dayjs: 1.11.13
- escape-html: 1.0.3
- lodash: 4.17.21
- lodash-es: 4.17.21
- lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
- memoize-one: 6.0.0
- normalize-wheel-es: 1.2.0
- vue: 3.4.31
- transitivePeerDependencies:
- - '@vue/composition-api'
-
- emoji-regex@8.0.0: {}
-
- emoji-regex@9.2.2: {}
-
- emojis-list@3.0.0: {}
-
- entities@1.1.2: {}
-
- entities@2.2.0: {}
-
- entities@4.5.0: {}
-
- es-abstract@1.23.9:
- dependencies:
- array-buffer-byte-length: 1.0.2
- arraybuffer.prototype.slice: 1.0.4
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.4
- data-view-buffer: 1.0.2
- data-view-byte-length: 1.0.2
- data-view-byte-offset: 1.0.1
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-set-tostringtag: 2.1.0
- es-to-primitive: 1.3.0
- function.prototype.name: 1.1.8
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- get-symbol-description: 1.1.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- internal-slot: 1.1.0
- is-array-buffer: 3.0.5
- is-callable: 1.2.7
- is-data-view: 1.0.2
- is-regex: 1.2.1
- is-shared-array-buffer: 1.0.4
- is-string: 1.1.1
- is-typed-array: 1.1.15
- is-weakref: 1.1.1
- math-intrinsics: 1.1.0
- object-inspect: 1.13.4
- object-keys: 1.1.1
- object.assign: 4.1.7
- own-keys: 1.0.1
- regexp.prototype.flags: 1.5.4
- safe-array-concat: 1.1.3
- safe-push-apply: 1.0.0
- safe-regex-test: 1.1.0
- set-proto: 1.0.0
- string.prototype.trim: 1.2.10
- string.prototype.trimend: 1.0.9
- string.prototype.trimstart: 1.0.8
- typed-array-buffer: 1.0.3
- typed-array-byte-length: 1.0.3
- typed-array-byte-offset: 1.0.4
- typed-array-length: 1.0.7
- unbox-primitive: 1.1.0
- which-typed-array: 1.1.19
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
- es-object-atoms@1.1.1:
- dependencies:
- es-errors: 1.3.0
-
- es-set-tostringtag@2.1.0:
- dependencies:
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- es-to-primitive@1.3.0:
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.1.0
- is-symbol: 1.1.1
-
- esbuild@0.21.5:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
-
- escape-html@1.0.3: {}
-
- escape-string-regexp@1.0.5: {}
-
- escape-string-regexp@5.0.0: {}
-
- estree-walker@2.0.2: {}
-
- estree-walker@3.0.3:
- dependencies:
- '@types/estree': 1.0.7
-
- etag@1.8.1: {}
-
- eventemitter3@2.0.3: {}
-
- expand-brackets@2.1.4:
- dependencies:
- debug: 2.6.9
- define-property: 0.2.5
- extend-shallow: 2.0.1
- posix-character-classes: 0.1.1
- regex-not: 1.0.2
- snapdragon: 0.8.2
- to-regex: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
- exsolve@1.0.5: {}
-
- extend-shallow@2.0.1:
- dependencies:
- is-extendable: 0.1.1
-
- extend-shallow@3.0.2:
- dependencies:
- assign-symbols: 1.0.0
- is-extendable: 1.0.1
-
- extend@3.0.2: {}
-
- extglob@2.0.4:
- dependencies:
- array-unique: 0.3.2
- define-property: 1.0.0
- expand-brackets: 2.1.4
- extend-shallow: 2.0.1
- fragment-cache: 0.2.1
- regex-not: 1.0.2
- snapdragon: 0.8.2
- to-regex: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
- fast-diff@1.1.2: {}
-
- fast-diff@1.2.0: {}
-
- fast-glob@3.3.3:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.8
-
- fastq@1.19.1:
- dependencies:
- reusify: 1.1.0
-
- file-saver@2.0.5: {}
-
- fill-range@4.0.0:
- dependencies:
- extend-shallow: 2.0.1
- is-number: 3.0.0
- repeat-string: 1.6.1
- to-regex-range: 2.1.1
-
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
-
- follow-redirects@1.15.9: {}
-
- for-each@0.3.5:
- dependencies:
- is-callable: 1.2.7
-
- for-in@1.0.2: {}
-
- foreground-child@3.3.1:
- dependencies:
- cross-spawn: 7.0.6
- signal-exit: 4.1.0
-
- form-data@4.0.2:
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- es-set-tostringtag: 2.1.0
- mime-types: 2.1.35
-
- fragment-cache@0.2.1:
- dependencies:
- map-cache: 0.2.2
-
- fs-extra@10.1.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.1
-
- fsevents@2.3.3:
- optional: true
-
- function-bind@1.1.2: {}
-
- function.prototype.name@1.1.8:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- functions-have-names: 1.2.3
- hasown: 2.0.2
- is-callable: 1.2.7
-
- functions-have-names@1.2.3: {}
-
- fuse.js@6.6.2: {}
-
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- math-intrinsics: 1.1.0
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.1
-
- get-symbol-description@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
-
- get-value@2.0.6: {}
-
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
- glob@10.4.5:
- dependencies:
- foreground-child: 3.3.1
- jackspeak: 3.4.3
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.1
- path-scurry: 1.11.1
-
- globalthis@1.0.4:
- dependencies:
- define-properties: 1.2.1
- gopd: 1.2.0
-
- good-listener@1.2.2:
- dependencies:
- delegate: 3.2.0
-
- gopd@1.2.0: {}
-
- graceful-fs@4.2.11: {}
-
- has-ansi@2.0.0:
- dependencies:
- ansi-regex: 2.1.1
-
- has-bigints@1.1.0: {}
-
- has-flag@1.0.0: {}
-
- has-flag@4.0.0: {}
-
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.1
-
- has-proto@1.2.0:
- dependencies:
- dunder-proto: 1.0.1
-
- has-symbols@1.1.0: {}
-
- has-tostringtag@1.0.2:
- dependencies:
- has-symbols: 1.1.0
-
- has-value@0.3.1:
- dependencies:
- get-value: 2.0.6
- has-values: 0.1.4
- isobject: 2.1.0
-
- has-value@1.0.0:
- dependencies:
- get-value: 2.0.6
- has-values: 1.0.0
- isobject: 3.0.1
-
- has-values@0.1.4: {}
-
- has-values@1.0.0:
- dependencies:
- is-number: 3.0.0
- kind-of: 4.0.0
-
- hasown@2.0.2:
- dependencies:
- function-bind: 1.1.2
-
- he@1.2.0: {}
-
- htmlparser2@3.10.1:
- dependencies:
- domelementtype: 1.3.1
- domhandler: 2.4.2
- domutils: 1.7.0
- entities: 1.1.2
- inherits: 2.0.4
- readable-stream: 3.6.2
-
- image-size@0.5.5: {}
-
- immutable@4.3.7: {}
-
- inherits@2.0.4: {}
-
- ini@1.3.8: {}
-
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
- is-accessor-descriptor@1.0.1:
- dependencies:
- hasown: 2.0.2
-
- is-arguments@1.2.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-async-function@2.1.1:
- dependencies:
- async-function: 1.0.0
- call-bound: 1.0.4
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
-
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
-
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
- is-boolean-object@1.2.2:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-buffer@1.1.6: {}
-
- is-callable@1.2.7: {}
-
- is-data-descriptor@1.0.1:
- dependencies:
- hasown: 2.0.2
-
- is-data-view@1.0.2:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- is-typed-array: 1.1.15
-
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-descriptor@0.1.7:
- dependencies:
- is-accessor-descriptor: 1.0.1
- is-data-descriptor: 1.0.1
-
- is-descriptor@1.0.3:
- dependencies:
- is-accessor-descriptor: 1.0.1
- is-data-descriptor: 1.0.1
-
- is-extendable@0.1.1: {}
-
- is-extendable@1.0.1:
- dependencies:
- is-plain-object: 2.0.4
-
- is-extglob@2.1.1: {}
-
- is-finalizationregistry@1.1.1:
- dependencies:
- call-bound: 1.0.4
-
- is-fullwidth-code-point@3.0.0: {}
-
- is-generator-function@1.1.0:
- dependencies:
- call-bound: 1.0.4
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
-
- is-glob@4.0.3:
- dependencies:
- is-extglob: 2.1.1
-
- is-map@2.0.3: {}
-
- is-number-object@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-number@3.0.0:
- dependencies:
- kind-of: 3.2.2
-
- is-number@7.0.0: {}
-
- is-plain-obj@1.1.0: {}
-
- is-plain-object@2.0.4:
- dependencies:
- isobject: 3.0.1
-
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.4
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- is-set@2.0.3: {}
-
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.4
-
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-symbol@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
-
- is-typed-array@1.1.15:
- dependencies:
- which-typed-array: 1.1.19
-
- is-weakmap@2.0.2: {}
-
- is-weakref@1.1.1:
- dependencies:
- call-bound: 1.0.4
-
- is-weakset@2.0.4:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-windows@1.0.2: {}
-
- isarray@1.0.0: {}
-
- isarray@2.0.5: {}
-
- isexe@2.0.0: {}
-
- isobject@2.1.0:
- dependencies:
- isarray: 1.0.0
-
- isobject@3.0.1: {}
-
- jackspeak@3.4.3:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
-
- js-base64@2.6.4: {}
-
- js-beautify@1.14.11:
- dependencies:
- config-chain: 1.1.13
- editorconfig: 1.0.4
- glob: 10.4.5
- nopt: 7.2.1
-
- js-cookie@3.0.5: {}
-
- js-tokens@9.0.1: {}
-
- jsencrypt@3.3.2: {}
-
- json5@1.0.2:
- dependencies:
- minimist: 1.2.8
-
- jsonfile@6.1.0:
- dependencies:
- universalify: 2.0.1
- optionalDependencies:
- graceful-fs: 4.2.11
-
- kind-of@3.2.2:
- dependencies:
- is-buffer: 1.1.6
-
- kind-of@4.0.0:
- dependencies:
- is-buffer: 1.1.6
-
- kind-of@5.1.0: {}
-
- kind-of@6.0.3: {}
-
- loader-utils@1.4.2:
- dependencies:
- big.js: 5.2.2
- emojis-list: 3.0.0
- json5: 1.0.2
-
- local-pkg@0.5.1:
- dependencies:
- mlly: 1.7.4
- pkg-types: 1.3.1
-
- local-pkg@1.1.1:
- dependencies:
- mlly: 1.7.4
- pkg-types: 2.1.0
- quansync: 0.2.10
-
- lodash-es@4.17.21: {}
-
- lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
- dependencies:
- '@types/lodash-es': 4.17.12
- lodash: 4.17.21
- lodash-es: 4.17.21
-
- lodash.clonedeep@4.5.0: {}
-
- lodash.isequal@4.5.0: {}
-
- lodash@4.17.21: {}
-
- lru-cache@10.4.3: {}
-
- magic-string@0.26.7:
- dependencies:
- sourcemap-codec: 1.4.8
-
- magic-string@0.30.17:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
-
- map-cache@0.2.2: {}
-
- map-visit@1.0.0:
- dependencies:
- object-visit: 1.0.1
-
- math-intrinsics@1.1.0: {}
-
- mdn-data@2.0.14: {}
-
- memoize-one@6.0.0: {}
-
- merge-options@1.0.1:
- dependencies:
- is-plain-obj: 1.1.0
-
- merge2@1.4.1: {}
-
- micromatch@3.1.0:
- dependencies:
- arr-diff: 4.0.0
- array-unique: 0.3.2
- braces: 2.3.2
- define-property: 1.0.0
- extend-shallow: 2.0.1
- extglob: 2.0.4
- fragment-cache: 0.2.1
- kind-of: 5.1.0
- nanomatch: 1.2.13
- object.pick: 1.3.0
- regex-not: 1.0.2
- snapdragon: 0.8.2
- to-regex: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
- micromatch@4.0.8:
- dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
-
- mime-db@1.52.0: {}
-
- mime-types@2.1.35:
- dependencies:
- mime-db: 1.52.0
-
- minimatch@9.0.1:
- dependencies:
- brace-expansion: 2.0.1
-
- minimatch@9.0.5:
- dependencies:
- brace-expansion: 2.0.1
-
- minimist@1.2.8: {}
-
- minipass@7.1.2: {}
-
- mixin-deep@1.3.2:
- dependencies:
- for-in: 1.0.2
- is-extendable: 1.0.1
-
- mlly@1.7.4:
- dependencies:
- acorn: 8.14.1
- pathe: 2.0.3
- pkg-types: 1.3.1
- ufo: 1.6.1
-
- ms@2.0.0: {}
-
- ms@2.1.3: {}
-
- nanoid@3.3.11: {}
-
- nanomatch@1.2.13:
- dependencies:
- arr-diff: 4.0.0
- array-unique: 0.3.2
- define-property: 2.0.2
- extend-shallow: 3.0.2
- fragment-cache: 0.2.1
- is-windows: 1.0.2
- kind-of: 6.0.3
- object.pick: 1.3.0
- regex-not: 1.0.2
- snapdragon: 0.8.2
- to-regex: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
- nopt@7.2.1:
- dependencies:
- abbrev: 2.0.0
-
- normalize-path@3.0.0: {}
-
- normalize-wheel-es@1.2.0: {}
-
- nprogress@0.2.0: {}
-
- nth-check@2.1.1:
- dependencies:
- boolbase: 1.0.0
-
- object-assign@4.1.1: {}
-
- object-copy@0.1.0:
- dependencies:
- copy-descriptor: 0.1.1
- define-property: 0.2.5
- kind-of: 3.2.2
-
- object-inspect@1.13.4: {}
-
- object-is@1.1.6:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
-
- object-keys@1.1.1: {}
-
- object-visit@1.0.1:
- dependencies:
- isobject: 3.0.1
-
- object.assign@4.1.7:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
- has-symbols: 1.1.0
- object-keys: 1.1.1
-
- object.pick@1.3.0:
- dependencies:
- isobject: 3.0.1
-
- own-keys@1.0.1:
- dependencies:
- get-intrinsic: 1.3.0
- object-keys: 1.1.1
- safe-push-apply: 1.0.0
-
- package-json-from-dist@1.0.1: {}
-
- parchment@1.1.4: {}
-
- pascalcase@0.1.1: {}
-
- path-key@3.1.1: {}
-
- path-scurry@1.11.1:
- dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.2
-
- pathe@0.2.0: {}
-
- pathe@2.0.3: {}
-
- picocolors@1.1.1: {}
-
- picomatch@2.3.1: {}
-
- picomatch@4.0.2: {}
-
- pinia@2.1.7(vue@3.4.31):
- dependencies:
- '@vue/devtools-api': 6.6.4
- vue: 3.4.31
- vue-demi: 0.14.10(vue@3.4.31)
-
- pkg-types@1.3.1:
- dependencies:
- confbox: 0.1.8
- mlly: 1.7.4
- pathe: 2.0.3
-
- pkg-types@2.1.0:
- dependencies:
- confbox: 0.2.2
- exsolve: 1.0.5
- pathe: 2.0.3
-
- posix-character-classes@0.1.1: {}
-
- possible-typed-array-names@1.1.0: {}
-
- postcss-prefix-selector@1.16.1(postcss@5.2.18):
- dependencies:
- postcss: 5.2.18
-
- postcss@5.2.18:
- dependencies:
- chalk: 1.1.3
- js-base64: 2.6.4
- source-map: 0.5.7
- supports-color: 3.2.3
-
- postcss@8.5.3:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- posthtml-parser@0.2.1:
- dependencies:
- htmlparser2: 3.10.1
- isobject: 2.1.0
-
- posthtml-rename-id@1.0.12:
- dependencies:
- escape-string-regexp: 1.0.5
-
- posthtml-render@1.4.0: {}
-
- posthtml-svg-mode@1.0.3:
- dependencies:
- merge-options: 1.0.1
- posthtml: 0.9.2
- posthtml-parser: 0.2.1
- posthtml-render: 1.4.0
-
- posthtml@0.9.2:
- dependencies:
- posthtml-parser: 0.2.1
- posthtml-render: 1.4.0
-
- proto-list@1.2.4: {}
-
- proxy-from-env@1.1.0: {}
-
- quansync@0.2.10: {}
-
- query-string@4.3.4:
- dependencies:
- object-assign: 4.1.1
- strict-uri-encode: 1.1.0
-
- queue-microtask@1.2.3: {}
-
- quill-delta@3.6.3:
- dependencies:
- deep-equal: 1.1.2
- extend: 3.0.2
- fast-diff: 1.1.2
-
- quill-delta@4.2.2:
- dependencies:
- fast-diff: 1.2.0
- lodash.clonedeep: 4.5.0
- lodash.isequal: 4.5.0
-
- quill@1.3.7:
- dependencies:
- clone: 2.1.2
- deep-equal: 1.1.2
- eventemitter3: 2.0.3
- extend: 3.0.2
- parchment: 1.1.4
- quill-delta: 3.6.3
-
- readable-stream@3.6.2:
- dependencies:
- inherits: 2.0.4
- string_decoder: 1.3.0
- util-deprecate: 1.0.2
-
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.1
-
- reflect.getprototypeof@1.0.10:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- which-builtin-type: 1.2.1
-
- regex-not@1.0.2:
- dependencies:
- extend-shallow: 3.0.2
- safe-regex: 1.1.0
-
- regexp.prototype.flags@1.5.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
-
- repeat-element@1.1.4: {}
-
- repeat-string@1.6.1: {}
-
- resolve-url@0.2.1: {}
-
- ret@0.1.15: {}
-
- reusify@1.1.0: {}
-
- rollup@4.40.2:
- dependencies:
- '@types/estree': 1.0.7
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.40.2
- '@rollup/rollup-android-arm64': 4.40.2
- '@rollup/rollup-darwin-arm64': 4.40.2
- '@rollup/rollup-darwin-x64': 4.40.2
- '@rollup/rollup-freebsd-arm64': 4.40.2
- '@rollup/rollup-freebsd-x64': 4.40.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.40.2
- '@rollup/rollup-linux-arm-musleabihf': 4.40.2
- '@rollup/rollup-linux-arm64-gnu': 4.40.2
- '@rollup/rollup-linux-arm64-musl': 4.40.2
- '@rollup/rollup-linux-loongarch64-gnu': 4.40.2
- '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2
- '@rollup/rollup-linux-riscv64-gnu': 4.40.2
- '@rollup/rollup-linux-riscv64-musl': 4.40.2
- '@rollup/rollup-linux-s390x-gnu': 4.40.2
- '@rollup/rollup-linux-x64-gnu': 4.40.2
- '@rollup/rollup-linux-x64-musl': 4.40.2
- '@rollup/rollup-win32-arm64-msvc': 4.40.2
- '@rollup/rollup-win32-ia32-msvc': 4.40.2
- '@rollup/rollup-win32-x64-msvc': 4.40.2
- fsevents: 2.3.3
-
- run-parallel@1.2.0:
- dependencies:
- queue-microtask: 1.2.3
-
- safe-array-concat@1.1.3:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- has-symbols: 1.1.0
- isarray: 2.0.5
-
- safe-buffer@5.2.1: {}
-
- safe-push-apply@1.0.0:
- dependencies:
- es-errors: 1.3.0
- isarray: 2.0.5
-
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-regex: 1.2.1
-
- safe-regex@1.1.0:
- dependencies:
- ret: 0.1.15
-
- sass@1.77.5:
- dependencies:
- chokidar: 3.6.0
- immutable: 4.3.7
- source-map-js: 1.2.1
-
- scule@1.3.0: {}
-
- select@1.1.2: {}
-
- semver@7.7.2: {}
-
- set-function-length@1.2.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
-
- set-function-name@2.0.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- set-proto@1.0.0:
- dependencies:
- dunder-proto: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
-
- set-value@2.0.1:
- dependencies:
- extend-shallow: 2.0.1
- is-extendable: 0.1.1
- is-plain-object: 2.0.4
- split-string: 3.1.0
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- side-channel-list@1.0.0:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-map@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-weakmap@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
-
- side-channel@1.1.0:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.0
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
- signal-exit@4.1.0: {}
-
- snapdragon-node@2.1.1:
- dependencies:
- define-property: 1.0.0
- isobject: 3.0.1
- snapdragon-util: 3.0.1
-
- snapdragon-util@3.0.1:
- dependencies:
- kind-of: 3.2.2
-
- snapdragon@0.8.2:
- dependencies:
- base: 0.11.2
- debug: 2.6.9
- define-property: 0.2.5
- extend-shallow: 2.0.1
- map-cache: 0.2.2
- source-map: 0.5.7
- source-map-resolve: 0.5.3
- use: 3.1.1
- transitivePeerDependencies:
- - supports-color
-
- sortablejs@1.14.0: {}
-
- sortablejs@1.15.6: {}
-
- source-map-js@1.2.1: {}
-
- source-map-resolve@0.5.3:
- dependencies:
- atob: 2.1.2
- decode-uri-component: 0.2.2
- resolve-url: 0.2.1
- source-map-url: 0.4.1
- urix: 0.1.0
-
- source-map-url@0.4.1: {}
-
- source-map@0.5.7: {}
-
- source-map@0.6.1: {}
-
- sourcemap-codec@1.4.8: {}
-
- split-string@3.1.0:
- dependencies:
- extend-shallow: 3.0.2
-
- splitpanes@3.1.5: {}
-
- stable@0.1.8: {}
-
- static-extend@0.1.2:
- dependencies:
- define-property: 0.2.5
- object-copy: 0.1.0
-
- strict-uri-encode@1.1.0: {}
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- string-width@5.1.2:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 9.2.2
- strip-ansi: 7.1.0
-
- string.prototype.trim@1.2.10:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-data-property: 1.1.4
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-object-atoms: 1.1.1
- has-property-descriptors: 1.0.2
-
- string.prototype.trimend@1.0.9:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- string.prototype.trimstart@1.0.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- string_decoder@1.3.0:
- dependencies:
- safe-buffer: 5.2.1
-
- strip-ansi@3.0.1:
- dependencies:
- ansi-regex: 2.1.1
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.1.0:
- dependencies:
- ansi-regex: 6.1.0
-
- strip-literal@2.1.1:
- dependencies:
- js-tokens: 9.0.1
-
- supports-color@2.0.0: {}
-
- supports-color@3.2.3:
- dependencies:
- has-flag: 1.0.0
-
- supports-color@7.2.0:
- dependencies:
- has-flag: 4.0.0
-
- svg-baker@1.7.0:
- dependencies:
- bluebird: 3.7.2
- clone: 2.1.2
- he: 1.2.0
- image-size: 0.5.5
- loader-utils: 1.4.2
- merge-options: 1.0.1
- micromatch: 3.1.0
- postcss: 5.2.18
- postcss-prefix-selector: 1.16.1(postcss@5.2.18)
- posthtml-rename-id: 1.0.12
- posthtml-svg-mode: 1.0.3
- query-string: 4.3.4
- traverse: 0.6.11
- transitivePeerDependencies:
- - supports-color
-
- svgo@2.8.0:
- dependencies:
- '@trysound/sax': 0.2.0
- commander: 7.2.0
- css-select: 4.3.0
- css-tree: 1.1.3
- csso: 4.2.0
- picocolors: 1.1.1
- stable: 0.1.8
-
- tiny-emitter@2.1.0: {}
-
- to-object-path@0.3.0:
- dependencies:
- kind-of: 3.2.2
-
- to-regex-range@2.1.1:
- dependencies:
- is-number: 3.0.0
- repeat-string: 1.6.1
-
- to-regex-range@5.0.1:
- dependencies:
- is-number: 7.0.0
-
- to-regex@3.0.2:
- dependencies:
- define-property: 2.0.2
- extend-shallow: 3.0.2
- regex-not: 1.0.2
- safe-regex: 1.1.0
-
- traverse@0.6.11:
- dependencies:
- gopd: 1.2.0
- typedarray.prototype.slice: 1.0.5
- which-typed-array: 1.1.19
-
- tslib@2.3.0: {}
-
- typed-array-buffer@1.0.3:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-typed-array: 1.1.15
-
- typed-array-byte-length@1.0.3:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
-
- typed-array-byte-offset@1.0.4:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
- reflect.getprototypeof: 1.0.10
-
- typed-array-length@1.0.7:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- is-typed-array: 1.1.15
- possible-typed-array-names: 1.1.0
- reflect.getprototypeof: 1.0.10
-
- typedarray.prototype.slice@1.0.5:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- get-proto: 1.0.1
- math-intrinsics: 1.1.0
- typed-array-buffer: 1.0.3
- typed-array-byte-offset: 1.0.4
-
- ufo@1.6.1: {}
-
- unbox-primitive@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-bigints: 1.1.0
- has-symbols: 1.1.0
- which-boxed-primitive: 1.1.1
-
- undici-types@6.21.0: {}
-
- unimport@3.14.6(rollup@4.40.2):
- dependencies:
- '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
- acorn: 8.14.1
- escape-string-regexp: 5.0.0
- estree-walker: 3.0.3
- fast-glob: 3.3.3
- local-pkg: 1.1.1
- magic-string: 0.30.17
- mlly: 1.7.4
- pathe: 2.0.3
- picomatch: 4.0.2
- pkg-types: 1.3.1
- scule: 1.3.0
- strip-literal: 2.1.1
- unplugin: 1.16.1
- transitivePeerDependencies:
- - rollup
-
- union-value@1.0.1:
- dependencies:
- arr-union: 3.1.0
- get-value: 2.0.6
- is-extendable: 0.1.1
- set-value: 2.0.1
-
- universalify@2.0.1: {}
-
- unplugin-auto-import@0.17.6(@vueuse/core@10.11.0(vue@3.4.31))(rollup@4.40.2):
- dependencies:
- '@antfu/utils': 0.7.10
- '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
- fast-glob: 3.3.3
- local-pkg: 0.5.1
- magic-string: 0.30.17
- minimatch: 9.0.5
- unimport: 3.14.6(rollup@4.40.2)
- unplugin: 1.16.1
- optionalDependencies:
- '@vueuse/core': 10.11.0(vue@3.4.31)
- transitivePeerDependencies:
- - rollup
-
- unplugin-vue-setup-extend-plus@1.0.1:
- dependencies:
- '@vue/compiler-sfc': 3.5.14
- magic-string: 0.26.7
- unplugin: 1.16.1
-
- unplugin@1.16.1:
- dependencies:
- acorn: 8.14.1
- webpack-virtual-modules: 0.6.2
-
- unset-value@1.0.0:
- dependencies:
- has-value: 0.3.1
- isobject: 3.0.1
-
- urix@0.1.0: {}
-
- use@3.1.1: {}
-
- util-deprecate@1.0.2: {}
-
- vary@1.1.2: {}
-
- vite-plugin-compression@0.5.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5)):
- dependencies:
- chalk: 4.1.2
- debug: 4.4.1
- fs-extra: 10.1.0
- vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
- transitivePeerDependencies:
- - supports-color
-
- vite-plugin-svg-icons@2.0.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5)):
- dependencies:
- '@types/svgo': 2.6.4
- cors: 2.8.5
- debug: 4.4.1
- etag: 1.8.1
- fs-extra: 10.1.0
- pathe: 0.2.0
- svg-baker: 1.7.0
- svgo: 2.8.0
- vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
- transitivePeerDependencies:
- - supports-color
-
- vite@5.3.2(@types/node@22.15.18)(sass@1.77.5):
- dependencies:
- esbuild: 0.21.5
- postcss: 8.5.3
- rollup: 4.40.2
- optionalDependencies:
- '@types/node': 22.15.18
- fsevents: 2.3.3
- sass: 1.77.5
-
- vue-cropper@1.1.1: {}
-
- vue-demi@0.14.10(vue@3.4.31):
- dependencies:
- vue: 3.4.31
-
- vue-router@4.4.0(vue@3.4.31):
- dependencies:
- '@vue/devtools-api': 6.6.4
- vue: 3.4.31
-
- vue@3.4.31:
- dependencies:
- '@vue/compiler-dom': 3.4.31
- '@vue/compiler-sfc': 3.4.31
- '@vue/runtime-dom': 3.4.31
- '@vue/server-renderer': 3.4.31(vue@3.4.31)
- '@vue/shared': 3.4.31
-
- vuedraggable@4.1.0(vue@3.4.31):
- dependencies:
- sortablejs: 1.14.0
- vue: 3.4.31
-
- webpack-virtual-modules@0.6.2: {}
-
- which-boxed-primitive@1.1.1:
- dependencies:
- is-bigint: 1.1.0
- is-boolean-object: 1.2.2
- is-number-object: 1.1.1
- is-string: 1.1.1
- is-symbol: 1.1.1
-
- which-builtin-type@1.2.1:
- dependencies:
- call-bound: 1.0.4
- function.prototype.name: 1.1.8
- has-tostringtag: 1.0.2
- is-async-function: 2.1.1
- is-date-object: 1.1.0
- is-finalizationregistry: 1.1.1
- is-generator-function: 1.1.0
- is-regex: 1.2.1
- is-weakref: 1.1.1
- isarray: 2.0.5
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.19
-
- which-collection@1.0.2:
- dependencies:
- is-map: 2.0.3
- is-set: 2.0.3
- is-weakmap: 2.0.2
- is-weakset: 2.0.4
-
- which-typed-array@1.1.19:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.4
- for-each: 0.3.5
- get-proto: 1.0.1
- gopd: 1.2.0
- has-tostringtag: 1.0.2
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@8.1.0:
- dependencies:
- ansi-styles: 6.2.1
- string-width: 5.1.2
- strip-ansi: 7.1.0
-
- zrender@5.6.0:
- dependencies:
- tslib: 2.3.0
diff --git a/public/DHDCico.ico b/public/DHDCico.ico
deleted file mode 100644
index b4c4363..0000000
--- a/public/DHDCico.ico
+++ /dev/null
Binary files differ
diff --git a/public/HYSNico.ico b/public/HYSNico.ico
deleted file mode 100644
index 70148cc..0000000
--- a/public/HYSNico.ico
+++ /dev/null
Binary files differ
diff --git a/public/JZYJico.ico b/public/JZYJico.ico
deleted file mode 100644
index f5a7820..0000000
--- a/public/JZYJico.ico
+++ /dev/null
Binary files differ
diff --git a/public/WDSYico.ico b/public/WDSYico.ico
deleted file mode 100644
index bfad99c..0000000
--- a/public/WDSYico.ico
+++ /dev/null
Binary files differ
diff --git a/public/ZQHXico.ico b/public/ZQHXico.ico
deleted file mode 100644
index 748238e..0000000
--- a/public/ZQHXico.ico
+++ /dev/null
Binary files differ
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index e263760..0000000
--- a/public/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/shims-uni.d.ts b/shims-uni.d.ts
new file mode 100644
index 0000000..ed4adcf
--- /dev/null
+++ b/shims-uni.d.ts
@@ -0,0 +1,10 @@
+/// <reference types='@dcloudio/types' />
+import 'vue'
+
+declare module '@vue/runtime-core' {
+ type Hooks = App.AppInstance & Page.PageInstance;
+
+ interface ComponentCustomOptions extends Hooks {
+
+ }
+}
diff --git a/src/App.vue b/src/App.vue
index fd2b3d5..98c818a 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,15 +1,26 @@
-<template>
- <router-view />
-</template>
-
-<script setup>
-import useSettingsStore from '@/store/modules/settings'
-import { handleThemeStyle } from '@/utils/theme'
-
-onMounted(() => {
- nextTick(() => {
- // 鍒濆鍖栦富棰樻牱寮�
- handleThemeStyle(useSettingsStore().theme)
- })
-})
+<script>
+export default {
+ onLaunch: function () {
+ console.log('App Launch')
+ },
+ onShow: function () {
+ console.log('App Show')
+ },
+ onHide: function () {
+ console.log('App Hide')
+ },
+}
</script>
+
+<style>
+/*姣忎釜椤甸潰鍏叡css */
+
+/* 閫夋嫨婊氳疆/涓嬫媺寮瑰眰閫夐」锛氶暱鏂囨湰寮哄埗鍗曡鐪佺暐锛岄槻姝㈡崲琛屾拺涔辨粴杞楂樸��
+ 寮瑰眰鎸傚湪缁勪欢鏍戝锛屽繀椤荤敤鍏ㄥ眬鏍峰紡鍏滃簳锛堣鐩栨棫鐗堝紡鏍蜂笌绗笁鏂规牱寮忔敞鍏ュ満鏅級銆� */
+.uni-picker-container .uni-picker-item,
+.uni-picker-container uni-picker-item {
+ white-space: nowrap !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+}
+</style>
diff --git a/src/api/auth.js b/src/api/auth.js
new file mode 100644
index 0000000..8fa5377
--- /dev/null
+++ b/src/api/auth.js
@@ -0,0 +1,58 @@
+/**
+ * 瀛︾敓绔� API锛氳处鍙蜂綋绯伙紙鐝骇鐮佹敞鍐� / 鐧诲綍 / 鎵惧洖 / 鏀瑰瘑锛�
+ */
+import r from '@/utils/request.js'
+
+// 鑾峰彇褰撳墠瀛︾敓淇℃伅
+export function getStudentInfo() {
+ return r.get('/miniapp/my-info')
+}
+
+// ========== 绔欑偣鏂囨锛堝悗鍙板瓧鍏� cj_fill_title锛屽尶鍚嶅彲璇伙級 ==========
+
+// 骞冲彴鏍囬/鍓爣棰樼瓑 鈫� { platformTitle, platformSubtitle, loginSubtitle }
+export function getSiteTitles() {
+ return r.get('/miniapp/site-titles')
+}
+
+// ========== 璐﹀彿浣撶郴锛堟敞鍐�/鐧诲綍/鎵惧洖/鏀瑰瘑锛� ==========
+
+// 鍥惧舰楠岃瘉鐮侊細杩斿洖 { captchaEnabled, uuid, img(base64) }
+export function getCaptcha() {
+ return r.get('/miniapp/captcha')
+}
+
+// 娉ㄥ唽 = 鐝骇鐮佸缓妗o紙瀛﹀彿+濮撳悕+鎵嬫満鍙�+瀵嗙爜+楠岃瘉鐮侊級锛屾垚鍔熷嵆鐧诲綍
+export function accountRegister(data) {
+ return r.post('/miniapp/account/register', data)
+}
+
+// 璐﹀彿瀵嗙爜鐧诲綍锛堝鍙�+濮撳悕+瀵嗙爜+楠岃瘉鐮侊級鈫� { token, mustChange }
+export function accountLogin(data) {
+ return r.post('/miniapp/account/login', data)
+}
+
+// 蹇樿瀵嗙爜 = 涓夎绱犺嚜鍔╅噸缃紙瀛﹀彿+濮撳悕+娉ㄥ唽鏃惰嚜濉墜鏈哄彿+鏂板瘑鐮�+楠岃瘉鐮侊級
+export function accountReset(data) {
+ return r.post('/miniapp/account/reset', data)
+}
+
+// 淇敼瀵嗙爜锛堢櫥褰曟�侊級鈫� { token }锛堟柊 token锛屽叾浠栬澶囦細璇濅綔搴燂級
+export function accountChange(data) {
+ return r.post('/miniapp/account/change', data)
+}
+
+// 瑙f瀽鐝骇娉ㄥ唽鐮� 鈫� { classId, className, majorName, collegeName }锛堟壂鐮佽繘鍏ユ敞鍐岄〉鏃跺睍绀虹彮绾э級
+export function resolveBind(bindCode) {
+ return r.get('/miniapp/account/resolve', { bindCode })
+}
+
+// 鎹㈢彮锛堢櫥褰曟�� + 鏂扮彮绾х爜锛夆啋 { className }锛涘凡鎻愪氦琛ㄥ崟浠嶅綊灞炲師鐝骇
+export function accountRebind(bindCode) {
+ return r.post('/miniapp/account/rebind', { bindCode })
+}
+
+// 鍏ㄩ儴鍙�夌彮绾э紙鏈壂鐮佹敞鍐屾椂鎵嬪姩閫夋嫨锛夆啋 [{classId, label}]
+export function getRegClasses() {
+ return r.get('/miniapp/account/classes')
+}
\ No newline at end of file
diff --git a/src/api/basicData/customerFile.js b/src/api/basicData/customerFile.js
deleted file mode 100644
index c52b76e..0000000
--- a/src/api/basicData/customerFile.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// 瀹㈡埛妗f椤甸潰鎺ュ彛
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function listCustomer(query) {
- return request({
- url: '/basic/customer/list',
- method: 'get',
- params: query
- })
-}
-// 鏌ヨ瀹㈡埛妗f璇︾粏
-export function getCustomer(id) {
- return request({
- url: '/basic/customer/' + id,
- method: 'get'
- })
-}
-// 鏂板瀹㈡埛妗f
-export function addCustomer(data) {
- return request({
- url: '/basic/customer/addCustomer',
- method: 'post',
- data: data
- })
-}
-// 淇敼瀹㈡埛妗f
-export function updateCustomer(data) {
- return request({
- url: '/basic/customer/updateCustomer',
- method: 'post',
- data: data
- })
-}
-// 瀵煎嚭瀹㈡埛妗f
-export function exportCustomer(query) {
- return request({
- url: '/basic/customer/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
-// 鍒犻櫎瀹㈡埛妗f
-export function delCustomer(ids) {
- return request({
- url: '/basic/customer/delCustomer',
- method: 'delete',
- data: ids
- })
-}
-
diff --git a/src/api/basicData/product.js b/src/api/basicData/product.js
deleted file mode 100644
index 10f8fd1..0000000
--- a/src/api/basicData/product.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// 浜у搧缁存姢椤甸潰鎺ュ彛
-import request from '@/utils/request'
-
-// 浜у搧鏍戞煡璇�
-export function productTreeList(query) {
- return request({
- url: '/basic/product/list',
- method: 'get',
- params: query
- })
-}
-// 浜у搧鏍戞柊澧炰慨鏀�
-export function addOrEditProduct(query) {
- return request({
- url: '/basic/product/addOrEditProduct',
- method: 'post',
- data: query
- })
-}
-// 瑙勬牸鍨嬪彿鏂板淇敼
-export function addOrEditProductModel(query) {
- return request({
- url: '/basic/product/addOrEditProductModel',
- method: 'post',
- data: query
- })
-}
-// 浜у搧鏍戝垹闄�
-export function delProduct(query) {
- return request({
- url: '/basic/product/delProduct',
- method: 'delete',
- data: query
- })
-}
-// 瑙勬牸鍨嬪彿鍒犻櫎
-export function delProductModel(query) {
- return request({
- url: '/basic/product/delProductModel',
- method: 'delete',
- data: query
- })
-}
-// 瑙勬牸鍨嬪彿鏌ヨ
-export function modelList(query) {
- return request({
- url: '/basic/product/modelList',
- method: 'get',
- params: query
- })
-}
-export function modelListPage(query) {
- return request({
- url: '/basic/product/modelListPage',
- method: 'get',
- params: query
- })
-}
diff --git a/src/api/basicData/supplierManageFile.js b/src/api/basicData/supplierManageFile.js
deleted file mode 100644
index 3b1ab97..0000000
--- a/src/api/basicData/supplierManageFile.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// 渚涘簲鍟嗘。妗堥〉闈㈡帴鍙�
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function listSupplier(query) {
- return request({
- url: '/system/supplier/listPage',
- method: 'get',
- params: query
- })
-}
-// 鏌ヨ渚涘簲鍟嗕俊鎭缁�
-export function getSupplier(id) {
- return request({
- url: '/system/supplier/' + id,
- method: 'get'
- })
-}
-// 鏂板渚涘簲鍟嗕俊鎭�
-export function addSupplier(data) {
- return request({
- url: '/system/supplier/add',
- method: 'post',
- data: data
- })
-}
-// 淇敼渚涘簲鍟嗕俊鎭�
-export function updateSupplier(data) {
- return request({
- url: '/system/supplier/update',
- method: 'post',
- data: data
- })
-}
-// 瀵煎嚭渚涘簲鍟嗕俊鎭�
-export function exportSupplier(query) {
- return request({
- url: '/system/supplier/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
-// 鍒犻櫎渚涘簲鍟嗕俊鎭�
-export function delSupplier(ids) {
- return request({
- url: '/system/supplier/del',
- method: 'delete',
- data: ids
- })
-}
-
diff --git a/src/api/collaborativeApproval/approvalProcess.js b/src/api/collaborativeApproval/approvalProcess.js
deleted file mode 100644
index 415bed8..0000000
--- a/src/api/collaborativeApproval/approvalProcess.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// 鍗忓悓瀹℃壒
-import request from "@/utils/request";
-
-export function approveProcessListPage(query) {
- return request({
- url: '/approveProcess/list',
- method: 'get',
- params: query,
- })
-}
-export function getDept(query) {
- return request({
- url: '/approveProcess/getDept',
- method: 'get',
- params: query,
- })
-}
-export function approveProcessGetInfo(query) {
- return request({
- url: '/approveProcess/get',
- method: 'get',
- params: query,
- })
-}
-// 鏂板瀹℃壒娴佺▼
-export function approveProcessAdd(query) {
- return request({
- url: '/approveProcess/add',
- method: 'post',
- data: query,
- })
-}
-// 淇敼瀹℃壒娴佺▼
-export function approveProcessUpdate(query) {
- return request({
- url: '/approveProcess/update',
- method: 'post',
- data: query,
- })
-}
-// 鎻愪氦瀹℃壒
-export function updateApproveNode(query) {
- return request({
- url: '/approveNode/updateApproveNode',
- method: 'post',
- data: query,
- })
-}
-// 鍒犻櫎瀹℃壒娴佺▼
-export function approveProcessDelete(query) {
- return request({
- url: '/approveProcess/deleteIds',
- method: 'delete',
- data: query,
- })
-}
-// 鏌ヨ瀹℃壒娴佺▼
-export function approveProcessDetails(query) {
- return request({
- url: '/approveNode/details/' + query,
- method: 'get',
- })
-}
\ No newline at end of file
diff --git a/src/api/collaborativeApproval/attendanceManagement.js b/src/api/collaborativeApproval/attendanceManagement.js
deleted file mode 100644
index 3c99775..0000000
--- a/src/api/collaborativeApproval/attendanceManagement.js
+++ /dev/null
@@ -1,136 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍋囨湡璁剧疆鍒楄〃
-export function listHolidaySettings(query) {
- return request({
- url: "/holidaySettings/getList",
- method: "get",
- params: query,
- });
-}
-//鏌ヨ骞村亣瑙勫垯鍒楄〃
-export function listAnnualLeaveSettingList(query) {
- return request({
- url: "/holidaySettings/getAnnualLeaveSettingList",
- method: "get",
- params: query,
- });
-}
-//鏌ヨ鍔犵彮瑙勫垯鍒楄〃
-export function listOvertimeSettingList(query) {
- return request({
- url: "/holidaySettings/getOvertimeSettingList",
- method: "get",
- params: query,
- });
-}
-//鏌ヨ宸ヤ綔鏃堕棿瑙勫垯鍒楄〃
-export function listWorkingHoursSettingList(query) {
- return request({
- url: "/holidaySettings/getWorkingHoursSettingList",
- method: "get",
- params: query,
- });
-}
-
-// 鏂板鍋囨湡璁剧疆
-export function addHolidaySettings(data) {
- return request({
- url: "/holidaySettings/add",
- method: "post",
- data: data,
- });
-}
-//鏂板骞村亣瑙勫垯
-export function addAnnualLeaveSetting(data) {
- return request({
- url: "/holidaySettings/addAnnualLeaveSetting",
- method: "post",
- data: data,
- });
-}
-//鏂板鍔犵彮瑙勫垯
-export function addOvertimeSetting(data) {
- return request({
- url: "/holidaySettings/addOvertimeSetting",
- method: "post",
- data: data,
- });
-}
-//鏂板宸ヤ綔鏃堕棿瑙勫垯
-export function addWorkingHoursSetting(data) {
- return request({
- url: "/holidaySettings/addWorkingHoursSetting",
- method: "post",
- data: data,
- });
-}
-
-
-// 淇敼鍋囨湡璁剧疆
-export function updateHolidaySettings(data) {
- return request({
- url: "/holidaySettings/update",
- method: "post",
- data: data,
- });
-}
-// 淇敼骞村亣瑙勫垯
-export function updateAnnualLeaveSetting(data) {
- return request({
- url: "/holidaySettings/updateAnnualLeaveSetting",
- method: "post",
- data: data,
- });
-}
-// 淇敼鍔犵彮瑙勫垯
-export function updateOvertimeSetting(data) {
- return request({
- url: "/holidaySettings/updateOvertimeSetting",
- method: "post",
- data: data,
- });
-}
-// 淇敼宸ヤ綔鏃堕棿瑙勫垯
-export function updateWorkingHoursSetting(data) {
- return request({
- url: "/holidaySettings/updateWorkingHoursSetting",
- method: "post",
- data: data,
- });
-}
-
-// 鎵归噺鍒犻櫎鍋囨湡璁剧疆
-export function delHolidaySettings(query) {
- return request({
- url: "/holidaySettings/delete",
- method: "delete",
- data: query,
- });
-}
-// 鎵归噺鍒犻櫎骞村亣瑙勫垯
-export function delAnnualLeaveSetting(query) {
- return request({
- url: "/holidaySettings/deleteAnnualLeaveSetting",
- method: "delete",
- data: query,
- });
-}
-// 鎵归噺鍒犻櫎鍔犵彮瑙勫垯
-export function delOvertimeSetting(query) {
- return request({
- url: "/holidaySettings/deleteOvertimeSetting",
- method: "delete",
- data: query,
- });
-}
-// 鎵归噺鍒犻櫎宸ヤ綔鏃堕棿瑙勫垯
-export function delWorkingHoursSetting(query) {
- return request({
- url: "/holidaySettings/deleteWorkingHoursSetting",
- method: "delete",
- data: query,
- });
-}
-
-
diff --git a/src/api/collaborativeApproval/knowledgeBase.js b/src/api/collaborativeApproval/knowledgeBase.js
deleted file mode 100644
index b195525..0000000
--- a/src/api/collaborativeApproval/knowledgeBase.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鐭ヨ瘑搴撳垪琛�
-export function listKnowledgeBase(query) {
- return request({
- url: "/knowledgeBase/getList",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ヨ鐭ヨ瘑搴撹缁�
-// export function getKnowledgeBase(knowledgeBaseId) {
-// return request({
-// url: "/collaborativeApproval/knowledgeBase/" + knowledgeBaseId,
-// method: "get",
-// });
-// }
-
-// 鏂板鐭ヨ瘑搴�
-export function addKnowledgeBase(data) {
- return request({
- url: "/knowledgeBase/add",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼鐭ヨ瘑搴�
-export function updateKnowledgeBase(data) {
- return request({
- url: "/knowledgeBase/update",
- method: "post",
- data: data,
- });
-}
-
-// 鍒犻櫎鐭ヨ瘑搴�
-export function delKnowledgeBase(query) {
- return request({
- url: "/knowledgeBase/delete",
- method: "delete",
- data: query,
- });
-}
-
-// 鎵归噺鍒犻櫎鐭ヨ瘑搴�
-export function delKnowledgeBaseBatch(knowledgeBaseIds) {
- return request({
- url: "/knowledgeBase/batch",
- method: "delete",
- data: knowledgeBaseIds,
- });
-}
-
diff --git a/src/api/collaborativeApproval/noticeManagement.js b/src/api/collaborativeApproval/noticeManagement.js
deleted file mode 100644
index 0f4e8b3..0000000
--- a/src/api/collaborativeApproval/noticeManagement.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍏憡鍒楄〃
-export function listNotice(query) {
- return request({
- url: '/collaborativeApproval/notice/page',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ鍏憡璇︾粏
-export function getNotice(noticeId) {
- return request({
- url: '/collaborativeApproval/notice/' + noticeId,
- method: 'get'
- })
-}
-
-// 鏂板鍏憡
-export function addNotice(data) {
- return request({
- url: '/collaborativeApproval/notice/add',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼鍏憡
-export function updateNotice(data) {
- return request({
- url: '/collaborativeApproval/notice/update',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎鍏憡
-export function delNotice(ids) {
- return request({
- url: '/collaborativeApproval/notice/' + ids,
- method: 'delete',
- })
-}
-
-// 鑾峰彇鍏憡鏁伴噺
-export function getCount() {
- return request({
- url: '/collaborativeApproval/notice/count',
- method: 'get',
- })
-}
diff --git a/src/api/collaborativeApproval/notificationManagement.js b/src/api/collaborativeApproval/notificationManagement.js
deleted file mode 100644
index abaeaa4..0000000
--- a/src/api/collaborativeApproval/notificationManagement.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ閫氱煡鍒楄〃
-export function listNotification(query) {
- return request({
- url: "/notificationManagement/getList",
- method: "get",
- params: query,
- });
-}
-
-// 鏂板閫氱煡
-export function addNotification(data) {
- return request({
- url: "/notificationManagement/add",
- method: "post",
- data: data,
- });
-}
-//鏂板浼氳
-export function addOnlineMeeting(data) {
- return request({
- url: "/notificationManagement/addOnlineMeeting",
- method: "post",
- data: data,
- });
-}
-//鏂板鏂囦欢鍏变韩
-export function addFileSharing(data) {
- return request({
- url: "/notificationManagement/addFileSharing",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼閫氱煡
-export function updateNotification(data) {
- return request({
- url: "/notificationManagement/update",
- method: "post",
- data: data,
- });
-}
-
-// 鎵归噺鍒犻櫎閫氱煡
-export function delNotification(query) {
- return request({
- url: "/notificationManagement/delete",
- method: "delete",
- data: query,
- });
-}
-
-// // 鎵归噺鍒犻櫎鐭ヨ瘑搴�
-// export function delKnowledgeBaseBatch(knowledgeBaseIds) {
-// return request({
-// url: "/knowledgeBase/batch",
-// method: "delete",
-// data: knowledgeBaseIds,
-// });
-// }
-
diff --git a/src/api/collaborativeApproval/officeSupplies.js b/src/api/collaborativeApproval/officeSupplies.js
deleted file mode 100644
index 340293b..0000000
--- a/src/api/collaborativeApproval/officeSupplies.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍔炲叕鐗╄祫鍒楄〃
-export function listPage(query) {
- return request({
- url: '/officeSupplies/listPage',
- method: 'get',
- params: query
- })
-}
-
-// 鏂板鍔炲叕鐗╄祫
-export function add(data) {
- return request({
- url: '/officeSupplies/add',
- method: 'post',
- data
- })
-}
-
-// 淇敼鍔炲叕鐗╄祫
-export function update(data) {
- return request({
- url: '/officeSupplies/update',
- method: 'post',
- data
- })
-}
-
-// 鍒犻櫎鍔炲叕鐗╄祫
-export function deleteOff(data) {
- return request({
- url: '/officeSupplies/delete',
- method: 'delete',
- data
- })
-}
diff --git a/src/api/collaborativeApproval/planTemplate.js b/src/api/collaborativeApproval/planTemplate.js
deleted file mode 100644
index 24a6ac4..0000000
--- a/src/api/collaborativeApproval/planTemplate.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ璁″垝鍒楄〃
-export function listDutyPlan(query) {
- return request({
- url: "/dutyPlan/getList",
- method: "get",
- params: query
- });
-}
-//鏁版嵁
-export function NumDutyPlan(query) {
- return request({
- url: "/dutyPlan/getNum",
- method: "get",
- params: query
- });
-}
-
-// 鏂板璁″垝
-export function addDutyPlan(data) {
- return request({
- url: "/dutyPlan/add",
- method: "post",
- data: data,
- });
-}
-
-
-// 淇敼璁″垝
-export function updateDutyPlan(data) {
- return request({
- url: "/dutyPlan/update",
- method: "post",
- data: data,
- });
-}
-
-// 鍒犻櫎璁″垝
-export function delDutyPlan(query) {
- return request({
- url: "/dutyPlan/delete",
- method: "delete",
- data: query,
- });
-}
-// 瀵煎嚭璁″垝
-export function exportDutyPlan(query) {
- return request({
- url: "/dutyPlan/export",
- method: "post",
- params: query,
- });
-}
-
-// // 鎵归噺鍒犻櫎璁″垝
-// export function delDutyPlanBatch(dutyPlanIds) {
-// return request({
-// url: "/dutyPlan/batch",
-// method: "delete",
-// data: dutyPlanIds,
-// });
-// }
-
diff --git a/src/api/collaborativeApproval/rpaManagement.js b/src/api/collaborativeApproval/rpaManagement.js
deleted file mode 100644
index 273bf9f..0000000
--- a/src/api/collaborativeApproval/rpaManagement.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨRPA鍒楄〃
-export function listRpa(query) {
- return request({
- url: "/rpaProcessAutomation/getList",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ヨRPA璇︾粏
-export function getRpa(rpaId) {
- return request({
- url: "/collaborativeApproval/rpa/" + rpaId,
- method: "get",
- });
-}
-
-// 鏂板RPA
-export function addRpa(data) {
- return request({
- url: "/rpaProcessAutomation/add",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼RPA
-export function updateRpa(data) {
- return request({
- url: "/rpaProcessAutomation/update",
- method: "post",
- data: data,
- });
-}
-
-// 鍒犻櫎RPA
-export function delRpa(query) {
- return request({
- url: "/rpaProcessAutomation/delete",
- method: "delete",
- data: query,
- });
-}
-
-// 鎵归噺鍒犻櫎RPA
-export function delRpaBatch(rpaIds) {
- return request({
- url: "/collaborativeApproval/rpa/batch",
- method: "delete",
- data: rpaIds,
- });
-}
-
-// 鍚姩RPA
-export function startRpa(rpaId) {
- return request({
- url: "/collaborativeApproval/rpa/start/" + rpaId,
- method: "post",
- });
-}
-
-// 鍋滄RPA
-export function stopRpa(rpaId) {
- return request({
- url: "/collaborativeApproval/rpa/stop/" + rpaId,
- method: "post",
- });
-}
-
-// 鑾峰彇RPA鐘舵��
-export function getRpaStatus(rpaId) {
- return request({
- url: "/collaborativeApproval/rpa/status/" + rpaId,
- method: "get",
- });
-}
diff --git a/src/api/collaborativeApproval/sealManagement.js b/src/api/collaborativeApproval/sealManagement.js
deleted file mode 100644
index cb990b3..0000000
--- a/src/api/collaborativeApproval/sealManagement.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍗扮珷鐢宠鍒楄〃
-export function listSealApplication(page,query) {
- return request({
- url: "/sealApplicationManagement/getList",
- method: "get",
- params: {
- ...page,
- ...query},
- });
-}
-// 鏌ヨ瑙勭珷鍒跺害鍒楄〃
-export function listRuleManagement(page,query) {
- return request({
- url: "/rulesRegulationsManagement/getList",
- method: "get",
- params: {
- ...page,
- ...query},
- });
-}
-// 鏌ヨ闃呰鐘舵�佸垪琛�
-export function getReadingStatusList(page,query) {
- return request({
- url: "/rulesRegulationsManagement/getReadingStatusList",
- method: "get",
- params: {
- ...page,
- ...query},
- });
-}
-// 鏍规嵁瑙勫垯id鏌ヨ闃呰鐘舵�佸垪琛�
-export function getReadingStatusByRuleId(id) {
- return request({
- url: "/rulesRegulationsManagement/getReadingStatusByRuleId/"+id,
- method: "get"
- });
-}
-
-// 鏂板鍗扮珷鐢宠
-export function addSealApplication(data) {
- return request({
- url: "/sealApplicationManagement/add",
- method: "post",
- data: data,
- });
-}
-// 鏂板瑙勭珷鍒跺害
-export function addRuleManagement(data) {
- return request({
- url: "/rulesRegulationsManagement/add",
- method: "post",
- data: data,
- });
-}
-// 鏂板闃呰鐘舵��
-export function addReadingStatus(data) {
- return request({
- url: "/rulesRegulationsManagement/addReadingStatus",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼鍗扮珷鐢宠
-export function updateSealApplication(data) {
- return request({
- url: "/sealApplicationManagement/update",
- method: "post",
- data: data,
- });
-}
-// 淇敼瑙勭珷鍒跺害
-export function updateRuleManagement(data) {
- return request({
- url: "/rulesRegulationsManagement/update",
- method: "post",
- data: data,
- });
-}
-// 淇敼闃呰鐘舵��
-export function updateReadingStatus(data) {
- return request({
- url: "/rulesRegulationsManagement/updateReadingStatus",
- method: "post",
- data: data,
- });
-}
-
-// 鍒犻櫎鍗扮珷鐢宠
-export function delSealApplication(query) {
- return request({
- url: "/sealApplicationManagement/delete",
- method: "delete",
- data: query,
- });
-}
-// 鍒犻櫎瑙勭珷鍒跺害
-export function delRuleManagement(query) {
- return request({
- url: "/rulesRegulationsManagement/delete",
- method: "delete",
- data: query,
- });
-}
-
-// 鎵归噺鍒犻櫎鐭ヨ瘑搴�
-export function delKnowledgeBaseBatch(knowledgeBaseIds) {
- return request({
- url: "/knowledgeBase/batch",
- method: "delete",
- data: knowledgeBaseIds,
- });
-}
-
diff --git a/src/api/customerService/index.js b/src/api/customerService/index.js
deleted file mode 100644
index e83cdfb..0000000
--- a/src/api/customerService/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// 鍞悗鏈嶅姟
-import request from "@/utils/request";
-
-// 鍙嶉鐧昏-鍒嗛〉鏌ヨ
-export function afterSalesServiceListPage(query) {
- return request({
- url: '/afterSalesService/listPage',
- method: 'get',
- params: query,
- })
-}
-// 鍙嶉鐧昏-鍒犻櫎
-export function afterSalesServiceDelete(query) {
- return request({
- url: '/afterSalesService/delete',
- method: 'delete',
- data: query,
- })
-}
-// 鍙嶉鐧昏-鍒犻櫎
-export function afterSalesServiceAdd(query) {
- return request({
- url: '/afterSalesService/add',
- method: 'post',
- data: query,
- })
-}
-// 鍙嶉鐧昏-鍒犻櫎
-export function afterSalesServiceUpdate(query) {
- return request({
- url: '/afterSalesService/update',
- method: 'post',
- data: query,
- })
-}
-// 鍙嶉鐧昏-鎻愪氦澶勭悊
-export function afterSalesServiceDispose(query) {
- return request({
- url: '/afterSalesService/dispose',
- method: 'post',
- data: query,
- })
-}
\ No newline at end of file
diff --git a/src/api/energyManagement/index.js b/src/api/energyManagement/index.js
deleted file mode 100644
index f2c5494..0000000
--- a/src/api/energyManagement/index.js
+++ /dev/null
@@ -1,127 +0,0 @@
-// 鑳芥簮绠$悊
-import request from "@/utils/request";
-
-// 璁惧鑳借��-鍒嗛〉鏌ヨ
-export function equipmentEnergyListPage(query) {
- return request({
- url: "/equipmentEnergyConsumption/listPage",
- method: "get",
- params: query,
- });
-}
-// -鑳芥簮瓒嬪娍-鍒嗛〉鏌ヨ
-export function listPageByTrend(query) {
- return request({
- url: "/equipmentEnergyConsumption/listPageByTrend",
- method: "get",
- params: query,
- });
-}
-// 鍖哄煙-鍒嗛〉鏌ヨ
-export function areaListPage(query) {
- return request({
- url: "/electricityConsumptionArea/listPage",
- method: "get",
- params: query,
- });
-}
-
-// 鍖哄煙-鏍�
-export function areaListTree(query) {
- return request({
- url: "/electricityConsumptionArea/list",
- method: "get",
- params: query,
- });
-}
-// 鏃堕棿鍛ㄦ湡-鍒嗛〉鏌ヨ
-export function periodListPage(query) {
- return request({
- url: "/energyPeriod/listPage",
- method: "get",
- params: query,
- });
-}
-
-// 璁惧鑳借��-鍒犻櫎
-export function equipmentEnergyDelete(query) {
- return request({
- url: "/equipmentEnergyConsumption/delete",
- method: "delete",
- data: query,
- });
-}
-// 鍖哄煙-鍒犻櫎
-export function areaDelete(query) {
- return request({
- url: "/electricityConsumptionArea/delete",
- method: "delete",
- data: query,
- });
-}
-// 鏃堕棿鍛ㄦ湡-鍒犻櫎
-export function periodDelete(query) {
- return request({
- url: "/energyPeriod/delete",
- method: "delete",
- data: query,
- });
-}
-
-// 璁惧鑳借��-鏂板
-export function equipmentEnergyAdd(query) {
- return request({
- url: "/equipmentEnergyConsumption/add",
- method: "post",
- data: query,
- });
-}
-// 鍖哄煙-鏂板
-export function areaAdd(query) {
- return request({
- url: "/electricityConsumptionArea/add",
- method: "post",
- data: query,
- });
-}
-
-// 鏃堕棿鍛ㄦ湡-鏂板
-export function periodAdd(query) {
- return request({
- url: "/energyPeriod/add",
- method: "post",
- data: query,
- });
-}
-// 璁惧鑳借��-淇敼
-export function equipmentEnergyUpdate(query) {
- return request({
- url: "/equipmentEnergyConsumption/update",
- method: "post",
- data: query,
- });
-}
-//鍖哄煙-淇敼
-export function areaUpdate(query) {
- return request({
- url: "/electricityConsumptionArea/update",
- method: "post",
- data: query,
- });
-}
-// 鏃堕棿鍛ㄦ湡-淇敼
-export function periodUpdate(query) {
- return request({
- url: "/energyPeriod/update",
- method: "post",
- data: query,
- });
-}
-
-// 璁惧涓嬫媺妗嗘煡璇�
-export function deviceList(query) {
- return request({
- url: "/equipmentEnergyConsumption/deviceList",
- method: "get",
- });
-}
diff --git a/src/api/energyManagement/waterManagement.js b/src/api/energyManagement/waterManagement.js
deleted file mode 100644
index 6dbf115..0000000
--- a/src/api/energyManagement/waterManagement.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// 鐢ㄦ按绠$悊
-import request from "@/utils/request";
-
-// 鐢ㄦ按璁惧-鍒嗛〉鏌ヨ
-export function waterEquipmentListPage(query) {
- return request({
- url: '/waterRecord/listPage',
- method: 'get',
- params: query,
- })
-}
-
-// 鐢ㄦ按瓒嬪娍-鍒嗛〉鏌ヨ
-export function listPageByWaterTrend(query) {
- return request({
- url: '/waterRecord/listPageByTrend',
- method: 'get',
- params: query,
- })
-}
-
-// 鐢ㄦ按璁惧-鍒犻櫎
-export function waterEquipmentDelete(query) {
- return request({
- url: '/waterRecord/delete',
- method: 'delete',
- data: query,
- })
-}
-
-// 鐢ㄦ按璁惧-鏂板
-export function waterEquipmentAdd(query) {
- return request({
- url: '/waterRecord/add',
- method: 'post',
- data: query,
- })
-}
-
-// 鐢ㄦ按璁惧-淇敼
-export function waterEquipmentUpdate(query) {
- return request({
- url: '/waterRecord/update',
- method: 'post',
- data: query,
- })
-}
-
-// 鐢ㄦ按璁惧涓嬫媺妗嗘煡璇�
-export function waterDeviceList(query) {
- return request({
- url: '/device/ledger/page',
- method: 'get',
- params: query,
- })
-}
-
-// 姘磋垂绠$悊-鍒嗛〉鏌ヨ
-export function waterBillListPage(query) {
- return request({
- url: '/waterBill/listPage',
- method: 'get',
- params: query,
- })
-}
-
-// 姘磋垂绠$悊-鏂板
-export function waterBillAdd(query) {
- return request({
- url: '/waterBill/add',
- method: 'post',
- data: query,
- })
-}
-
-// 姘磋垂绠$悊-淇敼
-export function waterBillUpdate(query) {
- return request({
- url: '/waterBill/update',
- method: 'post',
- data: query,
- })
-}
-
-// 姘磋垂绠$悊-鍒犻櫎
-export function waterBillDelete(query) {
- return request({
- url: '/waterBill/delete',
- method: 'delete',
- data: query,
- })
-}
-
diff --git a/src/api/equipmentManagement/brand.js b/src/api/equipmentManagement/brand.js
deleted file mode 100644
index 040cb38..0000000
--- a/src/api/equipmentManagement/brand.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// 璁惧鍝佺墝绠$悊 - 鏈湴鍋囨暟鎹� API锛堜娇鐢� localStorage 鎸佷箙鍖栵級
-
-const STORAGE_KEY = 'EQUIPMENT_BRANDS';
-
-function readStore() {
- try {
- const raw = localStorage.getItem(STORAGE_KEY);
- if (raw) {
- const parsed = JSON.parse(raw);
- if (Array.isArray(parsed)) return parsed;
- }
- } catch (e) {
- // ignore
- }
- // 鍒濆鍖栦竴浜涚ず渚嬫暟鎹�
- const initial = [
- { id: 1, name: '瑗块棬瀛�', country: '寰峰浗', description: '宸ヤ笟鑷姩鍖栦笌鐢垫皵宸ョ▼鍝佺墝', createdAt: Date.now() - 86400000 * 10 },
- { id: 2, name: '鏂借�愬痉', country: '娉曞浗', description: '鑳芥簮绠$悊涓庤嚜鍔ㄥ寲', createdAt: Date.now() - 86400000 * 7 },
- { id: 3, name: '涓夎彵鐢垫満', country: '鏃ユ湰', description: '鐢垫皵涓庤嚜鍔ㄥ寲璁惧', createdAt: Date.now() - 86400000 * 3 },
- ];
- localStorage.setItem(STORAGE_KEY, JSON.stringify(initial));
- return initial;
-}
-
-function writeStore(list) {
- localStorage.setItem(STORAGE_KEY, JSON.stringify(list));
-}
-
-function nextId(list) {
- const maxId = list.reduce((max, item) => Math.max(max, Number(item.id) || 0), 0);
- return maxId + 1;
-}
-
-export function getBrandPage(params = {}) {
- const { current = 1, size = 10, name } = params;
- const list = readStore();
- let filtered = list;
- if (name) {
- const kw = String(name).trim();
- filtered = filtered.filter((b) =>
- (b.name && b.name.includes(kw)) || (b.country && b.country.includes(kw))
- );
- }
- const start = (current - 1) * size;
- const end = start + Number(size);
- const records = filtered.slice(start, end);
- return Promise.resolve({
- code: 200,
- data: {
- total: filtered.length,
- records,
- },
- msg: 'ok',
- });
-}
-
-export function getBrandById(id) {
- const list = readStore();
- const item = list.find((i) => String(i.id) === String(id));
- return Promise.resolve({ code: 200, data: item || null, msg: 'ok' });
-}
-
-export function addBrand(data) {
- const list = readStore();
- const item = { ...data };
- item.id = nextId(list);
- item.createdAt = Date.now();
- list.unshift(item);
- writeStore(list);
- return Promise.resolve({ code: 200, data: item, msg: '鏂板鎴愬姛' });
-}
-
-export function editBrand(data) {
- const list = readStore();
- const index = list.findIndex((i) => String(i.id) === String(data.id));
- if (index !== -1) {
- list[index] = { ...list[index], ...data };
- writeStore(list);
- return Promise.resolve({ code: 200, data: list[index], msg: '淇敼鎴愬姛' });
- }
- return Promise.resolve({ code: 404, data: null, msg: '鏈壘鍒拌鍝佺墝' });
-}
-
-export function delBrand(idOrIds) {
- const list = readStore();
- const ids = Array.isArray(idOrIds) ? idOrIds.map(String) : [String(idOrIds)];
- const newList = list.filter((i) => !ids.includes(String(i.id)));
- writeStore(newList);
- return Promise.resolve({ code: 200, data: null, msg: '鍒犻櫎鎴愬姛' });
-}
-
-
-
diff --git a/src/api/equipmentManagement/calibration.js b/src/api/equipmentManagement/calibration.js
deleted file mode 100644
index 54b99f9..0000000
--- a/src/api/equipmentManagement/calibration.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// 妫�瀹氭牎鍑嗚褰�
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function ledgerRecordListPage(query) {
- return request({
- url: "/measuringInstrumentLedgerRecord/listPage",
- method: "get",
- params: query,
- });
-}
-// 鏍″噯
-export function ledgerRecordVerifying(query) {
- return request({
- url: "/measuringInstrumentLedger/verifying",
- method: "post",
- data: query,
- });
-}
-// 淇敼鏍″噯
-export function ledgerRecordUpdate(query) {
- return request({
- url: "/measuringInstrumentLedgerRecord/update",
- method: "post",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/equipmentManagement/deviceInfo.js b/src/api/equipmentManagement/deviceInfo.js
deleted file mode 100644
index d71b713..0000000
--- a/src/api/equipmentManagement/deviceInfo.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import request from "@/utils/request";
-
-// 鑾峰彇璁惧鍩烘湰淇℃伅
-export function getDeviceInfo(params) {
- return request({
- url: "/device/ledger/scanDevice",
- method: "get",
- params,
- });
-}
diff --git a/src/api/equipmentManagement/ledger.js b/src/api/equipmentManagement/ledger.js
deleted file mode 100644
index d1b65b0..0000000
--- a/src/api/equipmentManagement/ledger.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import request from "@/utils/request";
-
-export const getLedgerPage = (params) => {
- return request({
- url: "/device/ledger/page",
- method: "get",
- params,
- });
-};
-export const getLedgerById = (id) => {
- return request({
- url: `/device/ledger/${id}`,
- method: "get",
- });
-};
-
-export const addLedger = (data) => {
- return request({
- url: "/device/ledger",
- method: "post",
- data,
- });
-};
-export const editLedger = (data) => {
- return request({
- url: "/device/ledger",
- method: "put",
- data,
- });
-};
-
-export const delLedger = (id) => {
- return request({
- url: `/device/ledger/${id}`,
- method: "delete",
- });
-};
-
-export const getDeviceLedger = () => {
- return request({
- url: "/device/ledger/getDeviceLedger",
- method: "get",
- });
-};
diff --git a/src/api/equipmentManagement/measurementEquipment.js b/src/api/equipmentManagement/measurementEquipment.js
deleted file mode 100644
index a22c034..0000000
--- a/src/api/equipmentManagement/measurementEquipment.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// 璁¢噺鍣ㄥ叿鍙拌处
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function measuringInstrumentListPage(query) {
- return request({
- url: "/measuringInstrumentLedger/listPage",
- method: "get",
- params: query,
- });
-}
-// 鍒犻櫎
-export function measuringInstrumentDelete(query) {
- return request({
- url: "/measuringInstrumentLedger/delete",
- method: "delete",
- data: query,
- });
-}
-// 鏂板
-export function measuringInstrumentAdd(query) {
- return request({
- url: "/measuringInstrumentLedger/add",
- method: "post",
- data: query,
- });
-}
-// 淇敼
-export function measuringInstrumentUpdate(query) {
- return request({
- url: "/measuringInstrumentLedger/update",
- method: "post",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/equipmentManagement/repair.js b/src/api/equipmentManagement/repair.js
deleted file mode 100644
index 0233ae6..0000000
--- a/src/api/equipmentManagement/repair.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import request from "@/utils/request";
-
-/**
- * @desc 璁惧鎶ヤ慨鍒楄〃
- * @param {鍒嗛〉鏌ヨ} params
- * @returns
- */
-export const getRepairPage = (params) => {
- return request({
- url: "/device/repair/page",
- method: "get",
- params,
- });
-};
-
-/**
- * @desc 鏂板鎶ヤ慨
- * @param {鎶ヤ慨鍙傛暟} data
- * @returns
- */
-export const addRepair = (data) => {
- return request({
- url: "/device/repair",
- method: "post",
- data,
- });
-};
-
-/**
- * @desc 缂栬緫鎶ヤ慨
- * @param {鎶ヤ慨鍙傛暟} data
- * @returns
- */
-export const editRepair = (data) => {
- return request({
- url: "/device/repair",
- method: "put",
- data,
- });
-};
-
-/**
- * @desc 鏍规嵁id鏌ヨ涓�鏉℃姤淇�
- * @param {鎶ヤ慨id} id
- * @returns
- */
-export const getRepairById = (id) => {
- return request({
- url: `/device/repair/${id}`,
- method: "get",
- });
-};
-
-/**
- * @desc 鍒犻櫎鎶ヤ慨
- * @param {缂栧彿} ids
- * @returns
- */
-export const delRepair = (ids) => {
- return request({
- url: `/device/repair/${ids}`,
- method: "delete",
- });
-};
-
-export const addMaintain = (data) => {
- return request({
- url: `/device/repair/repair`,
- method: "post",
- data,
- });
-};
diff --git a/src/api/equipmentManagement/upkeep.js b/src/api/equipmentManagement/upkeep.js
deleted file mode 100644
index c091670..0000000
--- a/src/api/equipmentManagement/upkeep.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import request from "@/utils/request";
-
-/**
- * @desc 璁惧淇濆吇鍒楄〃鍒嗛〉鏌ヨ
- * @param {鍒嗛〉鏌ヨ鍏ュ弬} params
- * @returns
- */
-export const getUpkeepPage = (params) => {
- return request({
- url: "/device/maintenance/page",
- method: "get",
- params,
- });
-};
-
-/**
- * @desc 璁惧淇濆吇璇︽儏
- * @param {淇濆吇浣嗙紪鍙穧 id
- * @returns
- */
-export const getUpkeepById = (id) => {
- return request({
- url: `/device/maintenance/${id}`,
- method: "get",
- });
-};
-
-/**
- * @desc 璁惧淇濆吇鏂板
- * @param {鏂板淇濆吇琛ㄥ崟} data
- * @returns
- */
-export const addUpkeep = (data) => {
- return request({
- url: "/device/maintenance",
- method: "post",
- data,
- });
-};
-
-/**
- * @desc 璁惧淇濆吇缂栬緫
- * @param {缂栬緫淇濆吇琛ㄥ崟} data
- * @returns
- */
-export const editUpkeep = (data) => {
- return request({
- url: "/device/maintenance",
- method: "put",
- data,
- });
-};
-
-/**
- * @desc 鏂板淇濆吇琛ㄥ崟
- * @param {鏂板淇濆吇琛ㄥ崟} data
- * @returns
- */
-export const addMaintenance = (data) => {
- return request({
- url: "/device/maintenance/maintenance",
- method: "post",
- data,
- });
-};
-
-export const delUpkeep = (id) => {
- return request({
- url: `/device/maintenance/${id}`,
- method: "delete",
- });
-};
diff --git a/src/api/fileManagement/bookshelf.js b/src/api/fileManagement/bookshelf.js
deleted file mode 100644
index 0a4a748..0000000
--- a/src/api/fileManagement/bookshelf.js
+++ /dev/null
@@ -1,128 +0,0 @@
-import request from "@/utils/request";
-
-/**
- * 涔︽灦绠$悊鐩稿叧API鎺ュ彛
- * 鍖呭惈浠撳簱绠$悊銆佽揣鏋剁鐞嗐�佸浘涔︾鐞嗙瓑鍔熻兘鐨勬帴鍙�
- */
-
-/**
- * 鑾峰彇浠撳簱鍒楄〃
- * @description 鑾峰彇鎵�鏈変粨搴撶殑鍩烘湰淇℃伅鍒楄〃
- * @returns {Promise} 杩斿洖浠撳簱鍒楄〃鏁版嵁
- */
-export function getWarehouseList() {
- return request({
- url: "/warehouse/tree",
- method: "get",
- });
-}
-
-/**
- * 鏂板浠撳簱
- * @description 鍒涘缓鏂扮殑浠撳簱璁板綍
- * @param {Object} data 浠撳簱淇℃伅瀵硅薄锛屽寘鍚粨搴撳悕绉扮瓑瀛楁
- * @returns {Promise} 杩斿洖鏂板缁撴灉
- */
-export function addWarehouse(data) {
- return request({
- url: "/warehouse/add",
- method: "post",
- data,
- });
-}
-
-/**
- * 鏇存柊浠撳簱淇℃伅
- * @description 淇敼鐜版湁浠撳簱鐨勫熀鏈俊鎭�
- * @param {Object} data 浠撳簱淇℃伅瀵硅薄锛屽繀椤诲寘鍚粨搴揑D
- * @returns {Promise} 杩斿洖鏇存柊缁撴灉
- */
-export function updateWarehouse(data) {
- return request({
- url: "/warehouse/update",
- method: "put",
- data,
- });
-}
-
-/**
- * 鍒犻櫎浠撳簱
- * @description 鏍规嵁浠撳簱ID鍒犻櫎鎸囧畾鐨勪粨搴撹褰�
- * @param {string|number} id 浠撳簱ID
- * @returns {Promise} 杩斿洖鍒犻櫎缁撴灉
- */
-export function deleteWarehouse(data) {
- return request({
- url: `/warehouse/delete/`,
- method: "delete",
- data,
- });
-}
-
-/**
- * 鑾峰彇璐ф灦鍒楄〃
- * @description 鏍规嵁浠撳簱ID鑾峰彇璇ヤ粨搴撲笅鐨勬墍鏈夎揣鏋朵俊鎭�
- * @param {string|number} warehouseId 浠撳簱ID
- * @returns {Promise} 杩斿洖璐ф灦鍒楄〃鏁版嵁
- */
-export function getShelfList(warehouseId) {
- return request({
- url: `/shelf/list/${warehouseId}`,
- method: "get",
- });
-}
-
-/**
- * 鏂板璐ф灦
- * @description 鍦ㄦ寚瀹氫粨搴撲笅鍒涘缓鏂扮殑璐ф灦璁板綍
- * @param {Object} data 璐ф灦淇℃伅瀵硅薄锛屽寘鍚揣鏋跺悕绉般�佸眰鏁般�佸垪鏁扮瓑瀛楁
- * @returns {Promise} 杩斿洖鏂板缁撴灉
- */
-export function addShelf(data) {
- return request({
- url: "/warehouse/goodsShelves/add",
- method: "post",
- data,
- });
-}
-
-/**
- * 鏇存柊璐ф灦淇℃伅
- * @description 淇敼鐜版湁璐ф灦鐨勫熀鏈俊鎭�
- * @param {Object} data 璐ф灦淇℃伅瀵硅薄锛屽繀椤诲寘鍚揣鏋禝D
- * @returns {Promise} 杩斿洖鏇存柊缁撴灉
- */
-export function updateShelf(data) {
- return request({
- url: "/warehouse/goodsShelves/update",
- method: "put",
- data,
- });
-}
-
-/**
- * 鍒犻櫎璐ф灦
- * @description 鏍规嵁璐ф灦ID鍒犻櫎鎸囧畾鐨勮揣鏋惰褰�
- * @param {string|number} id 璐ф灦ID
- * @returns {Promise} 杩斿洖鍒犻櫎缁撴灉
- */
-export function deleteShelf(id) {
- return request({
- url: `/warehouse/goodsShelves/delete/${id}`,
- method: "delete",
- });
-}
-
-/**
- * 鑾峰彇浠撳簱缁撴瀯
- * @description 鑾峰彇鎸囧畾浠撳簱鐨勫畬鏁寸粨鏋勪俊鎭紝鍖呮嫭璐ф灦銆佸眰鏁般�佸垪鏁扮瓑
- * @param {string|number} warehouseId 浠撳簱ID
- * @returns {Promise} 杩斿洖浠撳簱鐨勫畬鏁寸粨鏋勬暟鎹�
- */
-export function getWarehouseStructure(data) {
- return request({
- url: `/warehouse/goodsShelvesRowcol/list`,
- method: "get",
- params: data,
- });
-}
diff --git a/src/api/fileManagement/borrow.js b/src/api/fileManagement/borrow.js
deleted file mode 100644
index 1f4c72c..0000000
--- a/src/api/fileManagement/borrow.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import request from "@/utils/request";
-
-// 鏂囨。鍊熼槄绠$悊鐩稿叧鎺ュ彛
-
-// 鑾峰彇鏂囨。鍒楄〃锛堢敤浜庡�熼槄涔︾睄閫夋嫨锛�
-export function getDocumentList() {
- return request({
- url: "/documentation/list",
- method: "get",
- });
-}
-
-// 鍊熼槄鍒嗛〉鏌ヨ
-export function getBorrowList(params) {
- return request({
- url: "/documentationBorrowManagement/listPage",
- method: "get",
- params: params,
- });
-}
-
-// 鏂板鍊熼槄
-export function addBorrow(data) {
- return request({
- url: "/documentationBorrowManagement/add",
- method: "post",
- data: data,
- });
-}
-
-// 鏇存柊鍊熼槄
-export function updateBorrow(data) {
- return request({
- url: "/documentationBorrowManagement/update",
- method: "put",
- data: data,
- });
-}
-
-// 鍒犻櫎鍊熼槄
-export function deleteBorrow(ids) {
- return request({
- url: "/documentationBorrowManagement/delete",
- method: "delete",
- data: ids,
- });
-}
diff --git a/src/api/fileManagement/document.js b/src/api/fileManagement/document.js
deleted file mode 100644
index f3d5f4f..0000000
--- a/src/api/fileManagement/document.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import request from "@/utils/request";
-
-// 鑾峰彇鍒嗙被鏍�
-export function getCategoryTree() {
- return request({
- url: "/warehouse/documentClassification/getList",
- method: "get",
- });
-}
-
-// 鏂板鍒嗙被
-export function addCategory(data) {
- return request({
- url: "/warehouse/documentClassification/add",
- method: "post",
- data: {
- category: data.category,
- parentId: data.parentId,
- },
- });
-}
-
-// 淇敼鍒嗙被
-export function updateCategory(data) {
- return request({
- url: "/warehouse/documentClassification/update",
- method: "put",
- data: {
- id: data.id,
- category: data.category,
- },
- });
-}
-
-// 鍒犻櫎鍒嗙被
-export function deleteCategory(ids) {
- return request({
- url: "/warehouse/documentClassification/delete",
- method: "delete",
- data: ids,
- });
-}
-
-// 鑾峰彇鏂囨。鍒楄〃锛堝垎椤碉級
-export function getDocumentList(query) {
- return request({
- url: "/documentation/listPage",
- method: "get",
- params: query,
- });
-}
-
-// 鏂板鏂囨。
-export function addDocument(data) {
- return request({
- url: "/documentation/add",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼鏂囨。
-export function updateDocument(data) {
- return request({
- url: "/documentation/update",
- method: "put",
- data: data,
- });
-}
-
-// 鍒犻櫎鏂囨。
-export function deleteDocument(ids) {
- return request({
- url: "/documentation/delete",
- method: "delete",
- data: ids,
- });
-}
-
-// 鑾峰彇鏂囨。璇︽儏
-export function getDocumentDetail(id) {
- return request({
- url: "/document/" + id,
- method: "get",
- });
-}
-
-// 鎼滅储鏂囨。
-export function searchDocument(query) {
- return request({
- url: "/document/search",
- method: "get",
- params: query,
- });
-}
-
-// 鑾峰彇浠撳簱缁撴瀯
-export function getWarehouseStructure() {
- return request({
- url: "/document/warehouse/structure",
- method: "get",
- });
-}
-
-// 闄勪欢绠$悊鐩稿叧鎺ュ彛
-// 娣诲姞闄勪欢
-export function addDocumentationFile(data) {
- return request({
- url: "/documentation/documentationFile/add",
- method: "post",
- data: data,
- });
-}
-
-// 鑾峰彇闄勪欢鍒楄〃
-export function getDocumentationFileList(params) {
- return request({
- url: "/documentation/documentationFile/listPage",
- method: "get",
- params: params,
- });
-}
-
-// 鍒犻櫎闄勪欢
-export function deleteDocumentationFile(ids) {
- return request({
- url: "/documentation/documentationFile/del",
- method: "delete",
- data: ids,
- });
-}
-
-// 鏂囨。鍊熼槄绠$悊鐩稿叧鎺ュ彛
-export function getBorrowList(params) {
- return request({
- url: "/documentationBorrowManagement/listPage",
- method: "get",
- params: params,
- });
-}
-
-export function addBorrow(data) {
- return request({
- url: "/documentationBorrowManagement/add",
- method: "post",
- data: data,
- });
-}
-
-export function updateBorrow(data) {
- return request({
- url: "/documentationBorrowManagement/update",
- method: "put",
- data: data,
- });
-}
-
-export function deleteBorrow(ids) {
- return request({
- url: "/documentationBorrowManagement/delete",
- method: "delete",
- data: ids,
- });
-}
-
-// 缁熻鐩稿叧鎺ュ彛
-// 鑾峰彇鎬讳綋缁熻鏁版嵁
-export function getDocumentationOverview() {
- return request({
- url: "/documentation/overview",
- method: "get",
- });
-}
-
-// 鑾峰彇鍒嗙被缁熻鏁版嵁
-export function getDocumentationCategoryStats() {
- return request({
- url: "/documentation/category",
- method: "get",
- });
-}
-
-// 鑾峰彇鐘舵�佺粺璁℃暟鎹�
-export function getDocumentationStatusStats() {
- return request({
- url: "/documentation/status",
- method: "get",
- });
-}
diff --git a/src/api/fileManagement/return.js b/src/api/fileManagement/return.js
deleted file mode 100644
index 2e0c0e7..0000000
--- a/src/api/fileManagement/return.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ褰掕繕璁板綍
-export function getReturnListPage(query) {
- return request({
- url: "/documentationBorrowManagement/listPageReturn",
- method: "get",
- params: query,
- });
-}
-
-// 褰掕繕鎿嶄綔
-export function returnDocument(data) {
- return request({
- url: "/documentationBorrowManagement/revent",
- method: "put",
- data: data,
- });
-}
-
-// 鍒犻櫎褰掕繕璁板綍
-export function deleteReturn(ids) {
- return request({
- url: "/documentationBorrowManagement/reventDelete",
- method: "delete",
- data: ids,
- });
-}
-
-// 鏇存柊鍊熼槄璁板綍
-export function updateBorrow(data) {
- return request({
- url: "/documentationBorrowManagement/update",
- method: "put",
- data: data,
- });
-}
-
-// 褰掕繕鏇存柊
-export function reventUpdate(data) {
- return request({
- url: "/documentationBorrowManagement/reventUpdate",
- method: "put",
- data: data,
- });
-}
-
-// 鑾峰彇鏂囨。鍒楄〃
-export function getDocumentList() {
- return request({
- url: "/documentationBorrowManagement/list",
- method: "get",
- });
-}
diff --git a/src/api/fileManagement/statistics.js b/src/api/fileManagement/statistics.js
deleted file mode 100644
index d77375c..0000000
--- a/src/api/fileManagement/statistics.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import request from "@/utils/request";
-
-// 鑾峰彇妗f鎬讳綋缁熻
-export function getDocumentStatistics() {
- return request({
- url: "/fileManagement/statistics/overview",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f鍒嗙被缁熻
-export function getCategoryStatistics() {
- return request({
- url: "/fileManagement/statistics/category",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f鐘舵�佺粺璁�
-export function getStatusStatistics() {
- return request({
- url: "/fileManagement/statistics/status",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f鍊熼槄缁熻
-export function getBorrowStatistics() {
- return request({
- url: "/fileManagement/statistics/borrow",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f骞村害缁熻
-export function getYearStatistics() {
- return request({
- url: "/fileManagement/statistics/year",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f浣嶇疆缁熻
-export function getLocationStatistics() {
- return request({
- url: "/fileManagement/statistics/location",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f瓒嬪娍缁熻
-export function getTrendStatistics(params) {
- return request({
- url: "/fileManagement/statistics/trend",
- method: "get",
- params: params,
- });
-}
-
-// 鑾峰彇妗f鍊熼槄鎺掕
-export function getBorrowRanking() {
- return request({
- url: "/fileManagement/statistics/borrowRanking",
- method: "get",
- });
-}
-
-// 鑾峰彇妗f鍒嗙被璇︽儏缁熻
-export function getCategoryDetailStatistics(categoryId) {
- return request({
- url: `/fileManagement/statistics/categoryDetail/${categoryId}`,
- method: "get",
- });
-}
-
diff --git a/src/api/financialManagement/expenseManagement.js b/src/api/financialManagement/expenseManagement.js
deleted file mode 100644
index 317dc47..0000000
--- a/src/api/financialManagement/expenseManagement.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export const listPage = (params) => {
- return request({
- url: "/account/accountExpense/listPage",
- method: "get",
- params,
- });
-};
-
-// 鏂板
-export function add(data) {
- return request({
- url: "/account/accountExpense/add",
- method: "post",
- data: data,
- });
-}
-
-// 缂栬緫
-export function update(data) {
- return request({
- url: "/account/accountExpense/update",
- method: "post",
- data: data,
- });
-}
-
-//瀵煎嚭
-export const exportAccountExpense = (query) => {
- return request({
- url: "/account/accountExpense/export",
- method: "post",
- data: query,
- responseType: "blob",
- });
-};
-
-export const delAccountExpense = (query) => {
- return request({
- url: `account/accountExpense/del`,
- method: "delete",
- data: query,
- });
-};
-
-export const getAccountExpense = (id) => {
- return request({
- url: `/account/accountExpense/${id}`,
- method: "get",
- });
-};
-
-// 鏌ヨ闄勪欢鍒楄〃
-export function fileListPage(query) {
- return request({
- url: "/account/accountFile/listPage",
- method: "get",
- params: query,
- });
-}
-// 淇濆瓨闄勪欢鍒楄〃
-export function fileAdd(query) {
- return request({
- url: "/account/accountFile/add",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎闄勪欢鍒楄〃
-export function fileDel(query) {
- return request({
- url: "/account/accountFile/del",
- method: "delete",
- data: query,
- });
-}
diff --git a/src/api/financialManagement/financialStatements.js b/src/api/financialManagement/financialStatements.js
deleted file mode 100644
index 537d36f..0000000
--- a/src/api/financialManagement/financialStatements.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import request from "@/utils/request";
-
-// 鏍规嵁鏃ユ湡鏌ヨ
-export const reportForms = (params) => {
- console.log(params);
- return request({
- url: "/account/accountExpense/report/forms",
- method: "get",
- params,
- });
-};
-
-// 鏌ヨ姣忔湀鏁版嵁-鏀跺叆
-export const reportIncome = (params) => {
- console.log(params);
- return request({
- url: "/account/accountExpense/report/income",
- method: "get",
- params,
- });
-};
-
-// 鏌ヨ姣忔湀鏁版嵁-鏀嚭
-export const reportExpense = (params) => {
- console.log(params);
- return request({
- url: "/account/accountExpense/report/expense",
- method: "get",
- params,
- });
-};
diff --git a/src/api/financialManagement/revenueManagement.js b/src/api/financialManagement/revenueManagement.js
deleted file mode 100644
index 090ddf8..0000000
--- a/src/api/financialManagement/revenueManagement.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export const listPage = (params) => {
- return request({
- url: "/account/accountIncome/listPage",
- method: "get",
- params,
- });
-};
-
-// 鏂板
-export function add(data) {
- return request({
- url: "/account/accountIncome/add",
- method: "post",
- data: data,
- });
-}
-
-// 缂栬緫
-export function update(data) {
- return request({
- url: "/account/accountIncome/update",
- method: "post",
- data: data,
- });
-}
-
-//瀵煎嚭
-export const exportAccountIncome = (query) => {
- return request({
- url: "/account/accountIncome/export",
- method: "post",
- data: query,
- responseType: "blob",
- });
-};
-
-export const delAccountIncome = (query) => {
- return request({
- url: `account/accountIncome/del`,
- method: "delete",
- data: query,
- });
-};
-
-export const getAccountIncome = (id) => {
- return request({
- url: `/account/accountIncome/${id}`,
- method: "get",
- });
-};
-
-// 鏌ヨ闄勪欢鍒楄〃
-export function fileListPage(query) {
- return request({
- url: "/account/accountFile/listPage",
- method: "get",
- params: query,
- });
-}
-// 淇濆瓨闄勪欢鍒楄〃
-export function fileAdd(query) {
- return request({
- url: "/account/accountFile/add",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎闄勪欢鍒楄〃
-export function fileDel(query) {
- return request({
- url: "/account/accountFile/del",
- method: "delete",
- data: query,
- });
-}
diff --git a/src/api/inventoryManagement/stockIn.js b/src/api/inventoryManagement/stockIn.js
deleted file mode 100644
index 5e104f7..0000000
--- a/src/api/inventoryManagement/stockIn.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍏ュ簱淇℃伅鍒楄〃
-export const getStockInPage = (params) => {
- return request({
- url: "/stockin/listPage",
- method: "get",
- params,
- });
-};
-
-// 淇敼鍏ュ簱瀛樹俊鎭�
-export const updateStockIn = (data) => {
- return request({
- url: "/stockin/update",
- method: "post",
- data,
- });
-};
-
-// 淇敼搴撳瓨淇℃伅
-export const updateManagement = (data) => {
- return request({
- url: "/stockin/updateManagement",
- method: "post",
- data,
- });
-};
-
-// 鏂板鍟嗗搧鍏ュ簱淇℃伅
-export function addSutockIn(data) {
- return request({
- url: '/stockin/add',
- method: 'post',
- data: data
- })
-}
-
-// 鍒犻櫎鍏ュ簱淇℃伅
-export function delStockIn(ids) {
- return request({
- url: '/stockin/del',
- method: 'post',
- data: ids
- })
-}
-
-// 瀵煎嚭鍏ュ簱淇℃伅
-export function exportStockIn(query) {
- return request({
- url: '/stockin/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
-
-export function selectProductRecordListByPuechaserId(query) {
- return request({
- url: '/stockin/productlist',
- method: 'get',
- params: query
- })
-}
-
-
-//
-
diff --git a/src/api/inventoryManagement/stockManage.js b/src/api/inventoryManagement/stockManage.js
deleted file mode 100644
index bb2081b..0000000
--- a/src/api/inventoryManagement/stockManage.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ搴撳瓨淇℃伅鍒楄〃
-export const getStockManagePage = (params) => {
- return request({
- url: "/stockin/listPageCopy",
- method: "get",
- params,
- });
-};
-
-
-// 淇敼搴撳瓨淇℃伅
-export const updateStockManage = (data) => {
- return request({
- url: "/stockmanagement/update",
- method: "put",
- data,
- });
-};
-
-// 鍒犻櫎搴撳瓨淇℃伅
-export function delStockManage(ids) {
- return request({
- url: '/stockin/del',
- method: 'post',
- data: ids
- })
-}
-
-// 瀵煎嚭搴撳瓨淇℃伅
-export function exportStockManage(query) {
- return request({
- url: '/stockmanagement/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
-
-//鍑哄簱鎺ュ彛
-export const stockOut = (data) => {
- return request({
- url: '/stockmanagement/stockout',
- method: 'post',
- data: data
- })
-}
-
-//鏍规嵁id鑾峰彇搴撳瓨淇℃伅
-export function getStockManageById(id) {
- return request({
- url: '/stockmanagement/' + id,
- method: 'get'
- })
-}
-
-//
\ No newline at end of file
diff --git a/src/api/inventoryManagement/stockOut.js b/src/api/inventoryManagement/stockOut.js
deleted file mode 100644
index 5d410d9..0000000
--- a/src/api/inventoryManagement/stockOut.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import request from "@/utils/request";
-
-//鏌ヨ鍑哄簱鍒楄〃
-export const getStockOutPage = (params) => {
- return request({
- url: "/stockmanagement/listPage",
- method: "get",
- params,
- });
-};
-
-//鏂板鍑哄簱淇℃伅
-export const addStockOut = (data) => {
- return request({
- url: '/stockout/add',
- method: 'post',
- data: data
- })
-}
-
-//淇敼鍑哄簱淇℃伅
-export const updateStockOut = (data) => {
- return request({
- url: "/stockout/update",
- method: "put",
- data,
- });
-}
-
-//鍒犻櫎鍑哄簱淇℃伅
-export const delStockOut = (ids) => {
- return request({
- url: '/stockmanagement/del',
- method: 'post',
- data: ids
- })
-}
-
-//瀵煎嚭鍑哄簱淇℃伅
-export const exportStockOut = (query) => {
- return request({
- url: '/stockmanagement/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
\ No newline at end of file
diff --git a/src/api/inventoryManagement/stockWarning.js b/src/api/inventoryManagement/stockWarning.js
deleted file mode 100644
index 65e641a..0000000
--- a/src/api/inventoryManagement/stockWarning.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍌ㄦ皵缃愰璀﹀垪琛�
-export const getStockWarningPage = (page, params) => {
- return request({
- url: "/gasTankWarning/listPage",
- method: "get",
- params: {
- ...page,
- ...params
- },
- });
-};
-
-// 鏂板鍌ㄦ皵缃愰璀﹁鍒�
-export const addStockWarning = (data) => {
- return request({
- url: "/gasTankWarning/add",
- method: "post",
- data: data,
- });
-};
-
-// 淇敼鍌ㄦ皵缃愰璀﹁鍒�
-export const updateStockWarning = (data) => {
- return request({
- url: "/gasTankWarning/update",
- method: "post",
- data: data,
- });
-};
-
-// 鍒犻櫎鍌ㄦ皵缃愰璀﹁鍒�
-export const deleteStockWarning = (ids) => {
- return request({
- url: "/gasTankWarning/delete",
- method: "delete",
- data: ids,
- });
-};
-
-// 鎵归噺澶勭悊鍌ㄦ皵缃愰璀�
-export const batchProcessStockWarning = (data) => {
- return request({
- url: "/gasTankWarning/batchProcess",
- method: "post",
- data,
- });
-};
-
-// 瀵煎嚭鍌ㄦ皵缃愰璀︽暟鎹�
-export const exportStockWarning = (params) => {
- return request({
- url: "/gasTankWarning/export",
- method: "get",
- params,
- responseType: "blob",
- });
-};
-
-// 鏍规嵁ID鑾峰彇鍌ㄦ皵缃愰璀﹁鎯�
-export const getStockWarningById = (id) => {
- return request({
- url: `/gasTankWarning/${id}`,
- method: "get",
- });
-};
-
-// 鍚敤/绂佺敤棰勮瑙勫垯
-export const toggleStockWarningStatus = (data) => {
- return request({
- url: "/gasTankWarning/toggleStatus",
- method: "put",
- data,
- });
-};
-
-// 鑾峰彇棰勮缁熻淇℃伅
-export const getStockWarningStatistics = () => {
- return request({
- url: "/gasTankWarning/statistics",
- method: "get",
- });
-};
diff --git a/src/api/lavorissce/ledger.js b/src/api/lavorissce/ledger.js
deleted file mode 100644
index f4f710c..0000000
--- a/src/api/lavorissce/ledger.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function listPage(query) {
- return request({
- url: '/lavorIssue/listPage',
- method: 'get',
- params: query
- })
-}
-
-// 鍒嗛〉鏌ヨ
-export function statistics(params) {
- return request({
- url: '/lavorIssue/statistics',
- method: 'get',
- params
- })
-}
-
-export function statisticsList(params) {
- return request({
- url: '/lavorIssue/statisticsList',
- method: 'get',
- params
- })
-}
-
-// 娣诲姞
-export function add(data) {
- return request({
- url: '/lavorIssue/add',
- method: 'post',
- data
- })
-}
-
-// 淇敼
-export function update(data) {
- return request({
- url: '/lavorIssue/update',
- method: 'post',
- data
- })
-}
-
-// 鍒犻櫎
-export function deleteLedger(data) {
- return request({
- url: '/lavorIssue/delete',
- method: 'delete',
- data
- })
-}
-
diff --git a/src/api/login.js b/src/api/login.js
deleted file mode 100644
index fea9d46..0000000
--- a/src/api/login.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import request from '@/utils/request'
-
-// 鐧诲綍鏂规硶
-export function login(username, password, code, uuid) {
- const data = {
- username,
- password,
- code,
- uuid
- }
- return request({
- url: '/login',
- headers: {
- isToken: false,
- repeatSubmit: false
- },
- method: 'post',
- data: data
- })
-}
-
-// 娉ㄥ唽鏂规硶
-export function register(data) {
- return request({
- url: '/register',
- headers: {
- isToken: false
- },
- method: 'post',
- data: data
- })
-}
-
-// 鑾峰彇鐢ㄦ埛璇︾粏淇℃伅
-export function getInfo() {
- return request({
- url: '/getInfo',
- method: 'get'
- })
-}
-
-// 閫�鍑烘柟娉�
-export function logout() {
- return request({
- url: '/logout',
- method: 'post'
- })
-}
-
-// 鑾峰彇楠岃瘉鐮�
-export function getCodeImg() {
- return request({
- url: '/captchaImage',
- headers: {
- isToken: false
- },
- method: 'get',
- timeout: 20000
- })
-}
-
-// 鐧诲綍鏍¢獙
-export function loginCheck(username, password) {
- const data = {
- username,
- password
- }
- return request({
- url: '/loginCheck',
- headers: {
- isToken: false,
- repeatSubmit: false
- },
- method: 'post',
- data: data
- })
-}
-
-// 鐧诲綍鏂规硶
-export function loginCheckFactory(username, password, factoryId) {
- const data = {
- username,
- password,
- factoryId
- }
- return request({
- url: '/loginCheckFactory',
- headers: {
- isToken: false,
- repeatSubmit: false
- },
- method: 'post',
- data: data
- })
-}
-
-export function tideLogin(data) {
- return request({
- url: '/tide/tideLogin',
- headers: {
- isToken: false,
- repeatSubmit: false
- },
- method: 'post',
- data: data
- })
-}
diff --git a/src/api/menu.js b/src/api/menu.js
deleted file mode 100644
index 6e52e6e..0000000
--- a/src/api/menu.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import request from '@/utils/request'
-
-// 鑾峰彇璺敱
-export const getRouters = () => {
- return request({
- url: '/getRouters',
- method: 'get'
- })
-}
\ No newline at end of file
diff --git a/src/api/monitor/cache.js b/src/api/monitor/cache.js
deleted file mode 100644
index e1f2c87..0000000
--- a/src/api/monitor/cache.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ缂撳瓨璇︾粏
-export function getCache() {
- return request({
- url: '/monitor/cache',
- method: 'get'
- })
-}
-
-// 鏌ヨ缂撳瓨鍚嶇О鍒楄〃
-export function listCacheName() {
- return request({
- url: '/monitor/cache/getNames',
- method: 'get'
- })
-}
-
-// 鏌ヨ缂撳瓨閿悕鍒楄〃
-export function listCacheKey(cacheName) {
- return request({
- url: '/monitor/cache/getKeys/' + cacheName,
- method: 'get'
- })
-}
-
-// 鏌ヨ缂撳瓨鍐呭
-export function getCacheValue(cacheName, cacheKey) {
- return request({
- url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
- method: 'get'
- })
-}
-
-// 娓呯悊鎸囧畾鍚嶇О缂撳瓨
-export function clearCacheName(cacheName) {
- return request({
- url: '/monitor/cache/clearCacheName/' + cacheName,
- method: 'delete'
- })
-}
-
-// 娓呯悊鎸囧畾閿悕缂撳瓨
-export function clearCacheKey(cacheKey) {
- return request({
- url: '/monitor/cache/clearCacheKey/' + cacheKey,
- method: 'delete'
- })
-}
-
-// 娓呯悊鍏ㄩ儴缂撳瓨
-export function clearCacheAll() {
- return request({
- url: '/monitor/cache/clearCacheAll',
- method: 'delete'
- })
-}
diff --git a/src/api/monitor/job.js b/src/api/monitor/job.js
deleted file mode 100644
index 84b7b5a..0000000
--- a/src/api/monitor/job.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ瀹氭椂浠诲姟璋冨害鍒楄〃
-export function listJob(query) {
- return request({
- url: "/monitor/job/list",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ヨ瀹氭椂浠诲姟璋冨害璇︾粏
-export function getJob(jobId) {
- return request({
- url: "/monitor/job/" + jobId,
- method: "get",
- });
-}
-
-// 鏂板瀹氭椂浠诲姟璋冨害
-export function addJob(data) {
- return request({
- url: "/monitor/job",
- method: "post",
- data: data,
- });
-}
-
-// 淇敼瀹氭椂浠诲姟璋冨害
-export function updateJob(data) {
- return request({
- url: "/monitor/job",
- method: "put",
- data: data,
- });
-}
-
-// 鍒犻櫎瀹氭椂浠诲姟璋冨害
-export function delJob(jobId) {
- return request({
- url: "/monitor/job/" + jobId,
- method: "delete",
- });
-}
-
-// 浠诲姟鐘舵�佷慨鏀�
-export function changeJobStatus(jobId, status) {
- const data = {
- jobId,
- status,
- };
- return request({
- url: "/monitor/job/changeStatus",
- method: "put",
- data: data,
- });
-}
-
-// 瀹氭椂浠诲姟绔嬪嵆鎵ц涓�娆�
-export function runJob(jobId, jobGroup) {
- const data = {
- jobId,
- jobGroup,
- };
- return request({
- url: "/monitor/job/run",
- method: "put",
- data: data,
- });
-}
diff --git a/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js
deleted file mode 100644
index 654bbae..0000000
--- a/src/api/monitor/jobLog.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ璋冨害鏃ュ織鍒楄〃
-export function listJobLog(query) {
- return request({
- url: '/monitor/jobLog/list',
- method: 'get',
- params: query
- })
-}
-
-// 鍒犻櫎璋冨害鏃ュ織
-export function delJobLog(jobLogId) {
- return request({
- url: '/monitor/jobLog/' + jobLogId,
- method: 'delete'
- })
-}
-
-// 娓呯┖璋冨害鏃ュ織
-export function cleanJobLog() {
- return request({
- url: '/monitor/jobLog/clean',
- method: 'delete'
- })
-}
diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js
deleted file mode 100644
index c49a40e..0000000
--- a/src/api/monitor/logininfor.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鐧诲綍鏃ュ織鍒楄〃
-export function list(query) {
- return request({
- url: '/monitor/logininfor/list',
- method: 'get',
- params: query
- })
-}
-
-// 鍒犻櫎鐧诲綍鏃ュ織
-export function delLogininfor(infoId) {
- return request({
- url: '/monitor/logininfor/' + infoId,
- method: 'delete'
- })
-}
-
-// 瑙i攣鐢ㄦ埛鐧诲綍鐘舵��
-export function unlockLogininfor(userName) {
- return request({
- url: '/monitor/logininfor/unlock/' + userName,
- method: 'get'
- })
-}
-
-// 娓呯┖鐧诲綍鏃ュ織
-export function cleanLogininfor() {
- return request({
- url: '/monitor/logininfor/clean',
- method: 'delete'
- })
-}
diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js
deleted file mode 100644
index 288ebe0..0000000
--- a/src/api/monitor/online.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍦ㄧ嚎鐢ㄦ埛鍒楄〃
-export function list(query) {
- return request({
- url: '/monitor/online/list',
- method: 'get',
- params: query
- })
-}
-
-// 寮洪��鐢ㄦ埛
-export function forceLogout(tokenId) {
- return request({
- url: '/monitor/online/' + tokenId,
- method: 'delete'
- })
-}
diff --git a/src/api/monitor/operlog.js b/src/api/monitor/operlog.js
deleted file mode 100644
index 6e881df..0000000
--- a/src/api/monitor/operlog.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鎿嶄綔鏃ュ織鍒楄〃
-export function list(query) {
- return request({
- url: '/monitor/operlog/list',
- method: 'get',
- params: query
- })
-}
-
-// 鍒犻櫎鎿嶄綔鏃ュ織
-export function delOperlog(operId) {
- return request({
- url: '/monitor/operlog/' + operId,
- method: 'delete'
- })
-}
-
-// 娓呯┖鎿嶄綔鏃ュ織
-export function cleanOperlog() {
- return request({
- url: '/monitor/operlog/clean',
- method: 'delete'
- })
-}
diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js
deleted file mode 100644
index cac7791..0000000
--- a/src/api/monitor/server.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import request from '@/utils/request'
-
-// 鑾峰彇鏈嶅姟淇℃伅
-export function getServer() {
- return request({
- url: '/monitor/server',
- method: 'get'
- })
-}
\ No newline at end of file
diff --git a/src/api/personnelManagement/employeeRecord.js b/src/api/personnelManagement/employeeRecord.js
deleted file mode 100644
index 378756a..0000000
--- a/src/api/personnelManagement/employeeRecord.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍦ㄨ亴鍛樺伐鍙拌处
-export function staffOnJobListPage(query) {
- return request({
- url: '/staff/staffOnJob/listPage',
- method: 'get',
- params: query,
- })
-}
-// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅
-export function staffOnJobInfo(query) {
- return request({
- url: '/staff/staffOnJob/staffNo',
- method: 'get',
- params: query,
- })
-}
\ No newline at end of file
diff --git a/src/api/personnelManagement/onboarding.js b/src/api/personnelManagement/onboarding.js
deleted file mode 100644
index 39dbf22..0000000
--- a/src/api/personnelManagement/onboarding.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ浜哄憳鍏ヨ亴鍒楄〃
-export function staffJoinListPage(query) {
- return request({
- url: "/staff/staffJoinLeaveRecord/listPage",
- method: "get",
- params: query,
- });
-}
-// 鏂板浜哄憳鍏ヨ亴
-export function staffJoinAdd(query) {
- return request({
- url: "/staff/staffJoinLeaveRecord/add",
- method: "post",
- data: query,
- });
-}
-// 淇敼浜哄憳鍏ヨ亴
-export function staffJoinUpdate(query) {
- return request({
- url: "/staff/staffJoinLeaveRecord/update",
- method: "post",
- data: query,
- });
-}
-// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅
-export function getStaffJoinInfo(query) {
- return request({
- url: "/staff/staffJoinLeaveRecord/" + query,
- method: "get",
- data: query,
- });
-}
-// 鍒犻櫎鍛樺伐
-export function staffJoinDel(query) {
- return request({
- url: "/staff/staffJoinLeaveRecord/del",
- method: "delete",
- data: query,
- });
-}
-
-export function getStaffOnJob() {
- return request({
- url: "/staff/staffOnJob/list",
- method: "get",
- });
-}
diff --git a/src/api/personnelManagement/payrollManagement.js b/src/api/personnelManagement/payrollManagement.js
deleted file mode 100644
index c29a6b1..0000000
--- a/src/api/personnelManagement/payrollManagement.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// 钖叕绠$悊
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export function compensationListPage(query) {
- return request({
- url: "/compensationPerformance/listPage",
- method: "get",
- params: query,
- });
-}
-// 鏂板
-export function compensationAdd(query) {
- return request({
- url: "/compensationPerformance/add",
- method: "post",
- data: query,
- });
-}
-// 淇敼
-export function compensationUpdate(query) {
- return request({
- url: "/compensationPerformance/update",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎
-export function compensationDelete(query) {
- return request({
- url: "/compensationPerformance/delete",
- method: "delete",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/personnelManagement/scheduling.js b/src/api/personnelManagement/scheduling.js
deleted file mode 100644
index 8e4b058..0000000
--- a/src/api/personnelManagement/scheduling.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// 鎺掔彮绠$悊
-import request from "@/utils/request";
-
-export function save(data) {
- return request({
- url: "/staff/staffScheduling/save",
- method: "post",
- data: data,
- });
-}
-
-export function del(id) {
- return request({
- url: "/staff/staffScheduling/del/"+id,
- method: "delete",
- });
-}
-
-export function delByIds(data) {
- return request({
- url: "/staff/staffScheduling/save",
- method: "post",
- data: data,
- });
-}
-export function listPage(data){
- return request({
- url: "/staff/staffScheduling/listPage",
- method: "post",
- data: data
- })
-}
diff --git a/src/api/personnelManagement/selfService.js b/src/api/personnelManagement/selfService.js
deleted file mode 100644
index c95436a..0000000
--- a/src/api/personnelManagement/selfService.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// 钖叕绠$悊
-import request from "@/utils/request";
-
-// 鏌ヨ鑰冨嫟鍒楄〃
-export function personalAttendanceRecordsListPage(query) {
- return request({
- url: "/staff/personalAttendanceRecords/listPage",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ鍋囨湡鐢宠鍒楄〃
-export function holidayApplicationListPage(query) {
- return request({
- url: "/staff/holidayApplication/listPage",
- method: "get",
- params: query,
- });
-}
-// 鏂板
-export function personalAttendanceRecordsAdd(query) {
- return request({
- url: "/staff/personalAttendanceRecords/add",
- method: "post",
- data: query,
- });
-}
-// 鏂板鍋囨湡鐢宠
-export function holidayApplicationAdd(query) {
- return request({
- url: "/staff/holidayApplication/add",
- method: "post",
- data: query,
- });
-}
-// 淇敼
-export function personalAttendanceRecordsUpdate(query) {
- return request({
- url: "/staff/personalAttendanceRecords/update",
- method: "put",
- data: query,
- });
-}
-// 淇敼鍋囨湡鐢宠
-export function holidayApplicationUpdate(query) {
- return request({
- url: "/staff/holidayApplication/update",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎
-export function personalAttendanceRecordsDelete(id) {
- return request({
- url: "/staff/personalAttendanceRecords/delete/"+id,
- method: "delete",
- });
-}
-// 鍒犻櫎鍋囨湡鐢宠
-export function holidayApplicationDelete(id) {
- return request({
- url: "/staff/holidayApplication/delete/"+id,
- method: "delete",
- });
-}
-// export function del(id) {
-// return request({
-// url: "/staff/staffScheduling/del/"+id,
-// method: "delete",
-// });
-// }
\ No newline at end of file
diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js
deleted file mode 100644
index 8325aa7..0000000
--- a/src/api/procurementManagement/invoiceEntry.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// 閲囪喘-鏉ョエ鐧昏鎺ュ彛
-import request from "@/utils/request";
-
-// 鏌ヨ閲囪喘鍚堝悓鍙�
-export function getProduct(query) {
- return request({
- url: "/purchase/ledger/getProduct",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ヨid閲囪喘鍚堝悓鍙�
-export function getPurchaseNoById(query) {
- return request({
- url: "/purchase/ledger/getPurchaseNoById",
- method: "get",
- params: query,
- });
-}
-// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭�
-export function getInfo(query) {
- return request({
- url: "/purchase/ledger/getInfo",
- method: "get",
- params: query,
- });
-}
-// 涓诲垪琛ㄦ煡璇�
-export function gePurchaseList(query) {
- return request({
- url: "/purchase/ledger/list",
- method: "get",
- params: query,
- });
-}
-// 涓诲垪琛ㄦ煡璇�
-export function getRegistrationById(query) {
- return request({
- url: "/purchase/registration/getRegistrationById",
- method: "get",
- params: query,
- });
-}
-// 鏂板缂栬緫鏉ョエ鐧昏
-export function addOrUpdateRegistration(query) {
- return request({
- url: "/purchase/registration/addOrUpdateRegistration",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎鏉ョエ鐧昏
-export function delRegistration(query) {
- return request({
- url: "/purchase/registration/delRegistration",
- method: "delete",
- data: query,
- });
-}
-
-// 涓诲垪琛ㄦ煡璇�
-export function gePurchaseListPage(query) {
- return request({
- url: "/purchase/ledger/listPage",
- method: "get",
- params: query,
- });
-}
diff --git a/src/api/procurementManagement/paymentEntry.js b/src/api/procurementManagement/paymentEntry.js
deleted file mode 100644
index 6ef0eb9..0000000
--- a/src/api/procurementManagement/paymentEntry.js
+++ /dev/null
@@ -1,81 +0,0 @@
-// 閲囪喘浠樻鐧昏椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function registrationList(query) {
- return request({
- url: "/purchase/paymentRegistration/list",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ璇︽儏
-export function registrationInfo(query) {
- return request({
- url: "/purchase/paymentRegistration/" + query,
- method: "get",
- });
-}
-// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣鎯�
-export function byPurchaseId(query) {
- return request({
- url: "/purchase/paymentRegistration/byPurchaseId/" + query,
- method: "get",
- });
-}
-// 鏌ヨ閲囪喘鍚堝悓鍙�
-export function getPurchaseNo() {
- return request({
- url: "/purchase/ledger/getPurchaseNo",
- method: "get",
- });
-}
-// 鏂板
-export function paymentRegistrationAdd(query) {
- return request({
- url: "/purchase/paymentRegistration",
- method: "post",
- data: query,
- });
-}
-// 淇敼
-export function paymentRegistrationEdit(query) {
- return request({
- url: "/purchase/paymentRegistration",
- method: "put",
- data: query,
- });
-}
-// 鍒犻櫎
-export function paymentRegistrationDel(query) {
- return request({
- url: "/purchase/paymentRegistration/delete",
- method: "delete",
- data: query,
- });
-}
-// 鑾峰彇鍙戠エ鍙峰拰鍙戠エ閲戦
-export function getTicketNo(query) {
- return request({
- url: "/purchase/registration/getTicketNo",
- method: "get",
- params: query,
- });
-}
-// 鍒嗛〉鏌ヨ
-export function paymentHistoryList(query) {
- return request({
- url: "/purchase/paymentRegistration/paymentHistoryList",
- method: "get",
- params: query,
- });
-}
-
-// 鍒嗛〉鏌ヨ
-export function paymentHistoryListPage(query) {
- return request({
- url: "/purchase/paymentRegistration/paymentHistoryListPage",
- method: "get",
- params: query,
- });
-}
diff --git a/src/api/procurementManagement/paymentLedger.js b/src/api/procurementManagement/paymentLedger.js
deleted file mode 100644
index 3e20b78..0000000
--- a/src/api/procurementManagement/paymentLedger.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// 閲囪喘鍙拌处椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function paymentLedgerList(query) {
- return request({
- url: "/purchase/paymentRegistration/paymentLedgerList",
- method: "get",
- params: query,
- });
-}
-
-// 鍒嗛〉鏌ヨ
-export function paymentRecordList(supplierId) {
- return request({
- url: "/purchase/paymentRegistration/getPaymentRecordList/" + supplierId,
- method: "get",
- });
-}
diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js
deleted file mode 100644
index 76f8410..0000000
--- a/src/api/procurementManagement/procurementInvoiceLedger.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// 閲囪喘-鏉ョエ鍙拌处鎺ュ彛
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export function invoiceList(query) {
- return request({
- url: "/purchase/registration/list",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ璇︽儏
-// export function getInvoiceById(query) {
-// return request({
-// url: "/purchase/registration/getRegistrationById",
-// method: "get",
-// params: query,
-// });
-// }
-// 鏂板銆佺紪杈�
-export function addOrUpdateInvoice(query) {
- return request({
- url: "/purchase/invoice/addOrUpdateInvoice",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎
-export function delInvoice(query) {
- return request({
- url: "/purchase/invoice/delInvoice",
- method: "delete",
- data: query,
- });
-}
-// 鍒犻櫎鏉ョエ鍙拌处
-export function delRegistration(query) {
- return request({
- url: "/purchase/registration/delRegistration",
- method: "delete",
- data: query,
- });
-}
-// 鍒犻櫎闄勪欢
-export function delCommonFile(query) {
- return request({
- url: "/commonFile/delCommonFile",
- method: "delete",
- data: query,
- });
-}
-// 瀛愯〃鏍兼煡璇�
-export function productRecordList(query) {
- return request({
- url: "/purchase/registration/productRecordList",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ヨ鍒楄〃
-export function invoiceListPage(query) {
- return request({
- url: "/purchase/registration/listPage",
- method: "get",
- params: query,
- });
-}
-
-export function productRecordPage(query) {
- return request({
- url: "/purchase/registration/productRecordPage",
- method: "get",
- params: query,
- });
-}
-
-export function productUploadFile(data) {
- return request({
- url: "/file/uploadFile",
- method: "post",
- data: data,
- });
-}
-
-export function getProductRecordById(params) {
- return request({
- url: "/purchase/registration/getProductRecordById",
- method: "get",
- params: params,
- });
-}
-
-export function updateRegistration(data) {
- return request({
- url: "/purchase/registration/updateRegistration",
- method: "post",
- data: data,
- });
-}
-
-// 鏌ヨ浠樻鐧昏瀛愬垪琛�
-export function registrationListPageGetById(query) {
- return request({
- url: "/purchase/registration/getById",
- method: "get",
- params: query,
- });
-}
-// 淇敼浠樻娴佹按
-export function updatePaymentRegistration(query) {
- return request({
- url: "/purchase/registration/updatePaymentRegistration",
- method: "put",
- data: query,
- });
-}
-// 鍒犻櫎浠樻娴佹按
-export function delPaymentRegistration(query) {
- return request({
- url: "/purchase/registration/delPaymentRegistration",
- method: "delete",
- data: query,
- });
-}
diff --git a/src/api/procurementManagement/procurementLedger.js b/src/api/procurementManagement/procurementLedger.js
deleted file mode 100644
index 9fb284e..0000000
--- a/src/api/procurementManagement/procurementLedger.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// 閲囪喘鍙拌处椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function purchaseList(query) {
- return request({
- url: "/purchase/ledger/list",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ鍚堝悓鍙�
-export function getSalesNo(query) {
- return request({
- url: "/purchase/ledger/getSalesNo",
- method: "get",
- params: query,
- });
-}
-// 瀛愯〃鏍兼煡璇�
-export function productList(query) {
- return request({
- url: "/sales/product/list",
- method: "get",
- params: query,
- });
-}
-// 鏂板銆佺紪杈�
-export function addOrEditPurchase(query) {
- return request({
- url: "/purchase/ledger/addOrEditPurchase",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎
-export function delPurchase(query) {
- return request({
- url: "/purchase/ledger/delPurchase",
- method: "delete",
- data: query,
- });
-}
-// 鏌ヨ璇︽儏
-export function getPurchaseById(query) {
- return request({
- url: "/purchase/ledger/getPurchaseById",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ璇︽儏
-export function getOptions(query) {
- return request({
- url: "/system/supplier/getOptions",
- method: "get",
- params: query,
- });
-}
-
-export function purchaseListPage(query) {
- return request({
- url: "/purchase/ledger/listPage",
- method: "get",
- params: query,
- });
-}
-
-export function createPurchaseNo() {
- return request({
- url: "/purchase/ledger/createPurchaseNo",
- method: "get",
- });
-}
diff --git a/src/api/procurementManagement/projectProfit.js b/src/api/procurementManagement/projectProfit.js
deleted file mode 100644
index 7fb1660..0000000
--- a/src/api/procurementManagement/projectProfit.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function getPurchaseList(query) {
- return request({
- url: "/purchase/report/list",
- method: "get",
- params: query,
- });
-}
diff --git a/src/api/procurementManagement/taxComparison.js b/src/api/procurementManagement/taxComparison.js
deleted file mode 100644
index 726a27f..0000000
--- a/src/api/procurementManagement/taxComparison.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function getTaxList(query) {
- return request({
- url: "/purchase/report/listVat",
- method: "get",
- params: query,
- });
-}
diff --git a/src/api/productionManagement/operationScheduling.js b/src/api/productionManagement/operationScheduling.js
deleted file mode 100644
index 75ffe2a..0000000
--- a/src/api/productionManagement/operationScheduling.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// 宸ュ簭鎺掍骇椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function listPageProcess(query) {
- return request({
- url: "/salesLedger/scheduling/listPageProcess",
- method: "get",
- params: query,
- });
-}
-// 鍙栨秷鎺掍骇
-export function productionDispatchDelete(query) {
- return request({
- url: "/salesLedger/scheduling/productionDispatchDelete",
- method: "delete",
- data: query,
- });
-}
-// 鍙栨秷鎺掍骇
-export function processScheduling(query) {
- return request({
- url: "/salesLedger/scheduling/processScheduling",
- method: "post",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/productionManagement/productionCosting.js b/src/api/productionManagement/productionCosting.js
deleted file mode 100644
index 8cc0251..0000000
--- a/src/api/productionManagement/productionCosting.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// 鐢熶骇鏍哥畻椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function productionAccountingListPage(query) {
- return request({
- url: "/salesLedger/productionAccounting/listPage",
- method: "get",
- params: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/productionManagement/productionOrder.js b/src/api/productionManagement/productionOrder.js
deleted file mode 100644
index ab3dc06..0000000
--- a/src/api/productionManagement/productionOrder.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// 鐢熶骇璁㈠崟椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function schedulingListPage(query) {
- return request({
- url: "/salesLedger/scheduling/listPage",
- method: "get",
- params: query,
- });
-}
-// 鐢熶骇娲惧伐
-export function productionDispatch(query) {
- return request({
- url: "/salesLedger/scheduling/productionDispatch",
- method: "post",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/productionManagement/productionReporting.js b/src/api/productionManagement/productionReporting.js
deleted file mode 100644
index fdec712..0000000
--- a/src/api/productionManagement/productionReporting.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// 鐢熶骇鎶ュ伐椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function workListPage(query) {
- return request({
- url: "/salesLedger/work/listPage",
- method: "get",
- params: query,
- });
-}
-// 瀛愯〃鏍兼煡璇�
-export function workListPageById(query) {
- return request({
- url: "/salesLedger/work/list",
- method: "get",
- params: query,
- });
-}
-// 鐢熶骇鎶ュ伐
-export function productionReport(query) {
- return request({
- url: "/salesLedger/work/productionReport",
- method: "post",
- data: query,
- });
-}
-// 鐢熶骇鎶ュ伐-缂栬緫
-export function productionReportUpdate(query) {
- return request({
- url: "/salesLedger/work/productionReportUpdate",
- method: "post",
- data: query,
- });
-}
\ No newline at end of file
diff --git a/src/api/qualityManagement/metricMaintenance.js b/src/api/qualityManagement/metricMaintenance.js
deleted file mode 100644
index 9bdff23..0000000
--- a/src/api/qualityManagement/metricMaintenance.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鎸囨爣鍒楄〃
-export function qualityTestStandardListPage(query) {
- return request({
- url: '/quality/qualityTestStandard/listPage',
- method: 'get',
- params: query,
- })
-}
-
-// 鏂板鎸囨爣鍒楄〃
-export function qualityTestStandardAdd(query) {
- return request({
- url: '/quality/qualityTestStandard/add',
- method: 'post',
- data: query,
- })
-}
-
-// 淇敼鎸囨爣鍒楄〃
-export function qualityTestStandardUpdate(query) {
- return request({
- url: '/quality/qualityTestStandard/update',
- method: 'post',
- data: query,
- })
-}
-
-// 鍒犻櫎鎸囨爣鍒楄〃
-export function qualityTestStandardDel(query) {
- return request({
- url: '/quality/qualityTestStandard/del',
- method: 'delete',
- data: query,
- })
-}
-
-// 鍒犻櫎鎸囨爣鍒楄〃
-export function qualityInspectDetailByProductId(productId) {
- return request({
- url: '/quality/qualityTestStandard/product/' + productId,
- method: 'get',
- })
-}
\ No newline at end of file
diff --git a/src/api/qualityManagement/nonconformingManagement.js b/src/api/qualityManagement/nonconformingManagement.js
deleted file mode 100644
index cf6ebe0..0000000
--- a/src/api/qualityManagement/nonconformingManagement.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedListPage(query) {
- return request({
- url: '/quality/qualityUnqualified/listPage',
- method: 'get',
- params: query,
- })
-}
-// 鏂板涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedAdd(query) {
- return request({
- url: '/quality/qualityUnqualified/add',
- method: 'post',
- data: query,
- })
-}
-// 淇敼涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedUpdate(query) {
- return request({
- url: '/quality/qualityUnqualified/update',
- method: 'post',
- data: query,
- })
-}
-// 鍒犻櫎涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedDel(query) {
- return request({
- url: '/quality/qualityUnqualified/del',
- method: 'delete',
- data: query,
- })
-}
-// 鏌ヨ涓嶅悎鏍肩鐞嗕俊鎭�
-export function getQualityUnqualifiedInfo(query) {
- return request({
- url: '/quality/qualityUnqualified/' + query,
- method: 'get',
- data: query,
- })
-}
\ No newline at end of file
diff --git a/src/api/qualityManagement/qualityInspectFile.js b/src/api/qualityManagement/qualityInspectFile.js
deleted file mode 100644
index 36b72cb..0000000
--- a/src/api/qualityManagement/qualityInspectFile.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ闄勪欢鍒楄〃
-export function qualityInspectFileListPage(query) {
- return request({
- url: '/quality/qualityInspectFile/listPage',
- method: 'get',
- params: query,
- })
-}
-// 淇濆瓨闄勪欢鍒楄〃
-export function qualityInspectFileAdd(query) {
- return request({
- url: '/quality/qualityInspectFile/add',
- method: 'post',
- data: query,
- })
-}
-// 鍒犻櫎闄勪欢鍒楄〃
-export function qualityInspectFileDel(query) {
- return request({
- url: '/quality/qualityInspectFile/del',
- method: 'delete',
- data: query,
- })
-}
\ No newline at end of file
diff --git a/src/api/qualityManagement/qualityInspectParam.js b/src/api/qualityManagement/qualityInspectParam.js
deleted file mode 100644
index 4618820..0000000
--- a/src/api/qualityManagement/qualityInspectParam.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ妫�楠屾寚鏍�
-export function qualityInspectParamInfo(query) {
- return request({
- url: '/quality/qualityInspectParam/' + query,
- method: 'get',
- data: query,
- })
-}
-// 鎻愪氦妫�楠�
-export function qualityInspectParamUpdate(query) {
- return request({
- url: '/quality/qualityInspectParam/update',
- method: 'post',
- data: query,
- })
-}
-
-// 鍒犻櫎妫�楠岃褰�
-export function qualityInspectParamDel(query) {
- return request({
- url: '/quality/qualityInspectParam/del',
- method: 'delete',
- data: query,
- })
-}
\ No newline at end of file
diff --git a/src/api/qualityManagement/rawMaterialInspection.js b/src/api/qualityManagement/rawMaterialInspection.js
deleted file mode 100644
index dcb3869..0000000
--- a/src/api/qualityManagement/rawMaterialInspection.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍘熸潗鏂欐楠屽垪琛�
-export function qualityInspectListPage(query) {
- return request({
- url: '/quality/qualityInspect/listPage',
- method: 'get',
- params: query,
- })
-}
-
-// 鏂板鍘熸潗鏂欐楠�
-export function qualityInspectAdd(query) {
- return request({
- url: '/quality/qualityInspect/add',
- method: 'post',
- data: query,
- })
-}
-
-// 淇敼鍘熸潗鏂欐楠�
-export function qualityInspectUpdate(query) {
- return request({
- url: '/quality/qualityInspect/update',
- method: 'post',
- data: query,
- })
-}
-
-// 鍒犻櫎鍘熸潗鏂欐楠�
-export function qualityInspectDel(query) {
- return request({
- url: '/quality/qualityInspect/del',
- method: 'delete',
- data: query,
- })
-}
-
-// 鎻愪氦鍘熸潗鏂欐楠�
-export function submitQualityInspect(data) {
- return request({
- url: '/quality/qualityInspect/submit',
- method: 'post',
- data: data,
- })
-}
-
-// 鎻愪氦鍘熸潗鏂欐楠�
-export function downloadQualityInspect(data) {
- return request({
- url: '/quality/qualityInspect/down',
- method: 'post',
- data: data,
- responseType: "blob",
- })
-}
-
diff --git a/src/api/salesManagement/invoiceLedger.js b/src/api/salesManagement/invoiceLedger.js
deleted file mode 100644
index 6a54493..0000000
--- a/src/api/salesManagement/invoiceLedger.js
+++ /dev/null
@@ -1,92 +0,0 @@
-// 寮�绁ㄥ彴璐﹂〉闈㈡帴鍙�
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function invoiceLedgerList(query) {
- return request({
- url: '/invoiceLedger/page',
- method: 'get',
- params: query
- })
-}
-
-// 鏂板
-export function invoiceLedgerSaveOrUpdate(query) {
- return request({
- url: '/invoiceLedger/saveOrUpdate',
- method: 'post',
- data: query
- })
-}
-
-// 寮�绁ㄥ彴璐﹀垹闄�
-export function invoiceLedgerDel(query) {
- return request({
- url: '/invoiceLedger/del',
- method: 'delete',
- data: query
- })
-}
-
-// 璇︽儏鏌ヨ
-export function invoiceLedgerDetail(query) {
- return request({
- url: '/invoiceLedger/info',
- method: 'get',
- params: query
- })
-}
-
-// 闄勪欢鎻愪氦
-export function commitFile(query) {
- return request({
- url: '/invoiceLedger/commitFile',
- method: 'post',
- data: query
- })
-}
-
-// 寮�绁ㄥ彴璐﹂儴鍒嗕篃鏌ヨ
-export function invoiceLedgerListNoPage(query) {
- return request({
- url: '/invoiceLedger/list',
- method: 'get',
- data: query
- })
-}
-
-// 鍒嗛〉鏌ヨ
-export function invoiceLedgerSalesAccount(query) {
- return request({
- url: '/invoiceLedger/salesAccount',
- method: 'get',
- params: query
- })
-}
-
-// 浜у搧寮�绁ㄨ褰曞垎椤垫煡璇�
-export function registrationProductPage(query) {
- return request({
- url: '/invoiceLedger/registrationProductPage',
- method: 'get',
- params: query
- })
-}
-
-// 浜у搧寮�绁ㄨ鎯呮煡璇�
-export function invoiceLedgerProductInfo(query) {
- return request({
- url: '/invoiceLedger/invoiceLedgerProductInfo',
- method: 'get',
- params: query
- })
-}
-
-export function delInvoiceLedgerByRegProductId(invoiceRegistrationProductId) {
- return request({
- url: '/invoiceLedger/delInvoiceLedger/'+ invoiceRegistrationProductId,
- method: 'delete'
- })
-}
-
-
diff --git a/src/api/salesManagement/invoiceRegistration.js b/src/api/salesManagement/invoiceRegistration.js
deleted file mode 100644
index 4bc33ce..0000000
--- a/src/api/salesManagement/invoiceRegistration.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// 閿�鍞彴璐﹂〉闈㈡帴鍙�
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function invoiceRegistrationList(query) {
- return request({
- url: '/invoiceRegistration/listPage',
- method: 'get',
- params: query
- })
-}
-// 寮�绁ㄧ櫥璁版柊澧�
-export function invoiceRegistrationSave(query) {
- return request({
- url: '/invoiceRegistration/save',
- method: 'post',
- data: query
- })
-}
-// 寮�绁ㄧ櫥璁板垹闄�
-export function invoiceRegistrationDel(query) {
- return request({
- url: '/invoiceRegistration/del',
- method: 'delete',
- data: query
- })
-}
-// 瀛愯〃鏍兼煡璇�
-export function productList(query) {
- return request({
- url: '/invoiceRegistration/productList',
- method: 'get',
- params: query
- })
-}
-
-// 寮�绁ㄧ櫥璁拌鎯�
-export function invoiceRegistrationDetail(query) {
- return request({
- url: '/invoiceRegistration/detail',
- method: 'get',
- params: query
- })
-}
-
-// 瀵煎嚭寮�绁ㄧ櫥璁�
-export function invoiceRegistrationExport(query) {
- return request({
- url: '/invoiceRegistration/export',
- method: 'get',
- params: query,
- responseType: 'blob'
- })
-}
diff --git a/src/api/salesManagement/receiptPayment.js b/src/api/salesManagement/receiptPayment.js
deleted file mode 100644
index b5d0cf5..0000000
--- a/src/api/salesManagement/receiptPayment.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// 寮�绁ㄧ櫥璁伴〉闈㈡帴鍙�
-import request from '@/utils/request'
-
-// 鏂板/淇敼
-export function receiptPaymentSaveOrUpdate(query) {
- return request({
- url: '/receiptPayment/saveOrUpdate',
- method: 'post',
- data: query
- })
-}
-
-// 瀹㈡埛寰�鏉ヨ褰曟煡璇�
-export function customerInteractions(query) {
- return request({
- url: '/receiptPayment/customerInteractions',
- method: 'get',
- params: query
- })
-}
-
-// 璇︽儏
-export function receiptPaymentInfo(query) {
- return request({
- url: '/receiptPayment/info',
- method: 'get',
- params: query
- })
-}
-
-// 鍒犻櫎
-export function receiptPaymentDel(query) {
- return request({
- url: '/receiptPayment/del',
- method: 'delete',
- data: query
- })
-}
-
-// 鏌ヨ宸茬粡缁戝畾鍙戠エ鐨勫紑绁ㄥ彴璐�
-export function bindInvoiceNoRegPage(query) {
- return request({
- url: '/receiptPayment/bindInvoiceNoRegPage',
- method: 'get',
- params: query
- })
-}
-
-// 寮�绁ㄥ彴璐﹁鎯�
-export function invoiceInfo(query) {
- return request({
- url: '/receiptPayment/invoiceInfo',
- method: 'get',
- params: query
- })
-}
-
-// 璇㈠洖娆捐褰�
-export function receiptPaymentHistoryList(query) {
- return request({
- url: '/receiptPayment/receiptPaymentHistoryList',
- method: 'get',
- params: query
- })
-}
-
-/**
- * 鏌ヨ鍥炴璁板綍鍒嗛〉鏌ヨ
- */
-export function receiptPaymentHistoryListPage(query) {
- return request({
- url: '/receiptPayment/receiptPaymentHistoryListPage',
- method: 'get',
- params: query
- })
-}
-
-export function receiptPaymentHistoryListNoPage(query) {
- return request({
- url: '/receiptPayment/receiptPaymentHistoryListNoPage',
- method: 'get',
- params: query
- })
-}
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
deleted file mode 100644
index 3a2fa22..0000000
--- a/src/api/salesManagement/salesLedger.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// 閿�鍞彴璐﹂〉闈㈡帴鍙�
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function ledgerList(query) {
- return request({
- url: "/sales/ledger/list",
- method: "get",
- params: query,
- });
-}
-// 瀛愯〃鏍兼煡璇�
-export function productList(query) {
- return request({
- url: "/sales/product/list",
- method: "get",
- params: query,
- });
-}
-// 鏌ヨ瀹㈡埛鍚嶇О鍒楄〃
-export function customerList(query) {
- return request({
- url: "/basic/customer/customerList",
- method: "get",
- params: query,
- });
-}
-// 鏂板銆佷慨鏀归攢鍞彴璐�
-export function addOrUpdateSalesLedger(query) {
- return request({
- url: "/sales/ledger/addOrUpdateSalesLedger",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎閿�鍞彴璐�
-export function delLedger(query) {
- return request({
- url: "/sales/ledger/delLedger",
- method: "delete",
- data: query,
- });
-}
-// 鏌ヨ閿�鍞彴璐﹁鎯�
-export function getSalesLedgerWithProducts(query) {
- return request({
- url: "/sales/ledger/getSalesLedgerWithProducts",
- method: "get",
- params: query,
- });
-}
-// 瀹炴椂淇敼浜у搧淇℃伅
-export function addOrUpdateSalesLedgerProduct(query) {
- return request({
- url: "/sales/product/addOrUpdateSalesLedgerProduct",
- method: "post",
- data: query,
- });
-}
-// 鍒犻櫎浜у搧
-export function delProduct(query) {
- return request({
- url: "/sales/product/delProduct",
- method: "delete",
- data: query,
- });
-}
-// 涓婁紶闄勪欢
-export function upload(query) {
- return request({
- url: "/file/upload",
- method: "post",
- data: query,
- responseType: "blob",
- });
-}
-// 缂栬緫鏃跺垹闄ら檮浠�
-export function delLedgerFile(query) {
- return request({
- url: "/sales/ledger/delLedgerFile",
- method: "delete",
- data: query,
- });
-}
-
-// 閿�鍞笉鍒嗛〉鏌ヨ
-export function ledgerListNoPage(query) {
- return request({
- url: "/sales/ledger/listNoPage",
- method: "get",
- params: query,
- });
-}
-
-// 鍒嗛〉鏌ヨ
-export function ledgerListPage(query) {
- return request({
- url: "/sales/ledger/listPage",
- method: "get",
- params: query,
- });
-}
-
-// 鏍规嵁閿�鍞悎鍚屽彿鏌ヤ骇鍝佷俊鎭�
-export function getProductInfoByContractNo(query) {
- return request({
- url: "/purchase/ledger/getProductBySalesNo",
- method: "get",
- params: query,
- });
-}
diff --git a/src/api/system/config.js b/src/api/system/config.js
deleted file mode 100644
index 7858c69..0000000
--- a/src/api/system/config.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍙傛暟鍒楄〃
-export function listConfig(query) {
- return request({
- url: '/system/config/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ鍙傛暟璇︾粏
-export function getConfig(configId) {
- return request({
- url: '/system/config/' + configId,
- method: 'get'
- })
-}
-
-// 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊�
-export function getConfigKey(configKey) {
- return request({
- url: '/system/config/configKey/' + configKey,
- method: 'get'
- })
-}
-
-// 鏂板鍙傛暟閰嶇疆
-export function addConfig(data) {
- return request({
- url: '/system/config',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼鍙傛暟閰嶇疆
-export function updateConfig(data) {
- return request({
- url: '/system/config',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎鍙傛暟閰嶇疆
-export function delConfig(configId) {
- return request({
- url: '/system/config/' + configId,
- method: 'delete'
- })
-}
-
-// 鍒锋柊鍙傛暟缂撳瓨
-export function refreshCache() {
- return request({
- url: '/system/config/refreshCache',
- method: 'delete'
- })
-}
diff --git a/src/api/system/dept.js b/src/api/system/dept.js
deleted file mode 100644
index 9ca6966..0000000
--- a/src/api/system/dept.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ閮ㄩ棬鍒楄〃
-export function listDept(query) {
- return request({
- url: '/system/dept/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級
-export function listDeptExcludeChild(deptId) {
- return request({
- url: '/system/dept/list/exclude/' + deptId,
- method: 'get'
- })
-}
-
-// 鏌ヨ閮ㄩ棬璇︾粏
-export function getDept(deptId) {
- return request({
- url: '/system/dept/' + deptId,
- method: 'get'
- })
-}
-
-// 鏂板閮ㄩ棬
-export function addDept(data) {
- return request({
- url: '/system/dept',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼閮ㄩ棬
-export function updateDept(data) {
- return request({
- url: '/system/dept',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎閮ㄩ棬
-export function delDept(deptId) {
- return request({
- url: '/system/dept/' + deptId,
- method: 'delete'
- })
-}
\ No newline at end of file
diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js
deleted file mode 100644
index 2a6e481..0000000
--- a/src/api/system/dict/data.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ瀛楀吀鏁版嵁鍒楄〃
-export function listData(query) {
- return request({
- url: '/system/dict/data/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ瀛楀吀鏁版嵁璇︾粏
-export function getData(dictCode) {
- return request({
- url: '/system/dict/data/' + dictCode,
- method: 'get'
- })
-}
-
-// 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
-export function getDicts(dictType) {
- return request({
- url: '/system/dict/data/type/' + dictType,
- method: 'get'
- })
-}
-
-// 鏂板瀛楀吀鏁版嵁
-export function addData(data) {
- return request({
- url: '/system/dict/data',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼瀛楀吀鏁版嵁
-export function updateData(data) {
- return request({
- url: '/system/dict/data',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎瀛楀吀鏁版嵁
-export function delData(dictCode) {
- return request({
- url: '/system/dict/data/' + dictCode,
- method: 'delete'
- })
-}
diff --git a/src/api/system/dict/type.js b/src/api/system/dict/type.js
deleted file mode 100644
index d89dbd1..0000000
--- a/src/api/system/dict/type.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ瀛楀吀绫诲瀷鍒楄〃
-export function listType(query) {
- return request({
- url: '/system/dict/type/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ瀛楀吀绫诲瀷璇︾粏
-export function getType(dictId) {
- return request({
- url: '/system/dict/type/' + dictId,
- method: 'get'
- })
-}
-
-// 鏂板瀛楀吀绫诲瀷
-export function addType(data) {
- return request({
- url: '/system/dict/type',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼瀛楀吀绫诲瀷
-export function updateType(data) {
- return request({
- url: '/system/dict/type',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎瀛楀吀绫诲瀷
-export function delType(dictId) {
- return request({
- url: '/system/dict/type/' + dictId,
- method: 'delete'
- })
-}
-
-// 鍒锋柊瀛楀吀缂撳瓨
-export function refreshCache() {
- return request({
- url: '/system/dict/type/refreshCache',
- method: 'delete'
- })
-}
-
-// 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
-export function optionselect() {
- return request({
- url: '/system/dict/type/optionselect',
- method: 'get'
- })
-}
diff --git a/src/api/system/menu.js b/src/api/system/menu.js
deleted file mode 100644
index 97258ee..0000000
--- a/src/api/system/menu.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鑿滃崟鍒楄〃
-export function listMenu(query) {
- return request({
- url: '/system/menu/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ鑿滃崟璇︾粏
-export function getMenu(menuId) {
- return request({
- url: '/system/menu/' + menuId,
- method: 'get'
- })
-}
-
-// 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋�
-export function treeselect() {
- return request({
- url: '/system/menu/treeselect',
- method: 'get'
- })
-}
-
-// 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋�
-export function roleMenuTreeselect(roleId) {
- return request({
- url: '/system/menu/roleMenuTreeselect/' + roleId,
- method: 'get'
- })
-}
-
-// 鏂板鑿滃崟
-export function addMenu(data) {
- return request({
- url: '/system/menu',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼鑿滃崟
-export function updateMenu(data) {
- return request({
- url: '/system/menu',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎鑿滃崟
-export function delMenu(menuId) {
- return request({
- url: '/system/menu/' + menuId,
- method: 'delete'
- })
-}
\ No newline at end of file
diff --git a/src/api/system/notice.js b/src/api/system/notice.js
deleted file mode 100644
index 737fc16..0000000
--- a/src/api/system/notice.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鍏憡鍒楄〃
-export function listNotice(query) {
- return request({
- url: '/system/notice/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ鍏憡璇︾粏
-export function getNotice(noticeId) {
- return request({
- url: '/system/notice/' + noticeId,
- method: 'get'
- })
-}
-
-// 鏂板鍏憡
-export function addNotice(data) {
- return request({
- url: '/system/notice',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼鍏憡
-export function updateNotice(data) {
- return request({
- url: '/system/notice',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎鍏憡
-export function delNotice(noticeId) {
- return request({
- url: '/system/notice/' + noticeId,
- method: 'delete'
- })
-}
\ No newline at end of file
diff --git a/src/api/system/post.js b/src/api/system/post.js
deleted file mode 100644
index 8faa266..0000000
--- a/src/api/system/post.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ宀椾綅鍒楄〃
-export function listPost(query) {
- return request({
- url: '/system/post/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ宀椾綅璇︾粏
-export function getPost(postId) {
- return request({
- url: '/system/post/' + postId,
- method: 'get'
- })
-}
-
-// 鏂板宀椾綅
-export function addPost(data) {
- return request({
- url: '/system/post',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼宀椾綅
-export function updatePost(data) {
- return request({
- url: '/system/post',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎宀椾綅
-export function delPost(postId) {
- return request({
- url: '/system/post/' + postId,
- method: 'delete'
- })
-}
diff --git a/src/api/system/role.js b/src/api/system/role.js
deleted file mode 100644
index 528cd18..0000000
--- a/src/api/system/role.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ瑙掕壊鍒楄〃
-export function listRole(query) {
- return request({
- url: '/system/role/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ瑙掕壊璇︾粏
-export function getRole(roleId) {
- return request({
- url: '/system/role/' + roleId,
- method: 'get'
- })
-}
-
-// 鏂板瑙掕壊
-export function addRole(data) {
- return request({
- url: '/system/role',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼瑙掕壊
-export function updateRole(data) {
- return request({
- url: '/system/role',
- method: 'put',
- data: data
- })
-}
-
-// 瑙掕壊鏁版嵁鏉冮檺
-export function dataScope(data) {
- return request({
- url: '/system/role/dataScope',
- method: 'put',
- data: data
- })
-}
-
-// 瑙掕壊鐘舵�佷慨鏀�
-export function changeRoleStatus(roleId, status) {
- const data = {
- roleId,
- status
- }
- return request({
- url: '/system/role/changeStatus',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎瑙掕壊
-export function delRole(roleId) {
- return request({
- url: '/system/role/' + roleId,
- method: 'delete'
- })
-}
-
-// 鏌ヨ瑙掕壊宸叉巿鏉冪敤鎴峰垪琛�
-export function allocatedUserList(query) {
- return request({
- url: '/system/role/authUser/allocatedList',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ瑙掕壊鏈巿鏉冪敤鎴峰垪琛�
-export function unallocatedUserList(query) {
- return request({
- url: '/system/role/authUser/unallocatedList',
- method: 'get',
- params: query
- })
-}
-
-// 鍙栨秷鐢ㄦ埛鎺堟潈瑙掕壊
-export function authUserCancel(data) {
- return request({
- url: '/system/role/authUser/cancel',
- method: 'put',
- data: data
- })
-}
-
-// 鎵归噺鍙栨秷鐢ㄦ埛鎺堟潈瑙掕壊
-export function authUserCancelAll(data) {
- return request({
- url: '/system/role/authUser/cancelAll',
- method: 'put',
- params: data
- })
-}
-
-// 鎺堟潈鐢ㄦ埛閫夋嫨
-export function authUserSelectAll(data) {
- return request({
- url: '/system/role/authUser/selectAll',
- method: 'put',
- params: data
- })
-}
-
-// 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋�
-export function deptTreeSelect(roleId) {
- return request({
- url: '/system/role/deptTree/' + roleId,
- method: 'get'
- })
-}
diff --git a/src/api/system/user.js b/src/api/system/user.js
deleted file mode 100644
index 431f6b0..0000000
--- a/src/api/system/user.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import request from '@/utils/request'
-import { parseStrEmpty } from "@/utils/ruoyi";
-
-// 鏌ヨ鐢ㄦ埛鍒楄〃
-export function listUser(query) {
- return request({
- url: '/system/user/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ鐢ㄦ埛璇︾粏
-export function getUser(userId) {
- return request({
- url: '/system/user/' + parseStrEmpty(userId),
- method: 'get'
- })
-}
-
-// 鏂板鐢ㄦ埛
-export function addUser(data) {
- return request({
- url: '/system/user',
- method: 'post',
- data: data
- })
-}
-
-// 淇敼鐢ㄦ埛
-export function updateUser(data) {
- return request({
- url: '/system/user',
- method: 'put',
- data: data
- })
-}
-
-// 鍒犻櫎鐢ㄦ埛
-export function delUser(userId) {
- return request({
- url: '/system/user/' + userId,
- method: 'delete'
- })
-}
-
-// 鐢ㄦ埛瀵嗙爜閲嶇疆
-export function resetUserPwd(userId, password) {
- const data = {
- userId,
- password
- }
- return request({
- url: '/system/user/resetPwd',
- method: 'put',
- data: data
- })
-}
-
-// 鐢ㄦ埛鐘舵�佷慨鏀�
-export function changeUserStatus(userId, status) {
- const data = {
- userId,
- status
- }
- return request({
- url: '/system/user/changeStatus',
- method: 'put',
- data: data
- })
-}
-
-// 鏌ヨ鐢ㄦ埛涓汉淇℃伅
-export function getUserProfile() {
- return request({
- url: '/system/user/profile',
- method: 'get'
- })
-}
-
-// 淇敼鐢ㄦ埛涓汉淇℃伅
-export function updateUserProfile(data) {
- return request({
- url: '/system/user/profile',
- method: 'put',
- data: data
- })
-}
-
-// 鐢ㄦ埛瀵嗙爜閲嶇疆
-export function updateUserPwd(oldPassword, newPassword) {
- const data = {
- oldPassword,
- newPassword
- }
- return request({
- url: '/system/user/profile/updatePwd',
- method: 'put',
- data: data
- })
-}
-
-// 鐢ㄦ埛澶村儚涓婁紶
-export function uploadAvatar(data) {
- return request({
- url: '/system/user/profile/avatar',
- method: 'post',
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
- data: data
- })
-}
-
-// 鏌ヨ鎺堟潈瑙掕壊
-export function getAuthRole(userId) {
- return request({
- url: '/system/user/authRole/' + userId,
- method: 'get'
- })
-}
-
-// 淇濆瓨鎺堟潈瑙掕壊
-export function updateAuthRole(data) {
- return request({
- url: '/system/user/authRole',
- method: 'put',
- params: data
- })
-}
-
-// 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋�
-export function deptTreeSelect() {
- return request({
- url: '/system/user/deptTree',
- method: 'get'
- })
-}
-// 鏌ヨ鐢ㄦ埛鍒楄〃
-export function userListNoPageByTenantId() {
- return request({
- url: '/system/user/userListNoPageByTenantId',
- method: 'get'
- })
-}
-
-// 鏌ヨ鐢ㄦ埛鍒楄〃
-export function userListNoPage() {
- return request({
- url: '/system/user/userListNoPage',
- method: 'get'
- })
-}
-// 閮ㄩ棬鍒楄〃
-export function userLoginFacotryList(params) {
- return request({
- url: '/userLoginFacotryList',
- method: 'get',
- params: params
- })
-}
diff --git a/src/api/task.js b/src/api/task.js
new file mode 100644
index 0000000..d7d407f
--- /dev/null
+++ b/src/api/task.js
@@ -0,0 +1,24 @@
+/**
+ * 瀛︾敓绔� API锛氬~琛ㄤ换鍔★紙鍔ㄦ�� schema 濉姤锛�
+ */
+import r from '@/utils/request.js'
+
+// 鎴戝彲濉姤/宸插~鎶ョ殑浠诲姟鍒楄〃
+export function getTasks() {
+ return r.get('/miniapp/tasks')
+}
+
+// 浠诲姟琛ㄥ崟锛歴chema + 棰勫~ + 鎴戠殑璁板綍
+export function getTaskForm(taskId) {
+ return r.get('/miniapp/task/' + taskId)
+}
+
+// 淇濆瓨鑽夌
+export function saveTaskDraft(data) {
+ return r.post('/miniapp/task/draft', data)
+}
+
+// 姝e紡鎻愪氦
+export function submitTask(data) {
+ return r.post('/miniapp/task/submit', data)
+}
diff --git a/src/api/tool/gen.js b/src/api/tool/gen.js
deleted file mode 100644
index 5728980..0000000
--- a/src/api/tool/gen.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ鐢熸垚琛ㄦ暟鎹�
-export function listTable(query) {
- return request({
- url: '/tool/gen/list',
- method: 'get',
- params: query
- })
-}
-// 鏌ヨdb鏁版嵁搴撳垪琛�
-export function listDbTable(query) {
- return request({
- url: '/tool/gen/db/list',
- method: 'get',
- params: query
- })
-}
-
-// 鏌ヨ琛ㄨ缁嗕俊鎭�
-export function getGenTable(tableId) {
- return request({
- url: '/tool/gen/' + tableId,
- method: 'get'
- })
-}
-
-// 淇敼浠g爜鐢熸垚淇℃伅
-export function updateGenTable(data) {
- return request({
- url: '/tool/gen',
- method: 'put',
- data: data
- })
-}
-
-// 瀵煎叆琛�
-export function importTable(data) {
- return request({
- url: '/tool/gen/importTable',
- method: 'post',
- params: data
- })
-}
-
-// 鍒涘缓琛�
-export function createTable(data) {
- return request({
- url: '/tool/gen/createTable',
- method: 'post',
- params: data
- })
-}
-
-// 棰勮鐢熸垚浠g爜
-export function previewTable(tableId) {
- return request({
- url: '/tool/gen/preview/' + tableId,
- method: 'get'
- })
-}
-
-// 鍒犻櫎琛ㄦ暟鎹�
-export function delTable(tableId) {
- return request({
- url: '/tool/gen/' + tableId,
- method: 'delete'
- })
-}
-
-// 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
-export function genCode(tableName) {
- return request({
- url: '/tool/gen/genCode/' + tableName,
- method: 'get'
- })
-}
-
-// 鍚屾鏁版嵁搴�
-export function synchDb(tableName) {
- return request({
- url: '/tool/gen/synchDb/' + tableName,
- method: 'get'
- })
-}
diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js
deleted file mode 100644
index 2d85171..0000000
--- a/src/api/viewIndex.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// 棣栭〉鎺ュ彛
-import request from '@/utils/request'
-
-// 閿�鍞�-閲囪喘-搴撳瓨鏁版嵁
-export const getBusiness = () => {
- return request({
- url: '/home/business',
- method: 'get'
- })
-}
-// 瀹㈡埛鍚堝悓閲戦鍒嗘瀽
-export const analysisCustomerContractAmounts = () => {
- return request({
- url: '/home/analysisCustomerContractAmounts',
- method: 'get'
- })
-}
-// 璐ㄦ鍒嗘瀽
-export const qualityStatistics = () => {
- return request({
- url: '/home/qualityStatistics',
- method: 'get'
- })
-}
-// 搴旀敹搴斾粯缁熻
-export const statisticsReceivablePayable = (query) => {
- return request({
- url: '/home/statisticsReceivablePayable',
- method: 'get',
- params: query
- })
-}
-// 寰呭姙浜嬮」
-export const homeTodos = () => {
- return request({
- url: '/home/todos',
- method: 'get'
- })
-}
-
-// 绾垮舰鍥�
-export const getAmountHalfYear = () => {
- return request({
- url: '/sales/ledger/getAmountHalfYear',
- method: 'get'
- })
-}
\ No newline at end of file
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
deleted file mode 100644
index cd6e0d9..0000000
--- a/src/assets/401_images/401.gif
+++ /dev/null
Binary files differ
diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png
deleted file mode 100644
index 3d8e230..0000000
--- a/src/assets/404_images/404.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png
deleted file mode 100644
index c6281d0..0000000
--- a/src/assets/404_images/404_cloud.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/fonts/DIN Alternate Bold.ttf b/src/assets/fonts/DIN Alternate Bold.ttf
deleted file mode 100644
index 81f2f7a..0000000
--- a/src/assets/fonts/DIN Alternate Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/src/assets/fonts/font.css b/src/assets/fonts/font.css
deleted file mode 100644
index 1a3894a..0000000
--- a/src/assets/fonts/font.css
+++ /dev/null
@@ -1,7 +0,0 @@
-@font-face {
- font-family: "MyCustomFont";
- src: url("./DIN Alternate Bold.ttf") format("truetype");
- font-weight: 700; /* 绮椾綋 */
- font-style: normal;
- font-display: swap;
-}
diff --git a/src/assets/icons/png/1.png b/src/assets/icons/png/1.png
deleted file mode 100644
index 1acfa67..0000000
--- a/src/assets/icons/png/1.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/png/2.png b/src/assets/icons/png/2.png
deleted file mode 100644
index cebdf2c..0000000
--- a/src/assets/icons/png/2.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/png/3.png b/src/assets/icons/png/3.png
deleted file mode 100644
index 719912b..0000000
--- a/src/assets/icons/png/3.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/png/4.png b/src/assets/icons/png/4.png
deleted file mode 100644
index b5f5861..0000000
--- a/src/assets/icons/png/4.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/png/5.png b/src/assets/icons/png/5.png
deleted file mode 100644
index 5467146..0000000
--- a/src/assets/icons/png/5.png
+++ /dev/null
Binary files differ
diff --git "a/src/assets/icons/png/\346\224\257\345\207\272.png" "b/src/assets/icons/png/\346\224\257\345\207\272.png"
deleted file mode 100644
index fc253ae..0000000
--- "a/src/assets/icons/png/\346\224\257\345\207\272.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/icons/png/\346\224\257\345\207\272\351\207\221\351\242\235.png" "b/src/assets/icons/png/\346\224\257\345\207\272\351\207\221\351\242\235.png"
deleted file mode 100644
index b0db95a..0000000
--- "a/src/assets/icons/png/\346\224\257\345\207\272\351\207\221\351\242\235.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/icons/png/\346\224\266\345\205\245\345\210\227\345\270\220.png" "b/src/assets/icons/png/\346\224\266\345\205\245\345\210\227\345\270\220.png"
deleted file mode 100644
index 782bd2f..0000000
--- "a/src/assets/icons/png/\346\224\266\345\205\245\345\210\227\345\270\220.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/icons/png/\346\224\266\345\205\245\346\224\266\346\254\276.png" "b/src/assets/icons/png/\346\224\266\345\205\245\346\224\266\346\254\276.png"
deleted file mode 100644
index a1d3272..0000000
--- "a/src/assets/icons/png/\346\224\266\345\205\245\346\224\266\346\254\276.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/icons/png/\346\224\266\345\205\245\351\207\221\351\242\235.png" "b/src/assets/icons/png/\346\224\266\345\205\245\351\207\221\351\242\235.png"
deleted file mode 100644
index b83863a..0000000
--- "a/src/assets/icons/png/\346\224\266\345\205\245\351\207\221\351\242\235.png"
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/svg/404.svg b/src/assets/icons/svg/404.svg
deleted file mode 100644
index 6df5019..0000000
--- a/src/assets/icons/svg/404.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/bug.svg b/src/assets/icons/svg/bug.svg
deleted file mode 100644
index 05a150d..0000000
--- a/src/assets/icons/svg/bug.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/build.svg b/src/assets/icons/svg/build.svg
deleted file mode 100644
index 97c4688..0000000
--- a/src/assets/icons/svg/build.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/button.svg b/src/assets/icons/svg/button.svg
deleted file mode 100644
index 904fddc..0000000
--- a/src/assets/icons/svg/button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/cascader.svg b/src/assets/icons/svg/cascader.svg
deleted file mode 100644
index e256024..0000000
--- a/src/assets/icons/svg/cascader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576153230908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="971" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z" p-id="972"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg
deleted file mode 100644
index 27728fb..0000000
--- a/src/assets/icons/svg/chart.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg
deleted file mode 100644
index 013fd3a..0000000
--- a/src/assets/icons/svg/checkbox.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575982282951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="902" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z" p-id="903"></path><path d="M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z" p-id="904"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg
deleted file mode 100644
index 90923ff..0000000
--- a/src/assets/icons/svg/clipboard.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg
deleted file mode 100644
index 5f9c5ab..0000000
--- a/src/assets/icons/svg/code.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" p-id="2423"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg
deleted file mode 100644
index 44a81aa..0000000
--- a/src/assets/icons/svg/color.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577252187056" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2508" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z" p-id="2509"></path><path d="M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z" p-id="2510"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/component.svg b/src/assets/icons/svg/component.svg
deleted file mode 100644
index 29c3458..0000000
--- a/src/assets/icons/svg/component.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575804206892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3145" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z" p-id="3146"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg
deleted file mode 100644
index 5317d37..0000000
--- a/src/assets/icons/svg/dashboard.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/date-range.svg b/src/assets/icons/svg/date-range.svg
deleted file mode 100644
index fda571e..0000000
--- a/src/assets/icons/svg/date-range.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579774833889" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1376" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z" p-id="1377"></path><path d="M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z" p-id="1378"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg
deleted file mode 100644
index 52dc73e..0000000
--- a/src/assets/icons/svg/date.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577186573535" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1068" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z" p-id="1069"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/dict.svg b/src/assets/icons/svg/dict.svg
deleted file mode 100644
index 4849377..0000000
--- a/src/assets/icons/svg/dict.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035680909" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1002.0848 744.672l-33.568 10.368c0.96 7.264 2.144 14.304 2.144 21.76 0 7.328-1.184 14.432-2.368 21.568l33.792 10.56c7.936 2.24 14.496 7.616 18.336 14.752 3.84 7.328 4.672 15.808 1.952 23.552-5.376 16-23.168 24.672-39.936 19.68l-34.176-10.624c-7.136 12.8-15.776 24.672-26.208 35.2l20.8 27.488a28.96 28.96 0 0 1 5.824 22.816 29.696 29.696 0 0 1-12.704 19.616 32.544 32.544 0 0 1-44.416-6.752l-20.8-27.552c-13.696 6.56-28.192 11.2-43.008 13.888v33.632c0 16.736-14.112 30.432-31.648 30.432-17.6 0-31.872-13.696-31.872-30.432v-33.632a167.616 167.616 0 0 1-42.88-13.888l-20.928 27.552c-10.72 13.76-30.08 16.64-44.288 6.752a29.632 29.632 0 0 1-12.704-19.616 29.28 29.28 0 0 1 5.696-22.816l20.896-27.808a166.72 166.72 0 0 1-27.008-34.688l-33.376 10.432c-16.8 5.184-34.56-3.552-39.936-19.616a29.824 29.824 0 0 1 20.224-38.24l33.472-10.432c-0.8-7.264-2.016-14.304-2.016-21.824 0-7.36 1.184-14.496 2.304-21.632l-33.792-10.368c-16.672-5.376-25.632-22.496-20.224-38.432 5.376-16 23.136-24.672 39.936-19.68l34.016 10.752c7.328-12.672 15.84-24.8 26.336-35.328l-20.8-27.552a29.44 29.44 0 0 1 6.944-42.432 32.704 32.704 0 0 1 44.384 6.752l20.832 27.616c13.696-6.432 28.224-11.2 43.104-13.952v-33.568c0-16.736 14.048-30.432 31.648-30.432 17.536 0 31.808 13.568 31.808 30.432v33.504c15.072 2.688 29.344 7.808 42.848 14.016l20.992-27.616a32.48 32.48 0 0 1 44.224-6.752 29.568 29.568 0 0 1 7.136 42.432l-21.024 27.808c10.432 10.432 19.872 21.888 27.04 34.752l33.376-10.432c16.768-5.12 34.56 3.68 39.936 19.68 5.536 15.936-3.712 33.056-20.32 38.304z m-206.016-74.432c-61.344 0-111.136 47.808-111.136 106.56 0 58.88 49.792 106.496 111.136 106.496 61.312 0 111.104-47.616 111.104-106.496 0-58.752-49.792-106.56-111.104-106.56z" p-id="3602"></path><path d="M802.7888 57.152h-76.448c0-22.08-21.024-38.24-42.848-38.24H39.3968a39.68 39.68 0 0 0-39.36 40.032v795.616s41.888 120.192 110.752 120.192H673.2848a227.488 227.488 0 0 1-107.04-97.44H117.6368s-40.608-13.696-40.608-41.248l470.304-0.256 1.664 3.36a227.68 227.68 0 0 1-12.64-73.632c0-60.576 24-118.624 66.88-161.44a228.352 228.352 0 0 1 123.552-63.392l-3.2 0.288 2.144-424.672h38.208l0.576 421.024c27.04 0 52.672 4.8 76.64 13.344V101.536c0.032 0-6.304-44.384-38.368-44.384zM149.7648 514.336H72.3888v-77.408H149.7648v77.408z m0-144.32H72.3888v-77.44H149.7648v77.44z m0-137.248H72.3888v-77.44H149.7648v77.44z m501.856 281.568H206.0848v-77.408h445.536v77.408z m0-144.32H206.0848v-77.44h445.536v77.44z m0-137.248H206.0848v-77.44h445.536v77.44z" p-id="3603"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/documentation.svg b/src/assets/icons/svg/documentation.svg
deleted file mode 100644
index 7043122..0000000
--- a/src/assets/icons/svg/documentation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg
deleted file mode 100644
index c896951..0000000
--- a/src/assets/icons/svg/download.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569915748289" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3062" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h64v64H256.35456v-64z m448 0h64v64h-64v-64z" fill="#333333" p-id="3063"></path><path d="M539.04256 845.248V512.192a32.448 32.448 0 0 0-32-32.192c-17.664 0-32 14.912-32 32.192v333.056l-36.096-36.096a32.192 32.192 0 0 0-45.056 0.192 31.616 31.616 0 0 0-0.192 45.056l90.88 90.944a31.36 31.36 0 0 0 22.528 9.088 30.08 30.08 0 0 0 22.4-9.088l90.88-90.88a32.192 32.192 0 0 0-0.192-45.12 31.616 31.616 0 0 0-45.056-0.192l-36.096 36.096z" fill="#333333" p-id="3064"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/drag.svg b/src/assets/icons/svg/drag.svg
deleted file mode 100644
index 4185d3c..0000000
--- a/src/assets/icons/svg/drag.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/druid.svg b/src/assets/icons/svg/druid.svg
deleted file mode 100644
index a2b4b4e..0000000
--- a/src/assets/icons/svg/druid.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036347051" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5853" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M832 128H192a64.19 64.19 0 0 0-64 64v640a64.19 64.19 0 0 0 64 64h640a64.19 64.19 0 0 0 64-64V192a64.19 64.19 0 0 0-64-64z m0 703.89l-0.11 0.11H192.11l-0.11-0.11V768h640zM832 544H720L605.6 696.54 442.18 435.07 333.25 544H192v-64h114.75l147.07-147.07L610.4 583.46 688 480h144z m0-288H192v-63.89l0.11-0.11h639.78l0.11 0.11z" p-id="5854"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg
deleted file mode 100644
index d26101f..0000000
--- a/src/assets/icons/svg/edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg
deleted file mode 100644
index 7bfb01d..0000000
--- a/src/assets/icons/svg/education.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg
deleted file mode 100644
index 74d25e2..0000000
--- a/src/assets/icons/svg/email.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/example.svg b/src/assets/icons/svg/example.svg
deleted file mode 100644
index 46f42b5..0000000
--- a/src/assets/icons/svg/example.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/excel.svg b/src/assets/icons/svg/excel.svg
deleted file mode 100644
index 74d97b8..0000000
--- a/src/assets/icons/svg/excel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg
deleted file mode 100644
index 485c128..0000000
--- a/src/assets/icons/svg/exit-fullscreen.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/eye-open.svg b/src/assets/icons/svg/eye-open.svg
deleted file mode 100644
index 88dcc98..0000000
--- a/src/assets/icons/svg/eye-open.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/eye.svg b/src/assets/icons/svg/eye.svg
deleted file mode 100644
index 16ed2d8..0000000
--- a/src/assets/icons/svg/eye.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/form.svg b/src/assets/icons/svg/form.svg
deleted file mode 100644
index dcbaa18..0000000
--- a/src/assets/icons/svg/form.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg
deleted file mode 100644
index 0e86b6f..0000000
--- a/src/assets/icons/svg/fullscreen.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg
deleted file mode 100644
index db0a0d4..0000000
--- a/src/assets/icons/svg/github.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1581238998885" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4187" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.542857 14.057143C228.914286 13.942857 0 242.742857 0 525.142857 0 748.457143 143.2 938.285714 342.628571 1008c26.857143 6.742857 22.742857-12.342857 22.742858-25.371429v-88.571428c-155.085714 18.171429-161.371429-84.457143-171.771429-101.6C172.571429 756.571429 122.857143 747.428571 137.714286 730.285714c35.314286-18.171429 71.314286 4.571429 113.028571 66.171429 30.171429 44.685714 89.028571 37.142857 118.857143 29.714286 6.514286-26.857143 20.457143-50.857143 39.657143-69.485715-160.685714-28.8-227.657143-126.857143-227.657143-243.428571 0-56.571429 18.628571-108.571429 55.2-150.514286-23.314286-69.142857 2.171429-128.342857 5.6-137.142857 66.4-5.942857 135.428571 47.542857 140.8 51.771429 37.714286-10.171429 80.8-15.542857 129.028571-15.542858 48.457143 0 91.657143 5.6 129.714286 15.885715 12.914286-9.828571 76.914286-55.771429 138.628572-50.171429 3.314286 8.8 28.228571 66.628571 6.285714 134.857143 37.028571 42.057143 55.885714 94.514286 55.885714 151.2 0 116.8-67.428571 214.971429-228.571428 243.314286a145.714286 145.714286 0 0 1 43.542857 104v128.571428c0.914286 10.285714 0 20.457143 17.142857 20.457143 202.4-68.228571 348.114286-259.428571 348.114286-484.685714 0-282.514286-229.028571-511.2-511.428572-511.2z" p-id="4188"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/guide.svg b/src/assets/icons/svg/guide.svg
deleted file mode 100644
index b271001..0000000
--- a/src/assets/icons/svg/guide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg
deleted file mode 100644
index 82be8ee..0000000
--- a/src/assets/icons/svg/icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/input.svg b/src/assets/icons/svg/input.svg
deleted file mode 100644
index ab91381..0000000
--- a/src/assets/icons/svg/input.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802859706" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3102" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 224H128c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V288c0-35.2-28.8-64-64-64z m0 480c0 19.2-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V320c0-19.2 12.8-32 32-32h704c19.2 0 32 12.8 32 32v384z" p-id="3103"></path><path d="M224 352c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V384c0-16-12.8-32-32-32z" p-id="3104"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg
deleted file mode 100644
index e9b56ee..0000000
--- a/src/assets/icons/svg/international.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/job.svg b/src/assets/icons/svg/job.svg
deleted file mode 100644
index 2a93a25..0000000
--- a/src/assets/icons/svg/job.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036191400" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5472" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M934.912 1016.832H192c-14.336 0-25.6-11.264-25.6-25.6v-189.44c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v163.84h691.712V64H217.6v148.48c0 14.336-11.264 25.6-25.6 25.6s-25.6-11.264-25.6-25.6v-174.08c0-14.336 11.264-25.6 25.6-25.6h742.912c14.336 0 25.6 11.264 25.6 25.6v952.832c0 14.336-11.264 25.6-25.6 25.6z" p-id="5473"></path><path d="M232.96 371.2h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 540.16h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 698.88h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM574.464 762.88c-134.144 0-243.2-109.056-243.2-243.2S440.32 276.48 574.464 276.48s243.2 109.056 243.2 243.2-109.056 243.2-243.2 243.2z m0-435.2c-105.984 0-192 86.016-192 192S468.48 711.68 574.464 711.68s192-86.016 192-192S680.448 327.68 574.464 327.68z" p-id="5474"></path><path d="M663.04 545.28h-87.04c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h87.04c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6z" p-id="5475"></path><path d="M576 545.28c-14.336 0-25.6-11.264-25.6-25.6v-87.04c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v87.04c0 14.336-11.264 25.6-25.6 25.6z" p-id="5476"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/language.svg b/src/assets/icons/svg/language.svg
deleted file mode 100644
index 0082b57..0000000
--- a/src/assets/icons/svg/language.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg
deleted file mode 100644
index 48197ba..0000000
--- a/src/assets/icons/svg/link.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg
deleted file mode 100644
index 20259ed..0000000
--- a/src/assets/icons/svg/list.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg
deleted file mode 100644
index 74fee54..0000000
--- a/src/assets/icons/svg/lock.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg
deleted file mode 100644
index d879d33..0000000
--- a/src/assets/icons/svg/log.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035943711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4805" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M208.736 566.336H64.384v59.328h144.352v-59.328z m0-336.096H165.44V74.592c0-7.968 4.896-14.848 10.464-14.848h502.016V0.448H175.936c-38.72 1.248-69.248 34.368-68.192 74.144v155.648H64.384V289.6h144.352V230.24z m0 168.096H64.384v59.328h144.352v-59.328z m714.656 76.576h-57.76v474.496c0 7.936-4.896 14.848-10.464 14.848H175.936c-5.568 0-10.464-6.912-10.464-14.848v-155.68h43.296v-59.296H64.384v59.296h43.328v155.68c-1.024 39.776 29.472 72.896 68.192 74.144h679.232c38.72-1.184 69.248-34.368 68.256-74.144V474.912z m14.944-290.336l-83.072-85.312a71.264 71.264 0 0 0-52.544-21.728 71.52 71.52 0 0 0-51.616 23.872L386.528 507.264a30.496 30.496 0 0 0-6.176 10.72L308.16 740.512a30.016 30.016 0 0 0 6.976 30.24c7.712 7.968 19.2 10.752 29.568 7.2l216.544-74.112a28.736 28.736 0 0 0 12.128-7.936L940.448 287.456a75.552 75.552 0 0 0-2.112-102.88z m-557.12 518.272l39.104-120.64 78.336 80.416-117.44 40.224z m170.048-70.016l-103.552-106.016 200.16-222.4 103.52 106.304-200.128 222.112zM897.952 247.072l-0.256 0.224-107.136 119.168-103.52-106.528 106.432-118.624a14.144 14.144 0 0 1 10.304-4.736 13.44 13.44 0 0 1 10.464 4.288l83.264 85.696c5.472 5.6 5.664 14.72 0.448 20.512z" p-id="4806"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/logininfor.svg b/src/assets/icons/svg/logininfor.svg
deleted file mode 100644
index 267f844..0000000
--- a/src/assets/icons/svg/logininfor.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036016814" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5261" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 128h-85.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666666v640H170.666667V213.333333h42.666666a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0-42.666667 42.666667v725.333333a42.666667 42.666667 0 0 0 42.666667 42.666667h768a42.666667 42.666667 0 0 0 42.666667-42.666667V170.666667a42.666667 42.666667 0 0 0-42.666667-42.666667z" p-id="5262"></path><path d="M341.333333 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666666 42.666667zM512 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333334 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM682.666667 298.666667a42.666667 42.666667 0 0 0 42.666666-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM341.333333 768a42.666667 42.666667 0 0 0 42.666667-42.666667 128 128 0 0 1 256 0 42.666667 42.666667 0 0 0 85.333333 0 213.333333 213.333333 0 0 0-107.52-184.32A128 128 0 0 0 640 469.333333a128 128 0 0 0-256 0 128 128 0 0 0 22.186667 71.68A213.333333 213.333333 0 0 0 298.666667 725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667z m128-298.666667a42.666667 42.666667 0 1 1 42.666667 42.666667 42.666667 42.666667 0 0 1-42.666667-42.666667z" p-id="5263"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg
deleted file mode 100644
index 14ca817..0000000
--- a/src/assets/icons/svg/message.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg
deleted file mode 100644
index c1580de..0000000
--- a/src/assets/icons/svg/money.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg
deleted file mode 100644
index 70db62b..0000000
--- a/src/assets/icons/svg/monitor.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543827393750" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4695" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
-</style></defs><path d="M64 64V640H896V64H64zM0 0h960v704H0V0z" p-id="4696"></path><path d="M192 896H768v64H192zM448 640H512v256h-64z" p-id="4697"></path><path d="M479.232 561.604267l309.9904-348.330667-47.803733-42.5472-259.566934 291.669333L303.957333 240.008533 163.208533 438.6048l52.224 37.009067 91.6224-129.28z" p-id="4698"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/moon.svg b/src/assets/icons/svg/moon.svg
deleted file mode 100644
index ec72d77..0000000
--- a/src/assets/icons/svg/moon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1733303018722" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1447" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M368.832 67.2c51.328-16.384 89.216 34.112 75.712 76.416a346.816 346.816 0 0 0 435.84 435.84c42.304-13.44 92.8 24.384 76.48 75.712A467.968 467.968 0 1 1 368.832 67.2z m-35.776 122.688a368.832 368.832 0 1 0 501.056 501.056 445.952 445.952 0 0 1-501.056-501.056z" p-id="1448"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg
deleted file mode 100644
index 06713a8..0000000
--- a/src/assets/icons/svg/nested.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/number.svg b/src/assets/icons/svg/number.svg
deleted file mode 100644
index ad5ce9a..0000000
--- a/src/assets/icons/svg/number.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802851180" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2867" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M279.272727 791.272727h512a46.545455 46.545455 0 0 1 0 93.090909H279.272727a46.545455 46.545455 0 0 1 0-93.090909z m33.838546-617.984V651.636364H193.722182V395.170909c0-37.003636-0.884364-59.298909-2.653091-66.746182a24.948364 24.948364 0 0 0-14.615273-16.989091c-8.005818-3.863273-25.786182-5.771636-53.341091-5.771636h-11.822545v-55.854545c57.716364-12.381091 101.562182-37.888 131.490909-76.520728h70.283636z m303.709091 396.8V651.636364H354.164364v-68.235637c77.777455-127.255273 124.043636-206.010182 138.705454-236.218182 14.661818-30.254545 22.016-53.853091 22.016-70.74909 0-13.032727-2.234182-22.714182-6.656-29.137455-4.421818-6.376727-11.170909-9.588364-20.247273-9.588364a22.248727 22.248727 0 0 0-20.200727 10.612364c-4.468364 7.121455-6.656 21.178182-6.656 42.263273v45.521454H354.164364v-17.454545c0-26.763636 1.396364-47.941818 4.142545-63.348364 2.746182-15.499636 9.541818-30.72 20.386909-45.661091 10.798545-14.987636 24.901818-26.298182 42.216727-33.978182 17.361455-7.68 38.167273-11.543273 62.37091-11.543272 47.476364 0 83.316364 11.776 107.706181 35.328 24.296727 23.552 36.445091 53.341091 36.445091 89.367272 0 27.368727-6.842182 56.32-20.48 86.853819-13.730909 30.533818-54.039273 95.325091-121.018182 194.420363h130.885819z m270.615272-189.393454c18.152727 6.097455 31.650909 16.104727 40.494546 29.975272 8.843636 13.917091 13.312 46.452364 13.312 97.652364 0 38.027636-4.328727 67.490909-13.032727 88.529455-8.657455 20.945455-23.598545 36.910545-44.869819 47.848727-21.271273 10.938182-48.593455 16.384-81.873454 16.384-37.794909 0-67.490909-6.330182-89.088-19.083636-21.550545-12.660364-35.746909-28.253091-42.542546-46.638546-6.795636-18.432-10.193455-50.362182-10.193454-95.883636v-37.841455h119.389091v77.730909c0 20.666182 1.210182 33.838545 3.723636 39.424 2.420364 5.585455 7.912727 8.424727 16.337455 8.424728 9.309091 0 15.36-3.537455 18.338909-10.612364 2.932364-7.121455 4.421818-25.6 4.421818-55.575273v-33.047273c0-18.338909-2.048-31.744-6.190546-40.215272a30.72 30.72 0 0 0-18.338909-16.709818c-8.052364-2.653091-23.738182-4.189091-46.964363-4.561455V357.050182c28.392727 0 45.893818-1.070545 52.596363-3.258182a22.946909 22.946909 0 0 0 14.475637-14.149818c2.932364-7.307636 4.421818-18.711273 4.421818-34.257455v-26.624c0-16.756364-1.722182-27.741091-5.12-33.047272-3.490909-5.352727-8.843636-8.005818-16.151273-8.005819-8.285091 0-13.963636 2.792727-16.989091 8.378182-3.025455 5.632-4.561455 17.640727-4.561454 35.933091v39.284364h-119.389091v-40.773818c0-45.661091 10.472727-76.567273 31.325091-92.625455 20.898909-16.058182 54.085818-24.064 99.607272-24.064 56.878545 0 95.511273 11.170909 115.805091 33.373091 20.293818 22.248727 30.394182 53.201455 30.394182 92.765091 0 26.810182-3.630545 46.173091-10.891636 58.088727-7.307636 11.915636-20.107636 22.807273-38.446546 32.628364z" p-id="2868"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/online.svg b/src/assets/icons/svg/online.svg
deleted file mode 100644
index 330a202..0000000
--- a/src/assets/icons/svg/online.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899557259" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="535" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M356.246145 681.56286c-68.156286-41.949414-107.246583-103.84102-107.246583-169.805384 0-65.966411 39.090297-127.860063 107.246583-169.809477 12.046361-7.414877 15.800871-23.190165 8.385994-35.236526-7.413853-12.046361-23.191188-15.801894-35.236526-8.387018-39.640836 24.399713-72.539106 56.044434-95.137801 91.515297-23.86657 37.461193-36.481889 79.620385-36.481889 121.917724 0 42.297338 12.615319 84.454484 36.481889 121.914654 22.598694 35.469839 55.496965 67.11456 95.137801 91.51325 4.185322 2.576685 8.821923 3.804652 13.400195 3.804652 8.598842 0 16.998139-4.329609 21.836331-12.190647C372.047016 704.752002 368.291482 688.976714 356.246145 681.56286zM263.943926 754.580874c-92.603071-61.111846-145.713686-149.623739-145.713686-242.840794 0-93.195565 53.094242-181.682899 145.667637-242.774279 11.805884-7.79043 15.061021-23.677259 7.269567-35.483142-7.79043-11.805884-23.677259-15.062044-35.483142-7.269567C128.487861 296.954249 67.006602 401.024489 67.006602 511.74008c0 110.73708 61.496609 214.830857 168.721703 285.593504 4.343935 2.867304 9.240455 4.238534 14.08274 4.238534 8.317433 0 16.476253-4.046153 21.400403-11.507078C279.003923 778.258133 275.748786 762.372328 263.943926 754.580874zM788.660552 226.213092c-11.80486-7.791453-27.692712-4.536316-35.483142 7.269567-7.79043 11.805884-4.536316 27.692712 7.269567 35.483142 92.575442 61.092403 145.670707 149.579737 145.670707 242.774279 0 93.216032-53.111638 181.727924-145.715733 242.840794-11.805884 7.79043-15.059997 23.678282-7.269567 35.484166 4.925173 7.461949 13.081946 11.507078 21.400403 11.507078 4.841262 0 9.739828-1.37123 14.083763-4.238534 107.22714-70.761624 168.724773-174.857447 168.724773-285.593504C957.341323 401.025513 895.860063 296.955272 788.660552 226.213092zM790.090111 633.67213c23.865547-37.459147 36.480866-79.617315 36.480866-121.914654 0-42.298362-12.615319-84.45653-36.480866-121.917724-22.598694-35.470863-55.496965-67.115584-95.139847-91.515297-12.047384-7.413853-27.821649-3.659343-35.236526 8.387018-7.414877 12.045337-3.659343 27.821649 8.385994 35.236526 68.156286 41.949414 107.247606 103.842043 107.247606 169.809477 0 65.964364-39.090297 127.85597-107.247606 169.804361-12.045337 7.414877-15.800871 23.190165-8.385994 35.237549 4.838192 7.861038 13.236466 12.190647 21.835308 12.190647 4.579295 0 9.215896-1.227967 13.400195-3.804652C734.591099 700.786691 767.490394 669.142993 790.090111 633.67213zM567.129086 518.274914c24.12342-17.150612 39.887452-45.305859 39.887452-77.07133 0-52.128241-42.452881-94.538143-94.634334-94.538143-52.18043 0-94.633311 42.408879-94.633311 94.538143 0 31.695886 15.696494 59.797921 39.730886 76.958766-49.875944 21.128203-84.917018 70.234621-84.917018 127.301338 0 2.366907 0.061398 4.762467 0.182149 7.119141l1.249457 24.296359 276.373515 0 1.238201-24.308639c0.119727-2.358721 0.181125-4.750187 0.181125-7.106862C651.786185 588.497255 616.865861 539.465538 567.129086 518.274914zM512.381182 397.889079c23.937179 0 43.411719 19.430538 43.411719 43.314505 0 23.882943-19.47454 43.313481-43.411719 43.313481-23.936155 0-43.409672-19.430538-43.409672-43.313481C468.971509 417.320641 488.445026 397.889079 512.381182 397.889079zM426.08884 625.656573c9.119705-38.542828 44.254923-67.337641 86.085634-67.337641s76.966952 28.794813 86.085634 67.337641L426.08884 625.656573z" p-id="536"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg
deleted file mode 100644
index 6c64def..0000000
--- a/src/assets/icons/svg/password.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802846045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2750" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z" p-id="2751"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/pdf.svg b/src/assets/icons/svg/pdf.svg
deleted file mode 100644
index 957aa0c..0000000
--- a/src/assets/icons/svg/pdf.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg
deleted file mode 100644
index 2bd54ae..0000000
--- a/src/assets/icons/svg/people.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg
deleted file mode 100644
index aab852e..0000000
--- a/src/assets/icons/svg/peoples.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg
deleted file mode 100644
index ab8e8c4..0000000
--- a/src/assets/icons/svg/phone.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1567417214476" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2266" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M761.503029 2.90619 242.121921 2.90619c-32.405037 0-58.932204 26.060539-58.932204 58.527998l0 902.302287c0 32.156374 26.217105 58.216913 58.932204 58.216913l519.381108 0c32.344662 0 58.591443-26.060539 58.591443-58.216913L820.094472 61.123103C820.094472 28.966729 793.847691 2.90619 761.503029 2.90619M452.878996 61.123103l98.147344 0c6.780427 0 12.31549 5.536087 12.31549 12.253068 0 6.748704-5.535063 12.253068-12.31549 12.253068l-98.147344 0c-6.779404 0-12.345166-5.504364-12.345166-12.253068C440.532807 66.659189 446.099592 61.123103 452.878996 61.123103M501.641583 980.593398c-29.636994 0-53.987588-23.946388-53.987588-53.677527 0-29.356608 24.039509-53.614082 53.987588-53.614082 29.91738 0 53.987588 23.883967 53.987588 53.614082C555.629171 956.647009 531.559986 980.593398 501.641583 980.593398M766.35657 803.142893c0 16.23373-13.186324 29.107945-29.233811 29.107945l-470.618521 0c-16.35755 0-29.325909-13.186324-29.325909-29.107945L237.178329 163.500794c0-16.232706 13.279445-29.138644 29.325909-29.138644l470.246037 0c16.420995 0 29.357632 13.1853 29.357632 29.138644l0 639.642099L766.35657 803.142893zM766.35657 803.142893" p-id="2267"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/post.svg b/src/assets/icons/svg/post.svg
deleted file mode 100644
index 2922c61..0000000
--- a/src/assets/icons/svg/post.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035724641" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3998" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M136.4 434.3h77.7c21.5 0 38.9-17.4 38.9-38.9s-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9zM252.9 628.6c0-21.5-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9H214c21.5-0.1 38.9-17.5 38.9-38.9z" p-id="3999"></path><path d="M874.7 97.5H227c-28.6 0-51.8 23.2-51.8 51.8v194.3h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v129.5h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v194.3c0 28.6 23.2 51.8 51.8 51.8h647.7c28.6 0 51.8-23.2 51.8-51.8V149.3c0-28.6-23.2-51.8-51.8-51.8z m-311.3 723c-15.6 0-146.7-71.6-146.7-91 0-19.4 102-368.6 102-368.6l-83.6-104s-12.3-23.1 24.6-23.1h208.9c36.9 0 18.4 23.1 18.4 23.1l-79 104s102 351.3 102 368.6c0.1 17.3-131 91-146.6 91z m169.2-253.6l-27.9 40.2-74.5-240 103.4 171.7c4.6 7.9 4.2 20.6-1 28.1z" p-id="4000"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/qq.svg b/src/assets/icons/svg/qq.svg
deleted file mode 100644
index ee13d4e..0000000
--- a/src/assets/icons/svg/qq.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M18.448 57.545l-.244-.744-.198-.968-.132-.53v-2.181l.236-.859.24-.908.317-.953.428-1.06.561-1.103.794-1.104v-.773l.077-.724.123-.984.34-1.106.313-1.194.25-.548.289-.511.371-.569.405-.423v-2.73l.234-1.407.236-1.633.42-1.955.577-2.035.43-1.118.426-1.217.468-1.135.559-1.216.57-1.332.655-1.247.737-1.331.929-1.33.43-.762.457-.624.995-1.406 1.025-1.403 1.163-1.444 1.246-1.405 1.352-1.384 1.41-1.423 1.708-1.536 1.083-.934 1.322-1.008 1.34-.89 1.448-.855 1.392-.76 1.57-.63 1.667-.775 1.657-.532 1.653-.552 1.787-.548 1.785-.417 1.876-.347L59.128.68l1.879-.245 1.876-.252 2.002-.106h5.912l1.97.243 1.981.231 2.019.207 1.874.441 1.979.413 1.857.475 2.035.53 1.862.646 1.782.738 1.904.78 1.736.853 1.689.95 1.655 1.044 1.425.971.662.548.693.401 1.323 1.1 1.115 1.064 1.112 1.1 1.083 1.214.894 1.178 1.064 1.217.74 1.306.752 1.162.798 1.352.661 1.175 1.113 2.489.546 1.286.428 1.192.428 1.294.384 1.217.267 1.047.347 1.231.607 2.198.388 1.924.253 1.861.217 1.497.342 2.28.077.362.274.41.737 1.18.473.8.42.832.534.892.472 1.07.307 1.093.334 1.2.252 1.232.115.605.106.746v.648l-.106.643v.8l-.192.774-.35 1.5-.403.76-.299.852v.213l.142.264.4.623 1.746 2.53 1.377 1.9.66 1.267.889 1.389.774 1.52.893 1.627.894 1.828 1.006 2.069.567 1.268.518 1.239.447 1.307.44 1.175.336 1.235.342 1.16.432 2.261.343 2.31.235 2.05v2.891l-.158 1.025-.226 1.768-.308 1.59-.48 1.44-.18.588-.336.707-.28.493-.375.607-.33.383-.42.494-.375.4-.401.34-.48.207-.432.207-.355.114h-.543l-.346-.114-.66-.32-.302-.212-.317-.223-.347-.304-.35-.342-.579-.63-.684-.89-.539-.917-.538-.734-.526-.855-.741-1.517-.833-1.579-.098-.055h-.138l-.338.247-.196.415-.326.516-.567 1.533-.856 2.182-1.096 2.626-.824 1.308-.864 1.366-1.027 1.536-1.09 1.503-.557.68-.676.743-1.555 1.497.136.135.21.214.777.446 3.235 1.524 1.41.779 1.347.756 1.332.953 1.187.982.574.443.432.511.445.593.367.643.198.533.242.64.105.554.115.647-.115.433v.44l-.105.454-.242.415-.092.325-.22.394-.587.784-.543.627-.42.47-.35.348-.893.638-1.01.556-1.077.532-1.155.511-1.287.495-.693.207-.608.167-1.496.342-1.545.325-1.552.323-1.689.27-1.74.072-1.785.21h-5.539l-1.998-.114-1.86-.168-2.005-.27-1.99-.209-2.095-.286-2.03-.495-1.981-.374-1.968-.552-2.019-.707-1.98-.585-1.044-.342-.927-.323-.586-.223-.582-.12h-1.647l-1.904-.131-.962-.096-1.24-.135-.795.705-1.085.665-1.471.701-1.628.875-.99.475-1.033.376-2.281.914-1.24.305-1.3.343-1.803.344-1.13.086-1.193.1-1.246.135-1.45.053h-5.926l-3.346-.053-3.25-.321-1.644-.23-1.589-.23-1.546-.227-1.547-.305-1.442-.456-1.434-.325-1.294-.51-1.223-.474-1.142-.533-.99-.583-.984-.71-.336-.343-.44-.415-.334-.362-.3-.417-.278-.415-.215-.42-.311-.89-.109-.46-.138-.51v-.473l.138-.533v-.53l.109-.53v-1.069l.052-.564.259-.647.215-.646.39-.779.286-.3.236-.348.615-.738.49-.38.464-.266.428-.338.676-.21.543-.324.676-.341.77-.227.775-.231.897-.192.85-.11 1.008-.13 1.093-.081.284-.092h.063l.137-.115v-.13l-.2-.266-.58-.27-1.45-1.231-.975-.761-1.127-.967-1.136-1.082-1.181-1.382-1.36-1.558-.508-.843-.672-.87-.58-1.007-.522-1.1-.704-1.047-.459-1.194-.547-1.192-.546-1.33-.397-1.273-.378-1.575-.112-.057h-.115l-.059-.113h-.14l-.23.113-.114.057-.158.264-.057.321-.119.286-.206.477-.664 1.157-.345.701-.546.612-.58.736-.641.816-.677.724-.795.701-.734.658-.814.524-.89.546-.855.325-1.008.247-.99.095h-.233l-.228-.095-.18-.384-.29-.188-.38-.912-.237-.493-.255-.707-.21-.734-.113-.724-.313-1.648-.12-.972v-3.185l.12-2.379.196-1.214.23-1.252.21-1.347.374-1.254.42-1.443.431-1.407.578-1.448.545-1.38.754-1.4.699-1.52.855-1.425 1.006-1.538 1.023-1.382 1.069-1.538.891-1.071 1.142-1.227 1.202-1.237.56-.59.678-.662.985-.836 1.012-.853 1.647-1.446 1.242-.889z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/question.svg b/src/assets/icons/svg/question.svg
deleted file mode 100644
index cf75bd4..0000000
--- a/src/assets/icons/svg/question.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1581238842264" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1409" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 0C229.233778 0 0 229.233778 0 512s229.233778 512 512 512 512-229.233778 512-512A512 512 0 0 0 512 0z m0 938.666667C276.366222 938.666667 85.333333 747.633778 85.333333 512 85.333333 276.366222 276.366222 85.333333 512 85.333333c235.633778 0 426.666667 191.032889 426.666667 426.666667a426.666667 426.666667 0 0 1-426.666667 426.666667z m0-717.653334a170.666667 170.666667 0 0 0-170.666667 170.666667 42.666667 42.666667 0 0 0 85.333334 0 85.333333 85.333333 0 1 1 85.333333 85.333333 42.666667 42.666667 0 0 0-42.666667 42.666667v111.36a42.666667 42.666667 0 0 0 85.333334 0v-74.24A170.666667 170.666667 0 0 0 512 221.013333z m-42.666667 542.293334a42.666667 42.666667 0 1 0 85.333334 0 42.666667 42.666667 0 0 0-85.333334 0z" p-id="1410"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/radio.svg b/src/assets/icons/svg/radio.svg
deleted file mode 100644
index 0cde345..0000000
--- a/src/assets/icons/svg/radio.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575966775973" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="879" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M507.39346659 71.84873358c241.53533667 0 437.39770766 195.85422109 437.39770767 437.37442191 0 241.53766571-195.86237099 437.38955776-437.39770767 437.38955776-241.50040803 0-437.34997219-195.85189205-437.34997219-437.38955776C70.0434944 267.70295467 265.89189347 71.84873358 507.39346659 71.84873358L507.39346659 71.84873358zM507.39346659 282.81899805c-125.00686734 0-226.37039389 101.38914133-226.37039388 226.41813048 0 125.01268821 101.36352768 226.39717262 226.37039388 226.39717262 125.04295993 0 226.42395136-101.38448441 226.42395136-226.39717262C733.81625401 384.20813938 632.43642653 282.81899805 507.39346659 282.81899805L507.39346659 282.81899805zM507.39346659 120.78172615c-214.46664192 0-388.42047261 173.95150279-388.4204726 388.44026539 0 214.51204949 173.95499463 388.46122325 388.4204726 388.46122325 214.52369237 0 388.46005817-173.94800981 388.46005818-388.46122325C895.85236082 294.73322894 721.91715897 120.78172615 507.39346659 120.78172615z" p-id="880"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/rate.svg b/src/assets/icons/svg/rate.svg
deleted file mode 100644
index aa3b14d..0000000
--- a/src/assets/icons/svg/rate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577246781606" class="icon" viewBox="0 0 1069 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1098" xmlns:xlink="http://www.w3.org/1999/xlink" width="84.5595703125" height="81"><defs><style type="text/css"></style></defs><path d="M633.72929961 378.02038203l9.49872568 18.68789795 20.78025469 2.79745225 206.61592412 27.33248408a11.46496817 11.46496817 0 0 1 6.6095543 19.47324902l-147.2675168 147.35350284-14.89299345 14.89299345 3.8006376 20.68280244 37.84585956 204.89044571a11.46496817 11.46496817 0 0 1-16.4808914 12.2961788L554.68980898 751.84713388l-18.68789794-9.49299345-18.48726123 9.99171915-183.23885392 99.34968163a11.46496817 11.46496817 0 0 1-16.78471347-11.8662416l32.5433127-205.79617881 3.29617793-20.78598692-15.19108243-14.49172002-151.03375839-143.48407587a11.46496817 11.46496817 0 0 1 6.09936328-19.63949062l205.79617881-32.63503185 20.78598691-3.2961788L428.87898125 380.72038203 518.59235674 192.64331182a11.46496817 11.46496817 0 0 1 20.56815264-0.26369385l94.56879023 185.63503183zM496.64840732 85.52038203l-121.75796162 254.98089229L95.76433145 384.76178369A34.3949045 34.3949045 0 0 0 77.46050938 443.66879023l204.87324901 194.66369385-44.16879023 279.1146498a34.3949045 34.3949045 0 0 0 50.36560489 35.61592325l248.4-134.67898038 251.84522285 128.27579591a34.3949045 34.3949045 0 0 0 49.43694287-36.89426777l-51.30573223-277.85350284 199.73120977-199.90891758a34.3949045 34.3949045 0 0 0-19.82866201-58.40827998l-280.11783428-37.03184736L558.32993633 84.71210205a34.3949045 34.3949045 0 0 0-61.68152901 0.80254775z" p-id="1099"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis-list.svg b/src/assets/icons/svg/redis-list.svg
deleted file mode 100644
index 98a15b2..0000000
--- a/src/assets/icons/svg/redis-list.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656035183065" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3395" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
-</style></defs><path d="M958.88 730.06H65.12c-18.28 0-33.12-14.82-33.12-33.12V68.91c0-18.29 14.83-33.12 33.12-33.12h893.77c18.28 0 33.12 14.82 33.12 33.12v628.03c-0.01 18.3-14.84 33.12-33.13 33.12zM98.23 663.83h827.53v-561.8H98.23v561.8z" p-id="3396"></path><path d="M512 954.55c-18.28 0-33.12-14.82-33.12-33.12V733.92c0-18.29 14.83-33.12 33.12-33.12s33.12 14.82 33.12 33.12v187.51c0 18.3-14.84 33.12-33.12 33.12z" p-id="3397"></path><path d="M762.01 988.21H261.99c-18.28 0-33.12-14.82-33.12-33.12 0-18.29 14.83-33.12 33.12-33.12h500.03c18.28 0 33.12 14.82 33.12 33.12-0.01 18.29-14.84 33.12-33.13 33.12zM514.74 578.55c-21.63 0-43.31-3.87-64.21-11.65-45.95-17.13-82.49-51.13-102.86-95.74-5.07-11.08-0.19-24.19 10.89-29.26 11.08-5.09 24.19-0.18 29.26 10.91 15.5 33.88 43.25 59.7 78.14 72.71 34.93 12.99 72.79 11.64 106.66-3.85 33.22-15.17 58.8-42.26 72.03-76.3 4.42-11.37 17.21-17.01 28.57-12.58 11.36 4.42 16.99 17.22 12.57 28.58-17.42 44.82-51.1 80.5-94.82 100.47-24.34 11.12-50.25 16.71-76.23 16.71z" p-id="3398"></path><path d="M325.27 528.78c-1.66 0-3.34-0.18-5.02-0.57-11.88-2.77-19.28-14.63-16.49-26.51l18.84-81c1.34-5.82 5-10.84 10.13-13.92 5.09-3.09 11.3-3.96 17.03-2.41l80.51 21.43c11.79 3.14 18.8 15.23 15.67 27.02-3.15 11.79-15.42 18.75-27.02 15.65l-58.49-15.57-13.69 58.81c-2.37 10.2-11.45 17.07-21.47 17.07zM360.8 351.01c-2.65 0-5.37-0.49-8-1.51-11.36-4.41-16.99-17.21-12.59-28.57 17.4-44.79 51.06-80.47 94.8-100.48 92.15-42.06 201.25-1.39 243.31 90.68 5.07 11.08 0.19 24.19-10.89 29.26-11.13 5.07-24.19 0.17-29.26-10.91-31.97-69.91-114.9-100.82-184.79-68.86-33.22 15.19-58.8 42.28-71.99 76.29-3.41 8.74-11.75 14.1-20.59 14.1z" p-id="3399"></path><path d="M684.68 376.74c-1.47 0-2.95-0.15-4.42-0.44l-81.61-16.68c-11.94-2.45-19.64-14.11-17.21-26.06 2.44-11.96 14.1-19.64 26.04-17.22l59.29 12.12 10.23-59.5c2.05-12 13.52-20.19 25.48-18.01 12.03 2.06 20.09 13.48 18.02 25.5l-14.08 81.96a22.089 22.089 0 0 1-9.29 14.49c-3.7 2.51-8.03 3.84-12.45 3.84z" p-id="3400"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg
deleted file mode 100644
index 2f1d62d..0000000
--- a/src/assets/icons/svg/redis.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1605865043777" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="856" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1023.786667 611.84c-0.426667 9.770667-13.354667 20.693333-39.893334 34.56-54.613333 28.458667-337.749333 144.896-397.994666 176.298667-60.288 31.402667-93.738667 31.104-141.354667 8.32-47.616-22.741333-348.842667-144.469333-403.114667-170.368-27.093333-12.970667-40.917333-23.893333-41.386666-34.218667v103.509333c0 10.325333 14.250667 21.290667 41.386666 34.261334 54.272 25.941333 355.541333 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.362667 60.245333-31.402667 343.338667-147.797333 397.994666-176.298667 27.776-14.464 40.106667-25.728 40.106667-35.925333v-102.058667l-0.213333-0.085333z m0-168.746667c-0.512 9.770667-13.397333 20.650667-39.893334 34.517334-54.613333 28.458667-337.749333 144.896-397.994666 176.298666-60.288 31.402667-93.738667 31.104-141.354667 8.362667-47.616-22.741333-348.842667-144.469333-403.114667-170.410667-27.093333-12.928-40.917333-23.893333-41.386666-34.176v103.509334c0 10.325333 14.250667 21.248 41.386666 34.218666 54.272 25.941333 355.498667 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.32 60.245333-31.402667 343.338667-147.84 397.994666-176.298666 27.776-14.506667 40.106667-25.770667 40.106667-35.968v-102.058667l-0.256-0.042667z m0-175.018666c0.469333-10.410667-13.141333-19.541333-40.533334-29.610667-53.248-19.498667-334.634667-131.498667-388.522666-151.253333-53.888-19.712-75.818667-18.901333-139.093334 3.84C392.234667 113.706667 92.629333 231.253333 39.338667 252.074667c-26.666667 10.496-39.68 20.181333-39.253334 30.506666V386.133333c0 10.325333 14.250667 21.248 41.386667 34.218667 54.272 25.941333 355.498667 147.669333 403.114667 170.410667 47.616 22.741333 81.066667 23.04 141.354666-8.362667 60.245333-31.402667 343.338667-147.84 397.994667-176.298667 27.776-14.506667 40.106667-25.770667 40.106667-35.968V268.074667h-0.341334zM366.677333 366.08l237.269334-36.437333-71.68 105.088-165.546667-68.650667z m524.8-94.634667l-140.330666 55.466667-15.232 5.973333-140.245334-55.466666 155.392-61.44 140.373334 55.466666z m-411.989333-101.674666l-22.954667-42.325334 71.594667 27.989334 67.498667-22.101334-18.261334 43.733334 68.778667 25.770666-88.704 9.216-19.882667 47.786667-32.085333-53.290667-102.4-9.216 76.416-27.562666z m-176.768 59.733333c70.058667 0 126.805333 21.973333 126.805333 49.109333s-56.746667 49.152-126.805333 49.152-126.848-22.058667-126.848-49.152c0-27.136 56.789333-49.152 126.848-49.152z" p-id="857"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/row.svg b/src/assets/icons/svg/row.svg
deleted file mode 100644
index 0780992..0000000
--- a/src/assets/icons/svg/row.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579339929870" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1182" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M152 854.856875h325.7146875V237.715625H134.856875v600q0 6.99375 5.0746875 12.0684375T152 854.856875z m737.143125-17.1421875v-600H546.284375v617.1421875H872q6.99375 0 12.0684375-5.07375t5.0746875-12.0684375z m68.5715625-651.429375V837.715625q0 35.3821875-25.16625 60.5484375T872 923.4284375H152q-35.383125 0-60.5484375-25.1653125T66.284375 837.7146875V186.284375q0-35.3821875 25.16625-60.5484375T152 100.5715625h720q35.383125 0 60.5484375 25.1653125t25.16625 60.5484375z" p-id="1183"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg
deleted file mode 100644
index 84233dd..0000000
--- a/src/assets/icons/svg/search.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/select.svg b/src/assets/icons/svg/select.svg
deleted file mode 100644
index d628382..0000000
--- a/src/assets/icons/svg/select.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575803481213" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="804" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M62 511.97954521C62 263.86590869 263.90681826 62 511.97954521 62s449.97954521 201.825 449.97954521 449.97954521c0 248.19545479-201.90681826 449.97954521-449.97954521 449.97954521C263.90681826 962 62 760.175 62 511.97954521M901.98636348 511.97954521c0-215.24318174-175.00909131-390.41590869-390.00681827-390.41590869-215.03863652 0-389.96590869 175.17272695-389.96590868 390.41590869 0 215.28409131 175.00909131 390.45681826 389.96590868 390.45681826C727.01818174 902.47727305 901.98636348 727.30454521 901.98636348 511.97954521M264.17272695 430.28409131c0-5.76818174 2.12727305-11.51590869 6.64772696-15.87272696 8.71363652-8.75454521 22.88863652-8.75454521 31.725 0l209.4340913 208.22727305L721.45454521 414.53409131c8.75454521-8.71363652 22.97045479-8.71363652 31.90909132 0 8.71363652 8.75454521 8.71363652 22.88863652 0 31.60227304L511.97954521 685.74090869 270.71818174 446.01363653C266.27954521 441.77954521 264.17272695 436.05227305 264.17272695 430.28409131" p-id="805"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg
deleted file mode 100644
index eb287e3..0000000
--- a/src/assets/icons/svg/server.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" p-id="6718"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg
deleted file mode 100644
index 87513e7..0000000
--- a/src/assets/icons/svg/shopping.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M42.913 101.36c1.642 0 3.198.332 4.667.996a12.28 12.28 0 0 1 3.89 2.772c1.123 1.184 1.987 2.582 2.592 4.193.605 1.612.908 3.318.908 5.118 0 1.8-.303 3.507-.908 5.118-.605 1.611-1.469 3.01-2.593 4.194a13.3 13.3 0 0 1-3.889 2.843 10.582 10.582 0 0 1-4.667 1.066c-1.729 0-3.306-.355-4.732-1.066a13.604 13.604 0 0 1-3.825-2.843c-1.123-1.185-1.988-2.583-2.593-4.194a14.437 14.437 0 0 1-.907-5.118c0-1.8.302-3.506.907-5.118.605-1.61 1.47-3.009 2.593-4.193a12.515 12.515 0 0 1 3.825-2.772c1.426-.664 3.003-.996 4.732-.996zm53.932.285c1.643 0 3.22.331 4.733.995a11.386 11.386 0 0 1 3.889 2.772c1.08 1.185 1.945 2.583 2.593 4.194.648 1.61.972 3.317.972 5.118 0 1.8-.324 3.506-.972 5.117-.648 1.611-1.513 3.01-2.593 4.194a12.253 12.253 0 0 1-3.89 2.843 11 11 0 0 1-4.732 1.066 10.58 10.58 0 0 1-4.667-1.066 12.478 12.478 0 0 1-3.824-2.843c-1.08-1.185-1.945-2.583-2.593-4.194a13.581 13.581 0 0 1-.973-5.117c0-1.801.325-3.507.973-5.118.648-1.611 1.512-3.01 2.593-4.194a11.559 11.559 0 0 1 3.824-2.772 11.212 11.212 0 0 1 4.667-.995zm21.781-80.747c2.42 0 4.3.355 5.64 1.066 1.34.71 2.29 1.587 2.852 2.63a6.427 6.427 0 0 1 .778 3.34c-.044 1.185-.195 2.204-.454 3.057-.26.853-.8 2.606-1.62 5.26a589.268 589.268 0 0 1-2.788 8.743 1236.373 1236.373 0 0 0-3.047 9.453c-.994 3.128-1.75 5.592-2.269 7.393-1.123 3.79-2.55 6.42-4.278 7.89-1.728 1.469-3.846 2.203-6.352 2.203H39.023l1.945 12.795h65.342c4.148 0 6.223 1.943 6.223 5.828 0 1.896-.41 3.53-1.232 4.905-.821 1.374-2.442 2.061-4.862 2.061H38.505c-1.729 0-3.176-.426-4.343-1.28-1.167-.852-2.14-1.966-2.917-3.34a21.277 21.277 0 0 1-1.88-4.478 44.128 44.128 0 0 1-1.102-4.55c-.087-.568-.324-1.942-.713-4.122-.39-2.18-.865-4.904-1.426-8.174l-1.88-10.947c-.692-4.027-1.383-8.079-2.075-12.154-1.642-9.572-3.5-20.234-5.574-31.986H6.87c-1.296 0-2.377-.356-3.24-1.067a9.024 9.024 0 0 1-2.14-2.558 10.416 10.416 0 0 1-1.167-3.2C.108 8.53 0 7.488 0 6.54c0-1.896.583-3.46 1.75-4.69C2.917.615 4.494 0 6.482 0h13.095c1.728 0 3.111.284 4.148.853 1.037.569 1.858 1.28 2.463 2.132a8.548 8.548 0 0 1 1.297 2.701c.26.948.475 1.754.648 2.417.173.758.346 1.825.519 3.199.173 1.374.345 2.772.518 4.193.26 1.706.519 3.507.778 5.403h88.678z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg
deleted file mode 100644
index ddb25b8..0000000
--- a/src/assets/icons/svg/size.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg
deleted file mode 100644
index a3b7312..0000000
--- a/src/assets/icons/svg/skill.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/slider.svg b/src/assets/icons/svg/slider.svg
deleted file mode 100644
index fbe4f39..0000000
--- a/src/assets/icons/svg/slider.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577185310368" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1238" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M951.453125 476.84375H523.671875a131.8359375 131.8359375 0 0 0-254.1796875 0H72.546875v70.3125h196.9453125a131.8359375 131.8359375 0 0 0 254.1796875 0H951.453125z" p-id="1239"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/star.svg b/src/assets/icons/svg/star.svg
deleted file mode 100644
index 6cf86e6..0000000
--- a/src/assets/icons/svg/star.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/sunny.svg b/src/assets/icons/svg/sunny.svg
deleted file mode 100644
index cc628bf..0000000
--- a/src/assets/icons/svg/sunny.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1733303115132" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12397" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 890.432c18.432 0 33.408 14.976 33.408 33.408v66.752a33.408 33.408 0 0 1-66.816 0v-66.752c0-18.432 14.976-33.408 33.408-33.408z m-267.52-110.848a33.408 33.408 0 0 1 0 47.232l-47.296 47.232a33.408 33.408 0 0 1-47.232-47.232l47.232-47.232a33.408 33.408 0 0 1 47.232 0z m582.336 0l47.232 47.232a33.408 33.408 0 0 1-47.232 47.232l-47.232-47.232a33.408 33.408 0 1 1 47.232-47.232zM512 200.32a311.68 311.68 0 1 1 0 623.296 311.68 311.68 0 0 1 0-623.36z m0 66.752a244.864 244.864 0 1 0 0 489.728 244.864 244.864 0 0 0 0-489.728zM100.16 478.592a33.408 33.408 0 1 1 0 66.816H33.408a33.408 33.408 0 0 1 0-66.816h66.752z m890.432 0a33.408 33.408 0 0 1 0 66.816h-66.752a33.408 33.408 0 1 1 0-66.816h66.752zM197.184 149.952l47.232 47.232a33.408 33.408 0 1 1-47.232 47.232l-47.232-47.232a33.408 33.408 0 0 1 47.232-47.232z m676.864 0a33.408 33.408 0 0 1 0 47.232l-47.232 47.232a33.408 33.408 0 1 1-47.232-47.232l47.232-47.232a33.408 33.408 0 0 1 47.232 0zM512 0c18.432 0 33.408 14.976 33.408 33.408v66.752a33.408 33.408 0 1 1-66.816 0V33.408C478.592 14.976 493.568 0 512 0z" p-id="12398"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg
deleted file mode 100644
index 05d4e7b..0000000
--- a/src/assets/icons/svg/swagger.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036776944" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6463" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M64 223.995345h168.001164v47.997673c0 26.428509 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.569164 41.984-47.997673v-47.997673h504.003491a32.004655 32.004655 0 0 0 0-64.009309H455.996509V111.988364c0-26.428509-18.878836-47.997673-41.984-47.997673H273.985164c-23.095855 0-41.984 21.569164-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.009309zM288.004655 128h111.997672V256H288.004655V128zM960 479.995345H791.998836v-47.997672c0-26.372655-18.878836-47.997673-41.984-47.997673H609.978182c-23.095855 0-41.984 21.634327-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.00931h504.003491v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h168.001164a32.004655 32.004655 0 1 0-0.009309-64.00931zM735.995345 576H623.997673v-128h111.997672v128zM960 800.293236v-0.288581H455.996509v-47.997673c0-26.363345-18.878836-47.997673-41.984-47.997673H274.050327c-23.105164 0-41.984 21.634327-41.984 47.997673v47.997673H64v0.288581a32.004655 32.004655 0 0 0 0 64.009309c0.986764 0 1.917673-0.195491 2.885818-0.288581h165.115346v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h501.108364c0.968145 0.093091 1.899055 0.288582 2.895127 0.288581a32.004655 32.004655 0 1 0-0.009309-64.009309zM400.002327 896H288.004655V768h111.997672v128z" fill="" p-id="6464"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/switch.svg b/src/assets/icons/svg/switch.svg
deleted file mode 100644
index 0ba61e3..0000000
--- a/src/assets/icons/svg/switch.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576042673958" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1110" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M692 792H332c-150 0-270-120-270-270s120-270 270-270h360c150 0 270 120 270 270 0 147-120 270-270 270zM332 312c-117 0-210 93-210 210s93 210 210 210h360c117 0 210-93 210-210s-93-210-210-210H332z" p-id="1111"></path><path d="M341 522m-150 0a150 150 0 1 0 300 0 150 150 0 1 0-300 0Z" p-id="1112"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg
deleted file mode 100644
index 76d41ba..0000000
--- a/src/assets/icons/svg/system.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543827724451" class="icon" style="" viewBox="0 0 1084 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10233" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
-</style></defs><path d="M1080.09609 434.500756c-4.216302-23.731757-26.9241-47.945376-50.595623-53.185637l-17.648235-4.095836a175.940257 175.940257 0 0 1-101.612877-80.832531 177.807476 177.807476 0 0 1-18.732427-129.801867l5.541425-16.684509c7.10748-23.129428-2.108151-54.992624-20.599646-70.833873 0 0-16.624276-14.094495-63.244529-41.199293-46.800951-26.984332-66.858502-34.513443-66.858502-34.513443-22.76803-8.372371-54.631227-0.361397-71.255503 17.407304l-12.287509 13.251234a173.470708 173.470708 0 0 1-120.465769 48.065842A174.13327 174.13327 0 0 1 421.329029 33.590675L409.583617 20.761071C393.140039 2.99237 361.096144-4.898138 338.267881 3.353767c0 0-20.358715 7.529111-67.099434 34.513443-46.800951 27.34573-63.244529 41.440225-63.244529 41.440225-18.431263 15.66055-27.646894 47.222582-20.539413 70.592941l5.059562 16.865207a178.048407 178.048407 0 0 1-18.672194 129.621169 174.916297 174.916297 0 0 1-102.275439 81.073463l-17.045906 3.854904c-23.310126 5.42096-46.258856 29.333415-50.595623 53.185637 0 0-3.854905 21.382674-3.854905 75.712737 0 54.330062 3.854905 75.712736 3.854905 75.712736 4.216302 23.972688 26.9241 47.945376 50.595623 53.185637l16.624276 3.854905a174.253736 174.253736 0 0 1 102.395904 81.314394c23.310126 40.837896 28.911785 87.337683 18.732427 129.801867l-4.81863 16.443578c-7.10748 23.129428 2.108151 54.992624 20.599646 70.833872 0 0 16.624276 14.094495 63.244529 41.199293 46.800951 27.104798 66.918735 34.513443 66.918735 34.513443 22.707798 8.372371 54.631227 0.361397 71.255503-17.407303l11.624947-12.588673a175.096996 175.096996 0 0 1 242.256662 0.120465l11.624947 12.648906c16.383345 17.708468 48.427239 25.598976 71.255503 17.347071 0 0 20.358715-7.529111 67.159666-34.513443 46.740719-27.104798 63.124063-41.199293 63.124064-41.199293 18.491496-15.600317 27.707127-47.463513 20.599646-70.833873l-5.059562-17.106139a176.723284 176.723284 0 0 1 18.672194-129.139305 176.060722 176.060722 0 0 1 102.395904-81.314394l16.68451-3.854905c23.310126-5.42096 46.258856-29.333415 50.595623-53.185637 0 0 3.854905-21.382674 3.854904-75.712737-0.240932-54.330062-4.095836-75.833202-4.095836-75.833202z m-537.819428 293.334149c-119.261112 0-216.175824-97.336342-216.175824-217.621412a216.657687 216.657687 0 0 1 216.236057-217.320249c119.200879 0 216.115591 97.276109 216.11559 217.56118-0.240932 120.044139-96.974945 217.320248-216.175823 217.320249z" p-id="10234"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg
deleted file mode 100644
index b4b48e4..0000000
--- a/src/assets/icons/svg/tab.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.921.052H49.08c-1.865 0-3.198 1.599-3.198 3.464v6.661c0 1.865 1.6 3.464 3.198 3.464h29.84c1.865 0 3.198-1.599 3.198-3.464V3.516C82.385 1.65 80.786.052 78.92.052zm45.563 0H94.642c-1.865 0-3.464 1.599-3.464 3.464v6.661c0 1.865 1.599 3.464 3.464 3.464h29.842c1.865-.266 3.464-1.599 3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464zm0 22.382H40.02c-1.866 0-3.464-1.599-3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464H3.516C1.65.052.052 1.651.052 3.516V124.75c0 1.598 1.599 3.197 3.464 3.197h120.968c1.865 0 3.464-1.599 3.464-3.464V25.898c0-1.865-1.599-3.464-3.464-3.464z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/table.svg b/src/assets/icons/svg/table.svg
deleted file mode 100644
index 0e3dc9d..0000000
--- a/src/assets/icons/svg/table.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/textarea.svg b/src/assets/icons/svg/textarea.svg
deleted file mode 100644
index 2709f29..0000000
--- a/src/assets/icons/svg/textarea.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802855098" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2984" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 160H128c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V224c0-35.2-28.8-64-64-64z m0 608c0 16-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V256c0-16 12.8-32 32-32h704c19.2 0 32 12.8 32 32v512z" p-id="2985"></path><path d="M224 288c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V320c0-16-12.8-32-32-32z m608 480c19.2 0 32-12.8 32-32V608L704 768h128z" p-id="2986"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg
deleted file mode 100644
index 5982a2f..0000000
--- a/src/assets/icons/svg/theme.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M125.5 36.984L95.336 2.83C93.735 1.018 91.565 0 89.3 0c-2.263 0-4.433 1.018-6.033 2.83l-3.786 4.286c-1.6 1.812-3.77 2.83-6.032 2.831H54.553c-2.263 0-4.434-1.018-6.033-2.83L44.734 2.83C43.134 1.018 40.964 0 38.701 0c-2.263 0-4.434 1.018-6.034 2.83L2.5 36.984C.9 38.796 0 41.254 0 43.815c0 2.562.899 5.02 2.5 6.831L14.565 64.31c2.178 2.468 5.367 3.403 8.33 2.444 1.35-.435 2.709.592 2.709 2.18v49.407c0 5.313 3.84 9.66 8.532 9.66h59.726c4.693 0 8.532-4.347 8.532-9.66V68.934c0-1.59 1.36-2.616 2.71-2.181 2.962.96 6.15.024 8.329-2.444L125.5 50.646c1.6-1.811 2.499-4.269 2.499-6.83 0-2.563-.899-5.02-2.5-6.832z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/time-range.svg b/src/assets/icons/svg/time-range.svg
deleted file mode 100644
index 13c1202..0000000
--- a/src/assets/icons/svg/time-range.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579774825624" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1248" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M498.595712 482.290351 345.420077 482.290351l0 57.307194 210.477712 0L555.897789 274.196942l-57.301054 0L498.596735 482.290351zM498.595712 482.290351" p-id="1249"></path><path d="M577.685002 644.98478l379.879913 0 0 57.302077L577.685002 702.286858 577.685002 644.98478 577.685002 644.98478zM577.685002 644.98478" p-id="1250"></path><path d="M577.685002 773.764795l379.879913 0 0 57.307194L577.685002 831.071989 577.685002 773.764795 577.685002 773.764795zM577.685002 773.764795" p-id="1251"></path><path d="M577.685002 902.549927l379.879913 0 0 57.307194L577.685002 959.857121 577.685002 902.549927 577.685002 902.549927zM577.685002 902.549927" p-id="1252"></path><path d="M102.523001 382.290823c4.450359 2.615571 9.470699 3.954055 14.530948 3.954055 2.969635 0 5.952572-0.461511 8.836249-1.394766l190.809767-61.886489c15.052834-4.882194 23.297612-21.040199 18.415418-36.08894-4.882194-15.052834-21.040199-23.297612-36.093033-18.415418L175.676092 308.458257c15.994276-26.115797 35.170011-50.537 57.370639-72.743768 73.767074-73.767074 171.845857-114.388237 276.16783-114.388237 104.32095 0 202.39564 40.622186 276.16169 114.388237s114.393353 171.845857 114.393353 276.16783c0 26.427906-2.615571 52.449559-7.709589 77.780481l58.302871 0c4.464685-25.499767 6.708795-51.470255 6.708795-77.780481 0-60.449767-11.845793-119.102608-35.204803-174.336584-22.559808-53.334719-54.850236-101.226472-95.968725-142.349055-41.122583-41.122583-89.017406-73.408917-142.348032-95.968725C628.317169 75.866898 569.659211 64.021106 509.215584 64.021106c-60.448744 0-119.106702 11.845793-174.336584 35.207873-53.334719 22.559808-101.230566 54.846142-142.349055 95.968725-23.980157 23.980157-44.934398 50.278103-62.727647 78.601172l-20.738323-105.655342c-3.043313-15.527648-18.105357-25.642007-33.631982-22.599717-15.527648 3.048429-25.64303 18.105357-22.599717 33.637098l36.102243 183.932126C90.51348 371.153158 95.460142 378.13313 102.523001 382.290823L102.523001 382.290823zM102.523001 382.290823" p-id="1253"></path><path d="M126.020158 587.9416 67.768453 587.9416c5.759167 33.679054 15.368012 66.544579 28.789697 98.278327 22.559808 53.333696 54.850236 101.225449 95.971795 142.348032 41.122583 41.122583 89.014336 73.408917 142.349055 95.968725 54.112432 22.88829 111.517863 34.71157 170.668031 35.18229L505.547031 902.395408c-102.94972-0.941442-199.594851-41.445948-272.499277-114.349351C177.545672 732.543975 140.810003 663.275355 126.020158 587.9416L126.020158 587.9416zM126.020158 587.9416" p-id="1254"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/time.svg b/src/assets/icons/svg/time.svg
deleted file mode 100644
index b376e32..0000000
--- a/src/assets/icons/svg/time.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577099827399" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1008" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M520 559h204c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32H488c-17.673 0-32-14.327-32-32 0-0.167 0.001-0.334 0.004-0.5a32.65 32.65 0 0 1-0.004-0.5V277c0-17.673 14.327-32 32-32 17.673 0 32 14.327 32 32v282z m-8 401C264.576 960 64 759.424 64 512S264.576 64 512 64s448 200.576 448 448-200.576 448-448 448z m0-64c212.077 0 384-171.923 384-384S724.077 128 512 128 128 299.923 128 512s171.923 384 384 384z" p-id="1009"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/tool.svg b/src/assets/icons/svg/tool.svg
deleted file mode 100644
index 48e0e35..0000000
--- a/src/assets/icons/svg/tool.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1553828490559" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1684" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M898.831744 900.517641 103.816972 900.517641c-36.002982 0-65.363683-29.286-65.363683-65.313541l0-554.949184c0-36.041868 29.361725-65.326844 65.363683-65.326844l795.015795 0c36.002982 0 65.198931 29.284977 65.198931 65.326844l0 554.949184C964.030675 871.231641 934.834726 900.517641 898.831744 900.517641L898.831744 900.517641zM103.816972 255.593236c-13.576203 0-24.711821 11.085476-24.711821 24.662703l0 554.949184c0 13.576203 11.136641 24.662703 24.711821 24.662703l795.015795 0c13.577227 0 24.547069-11.086499 24.547069-24.662703l0-554.949184c0-13.577227-10.970866-24.662703-24.547069-24.662703L103.816972 255.593236 103.816972 255.593236zM664.346245 251.774257c-11.161201 0-20.332071-9.080819-20.332071-20.332071l0-101.278661c0-13.576203-11.047614-24.623817-24.699542-24.623817L383.181611 105.539708c-13.576203 0-24.712845 11.04659-24.712845 24.623817l0 101.278661c0 11.252275-9.041934 20.332071-20.332071 20.332071-11.20111 0-20.319791-9.080819-20.319791-20.332071l0-101.278661c0-35.989679 29.323862-65.275679 65.364707-65.275679l236.133022 0c36.06745 0 65.402569 29.284977 65.402569 65.275679l0 101.278661C684.717202 242.694461 675.636383 251.774257 664.346245 251.774257L664.346245 251.774257zM413.233044 521.725502 75.694471 521.725502c-11.163247 0-20.333094-9.117658-20.333094-20.35663 0-11.252275 9.169847-20.332071 20.333094-20.332071l337.538573 0c11.277858 0 20.319791 9.080819 20.319791 20.332071C433.552835 512.607844 424.510902 521.725502 413.233044 521.725502L413.233044 521.725502zM912.894018 521.725502 575.367725 521.725502c-11.213389 0-20.332071-9.117658-20.332071-20.35663 0-11.252275 9.118682-20.332071 20.332071-20.332071l337.526293 0c11.290137 0 20.332071 9.080819 20.332071 20.332071C933.226089 512.607844 924.184155 521.725502 912.894018 521.725502L912.894018 521.725502zM557.56322 634.217552 445.085496 634.217552c-11.213389 0-20.332071-9.079796-20.332071-20.331048l0-168.763658c0-11.251252 9.118682-20.332071 20.332071-20.332071l112.478747 0c11.290137 0 20.370956 9.080819 20.370956 20.332071l0 168.763658C577.934177 625.137757 568.853357 634.217552 557.56322 634.217552L557.56322 634.217552zM465.417567 593.514525l71.827909 0L537.245476 465.454918l-71.827909 0L465.417567 593.514525 465.417567 593.514525z" p-id="1685"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg
deleted file mode 100644
index 8aafdb8..0000000
--- a/src/assets/icons/svg/tree-table.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg
deleted file mode 100644
index dd4b7dd..0000000
--- a/src/assets/icons/svg/tree.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/upload.svg b/src/assets/icons/svg/upload.svg
deleted file mode 100644
index bae49c0..0000000
--- a/src/assets/icons/svg/upload.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577540289643" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7922" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M530.944 458.24l4.8 3.456 122.176 106.816a32 32 0 0 1-37.44 51.584l-4.672-3.392L546.56 556.16v280.704a32 32 0 0 1-26.24 31.488l-5.76 0.512a32 32 0 0 1-31.424-26.24l-0.512-5.76-0.064-280.704-69.12 60.48a32 32 0 0 1-40.96 0.896l-4.16-3.968a32 32 0 0 1-0.96-40.96l4.032-4.16 122.176-106.816a32 32 0 0 1 37.312-3.456zM497.92 128c128.128 0 239.168 82.304 275.52 199.04 123.968 11.264 221.312 113.088 221.312 237.44 0 128.128-103.68 232.96-234.88 238.272h-5.888l-35.52 0.192a32 32 0 0 1-0.192-64l35.264-0.128 4.672-0.064c96.384-3.84 172.544-80.896 172.544-174.272 0-96.128-80.512-174.464-179.584-174.464h-1.984a32 32 0 0 1-32-25.28C695.872 264.96 604.736 192 497.92 192 381.824 192 285.44 277.76 274.816 388.48a32 32 0 0 1-28.352 28.8c-83.968 9.152-147.84 78.208-147.84 159.552l0.192 7.936c3.84 85.76 77.056 154.112 166.592 154.112h45.632a32 32 0 0 1 0 64h-45.632C142.016 802.944 40.32 708.032 34.88 586.88l-0.192-9.28c0-106.88 76.352-197.184 179.968-219.904C239.488 226.112 357.76 128 497.856 128z" p-id="7923"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg
deleted file mode 100644
index 0ba0716..0000000
--- a/src/assets/icons/svg/user.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg
deleted file mode 100644
index cfb1021..0000000
--- a/src/assets/icons/svg/validCode.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569580729849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1939" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M513.3 958.5c-142.2 0-397.9-222.1-401.6-440.5V268c1.7-39.6 31.7-72.3 71.1-77.3 49-4.6 97.1-16.5 142.7-35.3 47.8-14 91.9-38.3 129.4-71.1 30.3-24.4 72.9-26.3 105.3-4.6 39.9 30.7 83.8 55.9 130.5 74.6 48.6 14.7 98.2 25.9 148.4 33.7 38.5 7.6 67.1 40.3 69.5 79.5 3.3 84.9 2.5 169.9-2.6 254.7-33.7 281.6-253.7 436.4-392.7 436.3z m-0.1-813.7c-7.2-0.2-14.3 2-20 6.4-39.7 35.2-86.8 61.1-137.7 75.7-46.8 19.2-96.2 31-146.6 35.2-11 3.2-18.8 13-19.5 24.4v230.1c3.5 180.3 223.3 361 323.9 361s287.3-120.2 317.6-360.5c7.3-142.7 0-228.6 0-229.6-1.3-13.3-11-24.3-24-27.3-49.6-7.7-98.6-19-146.5-33.7-46.3-19.5-89.7-45.3-129-76.7-5.8-3.8-12.7-5.5-19.5-4.9l1.3-0.1z" fill="#C6CCDA" p-id="1940"></path><path d="M750.1 428L490.7 673.2c-11.7 11.1-29.5 12.9-43.1 4.2l-6.8-5.8-141.2-149.4c-9.3-9.3-12.7-22.9-9-35.5 3.8-12.6 14.1-22.1 27-24.8 12.9-2.7 26.1 1.9 34.6 11.9L469 597.5l233.7-221c14.6-12.8 36.8-11.6 49.9 2.7 13.2 14.2 11.5 35.3-2.5 48.8" fill="#C6CCDA" p-id="1941"></path></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg
deleted file mode 100644
index c586e55..0000000
--- a/src/assets/icons/svg/wechat.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg>
\ No newline at end of file
diff --git a/src/assets/icons/svg/zip.svg b/src/assets/icons/svg/zip.svg
deleted file mode 100644
index f806fc4..0000000
--- a/src/assets/icons/svg/zip.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.527 116.793c.178.008.348.024.527.024h40.233c4.711-.005 8.53-3.677 8.534-8.21V18.895c-.004-4.532-3.823-8.204-8.534-8.209H79.054c-.179 0-.353.016-.527.024V0L0 10.082v107.406l78.527 10.342v-11.037zm0-101.362c.174-.024.348-.052.527-.052h40.233c2.018 0 3.659 1.578 3.659 3.52v89.713c-.003 1.942-1.64 3.517-3.659 3.519H79.054c-.179 0-.353-.028-.527-.052V15.431zM30.262 75.757l-18.721-.46V72.37l11.3-16.673v-.148l-10.266.164v-4.51l17.504-.44v3.264L18.696 70.76v.144l11.566.176v4.678zm9.419.231l-5.823-.144V50.671l5.823-.144v25.461zm22.255-11.632c-2.168 1.922-5.353 2.76-9.02 2.736-.702.004-1.402-.04-2.097-.131v9.303l-5.997-.148V50.743c1.852-.352 4.473-.647 8.218-.743 3.838-.096 6.608.539 8.48 1.913 1.807 1.306 3.032 3.5 3.032 6.112s-.926 4.833-2.612 6.331h-.004zM53.36 54.45c-.856-.01-1.71.083-2.541.275v7.682c.523.116 1.167.152 2.06.152 3.301-.004 5.36-1.614 5.36-4.314 0-2.425-1.772-3.843-4.875-3.791l-.004-.004zm39.847-37.066h9.564v3.795h-9.564v-3.795zm-9.568 5.68h9.564v3.8h-9.564v-3.8zm9.568 6.216h9.564v3.799h-9.564V29.28zm0 12h9.564v3.794h-9.564V41.28zm-9.568-6.096h9.564v3.795h-9.564v-3.795zm9.472 47.064c2.512 0 4.921-.96 6.697-2.67 1.776-1.708 2.773-4.026 2.772-6.442l-1.748-15.263c0-5.033-2.492-9.112-7.725-9.112-5.232 0-7.72 4.079-7.72 9.112l-1.752 15.263c-.001 2.417.996 4.735 2.773 6.444 1.777 1.71 4.187 2.669 6.7 2.668h.003zm-3.135-16.75h6.27v12.743h-6.27V65.5z"/></svg>
\ No newline at end of file
diff --git a/src/assets/images/Rectangle 76@2x.png b/src/assets/images/Rectangle 76@2x.png
deleted file mode 100644
index 3aa9a4b..0000000
--- a/src/assets/images/Rectangle 76@2x.png
+++ /dev/null
Binary files differ
diff --git "a/src/assets/images/Rectangle 77@2x\0501\051.png" "b/src/assets/images/Rectangle 77@2x\0501\051.png"
deleted file mode 100644
index 995a340..0000000
--- "a/src/assets/images/Rectangle 77@2x\0501\051.png"
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/Rectangle 77@2x.png b/src/assets/images/Rectangle 77@2x.png
deleted file mode 100644
index 3957c66..0000000
--- a/src/assets/images/Rectangle 77@2x.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/caigou.png b/src/assets/images/caigou.png
deleted file mode 100644
index 3d54f1a..0000000
--- a/src/assets/images/caigou.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/chuchang.png b/src/assets/images/chuchang.png
deleted file mode 100644
index 81d3ee1..0000000
--- a/src/assets/images/chuchang.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/dark.svg b/src/assets/images/dark.svg
deleted file mode 100644
index 36b58b5..0000000
--- a/src/assets/images/dark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs>
- <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
- <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
- <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
- <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
- <feMerge>
- <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
- <feMergeNode in="SourceGraphic"></feMergeNode>
- </feMerge>
- </filter>
- <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
- <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
- <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
- <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
- <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
- </filter>
- </defs>
- <g id="閰嶇疆闈㈡澘" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
- <g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
- <g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
- <mask id="mask-3" fill="white">
- <use xlink:href="#path-2"></use>
- </mask>
- <g id="Rectangle-18">
- <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
- <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
- </g>
- <rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
- <rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
- </g>
- </g>
- </g>
- </g>
-</svg>
\ No newline at end of file
diff --git a/src/assets/images/denglu.png b/src/assets/images/denglu.png
deleted file mode 100644
index 0a04a27..0000000
--- a/src/assets/images/denglu.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/guocheng.png b/src/assets/images/guocheng.png
deleted file mode 100644
index 45d88df..0000000
--- a/src/assets/images/guocheng.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/icon 3.png b/src/assets/images/icon 3.png
deleted file mode 100644
index 08c335b..0000000
--- a/src/assets/images/icon 3.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/icon1.png b/src/assets/images/icon1.png
deleted file mode 100644
index adc9abc..0000000
--- a/src/assets/images/icon1.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/icon2.png b/src/assets/images/icon2.png
deleted file mode 100644
index a736c6c..0000000
--- a/src/assets/images/icon2.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/khtitle.png b/src/assets/images/khtitle.png
deleted file mode 100644
index 81cb4bf..0000000
--- a/src/assets/images/khtitle.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/kucun.png b/src/assets/images/kucun.png
deleted file mode 100644
index d89d059..0000000
--- a/src/assets/images/kucun.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/light.svg b/src/assets/images/light.svg
deleted file mode 100644
index efd52c6..0000000
--- a/src/assets/images/light.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs>
- <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
- <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
- <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
- <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
- <feMerge>
- <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
- <feMergeNode in="SourceGraphic"></feMergeNode>
- </feMerge>
- </filter>
- <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
- <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
- <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
- <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
- <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
- </filter>
- </defs>
- <g id="閰嶇疆闈㈡澘" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="setting-copy-2" transform="translate(-1254.000000, -136.000000)">
- <g id="Group-8" transform="translate(1167.000000, 0.000000)">
- <g id="Group-5" filter="url(#filter-1)" transform="translate(89.000000, 137.000000)">
- <mask id="mask-3" fill="white">
- <use xlink:href="#path-2"></use>
- </mask>
- <g id="Rectangle-18">
- <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
- <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
- </g>
- <rect id="Rectangle-18" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
- <rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
- </g>
- </g>
- </g>
- </g>
-</svg>
\ No newline at end of file
diff --git a/src/assets/images/login-background.png b/src/assets/images/login-background.png
deleted file mode 100644
index ace9d53..0000000
--- a/src/assets/images/login-background.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/pay.png b/src/assets/images/pay.png
deleted file mode 100644
index bb8b967..0000000
--- a/src/assets/images/pay.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/profile.jpg b/src/assets/images/profile.jpg
deleted file mode 100644
index b3a940b..0000000
--- a/src/assets/images/profile.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/xioashoushuju.png b/src/assets/images/xioashoushuju.png
deleted file mode 100644
index a7f1588..0000000
--- a/src/assets/images/xioashoushuju.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/yuancailiao.png b/src/assets/images/yuancailiao.png
deleted file mode 100644
index 6ec429f..0000000
--- a/src/assets/images/yuancailiao.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/clown-face.png b/src/assets/img/emoji/clown-face.png
deleted file mode 100644
index fd77228..0000000
--- a/src/assets/img/emoji/clown-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/face-screaming-in-fear.png b/src/assets/img/emoji/face-screaming-in-fear.png
deleted file mode 100644
index d6332ce..0000000
--- a/src/assets/img/emoji/face-screaming-in-fear.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/face-vomiting.png b/src/assets/img/emoji/face-vomiting.png
deleted file mode 100644
index dcc556f..0000000
--- a/src/assets/img/emoji/face-vomiting.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/face-with-tongue.png b/src/assets/img/emoji/face-with-tongue.png
deleted file mode 100644
index b2e228e..0000000
--- a/src/assets/img/emoji/face-with-tongue.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/face-without-mouth.png b/src/assets/img/emoji/face-without-mouth.png
deleted file mode 100644
index e48a05a..0000000
--- a/src/assets/img/emoji/face-without-mouth.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/ghost.png b/src/assets/img/emoji/ghost.png
deleted file mode 100644
index 8a4b03a..0000000
--- a/src/assets/img/emoji/ghost.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/hibiscus.png b/src/assets/img/emoji/hibiscus.png
deleted file mode 100644
index 5fddeb5..0000000
--- a/src/assets/img/emoji/hibiscus.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/jack-o-lantern.png b/src/assets/img/emoji/jack-o-lantern.png
deleted file mode 100644
index 7014639..0000000
--- a/src/assets/img/emoji/jack-o-lantern.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/lips.png b/src/assets/img/emoji/lips.png
deleted file mode 100644
index 40915bd..0000000
--- a/src/assets/img/emoji/lips.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/loudly-crying-face.png b/src/assets/img/emoji/loudly-crying-face.png
deleted file mode 100644
index d72008d..0000000
--- a/src/assets/img/emoji/loudly-crying-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/money-bag.png b/src/assets/img/emoji/money-bag.png
deleted file mode 100644
index df46b05..0000000
--- a/src/assets/img/emoji/money-bag.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/money-mouth-face.png b/src/assets/img/emoji/money-mouth-face.png
deleted file mode 100644
index f7c4cdf..0000000
--- a/src/assets/img/emoji/money-mouth-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/new-moon-face.png b/src/assets/img/emoji/new-moon-face.png
deleted file mode 100644
index 8942b8b..0000000
--- a/src/assets/img/emoji/new-moon-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/ok-hand-yellow.png b/src/assets/img/emoji/ok-hand-yellow.png
deleted file mode 100644
index 4dbd427..0000000
--- a/src/assets/img/emoji/ok-hand-yellow.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/pile-of-poo.png b/src/assets/img/emoji/pile-of-poo.png
deleted file mode 100644
index 28f149a..0000000
--- a/src/assets/img/emoji/pile-of-poo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/pouting-face.png b/src/assets/img/emoji/pouting-face.png
deleted file mode 100644
index 0265aa2..0000000
--- a/src/assets/img/emoji/pouting-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/rainbow.png b/src/assets/img/emoji/rainbow.png
deleted file mode 100644
index 7794ded..0000000
--- a/src/assets/img/emoji/rainbow.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/rocket.png b/src/assets/img/emoji/rocket.png
deleted file mode 100644
index 04a7619..0000000
--- a/src/assets/img/emoji/rocket.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/shamrock.png b/src/assets/img/emoji/shamrock.png
deleted file mode 100644
index 8fe0836..0000000
--- a/src/assets/img/emoji/shamrock.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/shangchuan.png b/src/assets/img/emoji/shangchuan.png
deleted file mode 100644
index af16fb4..0000000
--- a/src/assets/img/emoji/shangchuan.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/slightly-smiling-face.png b/src/assets/img/emoji/slightly-smiling-face.png
deleted file mode 100644
index be7dd9f..0000000
--- a/src/assets/img/emoji/slightly-smiling-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/smiling-face-with-heart-eyes.png b/src/assets/img/emoji/smiling-face-with-heart-eyes.png
deleted file mode 100644
index c838d4f..0000000
--- a/src/assets/img/emoji/smiling-face-with-heart-eyes.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/smiling-face-with-horns.png b/src/assets/img/emoji/smiling-face-with-horns.png
deleted file mode 100644
index b79738c..0000000
--- a/src/assets/img/emoji/smiling-face-with-horns.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/smiling-face-with-sunglasses.png b/src/assets/img/emoji/smiling-face-with-sunglasses.png
deleted file mode 100644
index 58b8604..0000000
--- a/src/assets/img/emoji/smiling-face-with-sunglasses.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/smiling-face.png b/src/assets/img/emoji/smiling-face.png
deleted file mode 100644
index 3c2915b..0000000
--- a/src/assets/img/emoji/smiling-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/sparkles.png b/src/assets/img/emoji/sparkles.png
deleted file mode 100644
index 4d11a1b..0000000
--- a/src/assets/img/emoji/sparkles.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/star.png b/src/assets/img/emoji/star.png
deleted file mode 100644
index 44f80bb..0000000
--- a/src/assets/img/emoji/star.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/thinking-face.png b/src/assets/img/emoji/thinking-face.png
deleted file mode 100644
index 33d791d..0000000
--- a/src/assets/img/emoji/thinking-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/thought-balloon.png b/src/assets/img/emoji/thought-balloon.png
deleted file mode 100644
index 892eedc..0000000
--- a/src/assets/img/emoji/thought-balloon.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/thumbs-up-yellow.png b/src/assets/img/emoji/thumbs-up-yellow.png
deleted file mode 100644
index c30b6ae..0000000
--- a/src/assets/img/emoji/thumbs-up-yellow.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/tired-face.png b/src/assets/img/emoji/tired-face.png
deleted file mode 100644
index d1deba8..0000000
--- a/src/assets/img/emoji/tired-face.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/two-hearts.png b/src/assets/img/emoji/two-hearts.png
deleted file mode 100644
index 4259b46..0000000
--- a/src/assets/img/emoji/two-hearts.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/emoji/victory-hand-yellow.png b/src/assets/img/emoji/victory-hand-yellow.png
deleted file mode 100644
index fc46ce2..0000000
--- a/src/assets/img/emoji/victory-hand-yellow.png
+++ /dev/null
Binary files differ
diff --git "a/src/assets/img/emoji/\345\217\226\346\266\210.png" "b/src/assets/img/emoji/\345\217\226\346\266\210.png"
deleted file mode 100644
index 30df0a9..0000000
--- "a/src/assets/img/emoji/\345\217\226\346\266\210.png"
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/excel.png b/src/assets/img/fileImg/excel.png
deleted file mode 100644
index ae8929c..0000000
--- a/src/assets/img/fileImg/excel.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/pdf.png b/src/assets/img/fileImg/pdf.png
deleted file mode 100644
index 3653045..0000000
--- a/src/assets/img/fileImg/pdf.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/ppt.png b/src/assets/img/fileImg/ppt.png
deleted file mode 100644
index 2362d61..0000000
--- a/src/assets/img/fileImg/ppt.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/txt.png b/src/assets/img/fileImg/txt.png
deleted file mode 100644
index 0ce91dc..0000000
--- a/src/assets/img/fileImg/txt.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/unknowfile.png b/src/assets/img/fileImg/unknowfile.png
deleted file mode 100644
index 75e22fb..0000000
--- a/src/assets/img/fileImg/unknowfile.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/word.png b/src/assets/img/fileImg/word.png
deleted file mode 100644
index 97e8a69..0000000
--- a/src/assets/img/fileImg/word.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/fileImg/zpi.png b/src/assets/img/fileImg/zpi.png
deleted file mode 100644
index de3c681..0000000
--- a/src/assets/img/fileImg/zpi.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/head_portrait.jpg b/src/assets/img/head_portrait.jpg
deleted file mode 100644
index dd345b3..0000000
--- a/src/assets/img/head_portrait.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/head_portrait1.png b/src/assets/img/head_portrait1.png
deleted file mode 100644
index 3134bd5..0000000
--- a/src/assets/img/head_portrait1.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png
deleted file mode 100644
index b53ef8a..0000000
--- a/src/assets/img/logo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/DHDCLogo.png b/src/assets/indexViews/DHDCLogo.png
deleted file mode 100644
index 139bdd1..0000000
--- a/src/assets/indexViews/DHDCLogo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/DHDCView.png b/src/assets/indexViews/DHDCView.png
deleted file mode 100644
index 7d3e8af..0000000
--- a/src/assets/indexViews/DHDCView.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/HYSNLogo.png b/src/assets/indexViews/HYSNLogo.png
deleted file mode 100644
index 70148cc..0000000
--- a/src/assets/indexViews/HYSNLogo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/HYSNView.png b/src/assets/indexViews/HYSNView.png
deleted file mode 100644
index ccd5fcc..0000000
--- a/src/assets/indexViews/HYSNView.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/JZYJLogo.png b/src/assets/indexViews/JZYJLogo.png
deleted file mode 100644
index b50afc2..0000000
--- a/src/assets/indexViews/JZYJLogo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/JZYJView.png b/src/assets/indexViews/JZYJView.png
deleted file mode 100644
index f64d46b..0000000
--- a/src/assets/indexViews/JZYJView.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/WDSYLogo.png b/src/assets/indexViews/WDSYLogo.png
deleted file mode 100644
index 3bc9755..0000000
--- a/src/assets/indexViews/WDSYLogo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/WDSYView.png b/src/assets/indexViews/WDSYView.png
deleted file mode 100644
index 19ec19d..0000000
--- a/src/assets/indexViews/WDSYView.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/ZQHXLogo.png b/src/assets/indexViews/ZQHXLogo.png
deleted file mode 100644
index 6924240..0000000
--- a/src/assets/indexViews/ZQHXLogo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/indexViews/ZQHXView.png b/src/assets/indexViews/ZQHXView.png
deleted file mode 100644
index 1830213..0000000
--- a/src/assets/indexViews/ZQHXView.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
deleted file mode 100644
index 91a5896..0000000
--- a/src/assets/logo/logo.png
+++ /dev/null
Binary files differ
diff --git "a/src/assets/logo/\344\270\212\346\265\267\351\203\242\346\230\261\347\275\221\347\273\234\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png" "b/src/assets/logo/\344\270\212\346\265\267\351\203\242\346\230\261\347\275\221\347\273\234\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png"
deleted file mode 100644
index f469ba7..0000000
--- "a/src/assets/logo/\344\270\212\346\265\267\351\203\242\346\230\261\347\275\221\347\273\234\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/logo/\345\215\227\351\200\232\344\272\221\344\273\216\345\267\245\344\270\232\344\272\222\350\201\224\347\275\221\346\234\211\351\231\220\345\205\254\345\217\270.png" "b/src/assets/logo/\345\215\227\351\200\232\344\272\221\344\273\216\345\267\245\344\270\232\344\272\222\350\201\224\347\275\221\346\234\211\351\231\220\345\205\254\345\217\270.png"
deleted file mode 100644
index d7ecf59..0000000
--- "a/src/assets/logo/\345\215\227\351\200\232\344\272\221\344\273\216\345\267\245\344\270\232\344\272\222\350\201\224\347\275\221\346\234\211\351\231\220\345\205\254\345\217\270.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/logo/\346\225\246\347\205\214\351\274\216\350\257\232.png" "b/src/assets/logo/\346\225\246\347\205\214\351\274\216\350\257\232.png"
deleted file mode 100644
index 139bdd1..0000000
--- "a/src/assets/logo/\346\225\246\347\205\214\351\274\216\350\257\232.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/logo/\346\226\260\347\274\206\357\274\210\346\261\237\350\213\217\357\274\211\346\225\260\345\255\227\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png" "b/src/assets/logo/\346\226\260\347\274\206\357\274\210\346\261\237\350\213\217\357\274\211\346\225\260\345\255\227\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png"
deleted file mode 100644
index 4481de2..0000000
--- "a/src/assets/logo/\346\226\260\347\274\206\357\274\210\346\261\237\350\213\217\357\274\211\346\225\260\345\255\227\347\247\221\346\212\200\346\234\211\351\231\220\345\205\254\345\217\270.png"
+++ /dev/null
Binary files differ
diff --git "a/src/assets/logo/\350\212\257\345\257\274\350\275\257\344\273\266\357\274\210\346\261\237\350\213\217\357\274\211\346\234\211\351\231\220\345\205\254\345\217\270.png" "b/src/assets/logo/\350\212\257\345\257\274\350\275\257\344\273\266\357\274\210\346\261\237\350\213\217\357\274\211\346\234\211\351\231\220\345\205\254\345\217\270.png"
deleted file mode 100644
index 5b49e96..0000000
--- "a/src/assets/logo/\350\212\257\345\257\274\350\275\257\344\273\266\357\274\210\346\261\237\350\213\217\357\274\211\346\234\211\351\231\220\345\205\254\345\217\270.png"
+++ /dev/null
Binary files differ
diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss
deleted file mode 100644
index 46a41f3..0000000
--- a/src/assets/styles/btn.scss
+++ /dev/null
@@ -1,99 +0,0 @@
-@import './variables.module.scss';
-
-@mixin colorBtn($color) {
- background: $color;
-
- &:hover {
- color: $color;
-
- &:before,
- &:after {
- background: $color;
- }
- }
-}
-
-.blue-btn {
- @include colorBtn($blue)
-}
-
-.light-blue-btn {
- @include colorBtn($light-blue)
-}
-
-.red-btn {
- @include colorBtn($red)
-}
-
-.pink-btn {
- @include colorBtn($pink)
-}
-
-.green-btn {
- @include colorBtn($green)
-}
-
-.tiffany-btn {
- @include colorBtn($tiffany)
-}
-
-.yellow-btn {
- @include colorBtn($yellow)
-}
-
-.pan-btn {
- font-size: 14px;
- color: #fff;
- padding: 14px 36px;
- border-radius: 8px;
- border: none;
- outline: none;
- transition: 600ms ease all;
- position: relative;
- display: inline-block;
-
- &:hover {
- background: #fff;
-
- &:before,
- &:after {
- width: 100%;
- transition: 600ms ease all;
- }
- }
-
- &:before,
- &:after {
- content: '';
- position: absolute;
- top: 0;
- right: 0;
- height: 2px;
- width: 0;
- transition: 400ms ease all;
- }
-
- &::after {
- right: inherit;
- top: inherit;
- left: 0;
- bottom: 0;
- }
-}
-
-.custom-button {
- display: inline-block;
- line-height: 1;
- white-space: nowrap;
- cursor: pointer;
- background: #fff;
- color: #fff;
- -webkit-appearance: none;
- text-align: center;
- box-sizing: border-box;
- outline: 0;
- margin: 0;
- padding: 10px 15px;
- font-size: 14px;
- border-radius: 4px;
-}
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
deleted file mode 100644
index 8c741af..0000000
--- a/src/assets/styles/element-ui.scss
+++ /dev/null
@@ -1,154 +0,0 @@
-// cover some element-ui styles
-
-.el-breadcrumb__inner,
-.el-breadcrumb__inner a {
- font-weight: 400 !important;
-}
-
-.el-upload {
- input[type="file"] {
- display: none !important;
- }
-}
-
-.el-upload__input {
- display: none;
-}
-
-.cell {
- .el-tag {
- margin-right: 0px;
- }
-}
-
-.small-padding {
- .cell {
- padding-left: 5px;
- padding-right: 5px;
- }
-}
-
-.fixed-width {
- .el-button--mini {
- padding: 7px 10px;
- width: 60px;
- }
-}
-
-.status-col {
- .cell {
- padding: 0 10px;
- text-align: center;
-
- .el-tag {
- margin-right: 0px;
- }
- }
-}
-
-// to fixed https://github.com/ElemeFE/element/issues/2461
-.el-dialog {
- transform: none;
- left: 0;
- position: relative;
- margin: 0 auto;
- border-radius: 8px;
- padding: 0 !important;
-}
-.el-dialog__header {
- background: #f5f6f7;
- padding: 12px 16px;
- border-radius: 8px 8px 0 0;
-}
-.el-dialog__title {
- font-weight: 400;
- font-size: 16px;
- color: #2e3033;
-}
-.el-dialog__body {
- padding: 16px 40px 0 40px;
- max-height: 74vh;
- overflow-y: auto;
-}
-.el-dialog__footer {
- text-align: center;
- padding: 16px;
-}
-.el-message-box {
- padding: 0 !important;
- border-radius: 8px;
-}
-.el-message-box__header {
- background: #f5f6f7;
- padding: 12px 16px;
- border-radius: 8px 8px 0 0;
-}
-.el-message-box__title {
- font-weight: 400;
- font-size: 16px;
- color: #2e3033;
-}
-.el-message-box__content {
- padding: 16px 40px 0 40px;
-}
-.el-message-box__container {
- justify-content: center;
-}
-.el-message-box__btns {
- text-align: center;
- padding: 16px;
- display: flex;
- flex-direction: row-reverse;
- justify-content: center;
- align-items: center;
- .el-button--primary {
- margin-right: 12px;
- }
-}
-.el-table__expanded-cell {
- padding: 0 !important;
- .el-table__header-wrapper {
- background-color: #f5f8ff !important;
- }
-}
-
-// refine element ui upload
-.upload-container {
- .el-upload {
- width: 100%;
-
- .el-upload-dragger {
- width: 100%;
- height: 200px;
- }
- }
-}
-
-// dropdown
-.el-dropdown-menu {
- a {
- display: block;
- }
-}
-
-// fix date-picker ui bug in filter-item
-.el-range-editor.el-input__inner {
- display: inline-flex !important;
-}
-
-// to fix el-date-picker css style
-.el-range-separator {
- box-sizing: content-box;
-}
-
-.el-menu--collapse
- > div
- > .el-submenu
- > .el-submenu__title
- .el-submenu__icon-arrow {
- display: none;
-}
-
-.el-dropdown .el-dropdown-link {
- color: var(--el-color-primary) !important;
-}
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
deleted file mode 100644
index 13d26ee..0000000
--- a/src/assets/styles/index.scss
+++ /dev/null
@@ -1,195 +0,0 @@
-@import './variables.module.scss';
-@import './mixin.scss';
-@import './transition.scss';
-@import './element-ui.scss';
-@import './sidebar.scss';
-@import './btn.scss';
-@import './ruoyi.scss';
-
-body {
- height: 100%;
- margin: 0;
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
- text-rendering: optimizeLegibility;
- font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
-}
-
-label {
- font-weight: 700;
-}
-
-html {
- height: 100%;
- box-sizing: border-box;
-}
-
-#app {
- height: 100%;
-}
-
-*,
-*:before,
-*:after {
- box-sizing: inherit;
-}
-
-.no-padding {
- padding: 0px !important;
-}
-
-.padding-content {
- padding: 4px 0;
-}
-
-a:focus,
-a:active {
- outline: none;
-}
-
-a,
-a:focus,
-a:hover {
- cursor: pointer;
- color: inherit;
- text-decoration: none;
-}
-
-div:focus {
- outline: none;
-}
-
-.fr {
- float: right;
-}
-
-.fl {
- float: left;
-}
-
-.pr-5 {
- padding-right: 5px;
-}
-
-.pl-5 {
- padding-left: 5px;
-}
-
-.block {
- display: block;
-}
-
-.pointer {
- cursor: pointer;
-}
-
-.inlineBlock {
- display: block;
-}
-
-.clearfix {
- &:after {
- visibility: hidden;
- display: block;
- font-size: 0;
- content: " ";
- clear: both;
- height: 0;
- }
-}
-
-aside {
- background: #eef1f6;
- padding: 8px 24px;
- margin-bottom: 20px;
- border-radius: 2px;
- display: block;
- line-height: 32px;
- font-size: 16px;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
- color: #2c3e50;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
- a {
- color: #337ab7;
- cursor: pointer;
-
- &:hover {
- color: rgb(32, 160, 255);
- }
- }
-}
-
-//main-container鍏ㄥ眬鏍峰紡
-.app-container {
- padding: 20px;
-}
-.search_form {
- display: flex;
- align-items: center;
- justify-content: space-between;
- .search_title {
- font-size: 14px;
- font-weight: 700;
- color: #333333;
- }
-}
-.table_list {
- height: calc(100vh - 11em);
- margin-top: 20px;
- background: #fff;
- padding: 18px
-}
-.components-container {
- margin: 30px 50px;
- position: relative;
-}
-
-.text-center {
- text-align: center
-}
-
-.sub-navbar {
- height: 50px;
- line-height: 50px;
- position: relative;
- width: 100%;
- text-align: right;
- padding-right: 20px;
- transition: 600ms ease position;
- background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
-
- .subtitle {
- font-size: 20px;
- color: #fff;
- }
-
- &.draft {
- background: #d0d0d0;
- }
-
- &.deleted {
- background: #d0d0d0;
- }
-}
-
-.link-type,
-.link-type:focus {
- color: #337ab7;
- cursor: pointer;
-
- &:hover {
- color: rgb(32, 160, 255);
- }
-}
-
-.filter-container {
- padding-bottom: 10px;
-
- .filter-item {
- display: inline-block;
- vertical-align: middle;
- margin-bottom: 10px;
- }
-}
diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss
deleted file mode 100644
index 64d9cf6..0000000
--- a/src/assets/styles/mixin.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-@mixin clearfix {
- &:after {
- content: "";
- display: table;
- clear: both;
- }
-}
-
-@mixin scrollBar {
- &::-webkit-scrollbar-track-piece {
- background: #d3dce6;
- }
-
- &::-webkit-scrollbar {
- width: 6px;
- }
-
- &::-webkit-scrollbar-thumb {
- background: #99a9bf;
- border-radius: 20px;
- }
-}
-
-@mixin relative {
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-@mixin pct($pct) {
- width: #{$pct};
- position: relative;
- margin: 0 auto;
-}
-
-@mixin triangle($width, $height, $color, $direction) {
- $width: $width/2;
- $color-border-style: $height solid $color;
- $transparent-border-style: $width solid transparent;
- height: 0;
- width: 0;
-
- @if $direction==up {
- border-bottom: $color-border-style;
- border-left: $transparent-border-style;
- border-right: $transparent-border-style;
- }
-
- @else if $direction==right {
- border-left: $color-border-style;
- border-top: $transparent-border-style;
- border-bottom: $transparent-border-style;
- }
-
- @else if $direction==down {
- border-top: $color-border-style;
- border-left: $transparent-border-style;
- border-right: $transparent-border-style;
- }
-
- @else if $direction==left {
- border-right: $color-border-style;
- border-top: $transparent-border-style;
- border-bottom: $transparent-border-style;
- }
-}
diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss
deleted file mode 100644
index d20ba26..0000000
--- a/src/assets/styles/ruoyi.scss
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * 閫氱敤css鏍峰紡甯冨眬澶勭悊
- * Copyright (c) 2019 ruoyi
- */
-
-/** 鍩虹閫氱敤 **/
-.pt5 {
- padding-top: 5px;
-}
-.pr5 {
- padding-right: 5px;
-}
-.pb5 {
- padding-bottom: 5px;
-}
-.mt5 {
- margin-top: 5px;
-}
-.mr5 {
- margin-right: 5px;
-}
-.mb5 {
- margin-bottom: 5px;
-}
-.mb8 {
- margin-bottom: 8px;
-}
-.ml5 {
- margin-left: 5px;
-}
-.mt10 {
- margin-top: 10px;
-}
-.mr10 {
- margin-right: 10px;
-}
-.mb10 {
- margin-bottom: 10px;
-}
-.ml10 {
- margin-left: 10px;
-}
-.mt20 {
- margin-top: 20px;
-}
-.mr20 {
- margin-right: 20px;
-}
-.mb20 {
- margin-bottom: 20px;
-}
-.ml20 {
- margin-left: 20px;
-}
-
-.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
- font-family: inherit;
- font-weight: 500;
- line-height: 1.1;
- color: inherit;
-}
-
-.el-form .el-form-item__label {
- font-weight: 700;
-}
-.el-dialog:not(.is-fullscreen) {
- margin-top: 6vh !important;
-}
-
-.el-dialog.scrollbar .el-dialog__body {
- overflow: auto;
- overflow-x: hidden;
- max-height: 70vh;
-}
-
-.el-table {
- .el-table__header-wrapper, .el-table__fixed-header-wrapper {
- th {
- word-break: break-word;
- background-color: #F0F1F5 !important;
- color: #515a6e;
- height: 40px !important;
- font-size: 13px;
- }
- }
- .el-table__body-wrapper {
- .el-button [class*="el-icon-"] + span {
- margin-left: 1px;
- }
- }
-}
-
-/** 琛ㄥ崟甯冨眬 **/
-.form-header {
- font-size:15px;
- color:#6379bb;
- border-bottom:1px solid #ddd;
- margin:8px 10px 25px 10px;
- padding-bottom:5px
-}
-
-/** 琛ㄦ牸甯冨眬 **/
-.pagination-container {
- display: flex;
- justify-content: flex-end;
- margin-top: 20px;
- background-color: transparent !important;
-}
-
-/* 寮圭獥涓殑鍒嗛〉鍣� */
-.el-dialog .pagination-container {
- position: static !important;
- margin: 10px 0 0 0;
- padding: 0 !important;
-
- .el-pagination {
- position: static;
- }
-}
-
-/* 绉诲姩绔�傞厤 */
-@media (max-width: 768px) {
- .pagination-container {
- .el-pagination {
- > .el-pagination__jump {
- display: none !important;
- }
- > .el-pagination__sizes {
- display: none !important;
- }
- }
- }
-}
-
-/* tree border */
-.tree-border {
- margin-top: 5px;
- border: 1px solid var(--el-border-color-light, #e5e6e7);
- background: var(--el-bg-color, #FFFFFF) none;
- border-radius:4px;
- width: 100%;
-}
-
-.el-table .fixed-width .el-button--small {
- padding-left: 0;
- padding-right: 0;
- width: inherit;
-}
-
-/** 琛ㄦ牸鏇村鎿嶄綔涓嬫媺鏍峰紡 */
-.el-table .el-dropdown-link {
- cursor: pointer;
- color: #2C51D9;
- margin-left: 10px;
-}
-
-.el-table .el-dropdown, .el-icon-arrow-down {
- font-size: 12px;
-}
-
-.el-tree-node__content > .el-checkbox {
- margin-right: 8px;
-}
-
-.list-group-striped > .list-group-item {
- border-left: 0;
- border-right: 0;
- border-radius: 0;
- padding-left: 0;
- padding-right: 0;
-}
-
-.list-group {
- padding-left: 0px;
- list-style: none;
-}
-
-.list-group-item {
- border-bottom: 1px solid #e7eaec;
- border-top: 1px solid #e7eaec;
- margin-bottom: -1px;
- padding: 11px 0px;
- font-size: 13px;
-}
-
-.pull-right {
- float: right !important;
-}
-
-.el-card__header {
- padding: 14px 15px 7px !important;
- min-height: 40px;
-}
-
-.el-card__body {
- padding: 15px 20px 20px 20px !important;
-}
-
-.card-box {
- margin-bottom: 10px;
-}
-
-/* button color */
-.el-button--cyan.is-active,
-.el-button--cyan:active {
- background: #20B2AA;
- border-color: #20B2AA;
- color: #FFFFFF;
-}
-
-.el-button--cyan:focus,
-.el-button--cyan:hover {
- background: #48D1CC;
- border-color: #48D1CC;
- color: #FFFFFF;
-}
-
-.el-button--cyan {
- background-color: #20B2AA;
- border-color: #20B2AA;
- color: #FFFFFF;
-}
-
-/* text color */
-.text-navy {
- color: #1ab394;
-}
-
-.text-primary {
- color: inherit;
-}
-
-.text-success {
- color: #1c84c6;
-}
-
-.text-info {
- color: #23c6c8;
-}
-
-.text-warning {
- color: #f8ac59;
-}
-
-.text-danger {
- color: #ed5565;
-}
-
-.text-muted {
- color: #888888;
-}
-
-/* image */
-.img-circle {
- border-radius: 50%;
-}
-
-.img-lg {
- width: 120px;
- height: 120px;
-}
-
-.avatar-upload-preview {
- position: absolute;
- top: 50%;
- transform: translate(50%, -50%);
- width: 200px;
- height: 200px;
- border-radius: 50%;
- box-shadow: 0 0 4px #ccc;
- overflow: hidden;
-}
-
-/* 鎷栨嫿鍒楁牱寮� */
-.sortable-ghost{
- opacity: .8;
- color: #fff!important;
- background: #42b983!important;
-}
-
-/* 琛ㄦ牸鍙充晶宸ュ叿鏍忔牱寮� */
-.top-right-btn {
- margin-left: auto;
-}
-
-/* 鍒嗗壊闈㈡澘鏍峰紡 */
-.splitpanes.default-theme .splitpanes__pane {
- background-color: var(--splitpanes-default-bg) !important;
-}
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
deleted file mode 100644
index 8534448..0000000
--- a/src/assets/styles/sidebar.scss
+++ /dev/null
@@ -1,240 +0,0 @@
-#app {
- .main-container {
- min-height: 100%;
- transition: margin-left 0.28s;
- margin-left: $base-sidebar-width;
- position: relative;
- background: #f5f7fb;
- }
-
- .sidebarHide {
- margin-left: 0 !important;
- }
-
- .sidebar-container {
- transition: width 0.28s;
- width: $base-sidebar-width !important;
- height: 100%;
- position: fixed;
- font-size: 0px;
- top: 0;
- bottom: 0;
- left: 0;
- z-index: 1001;
- overflow: hidden;
- -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
- box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
-
- // reset element-ui css
- .horizontal-collapse-transition {
- transition: 0s width ease-in-out, 0s padding-left ease-in-out,
- 0s padding-right ease-in-out;
- }
-
- .scrollbar-wrapper {
- overflow-x: hidden !important;
- }
-
- .el-scrollbar__bar.is-vertical {
- right: 0px;
- }
-
- .el-scrollbar {
- height: 100%;
- }
-
- &.has-logo {
- .el-scrollbar {
- height: calc(100% - 50px);
- }
- }
-
- .is-horizontal {
- display: none;
- }
-
- a {
- display: inline-block;
- width: 100%;
- overflow: hidden;
- }
-
- .svg-icon {
- margin-right: 16px;
- }
-
- .el-menu {
- border: none;
- height: 100%;
- width: 100% !important;
- }
-
- .el-menu-item,
- .menu-title {
- overflow: hidden !important;
- text-overflow: ellipsis !important;
- white-space: nowrap !important;
- }
-
- .el-menu-item .el-menu-tooltip__trigger {
- display: inline-block !important;
- }
-
- // menu hover
- .sub-menu-title-noDropdown,
- .el-sub-menu__title {
- &:hover {
- background-color: rgba(212, 221, 255, 0.8) !important;
- }
- }
- & .theme-light .is-active > .el-sub-menu__title {
- color: #fff !important;
- }
-
- & .nest-menu .el-sub-menu > .el-sub-menu__title,
- & .el-sub-menu .el-menu-item {
- min-width: $base-sidebar-width !important;
-
- &:hover {
- background-color: rgba(212, 221, 255, 0.8) !important;
- }
- &.is-active {
- background-color: #fff !important;
- }
- }
-
- & .theme-light .nest-menu .el-sub-menu > .el-sub-menu__title,
- & .theme-light .el-sub-menu .el-menu-item {
- //background-color: transparent;
-
- &:hover {
- background-color: rgba(212, 221, 255, 0.8) !important;
- }
- }
- }
-
- .hideSidebar {
- .sidebar-container {
- width: 54px !important;
- }
-
- .main-container {
- margin-left: 54px;
- }
-
- .sub-menu-title-noDropdown {
- padding: 0 !important;
- position: relative;
-
- .el-tooltip {
- padding: 0 !important;
-
- .svg-icon {
- margin-left: 20px;
- }
- }
- }
- .el-sub-menu {
- overflow: hidden;
-
- & > .el-sub-menu__title {
- padding: 0 !important;
-
- .svg-icon {
- margin-left: 20px;
- }
- }
- }
-
- .el-menu--collapse {
- .el-sub-menu {
- & > .el-sub-menu__title {
- & > span {
- height: 0;
- width: 0;
- overflow: hidden;
- visibility: hidden;
- display: inline-block;
- }
- & > i {
- height: 0;
- width: 0;
- overflow: hidden;
- visibility: hidden;
- display: inline-block;
- }
- }
- }
- }
- }
-
- .el-menu--collapse .el-menu .el-sub-menu {
- min-width: $base-sidebar-width !important;
- }
-
- // mobile responsive
- .mobile {
- .main-container {
- margin-left: 0px;
- }
-
- .sidebar-container {
- transition: transform 0.28s;
- width: $base-sidebar-width !important;
- }
-
- &.hideSidebar {
- .sidebar-container {
- pointer-events: none;
- transition-duration: 0.3s;
- transform: translate3d(-$base-sidebar-width, 0, 0);
- }
- }
- }
-
- .withoutAnimation {
- .main-container,
- .sidebar-container {
- transition: none;
- }
- }
-}
-
-// when menu collapsed
-.el-menu--vertical {
- & > .el-menu {
- .svg-icon {
- margin-right: 16px;
- }
- }
-
- .nest-menu .el-sub-menu > .el-sub-menu__title,
- .el-menu-item {
- &:hover {
- // you can use $sub-menuHover
- background-color: rgba(212, 221, 255, 0.56) !important;
- }
- &.is-active {
- background-color: rgba(212, 221, 255, 0.56) !important;
- }
- }
-
- // the scroll bar appears when the sub-menu is too long
- > .el-menu--popup {
- max-height: 100vh;
- overflow-y: auto;
-
- &::-webkit-scrollbar-track-piece {
- background: #d3dce6;
- }
-
- &::-webkit-scrollbar {
- width: 6px;
- }
-
- &::-webkit-scrollbar-thumb {
- background: #99a9bf;
- border-radius: 20px;
- }
- }
-}
diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss
deleted file mode 100644
index 7e1b103..0000000
--- a/src/assets/styles/transition.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-// global transition css
-
-/* fade */
-.fade-enter-active,
-.fade-leave-active {
- transition: opacity 0.28s;
-}
-
-.fade-enter,
-.fade-leave-active {
- opacity: 0;
-}
-
-/* fade-transform */
-.fade-transform--move,
-.fade-transform-leave-active,
-.fade-transform-enter-active {
- transition: all .5s;
-}
-
-.fade-transform-enter {
- opacity: 0;
- transform: translateX(-30px);
-}
-
-.fade-transform-leave-to {
- opacity: 0;
- transform: translateX(30px);
-}
-
-/* breadcrumb transition */
-.breadcrumb-enter-active,
-.breadcrumb-leave-active {
- transition: all .5s;
-}
-
-.breadcrumb-enter,
-.breadcrumb-leave-active {
- opacity: 0;
- transform: translateX(20px);
-}
-
-.breadcrumb-move {
- transition: all .5s;
-}
-
-.breadcrumb-leave-active {
- position: absolute;
-}
diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss
deleted file mode 100644
index 3194051..0000000
--- a/src/assets/styles/variables.module.scss
+++ /dev/null
@@ -1,221 +0,0 @@
-// base color
-$blue: #324157;
-$light-blue: #333c46;
-$red: #c03639;
-$pink: #e65d6e;
-$green: #30b08f;
-$tiffany: #4ab7bd;
-$yellow: #fec171;
-$panGreen: #30b08f;
-
-// 榛樿涓婚鍙橀噺
-$menuText: #bfcbd9;
-$menuActiveText: #409eff;
-$menuBg: #304156;
-$menuHover: #263445;
-
-// 娴呰壊涓婚theme-light
-$menuLightBg: #002fa7;
-$menuLightHover: #f0f1f5;
-$menuLightText: #fff;
-$menuLightActiveText: #002fa7;
-
-// 鍩虹鍙橀噺
-$base-sidebar-width: 200px;
-$sideBarWidth: 200px;
-
-// 鑿滃崟鏆楄壊鍙橀噺
-$base-menu-color: #bfcbd9;
-$base-menu-color-active: #f4f4f5;
-$base-menu-background: #304156;
-$base-sub-menu-background: #1f2d3d;
-$base-sub-menu-hover: #fff;
-
-// 缁勪欢鍙橀噺
-$--color-primary: #409eff;
-$--color-success: #67c23a;
-$--color-warning: #e6a23c;
-$--color-danger: #f56c6c;
-$--color-info: #909399;
-
-:export {
- menuText: $menuText;
- menuActiveText: $menuActiveText;
- menuBg: $menuBg;
- menuHover: $menuHover;
- menuLightBg: $menuLightBg;
- menuLightHover: $menuLightHover;
- menuLightText: $menuLightText;
- menuLightActiveText: $menuLightActiveText;
- sideBarWidth: $sideBarWidth;
- // 瀵煎嚭鍩虹棰滆壊
- blue: $blue;
- lightBlue: $light-blue;
- red: $red;
- pink: $pink;
- green: $green;
- tiffany: $tiffany;
- yellow: $yellow;
- panGreen: $panGreen;
- // 瀵煎嚭缁勪欢棰滆壊
- colorPrimary: $--color-primary;
- colorSuccess: $--color-success;
- colorWarning: $--color-warning;
- colorDanger: $--color-danger;
- colorInfo: $--color-info;
-}
-
-// CSS鍙橀噺瀹氫箟
-:root {
- /* 浜壊妯″紡鍙橀噺 */
- --sidebar-bg: #{$menuBg};
- --sidebar-text: #{$menuText};
- --menu-hover: #{$menuHover};
-
- --navbar-bg: #ffffff;
- --navbar-text: #303133;
-
- /* splitpanes default-theme 鍙橀噺 */
- --splitpanes-default-bg: #ffffff;
-}
-
-// 鏆楅粦妯″紡鍙橀噺
-html.dark {
- /* 榛樿閫氱敤 */
- --el-bg-color: #141414;
- --el-bg-color-overlay: #1d1e1f;
- --el-text-color-primary: #ffffff;
- --el-text-color-regular: #d0d0d0;
- --el-border-color: #434343;
- --el-border-color-light: #434343;
-
- /* 渚ц竟鏍� */
- --sidebar-bg: #141414;
- --sidebar-text: #ffffff;
- --menu-hover: #2d2d2d;
- --menu-active-text: #{$menuActiveText};
-
- /* 椤堕儴瀵艰埅鏍� */
- --navbar-bg: #141414;
- --navbar-text: #ffffff;
- --navbar-hover: #141414;
-
- /* 鏍囩鏍� */
- --tags-bg: #141414;
- --tags-item-bg: #1d1e1f;
- --tags-item-border: #303030;
- --tags-item-text: #d0d0d0;
- --tags-item-hover: #2d2d2d;
- --tags-close-hover: #64666a;
-
- /* splitpanes 缁勪欢鏆楅粦妯″紡鍙橀噺 */
- --splitpanes-bg: #141414;
- --splitpanes-border: #303030;
- --splitpanes-splitter-bg: #1d1e1f;
- --splitpanes-splitter-hover-bg: #2d2d2d;
-
- /* blockquote 鏆楅粦妯″紡鍙橀噺 */
- --blockquote-bg: #1d1e1f;
- --blockquote-border: #303030;
- --blockquote-text: #d0d0d0;
-
- /* Cron 鏃堕棿琛ㄨ揪寮� 妯″紡鍙橀噺 */
- --cron-border: #303030;
-
- /* splitpanes default-theme 鏆楅粦妯″紡鍙橀噺 */
- --splitpanes-default-bg: #141414;
-
- /* 渚ц竟鏍忚彍鍗曡鐩� */
- .sidebar-container {
- .el-menu-item,
- .menu-title {
- color: var(--el-text-color-regular);
- }
- & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
- & .theme-dark .el-sub-menu .el-menu-item {
- background-color: var(--el-bg-color) !important;
- }
- }
-
- /* 椤堕儴鏍忔爮鑿滃崟瑕嗙洊 */
- .el-menu--horizontal {
- .el-menu-item {
- &:not(.is-disabled) {
- &:hover,
- &:focus {
- background-color: var(--navbar-hover) !important;
- }
- }
- }
- }
-
- /* 鍒嗗壊绐楁牸瑕嗙洊 */
- .splitpanes {
- background-color: var(--splitpanes-bg);
-
- .splitpanes__pane {
- background-color: var(--splitpanes-bg);
- border-color: var(--splitpanes-border);
- }
-
- .splitpanes__splitter {
- background-color: var(--splitpanes-splitter-bg);
- border-color: var(--splitpanes-border);
-
- &:hover {
- background-color: var(--splitpanes-splitter-hover-bg);
- }
-
- &:before,
- &:after {
- background-color: var(--splitpanes-border);
- }
- }
- }
-
- /* 琛ㄦ牸鏍峰紡瑕嗙洊 */
- .el-table {
- --el-table-header-bg-color: var(--el-bg-color-overlay) !important;
- --el-table-header-text-color: var(--el-text-color-regular) !important;
- --el-table-border-color: var(--el-border-color-light) !important;
- --el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important;
-
- .el-table__header-wrapper,
- .el-table__fixed-header-wrapper {
- th {
- background-color: var(--el-bg-color-overlay, #f0f1f5) !important;
- color: var(--el-text-color-regular, #515a6e);
- }
- }
- }
-
- /* 鏍戠粍浠堕珮浜牱寮忚鐩� */
- .el-tree {
- .el-tree-node.is-current > .el-tree-node__content {
- background-color: var(--el-bg-color-overlay) !important;
- color: var(--el-color-primary);
- }
-
- .el-tree-node__content:hover {
- background-color: var(--el-bg-color-overlay);
- }
- }
-
- /* 涓嬫媺鑿滃崟鏍峰紡瑕嗙洊 */
- .el-dropdown-menu__item:not(.is-disabled):focus,
- .el-dropdown-menu__item:not(.is-disabled):hover {
- background-color: var(--navbar-hover) !important;
- }
-
- /* blockquote鏍峰紡瑕嗙洊 */
- blockquote {
- background-color: var(--blockquote-bg) !important;
- border-left-color: var(--blockquote-border) !important;
- color: var(--blockquote-text) !important;
- }
-
- /* 鏃堕棿琛ㄨ揪寮忔爣棰樻牱寮忚鐩� */
- .popup-result .title {
- background: var(--cron-border);
- }
-}
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
deleted file mode 100644
index 5385ec4..0000000
--- a/src/components/Breadcrumb/index.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<template>
- <el-breadcrumb class="app-breadcrumb" separator="/">
- <transition-group name="breadcrumb">
- <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
- <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{
- item.meta.title }}</span>
- <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
- </el-breadcrumb-item>
- </transition-group>
- </el-breadcrumb>
-</template>
-
-<script setup>
-import usePermissionStore from '@/store/modules/permission'
-
-const route = useRoute()
-const router = useRouter()
-const permissionStore = usePermissionStore()
-const levelList = ref([])
-
-function getBreadcrumb() {
- // only show routes with meta.title
- let matched = []
- const pathNum = findPathNum(route.path)
- // multi-level menu
- if (pathNum > 2) {
- const reg = /\/\w+/gi
- const pathList = route.path.match(reg).map((item, index) => {
- if (index !== 0) item = item.slice(1)
- return item
- })
- getMatched(pathList, permissionStore.defaultRoutes, matched)
- } else {
- matched = route.matched.filter((item) => item.meta && item.meta.title)
- }
- // 鍒ゆ柇鏄惁涓洪椤�
- if (!isDashboard(matched[0])) {
- matched = [{ path: "/index", meta: { title: "棣栭〉" } }].concat(matched)
- }
- levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
-}
-function findPathNum(str, char = "/") {
- let index = str.indexOf(char)
- let num = 0
- while (index !== -1) {
- num++
- index = str.indexOf(char, index + 1)
- }
- return num
-}
-function getMatched(pathList, routeList, matched) {
- let data = routeList.find(item => item.path == pathList[0] || (item.name += '').toLowerCase() == pathList[0])
- if (data) {
- matched.push(data)
- if (data.children && pathList.length) {
- pathList.shift()
- getMatched(pathList, data.children, matched)
- }
- }
-}
-function isDashboard(route) {
- const name = route && route.name
- if (!name) {
- return false
- }
- return name.trim() === 'Index'
-}
-function handleLink(item) {
- const { redirect, path } = item
- if (redirect) {
- router.push(redirect)
- return
- }
- router.push(path)
-}
-
-watchEffect(() => {
- // if you go to the redirect page, do not update the breadcrumbs
- if (route.path.startsWith('/redirect/')) {
- return
- }
- getBreadcrumb()
-})
-getBreadcrumb()
-</script>
-
-<style lang='scss' scoped>
-.app-breadcrumb.el-breadcrumb {
- display: inline-block;
- font-size: 14px;
- line-height: 50px;
- margin-left: 8px;
-
- .no-redirect {
- color: #002FA7;
- cursor: text;
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/day.vue b/src/components/Crontab/day.vue
deleted file mode 100644
index 456686f..0000000
--- a/src/components/Crontab/day.vue
+++ /dev/null
@@ -1,174 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 鏃ワ紝鍏佽鐨勯�氶厤绗, - * ? / L W]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 涓嶆寚瀹�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min="1" :max="30" /> -
- <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="31" /> 鏃�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 浠�
- <el-input-number v-model='average01' :min="1" :max="30" /> 鍙峰紑濮嬶紝姣�
- <el-input-number v-model='average02' :min="1" :max="31 - average01" /> 鏃ユ墽琛屼竴娆�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="5">
- 姣忔湀
- <el-input-number v-model='workday' :min="1" :max="31" /> 鍙锋渶杩戠殑閭d釜宸ヤ綔鏃�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="6">
- 鏈湀鏈�鍚庝竴澶�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="7">
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="10">
- <el-option v-for="item in 31" :key="item" :label="item" :value="item" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(1)
-const cycle01 = ref(1)
-const cycle02 = ref(2)
-const average01 = ref(1)
-const average02 = ref(1)
-const workday = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([1])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 1, 30)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 31)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 1, 30)
- average02.value = props.check(average02.value, 1, 31 - average01.value)
- return average01.value + '/' + average02.value
-})
-const workdayTotal = computed(() => {
- workday.value = props.check(workday.value, 1, 31)
- return workday.value + 'W'
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.day, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, workdayTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === "*") {
- radioValue.value = 1
- } else if (value === "?") {
- radioValue.value = 2
- } else if (value.indexOf("-") > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 3
- } else if (value.indexOf("/") > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 4
- } else if (value.indexOf("W") > -1) {
- const indexArr = value.split("W")
- workday.value = Number(indexArr[0])
- radioValue.value = 5
- } else if (value === "L") {
- radioValue.value = 6
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 7
- }
-}
-// 鍗曢�夋寜閽�煎彉鍖栨椂
-function onRadioChange() {
- if (radioValue.value === 2 && props.cron.week === '?') {
- emit('update', 'week', '*', 'day')
- }
- if (radioValue.value !== 2 && props.cron.week !== '?') {
- emit('update', 'week', '?', 'day')
- }
- switch (radioValue.value) {
- case 1:
- emit('update', 'day', '*', 'day')
- break
- case 2:
- emit('update', 'day', '?', 'day')
- break
- case 3:
- emit('update', 'day', cycleTotal.value, 'day')
- break
- case 4:
- emit('update', 'day', averageTotal.value, 'day')
- break
- case 5:
- emit('update', 'day', workdayTotal.value, 'day')
- break
- case 6:
- emit('update', 'day', 'L', 'day')
- break
- case 7:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'day', checkboxString.value, 'day')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 18.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/hour.vue b/src/components/Crontab/hour.vue
deleted file mode 100644
index d05779e..0000000
--- a/src/components/Crontab/hour.vue
+++ /dev/null
@@ -1,133 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 灏忔椂锛屽厑璁哥殑閫氶厤绗, - * /]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min="0" :max="22" /> -
- <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="23" /> 鏃�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 浠�
- <el-input-number v-model='average01' :min="0" :max="22" /> 鏃跺紑濮嬶紝姣�
- <el-input-number v-model='average02' :min="1" :max="23 - average01" /> 灏忔椂鎵ц涓�娆�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="10">
- <el-option v-for="item in 24" :key="item" :label="item - 1" :value="item - 1" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(1)
-const cycle01 = ref(0)
-const cycle02 = ref(1)
-const average01 = ref(0)
-const average02 = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([0])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 0, 22)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 23)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 0, 22)
- average02.value = props.check(average02.value, 1, 23 - average01.value)
- return average01.value + '/' + average02.value
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.hour, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (props.cron.min === '*') {
- emit('update', 'min', '0', 'hour')
- }
- if (props.cron.second === '*') {
- emit('update', 'second', '0', 'hour')
- }
- if (value === '*') {
- radioValue.value = 1
- } else if (value.indexOf('-') > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 2
- } else if (value.indexOf('/') > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 3
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 4
- }
-}
-function onRadioChange() {
- switch (radioValue.value) {
- case 1:
- emit('update', 'hour', '*', 'hour')
- break
- case 2:
- emit('update', 'hour', cycleTotal.value, 'hour')
- break
- case 3:
- emit('update', 'hour', averageTotal.value, 'hour')
- break
- case 4:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'hour', checkboxString.value, 'hour')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 18.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/index.vue b/src/components/Crontab/index.vue
deleted file mode 100644
index 71f3824..0000000
--- a/src/components/Crontab/index.vue
+++ /dev/null
@@ -1,309 +0,0 @@
-<template>
- <div>
- <el-tabs type="border-card">
- <el-tab-pane label="绉�" v-if="shouldHide('second')">
- <CrontabSecond
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronsecond"
- />
- </el-tab-pane>
-
- <el-tab-pane label="鍒嗛挓" v-if="shouldHide('min')">
- <CrontabMin
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronmin"
- />
- </el-tab-pane>
-
- <el-tab-pane label="灏忔椂" v-if="shouldHide('hour')">
- <CrontabHour
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronhour"
- />
- </el-tab-pane>
-
- <el-tab-pane label="鏃�" v-if="shouldHide('day')">
- <CrontabDay
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronday"
- />
- </el-tab-pane>
-
- <el-tab-pane label="鏈�" v-if="shouldHide('month')">
- <CrontabMonth
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronmonth"
- />
- </el-tab-pane>
-
- <el-tab-pane label="鍛�" v-if="shouldHide('week')">
- <CrontabWeek
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronweek"
- />
- </el-tab-pane>
-
- <el-tab-pane label="骞�" v-if="shouldHide('year')">
- <CrontabYear
- @update="updateCrontabValue"
- :check="checkNumber"
- :cron="crontabValueObj"
- ref="cronyear"
- />
- </el-tab-pane>
- </el-tabs>
-
- <div class="popup-main">
- <div class="popup-result">
- <p class="title">鏃堕棿琛ㄨ揪寮�</p>
- <table>
- <thead>
- <th v-for="item of tabTitles" :key="item">{{item}}</th>
- <th>Cron 琛ㄨ揪寮�</th>
- </thead>
- <tbody>
- <td>
- <span v-if="crontabValueObj.second.length < 10">{{crontabValueObj.second}}</span>
- <el-tooltip v-else :content="crontabValueObj.second" placement="top"><span>{{crontabValueObj.second}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.min.length < 10">{{crontabValueObj.min}}</span>
- <el-tooltip v-else :content="crontabValueObj.min" placement="top"><span>{{crontabValueObj.min}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.hour.length < 10">{{crontabValueObj.hour}}</span>
- <el-tooltip v-else :content="crontabValueObj.hour" placement="top"><span>{{crontabValueObj.hour}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.day.length < 10">{{crontabValueObj.day}}</span>
- <el-tooltip v-else :content="crontabValueObj.day" placement="top"><span>{{crontabValueObj.day}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.month.length < 10">{{crontabValueObj.month}}</span>
- <el-tooltip v-else :content="crontabValueObj.month" placement="top"><span>{{crontabValueObj.month}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.week.length < 10">{{crontabValueObj.week}}</span>
- <el-tooltip v-else :content="crontabValueObj.week" placement="top"><span>{{crontabValueObj.week}}</span></el-tooltip>
- </td>
- <td>
- <span v-if="crontabValueObj.year.length < 10">{{crontabValueObj.year}}</span>
- <el-tooltip v-else :content="crontabValueObj.year" placement="top"><span>{{crontabValueObj.year}}</span></el-tooltip>
- </td>
- <td class="result">
- <span v-if="crontabValueString.length < 90">{{crontabValueString}}</span>
- <el-tooltip v-else :content="crontabValueString" placement="top"><span>{{crontabValueString}}</span></el-tooltip>
- </td>
- </tbody>
- </table>
- </div>
- <CrontabResult :ex="crontabValueString"></CrontabResult>
-
- <div class="pop_btn">
- <el-button type="primary" @click="submitFill">纭畾</el-button>
- <el-button type="warning" @click="clearCron">閲嶇疆</el-button>
- <el-button @click="hidePopup">鍙栨秷</el-button>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import CrontabSecond from "./second.vue"
-import CrontabMin from "./min.vue"
-import CrontabHour from "./hour.vue"
-import CrontabDay from "./day.vue"
-import CrontabMonth from "./month.vue"
-import CrontabWeek from "./week.vue"
-import CrontabYear from "./year.vue"
-import CrontabResult from "./result.vue"
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['hide', 'fill'])
-const props = defineProps({
- hideComponent: {
- type: Array,
- default: () => [],
- },
- expression: {
- type: String,
- default: ""
- }
-})
-const tabTitles = ref(["绉�", "鍒嗛挓", "灏忔椂", "鏃�", "鏈�", "鍛�", "骞�"])
-const tabActive = ref(0)
-const hideComponent = ref([])
-const expression = ref('')
-const crontabValueObj = ref({
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
-})
-const crontabValueString = computed(() => {
- const obj = crontabValueObj.value
- return obj.second
- + " "
- + obj.min
- + " "
- + obj.hour
- + " "
- + obj.day
- + " "
- + obj.month
- + " "
- + obj.week
- + (obj.year === "" ? "" : " " + obj.year)
-})
-watch(expression, () => resolveExp())
-function shouldHide(key) {
- return !(hideComponent.value && hideComponent.value.includes(key))
-}
-function resolveExp() {
- // 鍙嶈В鏋� 琛ㄨ揪寮�
- if (expression.value) {
- const arr = expression.value.split(/\s+/)
- if (arr.length >= 6) {
- //6 浣嶄互涓婃槸鍚堟硶琛ㄨ揪寮�
- let obj = {
- second: arr[0],
- min: arr[1],
- hour: arr[2],
- day: arr[3],
- month: arr[4],
- week: arr[5],
- year: arr[6] ? arr[6] : ""
- }
- crontabValueObj.value = {
- ...obj,
- }
- }
- } else {
- // 娌℃湁浼犲叆鐨勮〃杈惧紡 鍒欒繕鍘�
- clearCron()
- }
-}
-// tab鍒囨崲鍊�
-function tabCheck(index) {
- tabActive.value = index
-}
-// 鐢卞瓙缁勪欢瑙﹀彂锛屾洿鏀硅〃杈惧紡缁勬垚鐨勫瓧娈靛��
-function updateCrontabValue(name, value, from) {
- crontabValueObj.value[name] = value
-}
-// 琛ㄥ崟閫夐」鐨勫瓙缁勪欢鏍¢獙鏁板瓧鏍煎紡锛堥�氳繃-props浼犻�掞級
-function checkNumber(value, minLimit, maxLimit) {
- // 妫�鏌ュ繀椤讳负鏁存暟
- value = Math.floor(value)
- if (value < minLimit) {
- value = minLimit
- } else if (value > maxLimit) {
- value = maxLimit
- }
- return value
-}
-// 闅愯棌寮圭獥
-function hidePopup() {
- emit("hide")
-}
-// 濉厖琛ㄨ揪寮�
-function submitFill() {
- emit("fill", crontabValueString.value)
- hidePopup()
-}
-function clearCron() {
- // 杩樺師閫夋嫨椤�
- crontabValueObj.value = {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
-}
-onMounted(() => {
- expression.value = props.expression
- hideComponent.value = props.hideComponent
-})
-</script>
-
-<style lang="scss" scoped>
-.pop_btn {
- text-align: center;
- margin-top: 20px;
-}
-.popup-main {
- position: relative;
- margin: 10px auto;
- border-radius: 5px;
- font-size: 12px;
- overflow: hidden;
-}
-.popup-title {
- overflow: hidden;
- line-height: 34px;
- padding-top: 6px;
- background: #f2f2f2;
-}
-.popup-result {
- box-sizing: border-box;
- line-height: 24px;
- margin: 25px auto;
- padding: 15px 10px 10px;
- border: 1px solid #ccc;
- position: relative;
-}
-.popup-result .title {
- position: absolute;
- top: -28px;
- left: 50%;
- width: 140px;
- font-size: 14px;
- margin-left: -70px;
- text-align: center;
- line-height: 30px;
- background: #fff;
-}
-.popup-result table {
- text-align: center;
- width: 100%;
- margin: 0 auto;
-}
-.popup-result table td:not(.result) {
- width: 3.5rem;
- min-width: 3.5rem;
- max-width: 3.5rem;
-}
-.popup-result table span {
- display: block;
- width: 100%;
- font-family: arial;
- line-height: 30px;
- height: 30px;
- white-space: nowrap;
- overflow: hidden;
- border: 1px solid #e8e8e8;
-}
-.popup-result-scroll {
- font-size: 12px;
- line-height: 24px;
- height: 10em;
- overflow-y: auto;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/min.vue b/src/components/Crontab/min.vue
deleted file mode 100644
index 33e9bec..0000000
--- a/src/components/Crontab/min.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 鍒嗛挓锛屽厑璁哥殑閫氶厤绗, - * /]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min="0" :max="58" /> -
- <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="59" /> 鍒嗛挓
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 浠�
- <el-input-number v-model='average01' :min="0" :max="58" /> 鍒嗛挓寮�濮嬶紝 姣�
- <el-input-number v-model='average02' :min="1" :max="59 - average01" /> 鍒嗛挓鎵ц涓�娆�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="10">
- <el-option v-for="item in 60" :key="item" :label="item - 1" :value="item - 1" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(1)
-const cycle01 = ref(0)
-const cycle02 = ref(1)
-const average01 = ref(0)
-const average02 = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([0])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 0, 58)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 59)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 0, 58)
- average02.value = props.check(average02.value, 1, 59 - average01.value)
- return average01.value + '/' + average02.value
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.min, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === '*') {
- radioValue.value = 1
- } else if (value.indexOf('-') > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 2
- } else if (value.indexOf('/') > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 3
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 4
- }
-}
-function onRadioChange() {
- switch (radioValue.value) {
- case 1:
- emit('update', 'min', '*', 'min')
- break
- case 2:
- emit('update', 'min', cycleTotal.value, 'min')
- break
- case 3:
- emit('update', 'min', averageTotal.value, 'min')
- break
- case 4:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'min', checkboxString.value, 'min')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 19.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/month.vue b/src/components/Crontab/month.vue
deleted file mode 100644
index 542dd6f..0000000
--- a/src/components/Crontab/month.vue
+++ /dev/null
@@ -1,141 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 鏈堬紝鍏佽鐨勯�氶厤绗, - * /]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min="1" :max="11" /> -
- <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="12" /> 鏈�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 浠�
- <el-input-number v-model='average01' :min="1" :max="11" /> 鏈堝紑濮嬶紝姣�
- <el-input-number v-model='average02' :min="1" :max="12 - average01" /> 鏈堟湀鎵ц涓�娆�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="8">
- <el-option v-for="item in monthList" :key="item.key" :label="item.value" :value="item.key" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(1)
-const cycle01 = ref(1)
-const cycle02 = ref(2)
-const average01 = ref(1)
-const average02 = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([1])
-const monthList = ref([
- {key: 1, value: '涓�鏈�'},
- {key: 2, value: '浜屾湀'},
- {key: 3, value: '涓夋湀'},
- {key: 4, value: '鍥涙湀'},
- {key: 5, value: '浜旀湀'},
- {key: 6, value: '鍏湀'},
- {key: 7, value: '涓冩湀'},
- {key: 8, value: '鍏湀'},
- {key: 9, value: '涔濇湀'},
- {key: 10, value: '鍗佹湀'},
- {key: 11, value: '鍗佷竴鏈�'},
- {key: 12, value: '鍗佷簩鏈�'}
-])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 1, 11)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 12)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 1, 11)
- average02.value = props.check(average02.value, 1, 12 - average01.value)
- return average01.value + '/' + average02.value
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.month, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === '*') {
- radioValue.value = 1
- } else if (value.indexOf('-') > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 2
- } else if (value.indexOf('/') > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 3
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 4
- }
-}
-function onRadioChange() {
- switch (radioValue.value) {
- case 1:
- emit('update', 'month', '*', 'month')
- break
- case 2:
- emit('update', 'month', cycleTotal.value, 'month')
- break
- case 3:
- emit('update', 'month', averageTotal.value, 'month')
- break
- case 4:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'month', checkboxString.value, 'month')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 18.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/result.vue b/src/components/Crontab/result.vue
deleted file mode 100644
index b260d59..0000000
--- a/src/components/Crontab/result.vue
+++ /dev/null
@@ -1,540 +0,0 @@
-<template>
- <div class="popup-result">
- <p class="title">鏈�杩�5娆¤繍琛屾椂闂�</p>
- <ul class="popup-result-scroll">
- <template v-if='isShow'>
- <li v-for='item in resultList' :key="item">{{item}}</li>
- </template>
- <li v-else>璁$畻缁撴灉涓�...</li>
- </ul>
- </div>
-</template>
-
-<script setup>
-const props = defineProps({
- ex: {
- type: String,
- default: ''
- }
-})
-const dayRule = ref('')
-const dayRuleSup = ref('')
-const dateArr = ref([])
-const resultList = ref([])
-const isShow = ref(false)
-watch(() => props.ex, () => expressionChange())
-// 琛ㄨ揪寮忓�煎彉鍖栨椂锛屽紑濮嬪幓璁$畻缁撴灉
-function expressionChange() {
- // 璁$畻寮�濮�-闅愯棌缁撴灉
- isShow.value = false
- // 鑾峰彇瑙勫垯鏁扮粍[0绉掋��1鍒嗐��2鏃躲��3鏃ャ��4鏈堛��5鏄熸湡銆�6骞碷
- let ruleArr = props.ex.split(' ')
- // 鐢ㄤ簬璁板綍杩涘叆寰幆鐨勬鏁�
- let nums = 0
- // 鐢ㄤ簬鏆傛椂瀛樼鍙锋椂闂磋鍒欑粨鏋滅殑鏁扮粍
- let resultArr = []
- // 鑾峰彇褰撳墠鏃堕棿绮剧‘鑷砙骞淬�佹湀銆佹棩銆佹椂銆佸垎銆佺]
- let nTime = new Date()
- let nYear = nTime.getFullYear()
- let nMonth = nTime.getMonth() + 1
- let nDay = nTime.getDate()
- let nHour = nTime.getHours()
- let nMin = nTime.getMinutes()
- let nSecond = nTime.getSeconds()
- // 鏍规嵁瑙勫垯鑾峰彇鍒拌繎100骞村彲鑳藉勾鏁扮粍銆佹湀鏁扮粍绛夌瓑
- getSecondArr(ruleArr[0])
- getMinArr(ruleArr[1])
- getHourArr(ruleArr[2])
- getDayArr(ruleArr[3])
- getMonthArr(ruleArr[4])
- getWeekArr(ruleArr[5])
- getYearArr(ruleArr[6], nYear)
- // 灏嗚幏鍙栧埌鐨勬暟缁勮祴鍊�-鏂逛究浣跨敤
- let sDate = dateArr.value[0]
- let mDate = dateArr.value[1]
- let hDate = dateArr.value[2]
- let DDate = dateArr.value[3]
- let MDate = dateArr.value[4]
- let YDate = dateArr.value[5]
- // 鑾峰彇褰撳墠鏃堕棿鍦ㄦ暟缁勪腑鐨勭储寮�
- let sIdx = getIndex(sDate, nSecond)
- let mIdx = getIndex(mDate, nMin)
- let hIdx = getIndex(hDate, nHour)
- let DIdx = getIndex(DDate, nDay)
- let MIdx = getIndex(MDate, nMonth)
- let YIdx = getIndex(YDate, nYear)
- // 閲嶇疆鏈堟棩鏃跺垎绉掔殑鍑芥暟(鍚庨潰鐢ㄧ殑姣旇緝澶�)
- const resetSecond = function () {
- sIdx = 0
- nSecond = sDate[sIdx]
- }
- const resetMin = function () {
- mIdx = 0
- nMin = mDate[mIdx]
- resetSecond()
- }
- const resetHour = function () {
- hIdx = 0
- nHour = hDate[hIdx]
- resetMin()
- }
- const resetDay = function () {
- DIdx = 0
- nDay = DDate[DIdx]
- resetHour()
- }
- const resetMonth = function () {
- MIdx = 0
- nMonth = MDate[MIdx]
- resetDay()
- }
- // 濡傛灉褰撳墠骞翠唤涓嶄负鏁扮粍涓綋鍓嶅��
- if (nYear !== YDate[YIdx]) {
- resetMonth()
- }
- // 濡傛灉褰撳墠鏈堜唤涓嶄负鏁扮粍涓綋鍓嶅��
- if (nMonth !== MDate[MIdx]) {
- resetDay()
- }
- // 濡傛灉褰撳墠鈥滄棩鈥濅笉涓烘暟缁勪腑褰撳墠鍊�
- if (nDay !== DDate[DIdx]) {
- resetHour()
- }
- // 濡傛灉褰撳墠鈥滄椂鈥濅笉涓烘暟缁勪腑褰撳墠鍊�
- if (nHour !== hDate[hIdx]) {
- resetMin()
- }
- // 濡傛灉褰撳墠鈥滃垎鈥濅笉涓烘暟缁勪腑褰撳墠鍊�
- if (nMin !== mDate[mIdx]) {
- resetSecond()
- }
- // 寰幆骞翠唤鏁扮粍
- goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) {
- let YY = YDate[Yi]
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (nMonth > MDate[MDate.length - 1]) {
- resetMonth()
- continue
- }
- // 寰幆鏈堜唤鏁扮粍
- goMonth: for (let Mi = MIdx; Mi < MDate.length; Mi++) {
- // 璧嬪�笺�佹柟渚垮悗闈㈣繍绠�
- let MM = MDate[Mi];
- MM = MM < 10 ? '0' + MM : MM
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (nDay > DDate[DDate.length - 1]) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue
- }
- // 寰幆鏃ユ湡鏁扮粍
- goDay: for (let Di = DIdx; Di < DDate.length; Di++) {
- // 璧嬪�笺�佹柟渚垮悗闈㈣繍绠�
- let DD = DDate[Di]
- let thisDD = DD < 10 ? '0' + DD : DD
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (nHour > hDate[hDate.length - 1]) {
- resetHour()
- if (Di === DDate.length - 1) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue goMonth
- }
- continue
- }
- // 鍒ゆ柇鏃ユ湡鐨勫悎娉曟�э紝涓嶅悎娉曠殑璇濅篃鏄烦鍑哄綋鍓嶅惊鐜�
- if (checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && dayRule.value !== 'workDay' && dayRule.value !== 'lastWeek' && dayRule.value !== 'lastDay') {
- resetDay()
- continue goMonth
- }
- // 濡傛灉鏃ユ湡瑙勫垯涓湁鍊兼椂
- if (dayRule.value === 'lastDay') {
- // 濡傛灉涓嶆槸鍚堟硶鏃ユ湡鍒欓渶瑕佸皢鍓嶅皢鏃ユ湡璋冨埌鍚堟硶鏃ユ湡鍗虫湀鏈渶鍚庝竴澶�
- if (checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- while (DD > 0 && checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- DD--
- thisDD = DD < 10 ? '0' + DD : DD
- }
- }
- } else if (dayRule.value === 'workDay') {
- // 鏍¢獙骞惰皟鏁村鏋滄槸2鏈�30鍙疯繖绉嶆棩鏈熶紶杩涙潵鏃堕渶璋冩暣鑷虫甯告湀搴�
- if (checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- while (DD > 0 && checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- DD--
- thisDD = DD < 10 ? '0' + DD : DD
- }
- }
- // 鑾峰彇杈惧埌鏉′欢鐨勬棩鏈熸槸鏄熸湡X
- let thisWeek = formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week')
- // 褰撴槦鏈熸棩鏃�
- if (thisWeek === 1) {
- // 鍏堟壘涓嬩竴涓棩锛屽苟鍒ゆ柇鏄惁涓烘湀搴�
- DD++
- thisDD = DD < 10 ? '0' + DD : DD
- // 鍒ゆ柇涓嬩竴鏃ュ凡缁忎笉鏄悎娉曟棩鏈�
- if (checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- DD -= 3
- }
- } else if (thisWeek === 7) {
- // 褰撴槦鏈�6鏃跺彧闇�鍒ゆ柇涓嶆槸1鍙峰氨鍙繘琛屾搷浣�
- if (dayRuleSup.value !== 1) {
- DD--
- } else {
- DD += 2
- }
- }
- } else if (dayRule.value === 'weekDay') {
- // 濡傛灉鎸囧畾浜嗘槸鏄熸湡鍑�
- // 鑾峰彇褰撳墠鏃ユ湡鏄睘浜庢槦鏈熷嚑
- let thisWeek = formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week')
- // 鏍¢獙褰撳墠鏄熸湡鏄惁鍦ㄦ槦鏈熸睜锛坉ayRuleSup锛変腑
- if (dayRuleSup.value.indexOf(thisWeek) < 0) {
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (Di === DDate.length - 1) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue goMonth
- }
- continue
- }
- } else if (dayRule.value === 'assWeek') {
- // 濡傛灉鎸囧畾浜嗘槸绗嚑鍛ㄧ殑鏄熸湡鍑�
- // 鑾峰彇姣忔湀1鍙锋槸灞炰簬鏄熸湡鍑�
- let thisWeek = formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week')
- if (dayRuleSup.value[1] >= thisWeek) {
- DD = (dayRuleSup.value[0] - 1) * 7 + dayRuleSup.value[1] - thisWeek + 1
- } else {
- DD = dayRuleSup.value[0] * 7 + dayRuleSup.value[1] - thisWeek + 1
- }
- } else if (dayRule.value === 'lastWeek') {
- // 濡傛灉鎸囧畾浜嗘瘡鏈堟渶鍚庝竴涓槦鏈熷嚑
- // 鏍¢獙骞惰皟鏁村鏋滄槸2鏈�30鍙疯繖绉嶆棩鏈熶紶杩涙潵鏃堕渶璋冩暣鑷虫甯告湀搴�
- if (checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- while (DD > 0 && checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
- DD--
- thisDD = DD < 10 ? '0' + DD : DD
- }
- }
- // 鑾峰彇鏈堟湯鏈�鍚庝竴澶╂槸鏄熸湡鍑�
- let thisWeek = formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week')
- // 鎵惧埌瑕佹眰涓渶杩戠殑閭d釜鏄熸湡鍑�
- if (dayRuleSup.value < thisWeek) {
- DD -= thisWeek - dayRuleSup.value
- } else if (dayRuleSup.value > thisWeek) {
- DD -= 7 - (dayRuleSup.value - thisWeek)
- }
- }
- // 鍒ゆ柇鏃堕棿鍊兼槸鍚﹀皬浜�10缃崲鎴愨��05鈥濊繖绉嶆牸寮�
- DD = DD < 10 ? '0' + DD : DD
- // 寰幆鈥滄椂鈥濇暟缁�
- goHour: for (let hi = hIdx; hi < hDate.length; hi++) {
- let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi]
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (nMin > mDate[mDate.length - 1]) {
- resetMin()
- if (hi === hDate.length - 1) {
- resetHour()
- if (Di === DDate.length - 1) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue goMonth
- }
- continue goDay
- }
- continue
- }
- // 寰幆"鍒�"鏁扮粍
- goMin: for (let mi = mIdx; mi < mDate.length; mi++) {
- let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi]
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (nSecond > sDate[sDate.length - 1]) {
- resetSecond()
- if (mi === mDate.length - 1) {
- resetMin()
- if (hi === hDate.length - 1) {
- resetHour()
- if (Di === DDate.length - 1) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue goMonth
- }
- continue goDay
- }
- continue goHour
- }
- continue
- }
- // 寰幆"绉�"鏁扮粍
- goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) {
- let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si]
- // 娣诲姞褰撳墠鏃堕棿锛堟椂闂村悎娉曟�у湪鏃ユ湡寰幆鏃跺凡缁忓垽鏂級
- if (MM !== '00' && DD !== '00') {
- resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss)
- nums++
- }
- // 濡傛灉鏉℃暟婊′簡灏遍��鍑哄惊鐜�
- if (nums === 5) break goYear
- // 濡傛灉鍒拌揪鏈�澶у�兼椂
- if (si === sDate.length - 1) {
- resetSecond()
- if (mi === mDate.length - 1) {
- resetMin()
- if (hi === hDate.length - 1) {
- resetHour()
- if (Di === DDate.length - 1) {
- resetDay()
- if (Mi === MDate.length - 1) {
- resetMonth()
- continue goYear
- }
- continue goMonth
- }
- continue goDay
- }
- continue goHour
- }
- continue goMin
- }
- } //goSecond
- } //goMin
- }//goHour
- }//goDay
- }//goMonth
- }
- // 鍒ゆ柇100骞村唴鐨勭粨鏋滄潯鏁�
- if (resultArr.length === 0) {
- resultList.value = ['娌℃湁杈惧埌鏉′欢鐨勭粨鏋滐紒']
- } else {
- resultList.value = resultArr
- if (resultArr.length !== 5) {
- resultList.value.push('鏈�杩�100骞村唴鍙湁涓婇潰' + resultArr.length + '鏉$粨鏋滐紒')
- }
- }
- // 璁$畻瀹屾垚-鏄剧ず缁撴灉
- isShow.value = true
-}
-// 鐢ㄤ簬璁$畻鏌愪綅鏁板瓧鍦ㄦ暟缁勪腑鐨勭储寮�
-function getIndex(arr, value) {
- if (value <= arr[0] || value > arr[arr.length - 1]) {
- return 0
- } else {
- for (let i = 0; i < arr.length - 1; i++) {
- if (value > arr[i] && value <= arr[i + 1]) {
- return i + 1
- }
- }
- }
-}
-// 鑾峰彇"骞�"鏁扮粍
-function getYearArr(rule, year) {
- dateArr.value[5] = getOrderArr(year, year + 100)
- if (rule !== undefined) {
- if (rule.indexOf('-') >= 0) {
- dateArr.value[5] = getCycleArr(rule, year + 100, false)
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[5] = getAverageArr(rule, year + 100)
- } else if (rule !== '*') {
- dateArr.value[5] = getAssignArr(rule)
- }
- }
-}
-// 鑾峰彇"鏈�"鏁扮粍
-function getMonthArr(rule) {
- dateArr.value[4] = getOrderArr(1, 12)
- if (rule.indexOf('-') >= 0) {
- dateArr.value[4] = getCycleArr(rule, 12, false)
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[4] = getAverageArr(rule, 12)
- } else if (rule !== '*') {
- dateArr.value[4] = getAssignArr(rule)
- }
-}
-// 鑾峰彇"鏃�"鏁扮粍-涓昏涓烘棩鏈熻鍒�
-function getWeekArr(rule) {
- // 鍙湁褰撴棩鏈熻鍒欑殑涓や釜鍊煎潎涓衡�溾�濇椂鍒欒〃杈炬棩鏈熸槸鏈夐�夐」鐨�
- if (dayRule.value === '' && dayRuleSup.value === '') {
- if (rule.indexOf('-') >= 0) {
- dayRule.value = 'weekDay'
- dayRuleSup.value = getCycleArr(rule, 7, false)
- } else if (rule.indexOf('#') >= 0) {
- dayRule.value = 'assWeek'
- let matchRule = rule.match(/[0-9]{1}/g)
- dayRuleSup.value = [Number(matchRule[1]), Number(matchRule[0])]
- dateArr.value[3] = [1]
- if (dayRuleSup.value[1] === 7) {
- dayRuleSup.value[1] = 0
- }
- } else if (rule.indexOf('L') >= 0) {
- dayRule.value = 'lastWeek'
- dayRuleSup.value = Number(rule.match(/[0-9]{1,2}/g)[0])
- dateArr.value[3] = [31]
- if (dayRuleSup.value === 7) {
- dayRuleSup.value = 0
- }
- } else if (rule !== '*' && rule !== '?') {
- dayRule.value = 'weekDay'
- dayRuleSup.value = getAssignArr(rule)
- }
- }
-}
-// 鑾峰彇"鏃�"鏁扮粍-灏戦噺涓烘棩鏈熻鍒�
-function getDayArr(rule) {
- dateArr.value[3] = getOrderArr(1, 31)
- dayRule.value = ''
- dayRuleSup.value = ''
- if (rule.indexOf('-') >= 0) {
- dateArr.value[3] = getCycleArr(rule, 31, false)
- dayRuleSup.value = 'null'
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[3] = getAverageArr(rule, 31)
- dayRuleSup.value = 'null'
- } else if (rule.indexOf('W') >= 0) {
- dayRule.value = 'workDay'
- dayRuleSup.value = Number(rule.match(/[0-9]{1,2}/g)[0])
- dateArr.value[3] = [dayRuleSup.value]
- } else if (rule.indexOf('L') >= 0) {
- dayRule.value = 'lastDay'
- dayRuleSup.value = 'null'
- dateArr.value[3] = [31]
- } else if (rule !== '*' && rule !== '?') {
- dateArr.value[3] = getAssignArr(rule)
- dayRuleSup.value = 'null'
- } else if (rule === '*') {
- dayRuleSup.value = 'null'
- }
-}
-// 鑾峰彇"鏃�"鏁扮粍
-function getHourArr(rule) {
- dateArr.value[2] = getOrderArr(0, 23)
- if (rule.indexOf('-') >= 0) {
- dateArr.value[2] = getCycleArr(rule, 24, true)
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[2] = getAverageArr(rule, 23)
- } else if (rule !== '*') {
- dateArr.value[2] = getAssignArr(rule)
- }
-}
-// 鑾峰彇"鍒�"鏁扮粍
-function getMinArr(rule) {
- dateArr.value[1] = getOrderArr(0, 59)
- if (rule.indexOf('-') >= 0) {
- dateArr.value[1] = getCycleArr(rule, 60, true)
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[1] = getAverageArr(rule, 59)
- } else if (rule !== '*') {
- dateArr.value[1] = getAssignArr(rule)
- }
-}
-// 鑾峰彇"绉�"鏁扮粍
-function getSecondArr(rule) {
- dateArr.value[0] = getOrderArr(0, 59)
- if (rule.indexOf('-') >= 0) {
- dateArr.value[0] = getCycleArr(rule, 60, true)
- } else if (rule.indexOf('/') >= 0) {
- dateArr.value[0] = getAverageArr(rule, 59)
- } else if (rule !== '*') {
- dateArr.value[0] = getAssignArr(rule)
- }
-}
-// 鏍规嵁浼犺繘鏉ョ殑min-max杩斿洖涓�涓『搴忕殑鏁扮粍
-function getOrderArr(min, max) {
- let arr = []
- for (let i = min; i <= max; i++) {
- arr.push(i)
- }
- return arr
-}
-// 鏍规嵁瑙勫垯涓寚瀹氱殑闆舵暎鍊艰繑鍥炰竴涓暟缁�
-function getAssignArr(rule) {
- let arr = []
- let assiginArr = rule.split(',')
- for (let i = 0; i < assiginArr.length; i++) {
- arr[i] = Number(assiginArr[i])
- }
- arr.sort(compare)
- return arr
-}
-// 鏍规嵁涓�瀹氱畻鏈鍒欒绠楄繑鍥炰竴涓暟缁�
-function getAverageArr(rule, limit) {
- let arr = []
- let agArr = rule.split('/')
- let min = Number(agArr[0])
- let step = Number(agArr[1])
- while (min <= limit) {
- arr.push(min)
- min += step
- }
- return arr
-}
-// 鏍规嵁瑙勫垯杩斿洖涓�涓叿鏈夊懆鏈熸�х殑鏁扮粍
-function getCycleArr(rule, limit, status) {
- // status--琛ㄧず鏄惁浠�0寮�濮嬶紙鍒欎粠1寮�濮嬶級
- let arr = []
- let cycleArr = rule.split('-')
- let min = Number(cycleArr[0])
- let max = Number(cycleArr[1])
- if (min > max) {
- max += limit
- }
- for (let i = min; i <= max; i++) {
- let add = 0
- if (status === false && i % limit === 0) {
- add = limit
- }
- arr.push(Math.round(i % limit + add))
- }
- arr.sort(compare)
- return arr
-}
-// 姣旇緝鏁板瓧澶у皬锛堢敤浜嶢rray.sort锛�
-function compare(value1, value2) {
- if (value2 - value1 > 0) {
- return -1
- } else {
- return 1
- }
-}
-// 鏍煎紡鍖栨棩鏈熸牸寮忓锛�2017-9-19 18:04:33
-function formatDate(value, type) {
- // 璁$畻鏃ユ湡鐩稿叧鍊�
- let time = typeof value == 'number' ? new Date(value) : value
- let Y = time.getFullYear()
- let M = time.getMonth() + 1
- let D = time.getDate()
- let h = time.getHours()
- let m = time.getMinutes()
- let s = time.getSeconds()
- let week = time.getDay()
- // 濡傛灉浼犻�掍簡type鐨勮瘽
- if (type === undefined) {
- return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s)
- } else if (type === 'week') {
- // 鍦╭uartz涓� 1涓烘槦鏈熸棩
- return week + 1
- }
-}
-// 妫�鏌ユ棩鏈熸槸鍚﹀瓨鍦�
-function checkDate(value) {
- let time = new Date(value)
- let format = formatDate(time)
- return value === format
-}
-onMounted(() => {
- expressionChange()
-})
-</script>
\ No newline at end of file
diff --git a/src/components/Crontab/second.vue b/src/components/Crontab/second.vue
deleted file mode 100644
index 05e8855..0000000
--- a/src/components/Crontab/second.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 绉掞紝鍏佽鐨勯�氶厤绗, - * /]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min="0" :max="58" /> -
- <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="59" /> 绉�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 浠�
- <el-input-number v-model='average01' :min="0" :max="58" /> 绉掑紑濮嬶紝姣�
- <el-input-number v-model='average02' :min="1" :max="59 - average01" /> 绉掓墽琛屼竴娆�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="10">
- <el-option v-for="item in 60" :key="item" :label="item - 1" :value="item - 1" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: "",
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(1)
-const cycle01 = ref(0)
-const cycle02 = ref(1)
-const average01 = ref(0)
-const average02 = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([0])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 0, 58)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 59)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 0, 58)
- average02.value = props.check(average02.value, 1, 59 - average01.value)
- return average01.value + '/' + average02.value
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.second, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === '*') {
- radioValue.value = 1
- } else if (value.indexOf('-') > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 2
- } else if (value.indexOf('/') > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 3
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 4
- }
-}
-// 鍗曢�夋寜閽�煎彉鍖栨椂
-function onRadioChange() {
- switch (radioValue.value) {
- case 1:
- emit('update', 'second', '*', 'second')
- break
- case 2:
- emit('update', 'second', cycleTotal.value, 'second')
- break
- case 3:
- emit('update', 'second', averageTotal.value, 'second')
- break
- case 4:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'second', checkboxString.value, 'second')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 18.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/week.vue b/src/components/Crontab/week.vue
deleted file mode 100644
index 69a03b0..0000000
--- a/src/components/Crontab/week.vue
+++ /dev/null
@@ -1,197 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio v-model='radioValue' :value="1">
- 鍛紝鍏佽鐨勯�氶厤绗, - * ? / L #]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="2">
- 涓嶆寚瀹�
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="3">
- 鍛ㄦ湡浠�
- <el-select clearable v-model="cycle01">
- <el-option
- v-for="(item,index) of weekList"
- :key="index"
- :label="item.value"
- :value="item.key"
- :disabled="item.key === 7"
- >{{item.value}}</el-option>
- </el-select>
- -
- <el-select clearable v-model="cycle02">
- <el-option
- v-for="(item,index) of weekList"
- :key="index"
- :label="item.value"
- :value="item.key"
- :disabled="item.key <= cycle01"
- >{{item.value}}</el-option>
- </el-select>
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="4">
- 绗�
- <el-input-number v-model='average01' :min="1" :max="4" /> 鍛ㄧ殑
- <el-select clearable v-model="average02">
- <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" />
- </el-select>
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="5">
- 鏈湀鏈�鍚庝竴涓�
- <el-select clearable v-model="weekday">
- <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" />
- </el-select>
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio v-model='radioValue' :value="6">
- 鎸囧畾
- <el-select class="multiselect" clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="6">
- <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" />
- </el-select>
- </el-radio>
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: ""
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-const radioValue = ref(2)
-const cycle01 = ref(2)
-const cycle02 = ref(3)
-const average01 = ref(1)
-const average02 = ref(2)
-const weekday = ref(2)
-const checkboxList = ref([])
-const checkCopy = ref([2])
-const weekList = ref([
- {key: 1, value: '鏄熸湡鏃�'},
- {key: 2, value: '鏄熸湡涓�'},
- {key: 3, value: '鏄熸湡浜�'},
- {key: 4, value: '鏄熸湡涓�'},
- {key: 5, value: '鏄熸湡鍥�'},
- {key: 6, value: '鏄熸湡浜�'},
- {key: 7, value: '鏄熸湡鍏�'}
-])
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, 1, 6)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, 7)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, 1, 4)
- average02.value = props.check(average02.value, 1, 7)
- return average02.value + '#' + average01.value
-})
-const weekdayTotal = computed(() => {
- weekday.value = props.check(weekday.value, 1, 7)
- return weekday.value + 'L'
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.week, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, weekdayTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === "*") {
- radioValue.value = 1
- } else if (value === "?") {
- radioValue.value = 2
- } else if (value.indexOf("-") > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 3
- } else if (value.indexOf("#") > -1) {
- const indexArr = value.split('#')
- average01.value = Number(indexArr[1])
- average02.value = Number(indexArr[0])
- radioValue.value = 4
- } else if (value.indexOf("L") > -1) {
- const indexArr = value.split("L")
- weekday.value = Number(indexArr[0])
- radioValue.value = 5
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 6
- }
-}
-function onRadioChange() {
- if (radioValue.value === 2 && props.cron.day === '?') {
- emit('update', 'day', '*', 'week')
- }
- if (radioValue.value !== 2 && props.cron.day !== '?') {
- emit('update', 'day', '?', 'week')
- }
- switch (radioValue.value) {
- case 1:
- emit('update', 'week', '*', 'week')
- break
- case 2:
- emit('update', 'week', '?', 'week')
- break
- case 3:
- emit('update', 'week', cycleTotal.value, 'week')
- break
- case 4:
- emit('update', 'week', averageTotal.value, 'week')
- break
- case 5:
- emit('update', 'week', weekdayTotal.value, 'week')
- break
- case 6:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'week', checkboxString.value, 'week')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.5rem;
-}
-.el-select, .el-select--small {
- width: 8rem;
-}
-.el-select.multiselect, .el-select--small.multiselect {
- width: 17.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Crontab/year.vue b/src/components/Crontab/year.vue
deleted file mode 100644
index 01b58f3..0000000
--- a/src/components/Crontab/year.vue
+++ /dev/null
@@ -1,143 +0,0 @@
-<template>
- <el-form>
- <el-form-item>
- <el-radio :value="1" v-model='radioValue'>
- 涓嶅~锛屽厑璁哥殑閫氶厤绗, - * /]
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio :value="2" v-model='radioValue'>
- 姣忓勾
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio :value="3" v-model='radioValue'>
- 鍛ㄦ湡浠�
- <el-input-number v-model='cycle01' :min='fullYear' :max="2098"/> -
- <el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : fullYear + 1" :max="2099"/>
- </el-radio>
- </el-form-item>
-
- <el-form-item>
- <el-radio :value="4" v-model='radioValue'>
- 浠�
- <el-input-number v-model='average01' :min='fullYear' :max="2098"/> 骞村紑濮嬶紝姣�
- <el-input-number v-model='average02' :min="1" :max="2099 - average01 || fullYear"/> 骞存墽琛屼竴娆�
- </el-radio>
-
- </el-form-item>
-
- <el-form-item>
- <el-radio :value="5" v-model='radioValue'>
- 鎸囧畾
- <el-select clearable v-model="checkboxList" placeholder="鍙閫�" multiple :multiple-limit="8">
- <el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" />
- </el-select>
- </el-radio>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-const emit = defineEmits(['update'])
-const props = defineProps({
- cron: {
- type: Object,
- default: {
- second: "*",
- min: "*",
- hour: "*",
- day: "*",
- month: "*",
- week: "?",
- year: ""
- }
- },
- check: {
- type: Function,
- default: () => {
- }
- }
-})
-
-const fullYear = Number(new Date().getFullYear())
-const maxFullYear = fullYear + 10
-const radioValue = ref(1)
-const cycle01 = ref(fullYear)
-const cycle02 = ref(fullYear + 1)
-const average01 = ref(fullYear)
-const average02 = ref(1)
-const checkboxList = ref([])
-const checkCopy = ref([fullYear])
-
-const cycleTotal = computed(() => {
- cycle01.value = props.check(cycle01.value, fullYear, maxFullYear - 1)
- cycle02.value = props.check(cycle02.value, cycle01.value + 1, maxFullYear)
- return cycle01.value + '-' + cycle02.value
-})
-const averageTotal = computed(() => {
- average01.value = props.check(average01.value, fullYear, maxFullYear - 1)
- average02.value = props.check(average02.value, 1, 10)
- return average01.value + '/' + average02.value
-})
-const checkboxString = computed(() => {
- return checkboxList.value.join(',')
-})
-watch(() => props.cron.year, value => changeRadioValue(value))
-watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
-function changeRadioValue(value) {
- if (value === '') {
- radioValue.value = 1
- } else if (value === "*") {
- radioValue.value = 2
- } else if (value.indexOf("-") > -1) {
- const indexArr = value.split('-')
- cycle01.value = Number(indexArr[0])
- cycle02.value = Number(indexArr[1])
- radioValue.value = 3
- } else if (value.indexOf("/") > -1) {
- const indexArr = value.split('/')
- average01.value = Number(indexArr[0])
- average02.value = Number(indexArr[1])
- radioValue.value = 4
- } else {
- checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
- radioValue.value = 5
- }
-}
-function onRadioChange() {
- switch (radioValue.value) {
- case 1:
- emit('update', 'year', '', 'year')
- break
- case 2:
- emit('update', 'year', '*', 'year')
- break
- case 3:
- emit('update', 'year', cycleTotal.value, 'year')
- break
- case 4:
- emit('update', 'year', averageTotal.value, 'year')
- break
- case 5:
- if (checkboxList.value.length === 0) {
- checkboxList.value.push(checkCopy.value[0])
- } else {
- checkCopy.value = checkboxList.value
- }
- emit('update', 'year', checkboxString.value, 'year')
- break
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-input-number--small, .el-select, .el-select--small {
- margin: 0 0.2rem;
-}
-.el-select, .el-select--small {
- width: 18.8rem;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue
deleted file mode 100644
index 5e70502..0000000
--- a/src/components/DictTag/index.vue
+++ /dev/null
@@ -1,82 +0,0 @@
-<template>
- <div>
- <template v-for="(item, index) in options">
- <template v-if="values.includes(item.value)">
- <span
- v-if="(item.elTagType == 'default' || item.elTagType == '') && (item.elTagClass == '' || item.elTagClass == null)"
- :key="item.value"
- :index="index"
- :class="item.elTagClass"
- >{{ item.label + " " }}</span>
- <el-tag
- v-else
- :disable-transitions="true"
- :key="item.value + ''"
- :index="index"
- :type="item.elTagType"
- :class="item.elTagClass"
- >{{ item.label + " " }}</el-tag>
- </template>
- </template>
- <template v-if="unmatch && showValue">
- {{ unmatchArray | handleArray }}
- </template>
- </div>
-</template>
-
-<script setup>
-// 璁板綍鏈尮閰嶇殑椤�
-const unmatchArray = ref([])
-
-const props = defineProps({
- // 鏁版嵁
- options: {
- type: Array,
- default: null,
- },
- // 褰撳墠鐨勫��
- value: [Number, String, Array],
- // 褰撴湭鎵惧埌鍖归厤鐨勬暟鎹椂锛屾樉绀簐alue
- showValue: {
- type: Boolean,
- default: true,
- },
- separator: {
- type: String,
- default: ",",
- }
-})
-
-const values = computed(() => {
- if (props.value === null || typeof props.value === 'undefined' || props.value === '') return []
- return Array.isArray(props.value) ? props.value.map(item => '' + item) : String(props.value).split(props.separator)
-})
-
-const unmatch = computed(() => {
- unmatchArray.value = []
- // 娌℃湁value涓嶆樉绀�
- if (props.value === null || typeof props.value === 'undefined' || props.value === '' || !Array.isArray(props.options) || props.options.length === 0) return false
- // 浼犲叆鍊间负鏁扮粍
- let unmatch = false // 娣诲姞涓�涓爣蹇楁潵鍒ゆ柇鏄惁鏈夋湭鍖归厤椤�
- values.value.forEach(item => {
- if (!props.options.some(v => v.value === item)) {
- unmatchArray.value.push(item)
- unmatch = true // 濡傛灉鏈夋湭鍖归厤椤癸紝灏嗘爣蹇楄缃负true
- }
- })
- return unmatch // 杩斿洖鏍囧織鐨勫��
-})
-
-function handleArray(array) {
- if (array.length === 0) return ""
- return array.reduce((pre, cur) => {
- return pre + " " + cur
- })
-}
-</script>
-
-<style scoped>
-.el-tag + .el-tag {
- margin-left: 10px;
-}
-</style>
diff --git a/src/components/DynamicTable/index.vue b/src/components/DynamicTable/index.vue
deleted file mode 100644
index 9da9a3c..0000000
--- a/src/components/DynamicTable/index.vue
+++ /dev/null
@@ -1,402 +0,0 @@
-<template>
- <div class="dynamic-table-container">
- <el-table
- ref="tableRef"
- v-loading="loading"
- :data="tableData"
- :border="border"
- :height="height"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- style="width: 100%"
- @selection-change="handleSelectionChange"
- @row-click="handleRowClick"
- >
- <!-- 閫夋嫨鍒� -->
- <el-table-column
- v-if="showSelection"
- align="center"
- type="selection"
- width="55"
- />
-
- <!-- 搴忓彿鍒� -->
- <el-table-column
- v-if="showIndex"
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
-
- <!-- 鍥哄畾鍒楋細閮ㄩ棬 -->
- <el-table-column
- label="閮ㄩ棬"
- prop="department"
- width="120"
- show-overflow-tooltip
- align="center"
- />
-
- <!-- 鍥哄畾鍒楋細濮撳悕 -->
- <el-table-column
- label="濮撳悕"
- prop="name"
- width="100"
- show-overflow-tooltip
- align="center"
- />
-
- <!-- 鍥哄畾鍒楋細宸ュ彿 -->
- <el-table-column
- label="宸ュ彿"
- prop="employeeId"
- width="100"
- show-overflow-tooltip
- align="center"
- />
-
- <!-- 鍔ㄦ�佸垪锛氭牴鎹瓧鍏告覆鏌� -->
- <el-table-column
- v-for="(dictItem, index) in dynamicColumns"
- :key="dictItem.value"
- :label="dictItem.label"
- :prop="dictItem.value"
- :width="dictItem.width || 120"
- show-overflow-tooltip
- align="center"
- >
- <template #default="scope">
- <!-- 鏍规嵁瀛楀吀绫诲瀷娓叉煋涓嶅悓鐨勬樉绀烘柟寮� -->
- <template v-if="dictItem.renderType === 'tag'">
- <el-tag
- :type="getTagType(scope.row[dictItem.value])"
- size="small"
- >
- {{ getDictValueLabel(dictItem.dictType, scope.row[dictItem.value]) }}
- </el-tag>
- </template>
- <template v-else-if="dictItem.renderType === 'select'">
- <el-select
- v-model="scope.row[dictItem.value]"
- placeholder="璇烽�夋嫨"
- size="small"
- @change="handleSelectChange(scope.row, dictItem.value, $event)"
- >
- <el-option
- v-for="option in dictItem.options"
- :key="option.value"
- :label="option.label"
- :value="option.value"
- />
- </el-select>
- </template>
- <template v-else-if="dictItem.renderType === 'input'">
- <el-input
- v-model="scope.row[dictItem.value]"
- size="small"
- placeholder="璇疯緭鍏�"
- @blur="handleInputChange(scope.row, dictItem.value, $event)"
- />
- </template>
- <template v-else>
- <span>{{ getDictValueLabel(dictItem.dictType, scope.row[dictItem.value]) }}</span>
- </template>
- </template>
- </el-table-column>
-
- <!-- 鎿嶄綔鍒� -->
- <el-table-column
- v-if="showActions"
- label="鎿嶄綔"
- width="150"
- align="center"
- fixed="right"
- >
- <template #default="scope">
- <el-button
- type="primary"
- link
- size="small"
- @click="handleEdit(scope.row, scope.$index)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- link
- size="small"
- @click="handleDelete(scope.row, scope.$index)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉缁勪欢 -->
- <div v-if="showPagination" class="pagination-container">
- <el-pagination
- v-model:current-page="pagination.current"
- v-model:page-size="pagination.size"
- :page-sizes="[10, 20, 50, 100]"
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, computed, onMounted, watch } from 'vue'
-import { useDict } from '@/utils/dict'
-
-// 瀹氫箟缁勪欢灞炴��
-const props = defineProps({
- // 琛ㄦ牸鏁版嵁
- data: {
- type: Array,
- default: () => []
- },
- // 瀛楀吀绫诲瀷鏁扮粍锛岀敤浜庡姩鎬佺敓鎴愬垪
- dictTypes: {
- type: Array,
- default: () => []
- },
- // 鏄惁鏄剧ず閫夋嫨鍒�
- showSelection: {
- type: Boolean,
- default: false
- },
- // 鏄惁鏄剧ず搴忓彿鍒�
- showIndex: {
- type: Boolean,
- default: true
- },
- // 鏄惁鏄剧ず鎿嶄綔鍒�
- showActions: {
- type: Boolean,
- default: false
- },
- // 鏄惁鏄剧ず鍒嗛〉
- showPagination: {
- type: Boolean,
- default: false
- },
- // 琛ㄦ牸楂樺害
- height: {
- type: [String, Number],
- default: 'auto'
- },
- // 鏄惁鏄剧ず杈规
- border: {
- type: Boolean,
- default: true
- },
- // 鍔犺浇鐘舵��
- loading: {
- type: Boolean,
- default: false
- },
- // 鍒嗛〉閰嶇疆
- pagination: {
- type: Object,
- default: () => ({
- current: 1,
- size: 10,
- total: 0
- })
- }
-})
-
-// 瀹氫箟浜嬩欢
-const emit = defineEmits([
- 'selection-change',
- 'row-click',
- 'edit',
- 'delete',
- 'select-change',
- 'input-change',
- 'size-change',
- 'current-change'
-])
-
-// 鍝嶅簲寮忔暟鎹�
-const tableRef = ref(null)
-const tableData = ref([])
-
-// 鑾峰彇瀛楀吀鏁版嵁
-const dictData = ref({})
-
-// 鍔ㄦ�佸垪閰嶇疆
-const dynamicColumns = computed(() => {
- const columns = []
-
- props.dictTypes.forEach(dictType => {
- const dictItems = dictData.value[dictType] || []
- // 涓烘瘡涓瓧鍏哥被鍨嬪垱寤轰竴涓垪锛岃�屼笉鏄负姣忎釜瀛楀吀椤瑰垱寤哄垪
- if (dictItems.length > 0) {
- columns.push({
- label: getDictLabel(dictType), // 鑾峰彇瀛楀吀绫诲瀷鐨勬樉绀哄悕绉�
- value: dictType, // 浣跨敤瀛楀吀绫诲瀷浣滀负瀛楁鍚�
- width: 120,
- renderType: 'tag', // 榛樿浣跨敤鏍囩鏄剧ず
- options: dictItems, // 鎻愪緵閫夐」
- dictType: dictType
- })
- }
- })
-
- return columns
-})
-
-// 鑾峰彇瀛楀吀绫诲瀷鐨勬樉绀哄悕绉�
-const getDictLabel = (dictType) => {
- const labelMap = {
- 'sys_normal_disable': '鐘舵��',
- 'sys_user_level': '绾у埆',
- 'sys_user_position': '鑱屼綅',
- 'sys_yes_no': '鏄惁',
- 'sys_user_sex': '鎬у埆',
- 'sys_lavor_issue': '鍔冲姟闂' // 娣诲姞鍔冲姟闂瀛楀吀
- }
- return labelMap[dictType] || dictType
-}
-
-// 鑾峰彇瀛楀吀鏁版嵁
-const loadDictData = async () => {
- try {
- const dictPromises = props.dictTypes.map(async (dictType) => {
- const { getDicts } = await import('@/api/system/dict/data')
- const response = await getDicts(dictType)
- return {
- type: dictType,
- data: response.data.map(item => ({
- label: item.dictLabel,
- value: item.dictValue,
- elTagType: item.listClass,
- elTagClass: item.cssClass
- }))
- }
- })
-
- const results = await Promise.all(dictPromises)
- results.forEach(result => {
- dictData.value[result.type] = result.data
- })
- } catch (error) {
- console.error('鍔犺浇瀛楀吀鏁版嵁澶辫触:', error)
- // 濡傛灉瀛楀吀鍔犺浇澶辫触锛屼娇鐢ㄩ粯璁ゆ暟鎹�
- props.dictTypes.forEach(dictType => {
- if (!dictData.value[dictType]) {
- dictData.value[dictType] = []
- }
- })
- }
-}
-
-// 鑾峰彇鏍囩绫诲瀷
-const getTagType = (value) => {
- // 鏍规嵁鍊艰繑鍥炰笉鍚岀殑鏍囩绫诲瀷
- if (value === '1' || value === 'true' || value === '鏄�') return 'success'
- if (value === '0' || value === 'false' || value === '鍚�') return 'danger'
- if (value === '2' || value === 'warning') return 'warning'
- return 'info'
-}
-
-// 鑾峰彇瀛楀吀鍊肩殑鏍囩
-const getDictValueLabel = (dictType, value) => {
- if (!value) return '-'
- const dictItems = dictData.value[dictType] || []
- const item = dictItems.find(item => item.value === value)
- return item ? item.label : value
-}
-
-// 浜嬩欢澶勭悊鍑芥暟
-const handleSelectionChange = (selection) => {
- emit('selection-change', selection)
-}
-
-const handleRowClick = (row, column, event) => {
- emit('row-click', row, column, event)
-}
-
-const handleEdit = (row, index) => {
- emit('edit', row, index)
-}
-
-const handleDelete = (row, index) => {
- emit('delete', row, index)
-}
-
-const handleSelectChange = (row, prop, value) => {
- emit('select-change', row, prop, value)
-}
-
-const handleInputChange = (row, prop, event) => {
- emit('input-change', row, prop, event.target.value)
-}
-
-const handleSizeChange = (size) => {
- emit('size-change', size)
-}
-
-const handleCurrentChange = (current) => {
- emit('current-change', current)
-}
-
-// 鐩戝惉鏁版嵁鍙樺寲
-watch(() => props.data, (newData) => {
- tableData.value = newData
-}, { immediate: true })
-
-// 鐩戝惉瀛楀吀绫诲瀷鍙樺寲
-watch(() => props.dictTypes, () => {
- loadDictData()
-}, { immediate: true })
-
-// 缁勪欢鎸傝浇鏃跺姞杞藉瓧鍏告暟鎹�
-onMounted(() => {
- loadDictData()
-})
-
-// 鏆撮湶鏂规硶缁欑埗缁勪欢
-defineExpose({
- tableRef,
- getSelection: () => tableRef.value?.getSelectionRows() || [],
- clearSelection: () => tableRef.value?.clearSelection(),
- toggleRowSelection: (row, selected) => tableRef.value?.toggleRowSelection(row, selected),
- setCurrentRow: (row) => tableRef.value?.setCurrentRow(row)
-})
-</script>
-
-<style scoped>
-.dynamic-table-container {
- width: 100%;
-}
-
-.pagination-container {
- margin-top: 20px;
- display: flex;
- justify-content: flex-end;
-}
-
-:deep(.el-table .el-table__header-wrapper th) {
- background-color: #F0F1F5 !important;
- color: #333333;
- font-weight: 600;
-}
-
-:deep(.el-table .el-table__body-wrapper td) {
- padding: 8px 0;
-}
-
-:deep(.el-select) {
- width: 100%;
-}
-
-:deep(.el-input) {
- width: 100%;
-}
-</style>
diff --git a/src/components/Echarts/echarts.vue b/src/components/Echarts/echarts.vue
deleted file mode 100644
index d8264ad..0000000
--- a/src/components/Echarts/echarts.vue
+++ /dev/null
@@ -1,159 +0,0 @@
-<template>
- <div style="position: relative;">
- <div ref="chartRef" :style="chartStyle"></div>
- <slot></slot>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onBeforeUnmount, watchEffect } from 'vue'
-import * as echarts from 'echarts'
-
-// Props
-const props = defineProps({
- options: {
- type: Object,
- default: () => ({})
- },
- chartStyle: {
- type: Object,
- default: () => ({
- height: '80%',
- width: '100%'
- })
- },
- dataset: {
- type: Object,
- default: () => {}
- },
- xAxis: {
- type: Array,
- default: () => []
- },
- yAxis: {
- type: Array,
- default: () => []
- },
- series: {
- type: Array,
- default: () => []
- },
- grid: {
- type: Object,
- default: () => ({})
- },
- legend: {
- type: Object,
- default: () => ({})
- },
- tooltip: {
- type: Object,
- default: () => ({})
- },
- lineColors: {
- type: Array,
- default: () => []
- },
- barColors: {
- type: Array,
- default: () => []
- },
- pieColors: {
- type: Array,
- default: () => []
- },
- loadingOption: {
- type: Object,
- default: () => ({
- text: '鏁版嵁鍔犺浇涓�...',
- color: '#00BAFF',
- textColor: '#000',
- maskColor: 'rgba(255, 255, 255, 0.8)',
- zlevel: 0
- })
- },
- color: {
- type: Array,
- default: () => []
- },
- option: {
- type: Object,
- default: () => ({})
- },
-})
-
-import { watch } from 'vue'
-
-// Refs
-const chartRef = ref(null)
-let chartInstance = null
-
-// Methods
-function generateChart(option) {
- const copiedOption = option
-
- if (copiedOption.series && copiedOption.series.length > 0) {
- copiedOption.series.forEach((s, index) => {
- if (s.type === 'line' && props.lineColors.length) {
- s.itemStyle = s.itemStyle || {}
- s.lineStyle = s.lineStyle || {}
- s.itemStyle.color = props.lineColors[index] || props.lineColors[0]
- s.lineStyle.color = props.lineColors[index] || props.lineColors[0]
- } else if (s.type === 'bar' && props.barColors.length) {
- s.itemStyle = s.itemStyle || {}
- s.itemStyle.color = props.barColors[index] || props.barColors[0]
- }
- })
- }
-
- chartInstance.setOption(copiedOption)
-}
-
-function renderChart() {
- const option = {
- color: props.color.length ? props.color : undefined,
- backgroundColor: props.options.backgroundColor || '#fff',
- xAxis: props.xAxis,
- yAxis: props.yAxis,
- dataset: props.dataset,
- series: props.series,
- grid: props.grid,
- legend: props.legend,
- tooltip: props.tooltip,
- }
-
- chartInstance.clear()
- generateChart(option)
-}
-
-function windowResizeListener() {
- if (!chartInstance) return
- chartInstance.resize()
-}
-
-// Lifecycle hooks
-onMounted(() => {
- chartInstance = echarts.init(chartRef.value)
- renderChart()
- window.addEventListener('resize', windowResizeListener)
-})
-
-onBeforeUnmount(() => {
- if (chartInstance) {
- window.removeEventListener('resize', windowResizeListener)
- chartInstance.dispose()
- chartInstance = null
- }
-})
-
-// Watch all reactive props that affect the chart
-watch(
- () => [props.xAxis, props.series, props.legend, props.tooltip],
- () => {
- if (chartInstance) {
- renderChart()
- }
- },
- { deep: true, immediate: true }
-)
-</script>
\ No newline at end of file
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
deleted file mode 100644
index c283e42..0000000
--- a/src/components/Editor/index.vue
+++ /dev/null
@@ -1,292 +0,0 @@
-<template>
- <div>
- <el-upload
- :action="uploadUrl"
- :before-upload="handleBeforeUpload"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- class="editor-img-uploader"
- v-if="type == 'url'"
- >
- <i ref="uploadRef" class="editor-img-uploader"></i>
- </el-upload>
- </div>
- <div class="editor">
- <quill-editor
- ref="quillEditorRef"
- v-model:content="content"
- contentType="html"
- @textChange="(e) => $emit('update:modelValue', content)"
- :options="options"
- :style="styles"
- />
- </div>
-</template>
-
-<script setup>
-import axios from "axios";
-import { QuillEditor } from "@vueup/vue-quill";
-import "@vueup/vue-quill/dist/vue-quill.snow.css";
-import { getToken } from "@/utils/auth";
-
-const { proxy } = getCurrentInstance();
-
-const quillEditorRef = ref();
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-
-const props = defineProps({
- /* 缂栬緫鍣ㄧ殑鍐呭 */
- modelValue: {
- type: String,
- },
- /* 楂樺害 */
- height: {
- type: Number,
- default: null,
- },
- /* 鏈�灏忛珮搴� */
- minHeight: {
- type: Number,
- default: null,
- },
- /* 鍙 */
- readOnly: {
- type: Boolean,
- default: false,
- },
- /* 涓婁紶鏂囦欢澶у皬闄愬埗(MB) */
- fileSize: {
- type: Number,
- default: 5,
- },
- /* 绫诲瀷锛坆ase64鏍煎紡銆乽rl鏍煎紡锛� */
- type: {
- type: String,
- default: "url",
- },
-});
-
-const options = ref({
- theme: "snow",
- bounds: document.body,
- debug: "warn",
- modules: {
- // 宸ュ叿鏍忛厤缃�
- toolbar: [
- ["bold", "italic", "underline", "strike"], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾�
- ["blockquote", "code-block"], // 寮曠敤 浠g爜鍧�
- [{ list: "ordered" }, { list: "bullet" }], // 鏈夊簭銆佹棤搴忓垪琛�
- [{ indent: "-1" }, { indent: "+1" }], // 缂╄繘
- [{ size: ["small", false, "large", "huge"] }], // 瀛椾綋澶у皬
- [{ header: [1, 2, 3, 4, 5, 6, false] }], // 鏍囬
- [{ color: [] }, { background: [] }], // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹�
- [{ align: [] }], // 瀵归綈鏂瑰紡
- ["clean"], // 娓呴櫎鏂囨湰鏍煎紡
- ["link", "image", "video"], // 閾炬帴銆佸浘鐗囥�佽棰�
- ],
- },
- placeholder: "璇疯緭鍏ュ唴瀹�",
- readOnly: props.readOnly,
-});
-
-const styles = computed(() => {
- let style = {};
- if (props.minHeight) {
- style.minHeight = `${props.minHeight}px`;
- }
- if (props.height) {
- style.height = `${props.height}px`;
- }
- return style;
-});
-
-const content = ref("");
-watch(
- () => props.modelValue,
- (v) => {
- if (v !== content.value) {
- content.value = v == undefined ? "<p></p>" : v;
- }
- },
- { immediate: true }
-);
-
-// 濡傛灉璁剧疆浜嗕笂浼犲湴鍧�鍒欒嚜瀹氫箟鍥剧墖涓婁紶浜嬩欢
-onMounted(() => {
- if (props.type == "url") {
- let quill = quillEditorRef.value.getQuill();
- let toolbar = quill.getModule("toolbar");
- toolbar.addHandler("image", (value) => {
- if (value) {
- proxy.$refs.uploadRef.click();
- } else {
- quill.format("image", false);
- }
- });
- quill.root.addEventListener("paste", handlePasteCapture, true);
- }
-});
-
-// 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏�
-function handleBeforeUpload(file) {
- const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"];
- const isJPG = type.includes(file.type);
- //妫�楠屾枃浠舵牸寮�
- if (!isJPG) {
- proxy.$modal.msgError(`鍥剧墖鏍煎紡閿欒!`);
- return false;
- }
- // 鏍℃鏂囦欢澶у皬
- if (props.fileSize) {
- const isLt = file.size / 1024 / 1024 < props.fileSize;
- if (!isLt) {
- proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
- return false;
- }
- }
- return true;
-}
-
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- // 鑾峰彇瀵屾枃鏈疄渚�
- let quill = toRaw(quillEditorRef.value).getQuill();
- // 鑾峰彇鍏夋爣浣嶇疆
- let length = quill.selection.savedRange.index;
- // 鎻掑叆鍥剧墖锛宺es.url涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ュ湴鍧�
- quill.insertEmbed(
- length,
- "image",
- import.meta.env.VITE_APP_BASE_API + res.fileName
- );
- // 璋冩暣鍏夋爣鍒版渶鍚�
- quill.setSelection(length + 1);
- } else {
- proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触");
- }
-}
-
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鍥剧墖鎻掑叆澶辫触");
-}
-
-// 澶嶅埗绮樿创鍥剧墖澶勭悊
-function handlePasteCapture(e) {
- const clipboard = e.clipboardData || window.clipboardData;
- if (clipboard && clipboard.items) {
- for (let i = 0; i < clipboard.items.length; i++) {
- const item = clipboard.items[i];
- if (item.type.indexOf("image") !== -1) {
- e.preventDefault();
- const file = item.getAsFile();
- insertImage(file);
- }
- }
- }
-}
-
-function insertImage(file) {
- const formData = new FormData();
- formData.append("file", file);
- axios
- .post(uploadUrl.value, formData, {
- headers: {
- "Content-Type": "multipart/form-data",
- Authorization: headers.value.Authorization,
- },
- })
- .then((res) => {
- handleUploadSuccess(res.data);
- });
-}
-</script>
-
-<style>
-.editor-img-uploader {
- display: none;
-}
-.editor,
-.ql-toolbar {
- white-space: pre-wrap !important;
- line-height: normal !important;
-}
-.quill-img {
- display: none;
-}
-.ql-snow .ql-tooltip[data-mode="link"]::before {
- content: "璇疯緭鍏ラ摼鎺ュ湴鍧�:";
-}
-.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
- border-right: 0px;
- content: "淇濆瓨";
- padding-right: 0px;
-}
-.ql-snow .ql-tooltip[data-mode="video"]::before {
- content: "璇疯緭鍏ヨ棰戝湴鍧�:";
-}
-.ql-snow .ql-picker.ql-size .ql-picker-label::before,
-.ql-snow .ql-picker.ql-size .ql-picker-item::before {
- content: "14px";
-}
-.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
-.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
- content: "10px";
-}
-.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
-.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
- content: "18px";
-}
-.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
-.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
- content: "32px";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item::before {
- content: "鏂囨湰";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
- content: "鏍囬1";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
- content: "鏍囬2";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
- content: "鏍囬3";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
- content: "鏍囬4";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
- content: "鏍囬5";
-}
-.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
-.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
- content: "鏍囬6";
-}
-.ql-snow .ql-picker.ql-font .ql-picker-label::before,
-.ql-snow .ql-picker.ql-font .ql-picker-item::before {
- content: "鏍囧噯瀛椾綋";
-}
-.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
-.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
- content: "琛嚎瀛椾綋";
-}
-.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
-.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
- content: "绛夊瀛椾綋";
-}
-</style>
diff --git a/src/components/FileCard.vue b/src/components/FileCard.vue
deleted file mode 100644
index d14ec48..0000000
--- a/src/components/FileCard.vue
+++ /dev/null
@@ -1,81 +0,0 @@
-<template>
- <div class="file-card">
- <img src="@/assets/img/fileImg/unknowfile.png" alt="" v-if="fileType == 0"/>
- <img src="@/assets/img/fileImg/word.png" alt="" v-else-if="fileType == 1"/>
- <img src="@/assets/img/fileImg/excel.png" alt="" v-else-if="fileType == 2"/>
- <img src="@/assets/img/fileImg/ppt.png" alt="" v-else-if="fileType == 3"/>
- <img src="@/assets/img/fileImg/pdf.png" alt="" v-else-if="fileType == 4"/>
- <img src="@/assets/img/fileImg/zpi.png" alt="" v-else-if="fileType == 5"/>
- <img src="@/assets/img/fileImg/txt.png" alt="" v-else/>
- <div class="word">
- <span
- >{{file.name || '鏈煡'}}</span
- >
- <span>154kb</span>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- // props: ["fileType", "file"],
- props: {
- fileType: Number,
- file: File,
- default() {
- return {};
- },
- },
- watch: {
- file() {
- console.log(this.file);
- },
- },
- mounted() {
- console.log(this.file);
- console.log(this.fileType);
- }
-};
-</script>
-
-<style lang="scss" scoped>
-.file-card {
- width: 250px;
- height: 100px;
- background-color: rgb(45, 48, 63);
- border-radius: 20px;
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 10px;
- box-sizing: border-box;
- cursor: pointer;
- &:hover {
- background-color: rgb(33, 36, 54);
- }
- img {
- width: 60px;
- height: 60px;
- }
- .word {
- width: 60%;
- margin-left: 10px;
- overflow: hidden;
- span {
- width: 90%;
- display: inline-block;
- color: #fff;
- }
- span:first-child {
- font-size: 14px;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
- span:last-child {
- font-size: 12px;
- color: rgb(180, 180, 180);
- }
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
deleted file mode 100644
index 57e62b7..0000000
--- a/src/components/FileUpload/index.vue
+++ /dev/null
@@ -1,259 +0,0 @@
-<template>
- <div class="upload-file">
- <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :data="data"
- :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess"
- :show-file-list="false" :headers="headers" class="upload-file-uploader" ref="fileUpload" v-if="!disabled">
- <!-- 涓婁紶鎸夐挳 -->
- <el-button type="primary">閫夊彇鏂囦欢</el-button>
- </el-upload>
- <!-- 涓婁紶鎻愮ず -->
- <div class="el-upload__tip" v-if="showTip && !disabled">
- 璇蜂笂浼�
- <template v-if="fileSize">
- 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b>
- </template>
- <template v-if="fileType">
- 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
- </template>
- 鐨勬枃浠�
- </div>
- <!-- 鏂囦欢鍒楄〃 -->
- <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
- <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
- <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
- <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
- </el-link>
- <div class="ele-upload-list__item-content-action">
- <el-link :underline="false" @click="handleDelete(index)" type="danger" v-if="!disabled"> 鍒犻櫎</el-link>
- </div>
- </li>
- </transition-group>
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import Sortable from "sortablejs";
-
-const props = defineProps({
- modelValue: [String, Object, Array],
- // 涓婁紶鎺ュ彛鍦板潃
- action: {
- type: String,
- default: "/common/upload",
- },
- // 涓婁紶鎼哄甫鐨勫弬鏁�
- data: {
- type: Object,
- },
- // 鏁伴噺闄愬埗
- limit: {
- type: Number,
- default: 5,
- },
- // 澶у皬闄愬埗(MB)
- fileSize: {
- type: Number,
- default: 5,
- },
- // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg']
- fileType: {
- type: Array,
- default: () => ["doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "pdf"],
- },
- // 鏄惁鏄剧ず鎻愮ず
- isShowTip: {
- type: Boolean,
- default: true,
- },
- // 绂佺敤缁勪欢锛堜粎鏌ョ湅鏂囦欢锛�
- disabled: {
- type: Boolean,
- default: false,
- },
- // 鎷栧姩鎺掑簭
- drag: {
- type: Boolean,
- default: true,
- },
-});
-
-const { proxy } = getCurrentInstance();
-const emit = defineEmits();
-const number = ref(0);
-const uploadList = ref([]);
-const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action); // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧�
-const headers = ref({ Authorization: "Bearer " + getToken() });
-const fileList = ref([]);
-const showTip = computed(
- () => props.isShowTip && (props.fileType || props.fileSize)
-);
-
-watch(
- () => props.modelValue,
- (val) => {
- if (val) {
- let temp = 1;
- // 棣栧厛灏嗗�艰浆涓烘暟缁�
- const list = Array.isArray(val) ? val : props.modelValue.split(",");
- // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
- fileList.value = list.map((item) => {
- if (typeof item === "string") {
- item = { name: item, url: item };
- }
- item.uid = item.uid || new Date().getTime() + temp++;
- return item;
- });
- } else {
- fileList.value = [];
- return [];
- }
- },
- { deep: true, immediate: true }
-);
-
-// 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢绫诲瀷
- if (props.fileType.length) {
- const fileName = file.name.split(".");
- const fileExt = fileName[fileName.length - 1];
- const isTypeOk = props.fileType.indexOf(fileExt) >= 0;
- if (!isTypeOk) {
- proxy.$modal.msgError(
- `鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!`
- );
- return false;
- }
- }
- // 鏍℃鏂囦欢鍚嶆槸鍚﹀寘鍚壒娈婂瓧绗�
- if (file.name.includes(",")) {
- proxy.$modal.msgError("鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!");
- return false;
- }
- // 鏍℃鏂囦欢澶у皬
- if (props.fileSize) {
- const isLt = file.size / 1024 / 1024 < props.fileSize;
- if (!isLt) {
- proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
- return false;
- }
- }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- number.value++;
- return true;
-}
-
-// 鏂囦欢涓暟瓒呭嚭
-function handleExceed() {
- proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`);
-}
-
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file) {
- if (res.code === 200) {
- uploadList.value.push({ name: res.fileName, url: res.fileName });
- uploadedSuccessfully();
- } else {
- number.value--;
- proxy.$modal.closeLoading();
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- uploadedSuccessfully();
- }
-}
-
-// 鍒犻櫎鏂囦欢
-function handleDelete(index) {
- fileList.value.splice(index, 1);
- emit("update:modelValue", listToString(fileList.value));
-}
-
-// 涓婁紶缁撴潫澶勭悊
-function uploadedSuccessfully() {
- if (number.value > 0 && uploadList.value.length === number.value) {
- fileList.value = fileList.value
- .filter((f) => f.url !== undefined)
- .concat(uploadList.value);
- uploadList.value = [];
- number.value = 0;
- emit("update:modelValue", listToString(fileList.value));
- proxy.$modal.closeLoading();
- }
-}
-
-// 鑾峰彇鏂囦欢鍚嶇О
-function getFileName(name) {
- // 濡傛灉鏄痷rl閭d箞鍙栨渶鍚庣殑鍚嶅瓧 濡傛灉涓嶆槸鐩存帴杩斿洖
- if (name.lastIndexOf("/") > -1) {
- return name.slice(name.lastIndexOf("/") + 1);
- } else {
- return name;
- }
-}
-
-// 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅�
-function listToString(list, separator) {
- let strs = "";
- separator = separator || ",";
- for (let i in list) {
- if (list[i].url) {
- strs += list[i].url + separator;
- }
- }
- return strs != "" ? strs.substr(0, strs.length - 1) : "";
-}
-
-// 鍒濆鍖栨嫋鎷芥帓搴�
-onMounted(() => {
- if (props.drag) {
- nextTick(() => {
- const element = document.querySelector(".upload-file-list");
- Sortable.create(element, {
- ghostClass: "file-upload-darg",
- onEnd: (evt) => {
- const movedItem = fileList.value.splice(evt.oldIndex, 1)[0];
- fileList.value.splice(evt.newIndex, 0, movedItem);
- emit("update:modelValue", listToString(fileList.value));
- },
- });
- });
- }
-});
-</script>
-<style scoped lang="scss">
-.file-upload-darg {
- opacity: 0.5;
- background: #c8ebfb;
-}
-
-.upload-file-uploader {
- margin-bottom: 5px;
-}
-
-.upload-file-list .el-upload-list__item {
- border: 1px solid #e4e7ed;
- line-height: 2;
- margin-bottom: 10px;
- position: relative;
- transition: none !important;
-}
-
-.upload-file-list .ele-upload-list__item-content {
- display: flex;
- justify-content: space-between;
- align-items: center;
- color: inherit;
-}
-
-.ele-upload-list__item-content-action .el-link {
- margin-right: 10px;
-}
-</style>
diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue
deleted file mode 100644
index 3ea9388..0000000
--- a/src/components/Hamburger/index.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-<template>
- <div style="padding: 0 15px;" @click="toggleClick">
- <svg
- :class="{'is-active':isActive}"
- class="hamburger"
- viewBox="0 0 1024 1024"
- xmlns="http://www.w3.org/2000/svg"
- width="64"
- height="64"
- fill="currentColor"
- >
- <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
- </svg>
- </div>
-</template>
-
-<script setup>
-defineProps({
- isActive: {
- type: Boolean,
- default: false
- }
-})
-
-const emit = defineEmits()
-const toggleClick = () => {
- emit('toggleClick')
-}
-</script>
-
-<style scoped>
-.hamburger {
- display: inline-block;
- vertical-align: middle;
- width: 20px;
- height: 20px;
-}
-
-.hamburger.is-active {
- transform: rotate(180deg);
-}
-</style>
diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue
deleted file mode 100644
index b57fe69..0000000
--- a/src/components/HeaderSearch/index.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-<template>
- <div class="header-search">
- <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" />
- <el-dialog
- v-model="show"
- width="600"
- @close="close"
- :show-close="false"
- append-to-body
- >
- <el-input
- v-model="search"
- ref="headerSearchSelectRef"
- size="large"
- @input="querySearch"
- prefix-icon="Search"
- placeholder="鑿滃崟鎼滅储锛屾敮鎸佹爣棰樸�乁RL妯$硦鏌ヨ"
- clearable
- >
- </el-input>
-
- <div class="result-wrap">
- <el-scrollbar>
- <div class="search-item" tabindex="1" v-for="item in options" :key="item.path">
- <div class="left">
- <svg-icon class="menu-icon" :icon-class="item.icon" />
- </div>
- <div class="search-info" @click="change(item)">
- <div class="menu-title">
- {{ item.title.join(" / ") }}
- </div>
- <div class="menu-path">
- {{ item.path }}
- </div>
- </div>
- </div>
- </el-scrollbar>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import Fuse from 'fuse.js'
-import { getNormalPath } from '@/utils/ruoyi'
-import { isHttp } from '@/utils/validate'
-import usePermissionStore from '@/store/modules/permission'
-
-const search = ref('')
-const options = ref([])
-const searchPool = ref([])
-const show = ref(false)
-const fuse = ref(undefined)
-const headerSearchSelectRef = ref(null)
-const router = useRouter()
-const routes = computed(() => usePermissionStore().defaultRoutes)
-
-function click() {
- show.value = !show.value
- if (show.value) {
- headerSearchSelectRef.value && headerSearchSelectRef.value.focus()
- options.value = searchPool.value
- }
-}
-
-function close() {
- headerSearchSelectRef.value && headerSearchSelectRef.value.blur()
- search.value = ''
- options.value = []
- show.value = false
-}
-
-function change(val) {
- const path = val.path
- const query = val.query
- if (isHttp(path)) {
- // http(s):// 璺緞鏂扮獥鍙f墦寮�
- const pindex = path.indexOf("http")
- window.open(path.substr(pindex, path.length), "_blank")
- } else {
- if (query) {
- router.push({ path: path, query: JSON.parse(query) })
- } else {
- router.push(path)
- }
- }
-
- search.value = ''
- options.value = []
- nextTick(() => {
- show.value = false
- })
-}
-
-function initFuse(list) {
- fuse.value = new Fuse(list, {
- shouldSort: true,
- threshold: 0.4,
- location: 0,
- distance: 100,
- minMatchCharLength: 1,
- keys: [{
- name: 'title',
- weight: 0.7
- }, {
- name: 'path',
- weight: 0.3
- }]
- })
-}
-
-// Filter out the routes that can be displayed in the sidebar
-// And generate the internationalized title
-function generateRoutes(routes, basePath = '', prefixTitle = []) {
- let res = []
-
- for (const r of routes) {
- // skip hidden router
- if (r.hidden) { continue }
- const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path
- const data = {
- path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path,
- title: [...prefixTitle],
- icon: ''
- }
-
- if (r.meta && r.meta.title) {
- data.title = [...data.title, r.meta.title]
- data.icon = r.meta.icon
- if (r.redirect !== "noRedirect") {
- // only push the routes with title
- // special case: need to exclude parent router without redirect
- res.push(data)
- }
- }
- if (r.query) {
- data.query = r.query
- }
-
- // recursive child routes
- if (r.children) {
- const tempRoutes = generateRoutes(r.children, data.path, data.title)
- if (tempRoutes.length >= 1) {
- res = [...res, ...tempRoutes]
- }
- }
- }
- return res
-}
-
-function querySearch(query) {
- if (query !== '') {
- options.value = fuse.value.search(query).map((item) => item.item) ?? searchPool.value
- } else {
- options.value = searchPool.value
- }
-}
-
-onMounted(() => {
- searchPool.value = generateRoutes(routes.value)
-})
-
-watch(searchPool, (list) => {
- initFuse(list)
-})
-</script>
-
-<style lang='scss' scoped>
-.header-search {
- .search-icon {
- cursor: pointer;
- font-size: 18px;
- vertical-align: middle;
- }
-}
-
-.result-wrap {
- height: 280px;
- margin: 10px 0;
-
- .search-item {
- display: flex;
- height: 48px;
-
- .left {
- width: 60px;
- text-align: center;
-
- .menu-icon {
- width: 18px;
- height: 18px;
- margin-top: 5px;
- }
- }
-
- .search-info {
- padding-left: 5px;
- width: 100%;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
-
- .menu-title,
- .menu-path {
- height: 20px;
- }
- .menu-path {
- color: #ccc;
- font-size: 10px;
- }
- }
- }
-
- .search-item:hover {
- cursor: pointer;
- }
-}
-</style>
diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue
deleted file mode 100644
index 3bb177f..0000000
--- a/src/components/IconSelect/index.vue
+++ /dev/null
@@ -1,111 +0,0 @@
-<template>
- <div class="icon-body">
- <el-input
- v-model="iconName"
- class="icon-search"
- clearable
- placeholder="璇疯緭鍏ュ浘鏍囧悕绉�"
- @clear="filterIcons"
- @input="filterIcons"
- >
- <template #suffix><i class="el-icon-search el-input__icon" /></template>
- </el-input>
- <div class="icon-list">
- <div class="list-container">
- <div v-for="(item, index) in iconList" class="icon-item-wrapper" :key="index" @click="selectedIcon(item)">
- <div :class="['icon-item', { active: activeIcon === item }]">
- <svg-icon :icon-class="item" class-name="icon" style="height: 25px;width: 16px;"/>
- <span>{{ item }}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import icons from './requireIcons'
-
-const props = defineProps({
- activeIcon: {
- type: String
- }
-})
-
-const iconName = ref('')
-const iconList = ref(icons)
-const emit = defineEmits(['selected'])
-
-function filterIcons() {
- iconList.value = icons
- if (iconName.value) {
- iconList.value = icons.filter(item => item.indexOf(iconName.value) !== -1)
- }
-}
-
-function selectedIcon(name) {
- emit('selected', name)
- document.body.click()
-}
-
-function reset() {
- iconName.value = ''
- iconList.value = icons
-}
-
-defineExpose({
- reset
-})
-</script>
-
-<style lang='scss' scoped>
- .icon-body {
- width: 100%;
- padding: 10px;
- .icon-search {
- position: relative;
- margin-bottom: 5px;
- }
- .icon-list {
- height: 200px;
- overflow: auto;
- .list-container {
- display: flex;
- flex-wrap: wrap;
- .icon-item-wrapper {
- width: calc(100% / 3);
- height: 25px;
- line-height: 25px;
- cursor: pointer;
- display: flex;
- .icon-item {
- display: flex;
- max-width: 100%;
- height: 100%;
- padding: 0 5px;
- &:hover {
- background: #ececec;
- border-radius: 5px;
- }
- .icon {
- flex-shrink: 0;
- }
- span {
- display: inline-block;
- vertical-align: -0.15em;
- fill: currentColor;
- padding-left: 2px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- }
- .icon-item.active {
- background: #ececec;
- border-radius: 5px;
- }
- }
- }
- }
- }
-</style>
\ No newline at end of file
diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js
deleted file mode 100644
index ccdfaa4..0000000
--- a/src/components/IconSelect/requireIcons.js
+++ /dev/null
@@ -1,8 +0,0 @@
-let icons = []
-const modules = import.meta.glob('./../../assets/icons/svg/*.svg')
-for (const path in modules) {
- const p = path.split('assets/icons/svg/')[1].split('.svg')[0]
- icons.push(p)
-}
-
-export default icons
\ No newline at end of file
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
deleted file mode 100644
index 00212c5..0000000
--- a/src/components/ImagePreview/index.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-<template>
- <el-image
- :src="`${realSrc}`"
- fit="cover"
- :style="`width:${realWidth};height:${realHeight};`"
- :preview-src-list="realSrcList"
- preview-teleported
- >
- <template #error>
- <div class="image-slot">
- <el-icon><picture-filled /></el-icon>
- </div>
- </template>
- </el-image>
-</template>
-
-<script setup>
-import { isExternal } from "@/utils/validate"
-
-const props = defineProps({
- src: {
- type: String,
- default: ""
- },
- width: {
- type: [Number, String],
- default: ""
- },
- height: {
- type: [Number, String],
- default: ""
- }
-})
-
-const realSrc = computed(() => {
- if (!props.src) {
- return
- }
- let real_src = props.src.split(",")[0]
- if (isExternal(real_src)) {
- return real_src
- }
- return import.meta.env.VITE_APP_BASE_API + real_src
-})
-
-const realSrcList = computed(() => {
- if (!props.src) {
- return
- }
- let real_src_list = props.src.split(",")
- let srcList = []
- real_src_list.forEach(item => {
- if (isExternal(item)) {
- return srcList.push(item)
- }
- return srcList.push(import.meta.env.VITE_APP_BASE_API + item)
- })
- return srcList
-})
-
-const realWidth = computed(() =>
- typeof props.width == "string" ? props.width : `${props.width}px`
-)
-
-const realHeight = computed(() =>
- typeof props.height == "string" ? props.height : `${props.height}px`
-)
-</script>
-
-<style lang="scss" scoped>
-.el-image {
- border-radius: 5px;
- background-color: #ebeef5;
- box-shadow: 0 0 5px 1px #ccc;
- :deep(.el-image__inner) {
- transition: all 0.3s;
- cursor: pointer;
- &:hover {
- transform: scale(1.2);
- }
- }
- :deep(.image-slot) {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100%;
- color: #909399;
- font-size: 30px;
- }
-}
-</style>
diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
deleted file mode 100644
index 9670c72..0000000
--- a/src/components/ImageUpload/index.vue
+++ /dev/null
@@ -1,256 +0,0 @@
-<template>
- <div class="component-upload-image">
- <el-upload
- multiple
- :action="uploadImgUrl"
- list-type="picture-card"
- :on-success="handleUploadSuccess"
- :before-upload="handleBeforeUpload"
- :data="data"
- :limit="limit"
- :on-error="handleUploadError"
- :on-exceed="handleExceed"
- ref="imageUpload"
- :before-remove="handleDelete"
- :show-file-list="true"
- :headers="headers"
- :file-list="fileList"
- :on-preview="handlePictureCardPreview"
- :class="{ hide: fileList.length >= limit }"
- >
- <el-icon class="avatar-uploader-icon"><plus /></el-icon>
- </el-upload>
- <!-- 涓婁紶鎻愮ず -->
- <div class="el-upload__tip" v-if="showTip">
- 璇蜂笂浼�
- <template v-if="fileSize">
- 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b>
- </template>
- <template v-if="fileType">
- 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
- </template>
- 鐨勬枃浠�
- </div>
-
- <el-dialog
- v-model="dialogVisible"
- title="棰勮"
- width="800px"
- append-to-body
- >
- <img
- :src="dialogImageUrl"
- style="display: block; max-width: 100%; margin: 0 auto"
- />
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import { isExternal } from "@/utils/validate";
-import Sortable from "sortablejs";
-
-const props = defineProps({
- modelValue: [String, Object, Array],
- // 涓婁紶鎺ュ彛鍦板潃
- action: {
- type: String,
- default: "/common/upload",
- },
- // 涓婁紶鎼哄甫鐨勫弬鏁�
- data: {
- type: Object,
- },
- // 鍥剧墖鏁伴噺闄愬埗
- limit: {
- type: Number,
- default: 5,
- },
- // 澶у皬闄愬埗(MB)
- fileSize: {
- type: Number,
- default: 5,
- },
- // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg']
- fileType: {
- type: Array,
- default: () => ["png", "jpg", "jpeg"],
- },
- // 鏄惁鏄剧ず鎻愮ず
- isShowTip: {
- type: Boolean,
- default: true,
- },
- // 鎷栧姩鎺掑簭
- drag: {
- type: Boolean,
- default: true,
- },
-});
-
-const { proxy } = getCurrentInstance();
-const emit = defineEmits();
-const number = ref(0);
-const uploadList = ref([]);
-const dialogImageUrl = ref("");
-const dialogVisible = ref(false);
-const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-const headers = ref({ Authorization: "Bearer " + getToken() });
-const fileList = ref([]);
-const showTip = computed(
- () => props.isShowTip && (props.fileType || props.fileSize)
-);
-
-watch(
- () => props.modelValue,
- (val) => {
- if (val) {
- // 棣栧厛灏嗗�艰浆涓烘暟缁�
- const list = Array.isArray(val) ? val : props.modelValue.split(",");
- // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
- fileList.value = list.map((item) => {
- if (typeof item === "string") {
- if (item.indexOf(baseUrl) === -1 && !isExternal(item)) {
- item = { name: baseUrl + item, url: baseUrl + item };
- } else {
- item = { name: item, url: item };
- }
- }
- return item;
- });
- } else {
- fileList.value = [];
- return [];
- }
- },
- { deep: true, immediate: true }
-);
-
-// 涓婁紶鍓峫oading鍔犺浇
-function handleBeforeUpload(file) {
- let isImg = false;
- if (props.fileType.length) {
- let fileExtension = "";
- if (file.name.lastIndexOf(".") > -1) {
- fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
- }
- isImg = props.fileType.some((type) => {
- if (file.type.indexOf(type) > -1) return true;
- if (fileExtension && fileExtension.indexOf(type) > -1) return true;
- return false;
- });
- } else {
- isImg = file.type.indexOf("image") > -1;
- }
- if (!isImg) {
- proxy.$modal.msgError(
- `鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!`
- );
- return false;
- }
- if (file.name.includes(",")) {
- proxy.$modal.msgError("鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!");
- return false;
- }
- if (props.fileSize) {
- const isLt = file.size / 1024 / 1024 < props.fileSize;
- if (!isLt) {
- proxy.$modal.msgError(`涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
- return false;
- }
- }
- proxy.$modal.loading("姝e湪涓婁紶鍥剧墖锛岃绋嶅��...");
- number.value++;
-}
-
-// 鏂囦欢涓暟瓒呭嚭
-function handleExceed() {
- proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`);
-}
-
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file) {
- if (res.code === 200) {
- uploadList.value.push({ name: res.fileName, url: res.fileName });
- uploadedSuccessfully();
- } else {
- number.value--;
- proxy.$modal.closeLoading();
- proxy.$modal.msgError(res.msg);
- proxy.$refs.imageUpload.handleRemove(file);
- uploadedSuccessfully();
- }
-}
-
-// 鍒犻櫎鍥剧墖
-function handleDelete(file) {
- const findex = fileList.value.map((f) => f.name).indexOf(file.name);
- if (findex > -1 && uploadList.value.length === number.value) {
- fileList.value.splice(findex, 1);
- emit("update:modelValue", listToString(fileList.value));
- return false;
- }
-}
-
-// 涓婁紶缁撴潫澶勭悊
-function uploadedSuccessfully() {
- if (number.value > 0 && uploadList.value.length === number.value) {
- fileList.value = fileList.value
- .filter((f) => f.url !== undefined)
- .concat(uploadList.value);
- uploadList.value = [];
- number.value = 0;
- emit("update:modelValue", listToString(fileList.value));
- proxy.$modal.closeLoading();
- }
-}
-
-// 涓婁紶澶辫触
-function handleUploadError() {
- proxy.$modal.msgError("涓婁紶鍥剧墖澶辫触");
- proxy.$modal.closeLoading();
-}
-
-// 棰勮
-function handlePictureCardPreview(file) {
- dialogImageUrl.value = file.url;
- dialogVisible.value = true;
-}
-
-// 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅�
-function listToString(list, separator) {
- let strs = "";
- separator = separator || ",";
- for (let i in list) {
- if (undefined !== list[i].url && list[i].url.indexOf("blob:") !== 0) {
- strs += list[i].url.replace(baseUrl, "") + separator;
- }
- }
- return strs != "" ? strs.substr(0, strs.length - 1) : "";
-}
-
-// 鍒濆鍖栨嫋鎷芥帓搴�
-onMounted(() => {
- if (props.drag) {
- nextTick(() => {
- const element = document.querySelector(".el-upload-list");
- Sortable.create(element, {
- onEnd: (evt) => {
- const movedItem = fileList.value.splice(evt.oldIndex, 1)[0];
- fileList.value.splice(evt.newIndex, 0, movedItem);
- emit("update:modelValue", listToString(fileList.value));
- },
- });
- });
- }
-});
-</script>
-
-<style scoped lang="scss">
-// .el-upload--picture-card 鎺у埗鍔犲彿閮ㄥ垎
-:deep(.hide .el-upload--picture-card) {
- display: none;
-}
-</style>
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
deleted file mode 100644
index c0a67a6..0000000
--- a/src/components/PIMTable/PIMTable.vue
+++ /dev/null
@@ -1,429 +0,0 @@
-<template>
- <el-table
- ref="multipleTable"
- v-loading="tableLoading"
- :border="border"
- :data="tableData"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- :height="height"
- :highlight-current-row="highlightCurrentRow"
- :row-class-name="rowClassName"
- :row-style="rowStyle"
- :row-key="rowKey"
- style="width: 100%"
- tooltip-effect="dark"
- :expand-row-keys="expandRowKeys"
- :show-summary="isShowSummary"
- :summary-method="summaryMethod"
- @row-click="rowClick"
- @current-change="currentChange"
- @selection-change="handleSelectionChange"
- @expand-change="expandChange"
- class="lims-table"
- >
- <el-table-column
- align="center"
- type="selection"
- width="55"
- v-if="isSelection"
- />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-
- <el-table-column
- v-for="(item, index) in column"
- :key="index"
- :column-key="item.columnKey"
- :filter-method="item.filterHandler"
- :filter-multiple="item.filterMultiple"
- :filtered-value="item.filteredValue"
- :filters="item.filters"
- :fixed="item.fixed"
- :label="item.label"
- :prop="item.prop"
- show-overflow-tooltip
- :align="item.align"
- :sortable="!!item.sortable"
- :type="item.type"
- :width="item.width"
- >
- <template
- v-if="item.hasOwnProperty('colunmTemplate')"
- #[item.colunmTemplate]="scope"
- >
- <slot
- v-if="item.theadSlot"
- :name="item.theadSlot"
- :index="scope.$index"
- :row="scope.row"
- />
- </template>
-
- <template #default="scope">
- <!-- 鎻掓Ы -->
- <div v-if="item.dataType == 'slot'">
- <slot
- v-if="item.slot"
- :index="scope.$index"
- :name="item.slot"
- :row="scope.row"
- />
- </div>
- <!-- 杩涘害鏉� -->
- <div v-else-if="item.dataType == 'progress'">
- <el-progress :percentage="Number(scope.row[item.prop])" />
- </div>
- <!-- 鍥剧墖 -->
- <div v-else-if="item.dataType == 'image'">
- <img
- :src="javaApi + '/img/' + scope.row[item.prop]"
- alt=""
- style="width: 40px; height: 40px; margin-top: 10px"
- />
- </div>
-
- <!-- tag -->
- <div v-else-if="item.dataType == 'tag'">
- <el-tag
- v-if="
- typeof dataTypeFn(scope.row[item.prop], item.formatData) ===
- 'string'
- "
- :title="formatters(scope.row[item.prop], item.formatData)"
- :type="formatType(scope.row[item.prop], item.formatType)"
- >
- {{ formatters(scope.row[item.prop], item.formatData) }}
- </el-tag>
-
- <el-tag
- v-for="(tag, index) in dataTypeFn(
- scope.row[item.prop],
- item.formatData
- )"
- v-else-if="
- typeof dataTypeFn(scope.row[item.prop], item.formatData) ===
- 'object'
- "
- :key="index"
- :title="formatters(scope.row[item.prop], item.formatData)"
- :type="formatType(tag, item.formatType)"
- >
- {{ item.tagGroup ? tag[item.tagGroup.label] ?? tag : tag }}
- </el-tag>
-
- <el-tag
- v-else
- :title="formatters(scope.row[item.prop], item.formatData)"
- :type="formatType(scope.row[item.prop], item.formatType)"
- >
- {{ formatters(scope.row[item.prop], item.formatData) }}
- </el-tag>
- </div>
-
- <!-- 鎸夐挳 -->
- <div v-else-if="item.dataType == 'action'">
- <template v-for="(o, key) in item.operation" :key="key">
- <el-button
- v-show="o.type != 'upload'"
- v-if="o.showHide ? o.showHide(scope.row) : true"
- :disabled="o.disabled ? o.disabled(scope.row) : false"
- :plain="o.plain"
- type="primary"
- :style="{
- color:
- o.name === '鍒犻櫎' || o.name === 'delete'
- ? '#f56c6c'
- : o.color,
- }"
- link
- @click="o.clickFun(scope.row)"
- :key="key"
- >
- {{ o.name }}
- </el-button>
- <el-upload
- :action="
- javaApi +
- o.url +
- '?id=' +
- (o.uploadIdFun ? o.uploadIdFun(scope.row) : scope.row.id)
- "
- ref="uploadRef"
- :multiple="o.multiple ? o.multiple : false"
- :limit="1"
- :disabled="o.disabled ? o.disabled(scope.row) : false"
- :accept="
- o.accept
- ? o.accept
- : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
- "
- v-if="o.type == 'upload'"
- style="display: inline-block; width: 50px"
- v-show="o.showHide ? o.showHide(scope.row) : true"
- :headers="uploadHeader"
- :before-upload="(file) => beforeUpload(file, scope.$index)"
- :on-change="
- (file, fileList) => handleChange(file, fileList, scope.$index)
- "
- :on-error="
- (error, file, fileList) =>
- onError(error, file, fileList, scope.$index)
- "
- :on-success="
- (response, file, fileList) =>
- handleSuccessUp(response, file, fileList, scope.$index)
- "
- :on-exceed="onExceed"
- :show-file-list="false"
- >
- <el-button
- link
- type="primary"
- :disabled="o.disabled ? o.disabled(scope.row) : false"
- >{{ o.name }}</el-button
- >
- </el-upload>
- </template>
- </div>
- <!-- 鍙偣鍑荤殑鏂囧瓧 -->
- <div
- v-else-if="item.dataType == 'link'"
- class="cell link"
- style="width: 100%"
- @click="goLink(scope.row, item.linkMethod)"
- >
- <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
- </div>
- <!-- 榛樿绾睍绀烘暟鎹� -->
- <div v-else class="cell" style="width: 100%">
- <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
- <span v-else>{{
- formatters(scope.row[item.prop], item.formatData)
- }}</span>
- </div>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-if="page.total > 0"
- :total="page.total"
- :layout="page.layout"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationSearch"
- />
-</template>
-
-<script setup>
-import pagination from "./Pagination.vue";
-import { ref, inject, getCurrentInstance } from "vue";
-import { ElMessage } from "element-plus";
-
-// 鑾峰彇鍏ㄥ眬鐨� uploadHeader
-const { proxy } = getCurrentInstance();
-const uploadHeader = proxy.uploadHeader;
-const javaApi = proxy.javaApi;
-
-const emit = defineEmits(["pagination", "expand-change", "selection-change"]);
-
-// Filters
-const typeFn = (val, row) => {
- return typeof val === "function" ? val(row) : val;
-};
-
-const formatters = (val, format) => {
- return typeof format === "function" ? format(val) : val;
-};
-
-// Props锛堜娇鐢� defineProps 鐨勯潪 TS 褰㈠紡锛�
-const props = defineProps({
- tableLoading: {
- type: Boolean,
- default: false,
- },
- height: {
- type: [Number, String],
- default: "calc(100vh - 22em)",
- },
- expandRowKeys: {
- type: Array,
- default: () => [],
- },
- summaryMethod: {
- type: Function,
- default: () => {},
- },
- rowClick: {
- type: Function,
- default: () => {},
- },
- currentChange: {
- type: Function,
- default: () => {},
- },
- border: {
- type: Boolean,
- default: true,
- },
- isSelection: {
- type: Boolean,
- default: false,
- },
- isShowSummary: {
- type: Boolean,
- default: false,
- },
- highlightCurrentRow: {
- type: Boolean,
- default: false,
- },
- headerCellStyle: {
- type: Object,
- default: () => ({}),
- },
- column: {
- type: Array,
- default: () => [],
- },
- rowClassName: {
- type: Function,
- default: () => "",
- },
- rowStyle: {
- type: [Object, Function],
- default: () => ({}),
- },
- tableData: {
- type: Array,
- default: () => [],
- },
- rowKey: {
- type: String,
- default: 'id',
- },
- page: {
- type: Object,
- default: () => ({
- total: 0,
- current: 0,
- size: 10,
- layout: "total, sizes, prev, pager, next, jumper",
- }),
- },
- total: {
- type: Number,
- default: 0,
- },
-});
-
-// Data
-const uploadRefs = ref([]);
-const currentFiles = ref({});
-const uploadKeys = ref({});
-
-const indexMethod = (index) => {
- return (props.page.current - 1) * props.page.size + index + 1;
-};
-
-// 鐐瑰嚮 link 浜嬩欢
-const goLink = (row, linkMethod) => {
- if (!linkMethod) {
- return ElMessage.warning("璇烽厤缃� link 浜嬩欢");
- }
- const parentMethod = getParentMethod(linkMethod);
- if (typeof parentMethod === "function") {
- parentMethod(row);
- } else {
- console.warn(`鐖剁粍浠朵腑鏈壘鍒版柟娉�: ${linkMethod}`);
- }
-};
-
-// 鑾峰彇鐖剁粍浠舵柟娉曪紙绀轰緥瀹炵幇锛�
-const getParentMethod = (methodName) => {
- const parentMethods = inject("parentMethods", {});
- return parentMethods[methodName];
-};
-
-const dataTypeFn = (val, format) => {
- if (typeof format === "function") {
- return format(val);
- } else return val;
-};
-
-const formatType = (val, format) => {
- if (typeof format === "function") {
- return format(val);
- } else return "";
-};
-
-// 鏂囦欢鍙樺寲澶勭悊
-const handleChange = (file, fileList, index) => {
- if (fileList.length > 1) {
- const earliestFile = fileList[0];
- uploadRefs.value[index]?.handleRemove(earliestFile);
- }
- currentFiles.value[index] = file;
-};
-
-// 鏂囦欢涓婁紶鍓嶆牎楠�
-const beforeUpload = (rawFile, index) => {
- currentFiles.value[index] = {};
- if (rawfile.size > 1024 * 1024 * 10 * 10) {
- ElMessage.error("涓婁紶鏂囦欢涓嶈秴杩�10M");
- return false;
- }
- return true;
-};
-
-// 涓婁紶鎴愬姛
-const handleSuccessUp = (response, file, fileList, index) => {
- if (response.code == 200) {
- if (uploadRefs[index]) {
- uploadRefs[index].clearFiles();
- }
- currentFiles[index] = file;
- ElMessage.success("涓婁紶鎴愬姛");
- resetUploadComponent(index);
- } else {
- ElMessage.error(response.message);
- }
-};
-
-const resetUploadComponent = (index) => {
- uploadKeys[index] = Date.now();
-};
-
-// 涓婁紶澶辫触
-const onError = (error, file, fileList, index) => {
- ElMessage.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
- if (uploadRefs.value[index]) {
- uploadRefs.value[index].clearFiles();
- }
-};
-
-// 鏂囦欢鏁伴噺瓒呴檺鎻愮ず
-const onExceed = () => {
- ElMessage.warning("瓒呭嚭鏂囦欢涓暟");
-};
-
-const paginationSearch = ({ page, limit }) => {
- emit("pagination", { page: page, limit: limit });
-};
-
-const expandChange = (row, expandedRows) => {
- emit("expand-change", row, expandedRows);
-};
-
-const handleSelectionChange = (newSelection) => {
- emit("selection-change", newSelection);
-};
-</script>
-
-<style scoped lang="scss">
-.cell {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- padding-right: 0 !important;
- padding-left: 0 !important;
-}
-</style>
diff --git a/src/components/PIMTable/Pagination.vue b/src/components/PIMTable/Pagination.vue
deleted file mode 100644
index 7639e64..0000000
--- a/src/components/PIMTable/Pagination.vue
+++ /dev/null
@@ -1,100 +0,0 @@
-<template>
- <div :class="{ hidden }" class="pagination-container">
- <el-pagination
- :background="background"
- v-model:current-page="currentPage"
- v-model:page-size="pageSize"
- :layout="layout"
- :page-sizes="pageSizes"
- :pager-count="pagerCount"
- :total="total"
- v-bind="$attrs"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
-</template>
-
-<script setup>
-import { computed } from 'vue'
-import { scrollTo } from '@/utils/scroll-to'
-
-const props = defineProps({
- total: {
- type: Number,
- required: true
- },
- page: {
- type: Number,
- default: 1
- },
- limit: {
- type: Number,
- default: 20
- },
- pageSizes: {
- type: Array,
- default: () => [10, 20, 30, 50, 100]
- },
- pagerCount: {
- type: Number,
- default: () => (document.body.clientWidth < 992 ? 5 : 7)
- },
- layout: {
- type: String,
- default: 'total, sizes, prev, pager, next, jumper'
- },
- background: {
- type: Boolean,
- default: true
- },
- autoScroll: {
- type: Boolean,
- default: true
- },
- hidden: {
- type: Boolean,
- default: false
- }
-})
-
-const emit = defineEmits(['update:page', 'update:limit', 'pagination'])
-
-const currentPage = computed({
- get: () => props.page,
- set: (val) => emit('update:page', val)
-})
-
-const pageSize = computed({
- get: () => props.limit,
- set: (val) => emit('update:limit', val)
-})
-
-const handleSizeChange = (val) => {
- if (currentPage.value * val > props.total) {
- currentPage.value = 1
- }
- emit('pagination', { page: currentPage.value, limit: val })
- if (props.autoScroll) {
- scrollTo(0, 800)
- }
-}
-
-const handleCurrentChange = (val) => {
- emit('pagination', { page: val, limit: pageSize.value })
- if (props.autoScroll) {
- scrollTo(0, 800)
- }
-}
-</script>
-
-<style scoped>
-.pagination-container {
- background: #fff;
- padding: 16px 0;
- margin-top: 0;
-}
-.pagination-container.hidden {
- display: none;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue
deleted file mode 100644
index 53fbec2..0000000
--- a/src/components/Pagination/index.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<template>
- <div :class="{ 'hidden': hidden }" class="pagination-container">
- <el-pagination
- :background="background"
- v-model:current-page="currentPage"
- v-model:page-size="pageSize"
- :layout="layout"
- :page-sizes="pageSizes"
- :pager-count="pagerCount"
- :total="total"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
-</template>
-
-<script setup>
-import { scrollTo } from '@/utils/scroll-to'
-
-const props = defineProps({
- total: {
- required: true,
- type: Number
- },
- page: {
- type: Number,
- default: 1
- },
- limit: {
- type: Number,
- default: 20
- },
- pageSizes: {
- type: Array,
- default() {
- return [10, 20, 30, 50]
- }
- },
- // 绉诲姩绔〉鐮佹寜閽殑鏁伴噺绔粯璁ゅ��5
- pagerCount: {
- type: Number,
- default: document.body.clientWidth < 992 ? 5 : 7
- },
- layout: {
- type: String,
- default: 'total, sizes, prev, pager, next, jumper'
- },
- background: {
- type: Boolean,
- default: true
- },
- autoScroll: {
- type: Boolean,
- default: true
- },
- hidden: {
- type: Boolean,
- default: false
- }
-})
-
-const emit = defineEmits()
-const currentPage = computed({
- get() {
- return props.page
- },
- set(val) {
- emit('update:page', val)
- }
-})
-const pageSize = computed({
- get() {
- return props.limit
- },
- set(val){
- emit('update:limit', val)
- }
-})
-
-function handleSizeChange(val) {
- if (currentPage.value * val > props.total) {
- currentPage.value = 1
- }
- emit('pagination', { page: currentPage.value, limit: val })
- if (props.autoScroll) {
- scrollTo(0, 800)
- }
-}
-
-function handleCurrentChange(val) {
- emit('pagination', { page: val, limit: pageSize.value })
- if (props.autoScroll) {
- scrollTo(0, 800)
- }
-}
-</script>
-
-<style scoped>
-.pagination-container {
- background: #fff;
-}
-.pagination-container.hidden {
- display: none;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/ParentView/index.vue b/src/components/ParentView/index.vue
deleted file mode 100644
index ad6360c..0000000
--- a/src/components/ParentView/index.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-<template >
- <router-view />
-</template>
diff --git a/src/components/QRCodeGenerator/index.vue b/src/components/QRCodeGenerator/index.vue
deleted file mode 100644
index 1708130..0000000
--- a/src/components/QRCodeGenerator/index.vue
+++ /dev/null
@@ -1,541 +0,0 @@
-<template>
- <div class="qr-code-generator">
- <!-- 浜岀淮鐮佺敓鎴愯〃鍗� -->
- <el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="qr-form">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏍囪瘑绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨鏍囪瘑绫诲瀷" style="width: 100%">
- <el-option label="浜岀淮鐮�" value="qrcode"></el-option>
- <el-option label="闃蹭吉鐮�" value="security"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍐呭" prop="content">
- <el-input
- v-model="form.content"
- placeholder="璇疯緭鍏ヨ缂栫爜鐨勫唴瀹�"
- :type="form.type === 'security' ? 'textarea' : 'text'"
- :rows="form.type === 'security' ? 3 : 1"
- ></el-input>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="灏哄" prop="size">
- <el-input-number
- v-model="form.size"
- :min="100"
- :max="500"
- :step="50"
- style="width: 100%"
- ></el-input-number>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="杈硅窛" prop="margin">
- <el-input-number
- v-model="form.margin"
- :min="0"
- :max="10"
- :step="1"
- style="width: 100%"
- ></el-input-number>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍓嶆櫙鑹�" prop="foregroundColor">
- <el-color-picker v-model="form.foregroundColor" style="width: 100%"></el-color-picker>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑳屾櫙鑹�" prop="backgroundColor">
- <el-color-picker v-model="form.backgroundColor" style="width: 100%"></el-color-picker>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item>
- <el-button type="primary" @click="generateCode" :loading="generating">
- 鐢熸垚{{ form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�' }}
- </el-button>
- <el-button @click="resetForm">閲嶇疆</el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <!-- 鐢熸垚鐨勭爜鏄剧ず鍖哄煙 -->
- <div v-if="generatedCodeUrl" class="code-display">
- <el-divider content-position="center">
- {{ form.type === 'qrcode' ? '鐢熸垚鐨勪簩缁寸爜' : '鐢熸垚鐨勯槻浼爜' }}
- </el-divider>
-
- <div class="code-container">
- <div class="code-image">
- <img :src="generatedCodeUrl" :alt="form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'" />
- </div>
-
- <div class="code-info">
- <p><strong>鍐呭锛�</strong>{{ form.content }}</p>
- <p><strong>绫诲瀷锛�</strong>{{ form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�' }}</p>
- <p><strong>灏哄锛�</strong>{{ form.size }}x{{ form.size }}px</p>
- <p><strong>鐢熸垚鏃堕棿锛�</strong>{{ generateTime }}</p>
- </div>
- </div>
-
- <div class="code-actions">
- <el-button type="success" @click="downloadCode" icon="Download">
- 涓嬭浇鍥剧墖
- </el-button>
- <el-button type="primary" @click="copyToClipboard" icon="CopyDocument">
- 澶嶅埗鍐呭
- </el-button>
- <el-button @click="printCode" icon="Printer">
- 鎵撳嵃
- </el-button>
- </div>
- </div>
-
- <!-- 鎵归噺鐢熸垚瀵硅瘽妗� -->
- <el-dialog v-model="batchDialogVisible" title="鎵归噺鐢熸垚" width="600px">
- <el-form :model="batchForm" label-width="120px">
- <el-form-item label="鐢熸垚鏁伴噺">
- <el-input-number v-model="batchForm.quantity" :min="1" :max="100" style="width: 100%"></el-input-number>
- </el-form-item>
- <el-form-item label="鍓嶇紑">
- <el-input v-model="batchForm.prefix" placeholder="璇疯緭鍏ュ墠缂�锛屽锛歅ROD_"></el-input>
- </el-form-item>
- <el-form-item label="璧峰缂栧彿">
- <el-input-number v-model="batchForm.startNumber" :min="1" style="width: 100%"></el-input-number>
- </el-form-item>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="batchDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="generateBatchCodes">寮�濮嬬敓鎴�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鎵归噺鐢熸垚缁撴灉 -->
- <div v-if="batchCodes.length > 0" class="batch-results">
- <el-divider content-position="center">鎵归噺鐢熸垚缁撴灉</el-divider>
-
- <div class="batch-grid">
- <div
- v-for="(code, index) in batchCodes"
- :key="index"
- class="batch-item"
- >
- <img :src="code.url" :alt="code.content" />
- <p class="batch-content">{{ code.content }}</p>
- <el-button size="small" @click="downloadSingleCode(code)">涓嬭浇</el-button>
- </div>
- </div>
-
- <div class="batch-actions">
- <el-button type="success" @click="downloadAllCodes">涓嬭浇鍏ㄩ儴</el-button>
- <el-button @click="clearBatchCodes">娓呯┖缁撴灉</el-button>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, onMounted } from 'vue'
-import QRCode from 'qrcode'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Download, CopyDocument, Printer } from '@element-plus/icons-vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'QRCodeGenerator'
-})
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- type: 'qrcode',
- content: '',
- size: 200,
- margin: 2,
- foregroundColor: '#000000',
- backgroundColor: '#FFFFFF'
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- type: [{ required: true, message: '璇烽�夋嫨鏍囪瘑绫诲瀷', trigger: 'change' }],
- content: [{ required: true, message: '璇疯緭鍏ュ唴瀹�', trigger: 'blur' }]
-}
-
-// 鍝嶅簲寮忔暟鎹�
-const formRef = ref()
-const generating = ref(false)
-const generatedCodeUrl = ref('')
-const generateTime = ref('')
-const batchDialogVisible = ref(false)
-const batchForm = reactive({
- quantity: 10,
- prefix: '',
- startNumber: 1
-})
-const batchCodes = ref([])
-
-// 鐢熸垚浜岀淮鐮佹垨闃蹭吉鐮�
-const generateCode = async () => {
- try {
- await formRef.value.validate()
-
- if (!form.content.trim()) {
- ElMessage.warning('璇疯緭鍏ヨ缂栫爜鐨勫唴瀹�')
- return
- }
-
- generating.value = true
-
- if (form.type === 'qrcode') {
- // 鐢熸垚浜岀淮鐮�
- generatedCodeUrl.value = await QRCode.toDataURL(form.content, {
- width: form.size,
- margin: form.margin,
- color: {
- dark: form.foregroundColor,
- light: form.backgroundColor
- },
- errorCorrectionLevel: 'M'
- })
- } else {
- // 鐢熸垚闃蹭吉鐮侊紙浣跨敤浜岀淮鐮佹妧鏈紝浣嗗唴瀹规牸寮忎笉鍚岋級
- const securityContent = generateSecurityCode(form.content)
- generatedCodeUrl.value = await QRCode.toDataURL(securityContent, {
- width: form.size,
- margin: form.margin,
- color: {
- dark: form.foregroundColor,
- light: form.backgroundColor
- },
- errorCorrectionLevel: 'H' // 闃蹭吉鐮佷娇鐢ㄦ渶楂樼籂閿欑骇鍒�
- })
- }
-
- generateTime.value = new Date().toLocaleString()
- ElMessage.success('鐢熸垚鎴愬姛锛�')
-
- } catch (error) {
- console.error('鐢熸垚澶辫触:', error)
- ElMessage.error('鐢熸垚澶辫触锛�' + error.message)
- } finally {
- generating.value = false
- }
-}
-
-// 鐢熸垚闃蹭吉鐮佸唴瀹�
-const generateSecurityCode = (content) => {
- const timestamp = Date.now()
- const random = Math.random().toString(36).substr(2, 8)
- return `SEC_${content}_${timestamp}_${random}`
-}
-
-// 涓嬭浇鐢熸垚鐨勭爜
-const downloadCode = () => {
- if (!generatedCodeUrl.value) {
- ElMessage.warning('璇峰厛鐢熸垚鐮�')
- return
- }
-
- const a = document.createElement('a')
- a.href = generatedCodeUrl.value
- a.download = `${form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'}_${new Date().getTime()}.png`
- document.body.appendChild(a)
- a.click()
- document.body.removeChild(a)
- ElMessage.success('涓嬭浇鎴愬姛锛�')
-}
-
-// 澶嶅埗鍐呭鍒板壀璐存澘
-const copyToClipboard = async () => {
- try {
- await navigator.clipboard.writeText(form.content)
- ElMessage.success('鍐呭宸插鍒跺埌鍓创鏉�')
- } catch (error) {
- // 闄嶇骇鏂规
- const textArea = document.createElement('textarea')
- textArea.value = form.content
- document.body.appendChild(textArea)
- textArea.select()
- document.execCommand('copy')
- document.body.removeChild(textArea)
- ElMessage.success('鍐呭宸插鍒跺埌鍓创鏉�')
- }
-}
-
-// 鎵撳嵃鐮�
-const printCode = () => {
- if (!generatedCodeUrl.value) {
- ElMessage.warning('璇峰厛鐢熸垚鐮�')
- return
- }
-
- const printWindow = window.open('', '_blank')
- printWindow.document.write(`
- <html>
- <head>
- <title>鎵撳嵃${form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'}</title>
- <style>
- body { text-align: center; padding: 20px; }
- img { max-width: 100%; height: auto; }
- .info { margin: 20px 0; }
- </style>
- </head>
- <body>
- <h2>${form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'}</h2>
- <img src="${generatedCodeUrl.value}" alt="${form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'}" />
- <div class="info">
- <p><strong>鍐呭锛�</strong>${form.content}</p>
- <p><strong>鐢熸垚鏃堕棿锛�</strong>${generateTime.value}</p>
- </div>
- </body>
- </html>
- `)
- printWindow.document.close()
- printWindow.print()
-}
-
-// 閲嶇疆琛ㄥ崟
-const resetForm = () => {
- formRef.value.resetFields()
- generatedCodeUrl.value = ''
- generateTime.value = ''
- batchCodes.value = []
-}
-
-// 鎵归噺鐢熸垚
-const generateBatchCodes = async () => {
- if (!batchForm.prefix.trim()) {
- ElMessage.warning('璇疯緭鍏ュ墠缂�')
- return
- }
-
- batchCodes.value = []
- generating.value = true
-
- try {
- for (let i = 0; i < batchForm.quantity; i++) {
- const number = batchForm.startNumber + i
- const content = `${batchForm.prefix}${number.toString().padStart(6, '0')}`
-
- let codeUrl
- if (form.type === 'qrcode') {
- codeUrl = await QRCode.toDataURL(content, {
- width: form.size,
- margin: form.margin,
- color: {
- dark: form.foregroundColor,
- light: form.backgroundColor
- }
- })
- } else {
- const securityContent = generateSecurityCode(content)
- codeUrl = await QRCode.toDataURL(securityContent, {
- width: form.size,
- margin: form.margin,
- color: {
- dark: form.foregroundColor,
- light: form.backgroundColor
- }
- })
- }
-
- batchCodes.value.push({
- content,
- url: codeUrl
- })
- }
-
- ElMessage.success(`鎵归噺鐢熸垚瀹屾垚锛屽叡鐢熸垚 ${batchForm.quantity} 涓爜`)
- batchDialogVisible.value = false
-
- } catch (error) {
- console.error('鎵归噺鐢熸垚澶辫触:', error)
- ElMessage.error('鎵归噺鐢熸垚澶辫触锛�' + error.message)
- } finally {
- generating.value = false
- }
-}
-
-// 涓嬭浇鍗曚釜鎵归噺鐢熸垚鐨勭爜
-const downloadSingleCode = (code) => {
- const a = document.createElement('a')
- a.href = code.url
- a.download = `${code.content}.png`
- document.body.appendChild(a)
- a.click()
- document.body.removeChild(a)
-}
-
-// 涓嬭浇鎵�鏈夋壒閲忕敓鎴愮殑鐮�
-const downloadAllCodes = async () => {
- if (batchCodes.value.length === 0) {
- ElMessage.warning('娌℃湁鍙笅杞界殑鐮�')
- return
- }
-
- try {
- // 浣跨敤JSZip鎵撳寘涓嬭浇
- const JSZip = await import('jszip')
- const zip = new JSZip.default()
-
- batchCodes.value.forEach((code, index) => {
- // 灏哹ase64杞崲涓篵lob
- const base64Data = code.url.split(',')[1]
- const byteCharacters = atob(base64Data)
- const byteNumbers = new Array(byteCharacters.length)
- for (let i = 0; i < byteCharacters.length; i++) {
- byteNumbers[i] = byteCharacters.charCodeAt(i)
- }
- const byteArray = new Uint8Array(byteNumbers)
-
- zip.file(`${code.content}.png`, byteArray)
- })
-
- const content = await zip.generateAsync({ type: 'blob' })
- const a = document.createElement('a')
- a.href = URL.createObjectURL(content)
- a.download = `鎵归噺${form.type === 'qrcode' ? '浜岀淮鐮�' : '闃蹭吉鐮�'}_${new Date().getTime()}.zip`
- document.body.appendChild(a)
- a.click()
- document.body.removeChild(a)
- URL.revokeObjectURL(a.href)
-
- ElMessage.success('鎵归噺涓嬭浇瀹屾垚锛�')
- } catch (error) {
- console.error('鎵归噺涓嬭浇澶辫触:', error)
- ElMessage.error('鎵归噺涓嬭浇澶辫触锛岃閫愪釜涓嬭浇')
- }
-}
-
-// 娓呯┖鎵归噺鐢熸垚缁撴灉
-const clearBatchCodes = () => {
- batchCodes.value = []
-}
-
-// 鏆撮湶鏂规硶缁欑埗缁勪欢
-defineExpose({
- generateCode,
- downloadCode,
- resetForm,
- form
-})
-</script>
-
-<style scoped>
-.qr-code-generator {
- padding: 20px;
-}
-
-.qr-form {
- background: #f8f9fa;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
-}
-
-.code-display {
- margin-top: 30px;
-}
-
-.code-container {
- display: flex;
- justify-content: center;
- align-items: flex-start;
- gap: 40px;
- margin: 20px 0;
-}
-
-.code-image img {
- border: 2px solid #e0e0e0;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-}
-
-.code-info {
- text-align: left;
- min-width: 200px;
-}
-
-.code-info p {
- margin: 8px 0;
- color: #666;
-}
-
-.code-actions {
- text-align: center;
- margin: 20px 0;
-}
-
-.code-actions .el-button {
- margin: 0 10px;
-}
-
-.batch-results {
- margin-top: 30px;
-}
-
-.batch-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
- gap: 20px;
- margin: 20px 0;
-}
-
-.batch-item {
- text-align: center;
- padding: 15px;
- border: 1px solid #e0e0e0;
- border-radius: 8px;
- background: #fff;
-}
-
-.batch-item img {
- width: 100px;
- height: 100px;
- margin-bottom: 10px;
-}
-
-.batch-content {
- font-size: 12px;
- color: #666;
- margin: 10px 0;
- word-break: break-all;
-}
-
-.batch-actions {
- text-align: center;
- margin: 20px 0;
-}
-
-.batch-actions .el-button {
- margin: 0 10px;
-}
-
-@media (max-width: 768px) {
- .code-container {
- flex-direction: column;
- align-items: center;
- }
-
- .batch-grid {
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
- }
-}
-</style>
diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue
deleted file mode 100644
index e5dae99..0000000
--- a/src/components/RightToolbar/index.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-<template>
- <div class="top-right-btn" :style="style">
- <el-row>
- <el-tooltip class="item" effect="dark" :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'" placement="top" v-if="search">
- <el-button circle icon="Search" @click="toggleSearch()" />
- </el-tooltip>
- <el-tooltip class="item" effect="dark" content="鍒锋柊" placement="top">
- <el-button circle icon="Refresh" @click="refresh()" />
- </el-tooltip>
- <el-tooltip class="item" effect="dark" content="鏄鹃殣鍒�" placement="top" v-if="columns">
- <el-button circle icon="Menu" @click="showColumn()" v-if="showColumnsType == 'transfer'"/>
- <el-dropdown trigger="click" :hide-on-click="false" style="padding-left: 12px" v-if="showColumnsType == 'checkbox'">
- <el-button circle icon="Menu" />
- <template #dropdown>
- <el-dropdown-menu>
- <!-- 鍏ㄩ��/鍙嶉�� 鎸夐挳 -->
- <el-dropdown-item>
- <el-checkbox :indeterminate="isIndeterminate" v-model="isChecked" @change="toggleCheckAll"> 鍒楀睍绀� </el-checkbox>
- </el-dropdown-item>
- <div class="check-line"></div>
- <template v-for="item in columns" :key="item.key">
- <el-dropdown-item>
- <el-checkbox v-model="item.visible" @change="checkboxChange($event, item.label)" :label="item.label" />
- </el-dropdown-item>
- </template>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </el-tooltip>
- </el-row>
- <el-dialog :title="title" v-model="open" append-to-body>
- <el-transfer
- :titles="['鏄剧ず', '闅愯棌']"
- v-model="value"
- :data="columns"
- @change="dataChange"
- ></el-transfer>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-const props = defineProps({
- /* 鏄惁鏄剧ず妫�绱㈡潯浠� */
- showSearch: {
- type: Boolean,
- default: true
- },
- /* 鏄鹃殣鍒椾俊鎭� */
- columns: {
- type: Array
- },
- /* 鏄惁鏄剧ず妫�绱㈠浘鏍� */
- search: {
- type: Boolean,
- default: true
- },
- /* 鏄鹃殣鍒楃被鍨嬶紙transfer绌挎妗嗐�乧heckbox澶嶉�夋锛� */
- showColumnsType: {
- type: String,
- default: "checkbox"
- },
- /* 鍙冲杈硅窛 */
- gutter: {
- type: Number,
- default: 10
- },
-})
-
-const emits = defineEmits(['update:showSearch', 'queryTable'])
-
-// 鏄鹃殣鏁版嵁
-const value = ref([])
-// 寮瑰嚭灞傛爣棰�
-const title = ref("鏄剧ず/闅愯棌")
-// 鏄惁鏄剧ず寮瑰嚭灞�
-const open = ref(false)
-
-const style = computed(() => {
- const ret = {}
- if (props.gutter) {
- ret.marginRight = `${props.gutter / 2}px`
- }
- return ret
-})
-
-// 鏄惁鍏ㄩ��/鍗婇�� 鐘舵��
-const isChecked = computed({
- get: () => props.columns.every(col => col.visible),
- set: () => {}
-})
-const isIndeterminate = computed(() => props.columns.some((col) => col.visible) && !isChecked.value)
-
-// 鎼滅储
-function toggleSearch() {
- emits("update:showSearch", !props.showSearch)
-}
-
-// 鍒锋柊
-function refresh() {
- emits("queryTable")
-}
-
-// 鍙充晶鍒楄〃鍏冪礌鍙樺寲
-function dataChange(data) {
- for (let item in props.columns) {
- const key = props.columns[item].key
- props.columns[item].visible = !data.includes(key)
- }
-}
-
-// 鎵撳紑鏄鹃殣鍒梔ialog
-function showColumn() {
- open.value = true
-}
-
-if (props.showColumnsType == 'transfer') {
- // 鏄鹃殣鍒楀垵濮嬮粯璁ら殣钘忓垪
- for (let item in props.columns) {
- if (props.columns[item].visible === false) {
- value.value.push(parseInt(item))
- }
- }
-}
-
-// 鍗曞嬀閫�
-function checkboxChange(event, label) {
- props.columns.filter(item => item.label == label)[0].visible = event
-}
-
-// 鍒囨崲鍏ㄩ��/鍙嶉��
-function toggleCheckAll() {
- const newValue = !isChecked.value
- props.columns.forEach((col) => (col.visible = newValue))
-}
-</script>
-
-<style lang='scss' scoped>
-:deep(.el-transfer__button) {
- border-radius: 50%;
- display: block;
- margin-left: 0px;
-}
-:deep(.el-transfer__button:first-child) {
- margin-bottom: 10px;
-}
-:deep(.el-dropdown-menu__item) {
- line-height: 30px;
- padding: 0 17px;
-}
-.check-line {
- width: 90%;
- height: 1px;
- background-color: #ccc;
- margin: 3px auto;
-}
-</style>
diff --git a/src/components/RuoYi/Doc/index.vue b/src/components/RuoYi/Doc/index.vue
deleted file mode 100644
index 91aebe0..0000000
--- a/src/components/RuoYi/Doc/index.vue
+++ /dev/null
@@ -1,13 +0,0 @@
-<template>
- <div>
- <svg-icon icon-class="question" @click="goto" />
- </div>
-</template>
-
-<script setup>
-const url = ref('http://doc.ruoyi.vip/ruoyi-vue')
-
-function goto() {
- window.open(url.value)
-}
-</script>
\ No newline at end of file
diff --git a/src/components/RuoYi/Git/index.vue b/src/components/RuoYi/Git/index.vue
deleted file mode 100644
index 96fdea7..0000000
--- a/src/components/RuoYi/Git/index.vue
+++ /dev/null
@@ -1,13 +0,0 @@
-<template>
- <div>
- <svg-icon icon-class="github" @click="goto" />
- </div>
-</template>
-
-<script setup>
-const url = ref('https://gitee.com/y_project/RuoYi-Vue')
-
-function goto() {
- window.open(url.value)
-}
-</script>
diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue
deleted file mode 100644
index cf23223..0000000
--- a/src/components/Screenfull/index.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div>
- <svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'" @click="toggle" />
- </div>
-</template>
-
-<script setup>
-import { useFullscreen } from '@vueuse/core'
-
-const { isFullscreen, enter, exit, toggle } = useFullscreen()
-</script>
-
-<style lang='scss' scoped>
-.screenfull-svg {
- display: inline-block;
- cursor: pointer;
- fill: #5a5e66;
- width: 20px;
- height: 20px;
- vertical-align: 10px;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
deleted file mode 100644
index dddb58a..0000000
--- a/src/components/SizeSelect/index.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-<template>
- <div>
- <el-dropdown trigger="click" @command="handleSetSize">
- <div class="size-icon--style">
- <svg-icon class-name="size-icon" icon-class="size" />
- </div>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size === item.value" :command="item.value">
- {{ item.label }}
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
-</template>
-
-<script setup>
-import useAppStore from "@/store/modules/app"
-
-const appStore = useAppStore()
-const size = computed(() => appStore.size)
-const route = useRoute()
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-const sizeOptions = ref([
- { label: "杈冨ぇ", value: "large" },
- { label: "榛樿", value: "default" },
- { label: "绋嶅皬", value: "small" },
-])
-
-function handleSetSize(size) {
- proxy.$modal.loading("姝e湪璁剧疆甯冨眬澶у皬锛岃绋嶅��...")
- appStore.setSize(size)
- setTimeout("window.location.reload()", 1000)
-}
-</script>
-
-<style lang='scss' scoped>
-.size-icon--style {
- font-size: 18px;
- line-height: 50px;
- padding-right: 7px;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
deleted file mode 100644
index 41f64c9..0000000
--- a/src/components/SvgIcon/index.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<template>
- <svg :class="svgClass" aria-hidden="true">
- <use :xlink:href="iconName" :fill="color" />
- </svg>
-</template>
-
-<script>
-export default defineComponent({
- props: {
- iconClass: {
- type: String,
- required: true
- },
- className: {
- type: String,
- default: ''
- },
- color: {
- type: String,
- default: ''
- },
- },
- setup(props) {
- return {
- iconName: computed(() => `#icon-${props.iconClass}`),
- svgClass: computed(() => {
- if (props.className) {
- return `svg-icon ${props.className}`
- }
- return 'svg-icon'
- })
- }
- }
-})
-</script>
-
-<style scope lang="scss">
-.sub-el-icon,
-.nav-icon {
- display: inline-block;
- font-size: 15px;
- margin-right: 12px;
- position: relative;
-}
-
-.svg-icon {
- width: 1em;
- height: 1em;
- position: relative;
- fill: currentColor;
- vertical-align: -2px;
-}
-</style>
diff --git a/src/components/SvgIcon/svgicon.js b/src/components/SvgIcon/svgicon.js
deleted file mode 100644
index 05284e3..0000000
--- a/src/components/SvgIcon/svgicon.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as components from '@element-plus/icons-vue'
-
-export default {
- install: (app) => {
- for (const key in components) {
- const componentConfig = components[key]
- app.component(componentConfig.name, componentConfig)
- }
- }
-}
diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
deleted file mode 100644
index 56e2803..0000000
--- a/src/components/TopNav/index.vue
+++ /dev/null
@@ -1,217 +0,0 @@
-<template>
- <el-menu
- :default-active="activeMenu"
- mode="horizontal"
- @select="handleSelect"
- :ellipsis="false"
- >
- <template v-for="(item, index) in topMenus">
- <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber">
- <svg-icon
- v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"
- :icon-class="item.meta.icon"/>
- {{ item.meta.title }}
- </el-menu-item>
- </template>
-
- <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 -->
- <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber">
- <template #title>鏇村鑿滃崟</template>
- <template v-for="(item, index) in topMenus">
- <el-menu-item
- :index="item.path"
- :key="index"
- v-if="index >= visibleNumber">
- <svg-icon
- v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"
- :icon-class="item.meta.icon"/>
- {{ item.meta.title }}
- </el-menu-item>
- </template>
- </el-sub-menu>
- </el-menu>
-</template>
-
-<script setup>
-import { constantRoutes } from "@/router"
-import { isHttp } from '@/utils/validate'
-import useAppStore from '@/store/modules/app'
-import useSettingsStore from '@/store/modules/settings'
-import usePermissionStore from '@/store/modules/permission'
-
-// 椤堕儴鏍忓垵濮嬫暟
-const visibleNumber = ref(null)
-// 褰撳墠婵�娲昏彍鍗曠殑 index
-const currentIndex = ref(null)
-// 闅愯棌渚ц竟鏍忚矾鐢�
-const hideList = ['/index', '/user/profile']
-
-const appStore = useAppStore()
-const settingsStore = useSettingsStore()
-const permissionStore = usePermissionStore()
-const route = useRoute()
-const router = useRouter()
-
-// 涓婚棰滆壊
-const theme = computed(() => settingsStore.theme)
-// 鎵�鏈夌殑璺敱淇℃伅
-const routers = computed(() => permissionStore.topbarRouters)
-
-// 椤堕儴鏄剧ず鑿滃崟
-const topMenus = computed(() => {
- let topMenus = []
- routers.value.map((menu) => {
- if (menu.hidden !== true) {
- // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞�
- if (menu.path === '/' && menu.children) {
- topMenus.push(menu.children[0])
- } else {
- topMenus.push(menu)
- }
- }
- })
- return topMenus
-})
-
-// 璁剧疆瀛愯矾鐢�
-const childrenMenus = computed(() => {
- let childrenMenus = []
- routers.value.map((router) => {
- for (let item in router.children) {
- if (router.children[item].parentPath === undefined) {
- if(router.path === "/") {
- router.children[item].path = "/" + router.children[item].path
- } else {
- if(!isHttp(router.children[item].path)) {
- router.children[item].path = router.path + "/" + router.children[item].path
- }
- }
- router.children[item].parentPath = router.path
- }
- childrenMenus.push(router.children[item])
- }
- })
- return constantRoutes.concat(childrenMenus)
-})
-
-// 榛樿婵�娲荤殑鑿滃崟
-const activeMenu = computed(() => {
- const path = route.path
- let activePath = path
- if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) {
- const tmpPath = path.substring(1, path.length)
- if (!route.meta.link) {
- activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"))
- appStore.toggleSideBarHide(false)
- }
- } else if(!route.children) {
- activePath = path
- appStore.toggleSideBarHide(true)
- }
- activeRoutes(activePath)
- return activePath
-})
-
-function setVisibleNumber() {
- const width = document.body.getBoundingClientRect().width / 3
- visibleNumber.value = parseInt(width / 85)
-}
-
-function handleSelect(key, keyPath) {
- currentIndex.value = key
- const route = routers.value.find(item => item.path === key)
- if (isHttp(key)) {
- // http(s):// 璺緞鏂扮獥鍙f墦寮�
- window.open(key, "_blank")
- } else if (!route || !route.children) {
- // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮�
- const routeMenu = childrenMenus.value.find(item => item.path === key)
- if (routeMenu && routeMenu.query) {
- let query = JSON.parse(routeMenu.query)
- router.push({ path: key, query: query })
- } else {
- router.push({ path: key })
- }
- appStore.toggleSideBarHide(true)
- } else {
- // 鏄剧ず宸︿晶鑱斿姩鑿滃崟
- activeRoutes(key)
- appStore.toggleSideBarHide(false)
- }
-}
-
-function activeRoutes(key) {
- let routes = []
- if (childrenMenus.value && childrenMenus.value.length > 0) {
- childrenMenus.value.map((item) => {
- if (key == item.parentPath || (key == "index" && "" == item.path)) {
- routes.push(item)
- }
- })
- }
- if(routes.length > 0) {
- permissionStore.setSidebarRouters(routes)
- } else {
- appStore.toggleSideBarHide(true)
- }
- return routes
-}
-
-onMounted(() => {
- window.addEventListener('resize', setVisibleNumber)
-})
-
-onBeforeUnmount(() => {
- window.removeEventListener('resize', setVisibleNumber)
-})
-
-onMounted(() => {
- setVisibleNumber()
-})
-</script>
-
-<style lang="scss">
-.topmenu-container.el-menu--horizontal > .el-menu-item {
- float: left;
- height: 50px !important;
- line-height: 50px !important;
- color: #999093 !important;
- padding: 0 5px !important;
- margin: 0 10px !important;
-}
-
-.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title {
- border-bottom: 2px solid #{'var(--theme)'} !important;
- color: #303133;
-}
-
-/* sub-menu item */
-.topmenu-container.el-menu--horizontal > .el-sub-menu .el-sub-menu__title {
- float: left;
- height: 50px !important;
- line-height: 50px !important;
- color: #999093 !important;
- padding: 0 5px !important;
- margin: 0 10px !important;
-}
-
-/* 鑳屾櫙鑹查殣钘� */
-.topmenu-container.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus, .topmenu-container.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover, .topmenu-container.el-menu--horizontal>.el-submenu .el-submenu__title:hover {
- background-color: #ffffff;
-}
-
-/* 鍥炬爣鍙抽棿璺� */
-.topmenu-container .svg-icon {
- margin-right: 4px;
-}
-
-/* topmenu more arrow */
-.topmenu-container .el-sub-menu .el-sub-menu__icon-arrow {
- position: static;
- vertical-align: middle;
- margin-left: 8px;
- margin-top: 0px;
-}
-
-
-</style>
diff --git a/src/components/Upload/FileUpload.vue b/src/components/Upload/FileUpload.vue
deleted file mode 100644
index 1ac0344..0000000
--- a/src/components/Upload/FileUpload.vue
+++ /dev/null
@@ -1,95 +0,0 @@
-<script setup>
-import { ref } from "vue";
-
-defineOptions({
- name: "鏂囦欢涓婁紶缁勪欢",
-});
-
-const props = defineProps({
- downloadTemplate: Function,
- showTips: Boolean,
- accept: {
- type: String,
- default: ".xls, .xlsx",
- },
- headers: Object,
- action: String,
- disabled: {
- type: Boolean,
- default: false,
- },
- showTip: {
- type: Boolean,
- default: true,
- },
- autoUpload: {
- type: Boolean,
- default: false,
- },
- limit: {
- type: Number,
- default: 1,
- },
-});
-const emits = defineEmits(["success", "remove"]);
-
-const uploadRef = ref();
-const fileList = ref([]);
-
-const uploadApi = () => {
- uploadRef.value.submit();
-};
-
-const handleFileSuccess = (response, file, fileList) => {
- // uploadRef.value.handleRemove(file);
- emits("success", response, file, fileList);
-};
-
-const handleRemove = (file) => {
- emits("remove", file);
-};
-
-defineExpose({
- fileList,
- uploadApi,
-});
-</script>
-
-<template>
- <el-upload
- ref="uploadRef"
- v-model:file-list="fileList"
- drag
- multiple
- :action="action"
- :accept="accept"
- :headers="headers"
- :disabled="disabled"
- :auto-upload="autoUpload"
- :limit="limit"
- :drag="true"
- :on-success="handleFileSuccess"
- :on-remove="handleRemove"
- >
- <div class="el-upload__text">
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">
- 灏嗘枃浠舵嫋鍒版澶勶紝鎴�
- <em>鐐瑰嚮涓婁紶闄勪欢</em>
- </div>
- </div>
- <template #tip>
- <div v-if="showTip" class="el-upload__tip text-center">
- 鍙兘涓婁紶xlsx/xls鏂囦欢锛屼笖涓嶈秴杩�10M
- <el-button
- type="primary"
- link
- class="reset-margin"
- @click="props.downloadTemplate()"
- >
- <span style="font-size: 12px; font-weight: normal">涓嬭浇妯℃澘</span>
- </el-button>
- </div>
- </template>
- </el-upload>
-</template>
diff --git a/src/components/Upload/index.js b/src/components/Upload/index.js
deleted file mode 100644
index 0ea60da..0000000
--- a/src/components/Upload/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default as FileUpload } from "./FileUpload.vue";
diff --git a/src/components/filePreview/index.vue b/src/components/filePreview/index.vue
deleted file mode 100644
index cda5b56..0000000
--- a/src/components/filePreview/index.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="棰勮" width="100%" fullscreen align-center :before-close="handleClose" append-to-body>
- <div>
- <!-- 鍥剧墖棰勮 -->
- <div v-if="isImage">
- <img :src="imgUrl" alt="Image Preview" />
- </div>
-
- <!-- PDF棰勮鎻愮ず -->
- <div v-if="isPdf" style="height: 100vh; display: flex; align-items: center; justify-content: center;">
- <p>姝e湪鍑嗗PDF棰勮...</p>
- </div>
-
- <!-- Word鏂囨。棰勮 -->
- <div v-if="isDoc">
- <p v-if="!isDocShow">鏂囨。鏃犳硶鐩存帴棰勮锛岃涓嬭浇鏌ョ湅銆�</p>
- <a :href="fileUrl" v-if="!isDocShow">涓嬭浇鏂囦欢</a>
- <vue-office-docx
- v-else
- :src="fileUrl"
- style="height: 100vh;"
- @rendered="renderedHandler"
- @error="errorHandler"
- />
- </div>
-
- <!-- Excel鏂囨。棰勮 -->
- <div v-if="isXls">
- <p v-if="!isDocShow">鏂囨。鏃犳硶鐩存帴棰勮锛岃涓嬭浇鏌ョ湅銆�</p>
- <a :href="fileUrl" v-if="!isDocShow">涓嬭浇鏂囦欢</a>
- <vue-office-excel
- v-else
- :src="fileUrl"
- :options="options"
- style="height: 100vh;"
- @rendered="renderedHandler"
- @error="errorHandler"
- />
- </div>
-
- <!-- 鍘嬬缉鏂囦欢澶勭悊 -->
- <div v-if="isZipOrRar">
- <p>鍘嬬缉鏂囦欢鏃犳硶鐩存帴棰勮锛岃涓嬭浇鏌ョ湅銆�</p>
- <a :href="fileUrl">涓嬭浇鏂囦欢</a>
- </div>
-
- <!-- 涓嶆敮鎸佺殑鏍煎紡 -->
- <div v-if="!isSupported">
- <p>涓嶆敮鎸佺殑鏂囦欢鏍煎紡</p>
- </div>
- </div>
- </el-dialog>
-</template>
-
-<script setup>
-import { ref, computed, getCurrentInstance, watch } from 'vue';
-import VueOfficeDocx from '@vue-office/docx';
-import '@vue-office/docx/lib/index.css';
-import VueOfficeExcel from '@vue-office/excel';
-import '@vue-office/excel/lib/index.css';
-
-// 鍝嶅簲寮忓彉閲�
-const fileUrl = ref('')
-const dialogVisible = ref(false)
-const { proxy } = getCurrentInstance();
-const javaApi = proxy.javaApi;
-
-// 鏂囨。棰勮鐘舵��
-const isDocShow = ref(true);
-const imgUrl = ref('');
-const options = ref({
- xls: false,
- minColLength: 0,
- minRowLength: 0,
- widthOffset: 10,
- heightOffset: 10,
- beforeTransformData: (workbookData) => workbookData,
- transformData: (workbookData) => workbookData,
-});
-
-// 璁$畻灞炴�� - 鍒ゆ柇鏂囦欢绫诲瀷
-const isImage = computed(() => {
- const state = /\.(jpg|jpeg|png|gif)$/i.test(fileUrl.value);
- if (state) {
- imgUrl.value = fileUrl.value.replaceAll('word', 'img');
- }
- return state;
-});
-
-const isPdf = computed(() => {
- console.log(fileUrl.value)
- return /\.pdf$/i.test(fileUrl.value);
-});
-
-const isDoc = computed(() => {
- return /\.(doc|docx)$/i.test(fileUrl.value);
-});
-
-const isXls = computed(() => {
- const state = /\.(xls|xlsx)$/i.test(fileUrl.value);
- if (state) {
- options.value.xls = /\.(xls)$/i.test(fileUrl.value);
- }
- return state;
-});
-
-const isZipOrRar = computed(() => {
- return /\.(zip|rar)$/i.test(fileUrl.value);
-});
-
-const isSupported = computed(() => {
- return isImage.value || isPdf.value || isDoc.value || isXls.value || isZipOrRar.value;
-});
-
-// 鍔ㄦ�佸垱寤篴鏍囩骞惰烦杞瑙圥DF
-const previewPdf = (url) => {
- // 鍒涘缓a鏍囩
- const link = document.createElement('a');
- // 璁剧疆PDF鏂囦欢URL
- link.href = url;
- // 鍦ㄦ柊鏍囩椤垫墦寮�
- link.target = '_blank';
- // 瀹夊叏灞炴�э紝闃叉鏂伴〉闈㈣闂師椤甸潰
- link.rel = 'noopener noreferrer';
- // 鍙�夛細璁剧疆閾炬帴鏂囨湰
- link.textContent = '棰勮PDF';
- // 灏哸鏍囩娣诲姞鍒伴〉闈紙閮ㄥ垎娴忚鍣ㄨ姹傚繀椤诲湪DOM涓級
- document.body.appendChild(link);
- // 瑙﹀彂鐐瑰嚮浜嬩欢
- link.click();
- // 绉婚櫎a鏍囩锛屾竻鐞咲OM
- document.body.removeChild(link);
-};
-
-
-// 鐩戝惉PDF鐘舵�佸彉鍖栵紝鑷姩瑙﹀彂璺宠浆
-watch(
- () => isPdf.value,
- (newVal) => {
-
- // 褰撶‘璁ゆ槸PDF涓旀枃浠禪RL鏈夋晥鏃�
- if (newVal && fileUrl.value) {
- // 鍏抽棴瀵硅瘽妗�
- dialogVisible.value = false;
- // 鍔犱釜灏忓欢杩熺‘淇濈姸鎬佹洿鏂板畬鎴�
- setTimeout(() => {
- previewPdf(fileUrl.value);
- fileUrl.value = '';
- }, 100);
- }
- }
-);
-
-// 鏂规硶瀹氫箟
-const renderedHandler = () => {
- console.log("娓叉煋瀹屾垚");
- isDocShow.value = true;
- resetStyle();
-};
-
-const errorHandler = () => {
- console.log("娓叉煋澶辫触");
- isDocShow.value = false;
-};
-
-const open = (url) => {
- fileUrl.value = window.location.protocol+'//'+window.location.host+ url;
- dialogVisible.value = true;
-};
-const handleClose = () => {
- dialogVisible.value = false;
-};
-
-const resetStyle = () => {
- const elements = document.querySelectorAll('[style*="pt"]');
- for (const element of elements) {
- const style = element.getAttribute('style');
- if (style) {
- element.setAttribute('style', style.replace(/pt/g, 'px'));
- }
- }
-};
-
-// 鏆撮湶open鏂规硶渚涘閮ㄨ皟鐢�
-defineExpose({
- open
-})
-</script>
-
-<style scoped>
-img {
- max-width: 100%;
- display: block;
- margin: 0 auto;
-}
-
-.oneLine {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-</style>
diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue
deleted file mode 100644
index fe98b2d..0000000
--- a/src/components/iFrame/index.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-<template>
- <div v-loading="loading" :style="'height:' + height">
- <iframe
- :src="url"
- frameborder="no"
- style="width: 100%; height: 100%"
- scrolling="auto" />
- </div>
-</template>
-
-<script setup>
-const props = defineProps({
- src: {
- type: String,
- required: true
- }
-})
-
-const height = ref(document.documentElement.clientHeight - 94.5 + "px;")
-const loading = ref(true)
-const url = computed(() => props.src)
-
-onMounted(() => {
- setTimeout(() => {
- loading.value = false
- }, 300)
- window.onresize = function temp() {
- height.value = document.documentElement.clientHeight - 94.5 + "px;"
- }
-})
-</script>
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 0000000..ea1bd6f
--- /dev/null
+++ b/src/config.js
@@ -0,0 +1,12 @@
+/**
+ * 瀛︾敓绔叏灞�閰嶇疆
+ * 閫氳繃 manifest.json 鐨� H5 鐜鍙橀噺鎴栫洿鎺ヤ慨鏀规澶�
+ */
+export default {
+ // 鍚庣鎺ュ彛鍦板潃
+ // 寮�鍙� H5锛堟湰鏈哄悗绔級: http://localhost:8080
+ // 鐢熶骇锛堟寮忓煙鍚�/鏈嶅姟鍣級: http://your-domain.com/dev-api 鎴� https://...
+ baseUrl: '/prod-api', // 鐢熶骇锛氳蛋 nginx 浠g悊锛堝悓婧愶紝閬垮厤璺ㄥ煙锛�
+ // 寰俊灏忕▼搴� AppID锛堥厤缃簬 manifest.json mp-weixin.appid锛�
+ appName: '浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴',
+}
diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js
deleted file mode 100644
index 169c068..0000000
--- a/src/directive/common/copyText.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
-* v-copyText 澶嶅埗鏂囨湰鍐呭
-* Copyright (c) 2022 ruoyi
-*/
-
-export default {
- beforeMount(el, { value, arg }) {
- if (arg === "callback") {
- el.$copyCallback = value
- } else {
- el.$copyValue = value
- const handler = () => {
- copyTextToClipboard(el.$copyValue)
- if (el.$copyCallback) {
- el.$copyCallback(el.$copyValue)
- }
- }
- el.addEventListener("click", handler)
- el.$destroyCopy = () => el.removeEventListener("click", handler)
- }
- }
-}
-
-function copyTextToClipboard(input, { target = document.body } = {}) {
- const element = document.createElement('textarea')
- const previouslyFocusedElement = document.activeElement
-
- element.value = input
-
- // Prevent keyboard from showing on mobile
- element.setAttribute('readonly', '')
-
- element.style.contain = 'strict'
- element.style.position = 'absolute'
- element.style.left = '-9999px'
- element.style.fontSize = '12pt' // Prevent zooming on iOS
-
- const selection = document.getSelection()
- const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0)
-
- target.append(element)
- element.select()
-
- // Explicit selection workaround for iOS
- element.selectionStart = 0
- element.selectionEnd = input.length
-
- let isSuccess = false
- try {
- isSuccess = document.execCommand('copy')
- } catch { }
-
- element.remove()
-
- if (originalRange) {
- selection.removeAllRanges()
- selection.addRange(originalRange)
- }
-
- // Get the focus back on the previously focused element, if any
- if (previouslyFocusedElement) {
- previouslyFocusedElement.focus()
- }
-
- return isSuccess
-}
diff --git a/src/directive/index.js b/src/directive/index.js
deleted file mode 100644
index a86e00b..0000000
--- a/src/directive/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import hasRole from './permission/hasRole'
-import hasPermi from './permission/hasPermi'
-import copyText from './common/copyText'
-
-export default function directive(app){
- app.directive('hasRole', hasRole)
- app.directive('hasPermi', hasPermi)
- app.directive('copyText', copyText)
-}
\ No newline at end of file
diff --git a/src/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js
deleted file mode 100644
index e381ea9..0000000
--- a/src/directive/permission/hasPermi.js
+++ /dev/null
@@ -1,28 +0,0 @@
- /**
- * v-hasPermi 鎿嶄綔鏉冮檺澶勭悊
- * Copyright (c) 2019 ruoyi
- */
-
-import useUserStore from '@/store/modules/user'
-
-export default {
- mounted(el, binding, vnode) {
- const { value } = binding
- const all_permission = "*:*:*"
- const permissions = useUserStore().permissions
-
- if (value && value instanceof Array && value.length > 0) {
- const permissionFlag = value
-
- const hasPermissions = permissions.some(permission => {
- return all_permission === permission || permissionFlag.includes(permission)
- })
-
- if (!hasPermissions) {
- el.parentNode && el.parentNode.removeChild(el)
- }
- } else {
- throw new Error(`璇疯缃搷浣滄潈闄愭爣绛惧�糮)
- }
- }
-}
diff --git a/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js
deleted file mode 100644
index 2f1bb90..0000000
--- a/src/directive/permission/hasRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
- /**
- * v-hasRole 瑙掕壊鏉冮檺澶勭悊
- * Copyright (c) 2019 ruoyi
- */
-
-import useUserStore from '@/store/modules/user'
-
-export default {
- mounted(el, binding, vnode) {
- const { value } = binding
- const super_admin = "admin"
- const roles = useUserStore().roles
-
- if (value && value instanceof Array && value.length > 0) {
- const roleFlag = value
-
- const hasRole = roles.some(role => {
- return super_admin === role || roleFlag.includes(role)
- })
-
- if (!hasRole) {
- el.parentNode && el.parentNode.removeChild(el)
- }
- } else {
- throw new Error(`璇疯缃鑹叉潈闄愭爣绛惧�糮)
- }
- }
-}
diff --git a/src/hooks/useFormData.js b/src/hooks/useFormData.js
deleted file mode 100644
index d22204b..0000000
--- a/src/hooks/useFormData.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { reactive } from "vue";
-import { deepClone } from "@/utils/index.js"
-
-export default function useFormData(initData) {
- const form = reactive(deepClone(initData, true));
-
- function resetForm() {
- const initData2 = JSON.parse(JSON.stringify(initData));
- Object.keys(initData).forEach(key => {
- form[key] = initData2[key];
- });
- }
-
- return { form, resetForm };
-}
diff --git a/src/hooks/useModal.js b/src/hooks/useModal.js
deleted file mode 100644
index 0d443a1..0000000
--- a/src/hooks/useModal.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import { ref } from "vue";
-export function useModal(options) {
- const id = ref();
- const visible = ref(false);
- const loading = ref(false);
- const modalOptions = ref({});
-
- const openModal = (e) => {
- id.value = e;
- modalOptions.value = {
- title: e ? `淇敼${options.title}` : `鏂板${options.title}`,
- content: "纭畾鎵ц姝ゆ搷浣滃悧锛�",
- confirmText: "纭畾",
- cancelText: "鍙栨秷",
- };
- visible.value = true;
- };
-
- // 鍏抽棴妯℃�佹
- const closeModal = () => {
- visible.value = false;
- loading.value = false;
- };
-
- // 纭鎿嶄綔
- const handleConfirm = async (callback) => {
- loading.value = true;
- callback();
- closeModal();
- };
-
- return {
- id,
- visible,
- loading,
- modalOptions,
- openModal,
- closeModal,
- handleConfirm,
- };
-}
diff --git a/src/hooks/usePaginationApi.jsx b/src/hooks/usePaginationApi.jsx
deleted file mode 100644
index f1e8967..0000000
--- a/src/hooks/usePaginationApi.jsx
+++ /dev/null
@@ -1,145 +0,0 @@
-import { ref, reactive, watchEffect, unref } from "vue";
-import useFormData from "@/hooks/useFormData";
-import { deepClone, isEqual } from "@/utils/index.js"
-import { ElMessage } from 'element-plus'
-
-/**
- * 鍒嗛〉api
- * @param api 鎺ュ彛
- * @param initalFilters 鍒濆鍖栫瓫閫夋潯浠�
- * @param sorters
- * @param filterTransformer
- */
-export function usePaginationApi(
- api,
- initalFilters,
- columns,
- sorters,
- filterTransformer,
- cb
-) {
- const dataList = ref([]);
- const { form: filters, resetForm } = useFormData(initalFilters);
- let lastFilters = deepClone(initalFilters);
- const sorter = reactive(sorters || {});
- const others = ref({});
- const loading = ref(true);
- const paginationAlign = ref("right");
-
- /** 鍒嗛〉閰嶇疆 */
- const pagination = reactive({
- pageSize: 100,
- currentPage: 1,
- pageSizes: [10, 15, 20],
- total: 0,
- align: "right",
- background: true
- });
-
- /** 鍔犺浇鍔ㄧ敾閰嶇疆 */
- const loadingConfig = reactive({
- text: "姝e湪鍔犺浇绗竴椤�...",
- viewBox: "-10, -10, 50, 50",
- spinner: `
- <path class="path" d="
- M 30 15
- L 28 17
- M 25.61 25.61
- A 15 15, 0, 0, 1, 15 30
- A 15 15, 0, 1, 1, 27.99 7.5
- L 15 15
- " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
- `
- // svg: "",
- // background: rgba()
- });
-
- function getFinalParams() {
- const finalFilters = {};
- const beforeParams = unref(filters);
- if (filterTransformer) {
- Object.keys(beforeParams).forEach(key => {
- if (filterTransformer[key]) {
- Object.assign(
- finalFilters,
- filterTransformer[key](beforeParams[key], beforeParams)
- );
- } else {
- finalFilters[key] = beforeParams[key];
- }
- });
- }
-
- return filterTransformer
- ? { ...finalFilters, ...sorter }
- : { ...beforeParams, ...sorter };
- }
-
- async function getTableData() {
- // 濡傛灉杩欐鍜屼笂娆$殑filter涓嶅悓锛岄偅涔堝氨閲嶇疆椤电爜
- if (!isEqual(unref(filters), lastFilters)) {
- pagination.currentPage = 1;
- lastFilters = deepClone(unref(filters));
- }
- loading.value = true;
- api({
- ...getFinalParams(),
- current: pagination.currentPage,
- size: pagination.pageSize
- }).then(({ code, data, msg, ...rest }) => {
- if (code == 200) {
- // pagination.currentPage = meta.current_page;
- // pagination.pageSize = meta.per_page;
- pagination.total = data.total;
- others.value = rest;
- dataList.value = data.records;
- cb && cb(data);
- loading.value = false;
- } else {
- loading.value = false;
- ElMessage({ message: msg, type: "error" });
- }
- });
- }
-
- function onSizeChange(val) {
- pagination.pageSize = val;
- pagination.currentPage = 1;
- getTableData();
- }
-
- function onCurrentChange(val) {
- loadingConfig.text = `姝e湪鍔犺浇绗�${val}椤�...`;
- loading.value = true;
- getTableData();
- }
- function resetFilters() {
- resetForm();
- pagination.currentPage = 1;
- getTableData();
- }
-
- watchEffect(() => {
- pagination.align = paginationAlign.value
- });
-
- // onMounted(() => {
- // getTableData();
- // });
-
- return {
- loading,
- columns,
- dataList,
- pagination,
- loadingConfig,
- paginationAlign,
- filters,
- sorter,
- others,
- onSizeChange,
- onCurrentChange,
- getTableData,
- resetFilters
- };
-}
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
deleted file mode 100644
index a87ef7d..0000000
--- a/src/layout/components/AppMain.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-<template>
- <section class="app-main">
- <router-view v-slot="{ Component, route }">
- <transition name="fade-transform" mode="out-in">
- <keep-alive :include="tagsViewStore.cachedViews">
- <component v-if="!route.meta.link" :is="Component" :key="route.path"/>
- </keep-alive>
- </transition>
- </router-view>
- <iframe-toggle />
- </section>
-</template>
-
-<script setup>
-import iframeToggle from "./IframeToggle/index"
-import useTagsViewStore from '@/store/modules/tagsView'
-
-const route = useRoute()
-const tagsViewStore = useTagsViewStore()
-
-onMounted(() => {
- addIframe()
-})
-
-watchEffect(() => {
- addIframe()
-})
-
-function addIframe() {
- if (route.meta.link) {
- useTagsViewStore().addIframeView(route)
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.app-main {
- /* 50= navbar 50 */
- min-height: calc(100vh - 50px);
- width: 100%;
- position: relative;
- overflow: hidden;
- background: #F5F7FB;
-}
-
-.fixed-header + .app-main {
- padding-top: 50px;
-}
-
-.hasTagsView {
- .app-main {
- /* 84 = navbar + tags-view = 50 + 34 */
- min-height: calc(100vh - 84px);
- }
-
- .fixed-header + .app-main {
- padding-top: 84px;
- }
-}
-</style>
-
-<style lang="scss">
-// fix css style bug in open el-dialog
-.el-popup-parent--hidden {
- .fixed-header {
- padding-right: 6px;
- }
-}
-
-::-webkit-scrollbar {
- width: 6px;
- height: 6px;
-}
-
-::-webkit-scrollbar-track {
- background-color: #f1f1f1;
-}
-
-::-webkit-scrollbar-thumb {
- background-color: #c0c0c0;
- border-radius: 3px;
-}
-</style>
-
diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue
deleted file mode 100644
index 992b59d..0000000
--- a/src/layout/components/IframeToggle/index.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<template>
- <inner-link
- v-for="(item, index) in tagsViewStore.iframeViews"
- :key="item.path"
- :iframeId="'iframe' + index"
- v-show="route.path === item.path"
- :src="iframeUrl(item.meta.link, item.query)"
- ></inner-link>
-</template>
-
-<script setup>
-import InnerLink from "../InnerLink/index"
-import useTagsViewStore from "@/store/modules/tagsView"
-
-const route = useRoute()
-const tagsViewStore = useTagsViewStore()
-
-function iframeUrl(url, query) {
- if (Object.keys(query).length > 0) {
- let params = Object.keys(query).map((key) => key + "=" + query[key]).join("&")
- return url + "?" + params
- }
- return url
-}
-</script>
diff --git a/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue
deleted file mode 100644
index 2634830..0000000
--- a/src/layout/components/InnerLink/index.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<template>
- <div :style="'height:' + height" v-loading="loading" element-loading-text="姝e湪鍔犺浇椤甸潰锛岃绋嶅�欙紒">
- <iframe
- :id="iframeId"
- style="width: 100%; height: 100%"
- :src="src"
- ref="iframeRef"
- frameborder="no"
- ></iframe>
- </div>
-</template>
-
-<script setup>
-const props = defineProps({
- src: {
- type: String,
- default: "/"
- },
- iframeId: {
- type: String
- }
-})
-
-const loading = ref(true)
-const height = ref(document.documentElement.clientHeight - 94.5 + 'px')
-const iframeRef = ref(null)
-
-onMounted(() => {
- if (iframeRef.value) {
- iframeRef.value.onload = () => {
- loading.value = false
- }
- }
-})
-</script>
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
deleted file mode 100644
index 1f0d385..0000000
--- a/src/layout/components/Navbar.vue
+++ /dev/null
@@ -1,269 +0,0 @@
-<template>
- <div class="navbar">
- <div>
- <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
- @toggleClick="toggleSideBar" />
- <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" />
- </div>
- <!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />-->
- <div class="center-menu">
- <span class="label">{{ userStore.currentFactoryName }}</span>
- <el-dropdown @command="handleFactoryChange" class="right-menu-item hover-effect" trigger="click">
- <div>
- <el-icon size="20">
- <Switch />
- </el-icon>
- </div>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item v-for="item in factoryList" :key="item.deptId" :command="item">
- {{ item.deptName }}
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
- <div class="right-menu">
- <div class="avatar-container">
- <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
- <div class="avatar-wrapper">
- <img :src="userStore.avatar" class="user-avatar" />
- <el-icon><caret-bottom /></el-icon>
- </div>
- <template #dropdown>
- <el-dropdown-menu>
- <router-link to="/user/profile">
- <el-dropdown-item>涓汉涓績</el-dropdown-item>
- </router-link>
- <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">
- <span>甯冨眬璁剧疆</span>
- </el-dropdown-item>
- <el-dropdown-item divided command="logout">
- <span>閫�鍑虹櫥褰�</span>
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ElMessageBox } from 'element-plus'
-import Breadcrumb from '@/components/Breadcrumb'
-import TopNav from '@/components/TopNav'
-import Hamburger from '@/components/Hamburger'
-import Screenfull from '@/components/Screenfull'
-import SizeSelect from '@/components/SizeSelect'
-import HeaderSearch from '@/components/HeaderSearch'
-import RuoYiGit from '@/components/RuoYi/Git'
-import RuoYiDoc from '@/components/RuoYi/Doc'
-import useAppStore from '@/store/modules/app'
-import useUserStore from '@/store/modules/user'
-import useSettingsStore from '@/store/modules/settings'
-import { userLoginFacotryList } from "@/api/system/user.js"
-import Cookies from "js-cookie";
-import { decrypt } from "@/utils/jsencrypt"
-
-const appStore = useAppStore()
-const userStore = useUserStore()
-const settingsStore = useSettingsStore()
-const factoryList = ref([])
-function toggleSideBar() {
- appStore.toggleSideBar()
-}
-// const redirect = ref(undefined)
-// watch(route, (newRoute) => {
-// redirect.value = newRoute.query && newRoute.query.redirect
-// }, { immediate: true })
-
-function handleCommand(command) {
- switch (command) {
- case "setLayout":
- setLayout()
- break
- case "logout":
- logout()
- break
- default:
- break
- }
-}
-
-function logout() {
- ElMessageBox.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- userStore.logOut().then(() => {
- location.href = '/index'
- })
- }).catch(() => { })
-}
-
-const emits = defineEmits(['setLayout'])
-function setLayout() {
- emits('setLayout')
-}
-
-function toggleTheme() {
- settingsStore.toggleTheme()
-}
-
-function getUserLoginFacotryList() {
- if (userStore.id) {
- userLoginFacotryList({ userId: userStore.id }).then(res => {
- console.log('res', res)
- factoryList.value = res.data
- })
- } else {
- factoryList.value = []
- }
-}
-
-function handleFactoryChange(command) {
- console.log('command', command)
- handleLogin(command.deptId);
-}
-
-function handleLogin(currentFatoryId) {
- const loginForm = {
- username: Cookies.get("username"),
- password: Cookies.get("password") === undefined ? null : decrypt(Cookies.get("password")),
- currentFatoryId: currentFatoryId
- }
- userStore.loginCheckFactory(loginForm).then(res => {
- forceReload();
- }).catch((err) => {
- console.log(err)
- })
-}
-function forceReload() {
- const currentUrl = window.location.origin + window.location.pathname;
- const timestamp = new Date().getTime();
- window.location.href = `${currentUrl}?reload=${timestamp}`;
-}
-
-getUserLoginFacotryList();
-</script>
-
-<style lang='scss' scoped>
-.navbar {
- height: 50px;
- overflow: hidden;
- position: relative;
- background: var(--navbar-bg);
- box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
-
- .center-menu {
- line-height: 50px;
- position: absolute;
- left: 50%;
- transform: translateX(-50%);
- display: flex;
- align-items: center;
-
- .label {
- font-weight: bold;
- font-size: 18px;
- color: #333333;
- margin-right: 10px;
- }
- }
-
- .hamburger-container {
- line-height: 46px;
- height: 100%;
- float: left;
- cursor: pointer;
- transition: background 0.3s;
- -webkit-tap-highlight-color: transparent;
-
- &:hover {
- background: rgba(0, 0, 0, 0.025);
- }
- }
-
- .breadcrumb-container {
- float: left;
- }
-
- .topmenu-container {
- position: absolute;
- left: 50px;
- }
-
- .errLog-container {
- display: inline-block;
- vertical-align: top;
- }
-
- .right-menu {
- float: right;
- height: 100%;
- line-height: 50px;
- display: flex;
-
- &:focus {
- outline: none;
- }
-
- .right-menu-item {
- display: inline-block;
- padding: 0 8px;
- height: 100%;
- font-size: 18px;
- color: var(--navbar-text);
- vertical-align: text-bottom;
-
- &.hover-effect {
- cursor: pointer;
- transition: background 0.3s;
-
- &:hover {
- background: rgba(0, 0, 0, 0.025);
- }
- }
-
- &.theme-switch-wrapper {
- display: flex;
- align-items: center;
-
- svg {
- transition: transform 0.3s;
-
- &:hover {
- transform: scale(1.15);
- }
- }
- }
- }
-
- .avatar-container {
- margin-right: 40px;
-
- .avatar-wrapper {
- margin-top: 5px;
- position: relative;
-
- .user-avatar {
- cursor: pointer;
- width: 40px;
- height: 40px;
- border-radius: 50px;
- }
-
- i {
- cursor: pointer;
- position: absolute;
- right: -20px;
- top: 14px;
- font-size: 12px;
- }
- }
- }
- }
-}
-</style>
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
deleted file mode 100644
index b4796f3..0000000
--- a/src/layout/components/Settings/index.vue
+++ /dev/null
@@ -1,259 +0,0 @@
-<template>
- <el-drawer v-model="showSettings" direction="rtl" size="300px">
-<!-- <div class="setting-drawer-title">-->
-<!-- <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3>-->
-<!-- </div>-->
-<!-- <div class="setting-drawer-block-checbox">-->
-<!-- <div-->
-<!-- class="setting-drawer-block-checbox-item"-->
-<!-- @click="handleTheme('theme-dark')"-->
-<!-- >-->
-<!-- <img src="@/assets/images/dark.svg" alt="dark" />-->
-<!-- <div-->
-<!-- v-if="sideTheme === 'theme-dark'"-->
-<!-- class="setting-drawer-block-checbox-selectIcon"-->
-<!-- style="display: block"-->
-<!-- >-->
-<!-- <i aria-label="鍥炬爣: check" class="anticon anticon-check">-->
-<!-- <svg-->
-<!-- viewBox="64 64 896 896"-->
-<!-- data-icon="check"-->
-<!-- width="1em"-->
-<!-- height="1em"-->
-<!-- :fill="theme"-->
-<!-- aria-hidden="true"-->
-<!-- focusable="false"-->
-<!-- class-->
-<!-- >-->
-<!-- <path-->
-<!-- d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"-->
-<!-- />-->
-<!-- </svg>-->
-<!-- </i>-->
-<!-- </div>-->
-<!-- </div>-->
-<!-- <div-->
-<!-- class="setting-drawer-block-checbox-item"-->
-<!-- @click="handleTheme('theme-light')"-->
-<!-- >-->
-<!-- <img src="@/assets/images/light.svg" alt="light" />-->
-<!-- <div-->
-<!-- v-if="sideTheme === 'theme-light'"-->
-<!-- class="setting-drawer-block-checbox-selectIcon"-->
-<!-- style="display: block"-->
-<!-- >-->
-<!-- <i aria-label="鍥炬爣: check" class="anticon anticon-check">-->
-<!-- <svg-->
-<!-- viewBox="64 64 896 896"-->
-<!-- data-icon="check"-->
-<!-- width="1em"-->
-<!-- height="1em"-->
-<!-- :fill="theme"-->
-<!-- aria-hidden="true"-->
-<!-- focusable="false"-->
-<!-- class-->
-<!-- >-->
-<!-- <path-->
-<!-- d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"-->
-<!-- />-->
-<!-- </svg>-->
-<!-- </i>-->
-<!-- </div>-->
-<!-- </div>-->
-<!-- </div>-->
- <div class="drawer-item">
- <span>涓婚棰滆壊</span>
- <span class="comp-style">
- <el-color-picker
- v-model="theme"
- :predefine="predefineColors"
- @change="themeChange"
- />
- </span>
- </div>
- <el-divider />
-
- <h3 class="drawer-title">绯荤粺甯冨眬閰嶇疆</h3>
-
- <div class="drawer-item">
- <span>寮�鍚� TopNav</span>
- <span class="comp-style">
- <el-switch
- v-model="settingsStore.topNav"
- @change="topNavChange"
- class="drawer-switch"
- />
- </span>
- </div>
-
- <div class="drawer-item">
- <span>寮�鍚� Tags-Views</span>
- <span class="comp-style">
- <el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
- </span>
- </div>
-
- <div class="drawer-item">
- <span>鍥哄畾 Header</span>
- <span class="comp-style">
- <el-switch v-model="settingsStore.fixedHeader" class="drawer-switch" />
- </span>
- </div>
-
- <div class="drawer-item">
- <span>鏄剧ず Logo</span>
- <span class="comp-style">
- <el-switch v-model="settingsStore.sidebarLogo" class="drawer-switch" />
- </span>
- </div>
-
- <div class="drawer-item">
- <span>鍔ㄦ�佹爣棰�</span>
- <span class="comp-style">
- <el-switch v-model="settingsStore.dynamicTitle" class="drawer-switch" />
- </span>
- </div>
-
- <el-divider />
-
- <el-button type="primary" plain icon="DocumentAdd" @click="saveSetting"
- >淇濆瓨閰嶇疆</el-button
- >
- <el-button plain icon="Refresh" @click="resetSetting">閲嶇疆閰嶇疆</el-button>
- </el-drawer>
-</template>
-
-<script setup>
-import variables from "@/assets/styles/variables.module.scss";
-import axios from "axios";
-import { ElLoading, ElMessage } from "element-plus";
-import { useDynamicTitle } from "@/utils/dynamicTitle";
-import useAppStore from "@/store/modules/app";
-import useSettingsStore from "@/store/modules/settings";
-import usePermissionStore from "@/store/modules/permission";
-import { handleThemeStyle } from "@/utils/theme";
-
-const { proxy } = getCurrentInstance();
-const appStore = useAppStore();
-const settingsStore = useSettingsStore();
-const permissionStore = usePermissionStore();
-const showSettings = ref(false);
-const theme = ref(settingsStore.theme);
-const sideTheme = ref(settingsStore.sideTheme);
-const storeSettings = computed(() => settingsStore);
-const predefineColors = ref([
- "#002fa7",
- "#81D8D0",
- "#E85827",
- "#008C8C",
- "#F9DC24",
- "#B05923",
- "#003153",
- "#8F4B28",
- "#4C0009",
-]);
-
-/** 鏄惁闇�瑕乼opnav */
-function topNavChange(val) {
- if (!val) {
- appStore.toggleSideBarHide(false);
- permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
- }
-}
-
-function themeChange(val) {
- settingsStore.theme = val;
- handleThemeStyle(val);
-}
-
-function handleTheme(val) {
- settingsStore.sideTheme = val;
- sideTheme.value = val;
-}
-
-function saveSetting() {
- proxy.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...");
- let layoutSetting = {
- topNav: storeSettings.value.topNav,
- tagsView: storeSettings.value.tagsView,
- fixedHeader: storeSettings.value.fixedHeader,
- sidebarLogo: storeSettings.value.sidebarLogo,
- dynamicTitle: storeSettings.value.dynamicTitle,
- sideTheme: storeSettings.value.sideTheme,
- theme: storeSettings.value.theme,
- };
- localStorage.setItem("layout-setting", JSON.stringify(layoutSetting));
- setTimeout(proxy.$modal.closeLoading(), 1000);
-}
-
-function resetSetting() {
- proxy.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...");
- localStorage.removeItem("layout-setting");
- setTimeout("window.location.reload()", 1000);
-}
-
-function openSetting() {
- showSettings.value = true;
-}
-
-defineExpose({
- openSetting,
-});
-</script>
-
-<style lang="scss" scoped>
-.setting-drawer-title {
- margin-bottom: 12px;
- color: var(--el-text-color-primary, rgba(0, 0, 0, 0.85));
- line-height: 22px;
- font-weight: bold;
-
- .drawer-title {
- font-size: 14px;
- }
-}
-
-.setting-drawer-block-checbox {
- display: flex;
- justify-content: flex-start;
- align-items: center;
- margin-top: 10px;
- margin-bottom: 20px;
-
- .setting-drawer-block-checbox-item {
- position: relative;
- margin-right: 16px;
- border-radius: 2px;
- cursor: pointer;
-
- img {
- width: 48px;
- height: 48px;
- }
-
- .setting-drawer-block-checbox-selectIcon {
- position: absolute;
- top: 0;
- right: 0;
- width: 100%;
- height: 100%;
- padding-top: 15px;
- padding-left: 24px;
- color: #1890ff;
- font-weight: 700;
- font-size: 14px;
- }
- }
-}
-
-.drawer-item {
- color: var(--el-text-color-regular, rgba(0, 0, 0, 0.65));
- padding: 12px 0;
- font-size: 14px;
-
- .comp-style {
- float: right;
- margin: -3px 8px 0px 0px;
- }
-}
-</style>
diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue
deleted file mode 100644
index 15692ba..0000000
--- a/src/layout/components/Sidebar/Link.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-<template>
- <component :is="type" v-bind="linkProps()">
- <slot />
- </component>
-</template>
-
-<script setup>
-import { isExternal } from '@/utils/validate'
-
-const props = defineProps({
- to: {
- type: [String, Object],
- required: true
- }
-})
-
-const isExt = computed(() => {
- return isExternal(props.to)
-})
-
-const type = computed(() => {
- if (isExt.value) {
- return 'a'
- }
- return 'router-link'
-})
-
-function linkProps() {
- if (isExt.value) {
- return {
- href: props.to,
- target: '_blank',
- rel: 'noopener'
- }
- }
- return {
- to: props.to
- }
-}
-</script>
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
deleted file mode 100644
index c90dcae..0000000
--- a/src/layout/components/Sidebar/Logo.vue
+++ /dev/null
@@ -1,129 +0,0 @@
-<template>
- <div class="sidebar-logo-container" :class="{ 'collapse': collapse }">
- <transition name="sidebarLogoFade">
- <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
- <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="鍏徃Logo" />
- <h1 v-else class="sidebar-title">{{ title }}</h1>
- </router-link>
- <router-link v-else key="expand" class="sidebar-logo-link" to="/">
- <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="鍏徃Logo" />
- <h1 v-else class="sidebar-title">{{ title }}</h1>
- </router-link>
- </transition>
- </div>
-</template>
-
-<script setup>
-import { ref, computed, onMounted, watch } from 'vue'
-import useUserStore from '@/store/modules/user'
-import defaultLogo from '@/assets/logo/鏁︾厡榧庤瘹.png' // 瀵煎叆榛樿logo
-
-defineProps({
- collapse: {
- type: Boolean,
- required: true
- }
-})
-
-const title = import.meta.env.VITE_APP_TITLE
-const userStore = useUserStore()
-
-// 澶勭悊宸ュ巶鍚嶇О锛岀敓鎴愬悎娉曠殑鏂囦欢鍚�
-const cleanFactoryName = computed(() => {
- if (!userStore.currentFactoryName) return ''
- return userStore.currentFactoryName.trim()
-})
-
-// 鍔ㄦ�乴ogo璺緞
-const logoUrl = ref('')
-
-// 妫�鏌ogo鏄惁瀛樺湪骞惰缃畊rl
-const updateLogoUrl = () => {
- if (!cleanFactoryName.value) {
- logoUrl.value = defaultLogo
- return
- }
-
- // 浣跨敤Vite鐨勫姩鎬佸鍏�
- try {
- const dynamicLogo = import.meta.glob('/src/assets/logo/*.png', { eager: true })
- const logoPath = `/src/assets/logo/${cleanFactoryName.value}.png`
-
- if (dynamicLogo[logoPath]) {
- logoUrl.value = dynamicLogo[logoPath].default
- } else {
- logoUrl.value = defaultLogo
- }
- } catch (error) {
- console.error('鍔犺浇宸ュ巶Logo澶辫触:', error)
- logoUrl.value = defaultLogo
- }
-}
-
-// 鍒濆鍖栧拰鐩戝惉鍙樺寲
-onMounted(() => {
- updateLogoUrl()
-
- // 鐩戝惉宸ュ巶鍚嶇О鍙樺寲
- watch(() => userStore.currentFactoryName, updateLogoUrl)
-})
-
-// 鍥剧墖鍔犺浇閿欒澶勭悊
-const handleImageError = (event) => {
- console.warn('Logo鍔犺浇澶辫触锛屼娇鐢ㄩ粯璁ogo')
- logoUrl.value = defaultLogo
-}
-</script>
-
-<style lang="scss" scoped>
-@import '@/assets/styles/variables.module.scss';
-
-.sidebarLogoFade-enter-active {
- transition: opacity 1.5s;
-}
-
-.sidebarLogoFade-enter,
-.sidebarLogoFade-leave-to {
- opacity: 0;
-}
-
-.sidebar-logo-container {
- position: relative;
- width: 100% !important;
- height: 50px !important;
- line-height: 50px;
- background: #fff;
- text-align: center;
- overflow: hidden;
-
- & .sidebar-logo-link {
- height: 100%;
- width: 100%;
-
- & .sidebar-logo {
- width: 100%;
- height: 100%;
- // height: 32px;
- vertical-align: middle;
- margin-right: 12px;
- }
-
- & .sidebar-title {
- display: inline-block;
- margin: 0;
- color: v-bind(getLogoTextColor);
- font-weight: 600;
- line-height: 50px;
- font-size: 14px;
- font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
- vertical-align: middle;
- }
- }
-
- &.collapse {
- .sidebar-logo {
- margin-right: 0px;
- }
- }
-}
-</style>
diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
deleted file mode 100644
index f395d95..0000000
--- a/src/layout/components/Sidebar/SidebarItem.vue
+++ /dev/null
@@ -1,100 +0,0 @@
-<template>
- <div v-if="!item.hidden">
- <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
- <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
- <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
- <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
- <template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
- </el-menu-item>
- </app-link>
- </template>
-
- <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
- <template v-if="item.meta" #title>
- <svg-icon :icon-class="item.meta && item.meta.icon" />
- <span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
- </template>
-
- <sidebar-item
- v-for="(child, index) in item.children"
- :key="child.path + index"
- :is-nest="true"
- :item="child"
- :base-path="resolvePath(child.path)"
- class="nest-menu"
- />
- </el-sub-menu>
- </div>
-</template>
-
-<script setup>
-import { isExternal } from '@/utils/validate'
-import AppLink from './Link'
-import { getNormalPath } from '@/utils/ruoyi'
-
-const props = defineProps({
- // route object
- item: {
- type: Object,
- required: true
- },
- isNest: {
- type: Boolean,
- default: false
- },
- basePath: {
- type: String,
- default: ''
- }
-})
-
-const onlyOneChild = ref({})
-
-function hasOneShowingChild(children = [], parent) {
- if (!children) {
- children = []
- }
- const showingChildren = children.filter(item => {
- if (item.hidden) {
- return false
- }
- onlyOneChild.value = item
- return true
- })
-
- // When there is only one child router, the child router is displayed by default
- if (showingChildren.length === 1) {
- return true
- }
-
- // Show parent if there are no child router to display
- if (showingChildren.length === 0) {
- onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
- return true
- }
-
- return false
-}
-
-function resolvePath(routePath, routeQuery) {
- if (isExternal(routePath)) {
- return routePath
- }
- if (isExternal(props.basePath)) {
- return props.basePath
- }
- if (routeQuery) {
- let query = JSON.parse(routeQuery)
- return { path: getNormalPath(props.basePath + '/' + routePath), query: query }
- }
- return getNormalPath(props.basePath + '/' + routePath)
-}
-
-function hasTitle(title){
- if (title.length > 5) {
- return title
- } else {
- return ""
- }
-}
-</script>
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
deleted file mode 100644
index 9044945..0000000
--- a/src/layout/components/Sidebar/index.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-<template>
- <div :class="{ 'has-logo': showLogo }" class="sidebar-container">
- <logo v-if="showLogo" :collapse="isCollapse" />
- <el-scrollbar wrap-class="scrollbar-wrapper">
- <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="getMenuBackground"
- :text-color="getMenuTextColor" :unique-opened="true" :active-text-color="theme" :collapse-transition="false"
- mode="vertical" :class="sideTheme">
- <sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route"
- :base-path="route.path" />
- </el-menu>
- </el-scrollbar>
- </div>
-</template>
-
-<script setup>
-import Logo from './Logo'
-import SidebarItem from './SidebarItem'
-import variables from '@/assets/styles/variables.module.scss'
-import useAppStore from '@/store/modules/app'
-import useSettingsStore from '@/store/modules/settings'
-import usePermissionStore from '@/store/modules/permission'
-
-const route = useRoute()
-const appStore = useAppStore()
-const settingsStore = useSettingsStore()
-const permissionStore = usePermissionStore()
-
-const sidebarRouters = computed(() => permissionStore.sidebarRouters)
-const showLogo = computed(() => settingsStore.sidebarLogo)
-const sideTheme = computed(() => settingsStore.sideTheme)
-const theme = computed(() => settingsStore.theme)
-const isCollapse = computed(() => !appStore.sidebar.opened)
-
-// 鑾峰彇鑿滃崟鑳屾櫙鑹�
-const getMenuBackground = computed(() => {
- if (settingsStore.isDark) {
- return 'var(--sidebar-bg)'
- }
- // 娴呰壊涓婚鏃讹紝鐩存帴鐢ㄤ富棰樿壊
- return sideTheme.value === 'theme-dark' ? variables.menuBg : settingsStore.theme
-})
-
-// 鑾峰彇鑿滃崟鏂囧瓧棰滆壊
-const getMenuTextColor = computed(() => {
- if (settingsStore.isDark) {
- return 'var(--sidebar-text)'
- }
- return sideTheme.value === 'theme-dark' ? variables.menuText : variables.menuLightText
-})
-
-const activeMenu = computed(() => {
- const { meta, path } = route
- if (meta.activeMenu) {
- return meta.activeMenu
- }
- return path
-})
-</script>
-
-<style lang="scss" scoped>
-.sidebar-container {
- background-color: v-bind(getMenuBackground);
-
- .scrollbar-wrapper {
- background-color: v-bind(getMenuBackground);
- }
-
- .el-menu {
- border: none;
- height: 100%;
- width: 100% !important;
-
- .el-menu-item,
- .el-sub-menu__title {
- &:hover {
- background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
- }
- }
-
- .el-menu-item {
- color: v-bind(getMenuTextColor);
-
- &.is-active {
- color: var(--menu-active-text, #409eff);
- background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
- }
- }
-
- .el-sub-menu__title {
- color: v-bind(getMenuTextColor);
- }
- }
-}
-</style>
diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue
deleted file mode 100644
index 0189a17..0000000
--- a/src/layout/components/TagsView/ScrollPane.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-<template>
- <el-scrollbar
- ref="scrollContainer"
- :vertical="false"
- class="scroll-container"
- @wheel.prevent="handleScroll"
- >
- <slot />
- </el-scrollbar>
-</template>
-
-<script setup>
-import useTagsViewStore from '@/store/modules/tagsView'
-
-const tagAndTagSpacing = ref(4)
-const { proxy } = getCurrentInstance()
-
-const scrollWrapper = computed(() => proxy.$refs.scrollContainer.$refs.wrapRef)
-
-onMounted(() => {
- scrollWrapper.value.addEventListener('scroll', emitScroll, true)
-})
-
-onBeforeUnmount(() => {
- scrollWrapper.value.removeEventListener('scroll', emitScroll)
-})
-
-function handleScroll(e) {
- const eventDelta = e.wheelDelta || -e.deltaY * 40
- const $scrollWrapper = scrollWrapper.value
- $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
-}
-
-const emits = defineEmits()
-const emitScroll = () => {
- emits('scroll')
-}
-
-const tagsViewStore = useTagsViewStore()
-const visitedViews = computed(() => tagsViewStore.visitedViews)
-
-function moveToTarget(currentTag) {
- const $container = proxy.$refs.scrollContainer.$el
- const $containerWidth = $container.offsetWidth
- const $scrollWrapper = scrollWrapper.value
-
- let firstTag = null
- let lastTag = null
-
- // find first tag and last tag
- if (visitedViews.value.length > 0) {
- firstTag = visitedViews.value[0]
- lastTag = visitedViews.value[visitedViews.value.length - 1]
- }
-
- if (firstTag === currentTag) {
- $scrollWrapper.scrollLeft = 0
- } else if (lastTag === currentTag) {
- $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
- } else {
- const tagListDom = document.getElementsByClassName('tags-view-item')
- const currentIndex = visitedViews.value.findIndex(item => item === currentTag)
- let prevTag = null
- let nextTag = null
- for (const k in tagListDom) {
- if (k !== 'length' && Object.hasOwnProperty.call(tagListDom, k)) {
- if (tagListDom[k].dataset.path === visitedViews.value[currentIndex - 1].path) {
- prevTag = tagListDom[k]
- }
- if (tagListDom[k].dataset.path === visitedViews.value[currentIndex + 1].path) {
- nextTag = tagListDom[k]
- }
- }
- }
-
- // the tag's offsetLeft after of nextTag
- const afterNextTagOffsetLeft = nextTag.offsetLeft + nextTag.offsetWidth + tagAndTagSpacing.value
-
- // the tag's offsetLeft before of prevTag
- const beforePrevTagOffsetLeft = prevTag.offsetLeft - tagAndTagSpacing.value
- if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
- $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
- } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
- $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
- }
- }
-}
-
-defineExpose({
- moveToTarget,
-})
-</script>
-
-<style lang='scss' scoped>
-.scroll-container {
- white-space: nowrap;
- position: relative;
- overflow: hidden;
- width: 100%;
- :deep(.el-scrollbar__bar) {
- bottom: 0px;
- }
- :deep(.el-scrollbar__wrap) {
- height: 39px;
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
deleted file mode 100644
index d3aa736..0000000
--- a/src/layout/components/TagsView/index.vue
+++ /dev/null
@@ -1,355 +0,0 @@
-<template>
- <div id="tags-view-container" class="tags-view-container">
- <scroll-pane ref="scrollPaneRef" class="tags-view-wrapper" @scroll="handleScroll">
- <router-link
- v-for="tag in visitedViews"
- :key="tag.path"
- :data-path="tag.path"
- :class="isActive(tag) ? 'active' : ''"
- :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
- class="tags-view-item"
- :style="activeStyle(tag)"
- @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''"
- @contextmenu.prevent="openMenu(tag, $event)"
- >
- {{ tag.title }}
- <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)">
- <close class="el-icon-close" style="width: 1em; height: 1em;vertical-align: middle;" />
- </span>
- </router-link>
- </scroll-pane>
- <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
- <li @click="refreshSelectedTag(selectedTag)">
- <refresh-right style="width: 1em; height: 1em;" /> 鍒锋柊椤甸潰
- </li>
- <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">
- <close style="width: 1em; height: 1em;" /> 鍏抽棴褰撳墠
- </li>
- <li @click="closeOthersTags">
- <circle-close style="width: 1em; height: 1em;" /> 鍏抽棴鍏朵粬
- </li>
- <li v-if="!isFirstView()" @click="closeLeftTags">
- <back style="width: 1em; height: 1em;" /> 鍏抽棴宸︿晶
- </li>
- <li v-if="!isLastView()" @click="closeRightTags">
- <right style="width: 1em; height: 1em;" /> 鍏抽棴鍙充晶
- </li>
- <li @click="closeAllTags(selectedTag)">
- <circle-close style="width: 1em; height: 1em;" /> 鍏ㄩ儴鍏抽棴
- </li>
- </ul>
- </div>
-</template>
-
-<script setup>
-import ScrollPane from './ScrollPane'
-import { getNormalPath } from '@/utils/ruoyi'
-import useTagsViewStore from '@/store/modules/tagsView'
-import useSettingsStore from '@/store/modules/settings'
-import usePermissionStore from '@/store/modules/permission'
-
-const visible = ref(false)
-const top = ref(0)
-const left = ref(0)
-const selectedTag = ref({})
-const affixTags = ref([])
-const scrollPaneRef = ref(null)
-
-const { proxy } = getCurrentInstance()
-const route = useRoute()
-const router = useRouter()
-
-const visitedViews = computed(() => useTagsViewStore().visitedViews)
-const routes = computed(() => usePermissionStore().routes)
-const theme = computed(() => useSettingsStore().theme)
-
-watch(route, () => {
- addTags()
- moveToCurrentTag()
-})
-
-watch(visible, (value) => {
- if (value) {
- document.body.addEventListener('click', closeMenu)
- } else {
- document.body.removeEventListener('click', closeMenu)
- }
-})
-
-onMounted(() => {
- initTags()
- addTags()
-})
-
-function isActive(r) {
- return r.path === route.path
-}
-
-function activeStyle(tag) {
- if (!isActive(tag)) return {}
- return {
- "background-color": theme.value,
- "border-color": theme.value
- }
-}
-
-function isAffix(tag) {
- return tag.meta && tag.meta.affix
-}
-
-function isFirstView() {
- try {
- return selectedTag.value.fullPath === '/index' || selectedTag.value.fullPath === visitedViews.value[1].fullPath
- } catch (err) {
- return false
- }
-}
-
-function isLastView() {
- try {
- return selectedTag.value.fullPath === visitedViews.value[visitedViews.value.length - 1].fullPath
- } catch (err) {
- return false
- }
-}
-
-function filterAffixTags(routes, basePath = '') {
- let tags = []
- routes.forEach(route => {
- if (route.meta && route.meta.affix) {
- const tagPath = getNormalPath(basePath + '/' + route.path)
- tags.push({
- fullPath: tagPath,
- path: tagPath,
- name: route.name,
- meta: { ...route.meta }
- })
- }
- if (route.children) {
- const tempTags = filterAffixTags(route.children, route.path)
- if (tempTags.length >= 1) {
- tags = [...tags, ...tempTags]
- }
- }
- })
- return tags
-}
-
-function initTags() {
- const res = filterAffixTags(routes.value)
- affixTags.value = res
- for (const tag of res) {
- // Must have tag name
- if (tag.name) {
- useTagsViewStore().addVisitedView(tag)
- }
- }
-}
-
-function addTags() {
- const { name } = route
- if (name) {
- useTagsViewStore().addView(route)
- }
-}
-
-function moveToCurrentTag() {
- nextTick(() => {
- for (const r of visitedViews.value) {
- if (r.path === route.path) {
- scrollPaneRef.value.moveToTarget(r)
- // when query is different then update
- if (r.fullPath !== route.fullPath) {
- useTagsViewStore().updateVisitedView(route)
- }
- }
- }
- })
-}
-
-function refreshSelectedTag(view) {
- proxy.$tab.refreshPage(view)
- if (route.meta.link) {
- useTagsViewStore().delIframeView(route)
- }
-}
-
-function closeSelectedTag(view) {
- proxy.$tab.closePage(view).then(({ visitedViews }) => {
- if (isActive(view)) {
- toLastView(visitedViews, view)
- }
- })
-}
-
-function closeRightTags() {
- proxy.$tab.closeRightPage(selectedTag.value).then(visitedViews => {
- if (!visitedViews.find(i => i.fullPath === route.fullPath)) {
- toLastView(visitedViews)
- }
- })
-}
-
-function closeLeftTags() {
- proxy.$tab.closeLeftPage(selectedTag.value).then(visitedViews => {
- if (!visitedViews.find(i => i.fullPath === route.fullPath)) {
- toLastView(visitedViews)
- }
- })
-}
-
-function closeOthersTags() {
- router.push(selectedTag.value).catch(() => { })
- proxy.$tab.closeOtherPage(selectedTag.value).then(() => {
- moveToCurrentTag()
- })
-}
-
-function closeAllTags(view) {
- proxy.$tab.closeAllPage().then(({ visitedViews }) => {
- if (affixTags.value.some(tag => tag.path === route.path)) {
- return
- }
- toLastView(visitedViews, view)
- })
-}
-
-function toLastView(visitedViews, view) {
- const latestView = visitedViews.slice(-1)[0]
- if (latestView) {
- router.push(latestView.fullPath)
- } else {
- // now the default is to redirect to the home page if there is no tags-view,
- // you can adjust it according to your needs.
- if (view.name === 'Dashboard') {
- // to reload home page
- router.replace({ path: '/redirect' + view.fullPath })
- } else {
- router.push('/')
- }
- }
-}
-
-function openMenu(tag, e) {
- const menuMinWidth = 105
- const offsetLeft = proxy.$el.getBoundingClientRect().left // container margin left
- const offsetWidth = proxy.$el.offsetWidth // container width
- const maxLeft = offsetWidth - menuMinWidth // left boundary
- const l = e.clientX - offsetLeft + 15 // 15: margin right
-
- if (l > maxLeft) {
- left.value = maxLeft
- } else {
- left.value = l
- }
-
- top.value = e.clientY
- visible.value = true
- selectedTag.value = tag
-}
-
-function closeMenu() {
- visible.value = false
-}
-
-function handleScroll() {
- closeMenu()
-}
-</script>
-
-<style lang="scss" scoped>
-.tags-view-container {
- height: 34px;
- width: 100%;
- background: transparent;
-
- .tags-view-wrapper {
- .tags-view-item {
- display: inline-block;
- position: relative;
- cursor: pointer;
- height: 32px;
- line-height: 32px;
- //border: 1px solid var(--tags-item-border, #d8dce5);
- color: #4E5463;
- background: #E5E7EA;
- padding: 0 16px;
- font-size: 12px;
- //margin-left: 5px;
- //margin-top: 4px;
-
- //&:first-of-type {
- // margin-left: 8px;
- //}
- //
- //&:last-of-type {
- // margin-right: 15px;
- //}
-
- &.active {
- background-color: #FFFFFF !important;
- color: #2C51D9;
- }
- }
- //.tags-view-item div {
- // transform: skew(12deg);
- // display: inline-block;
- //}
- }
-
- .contextmenu {
- margin: 0;
- background: var(--el-bg-color-overlay, #fff);
- z-index: 3000;
- position: absolute;
- list-style-type: none;
- padding: 5px 0;
- border-radius: 4px;
- font-size: 12px;
- font-weight: 400;
- color: var(--tags-item-text, #333);
- box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
- border: 1px solid var(--el-border-color-light, #e4e7ed);
-
- li {
- margin: 0;
- padding: 7px 16px;
- cursor: pointer;
-
- &:hover {
- background: var(--tags-item-hover, #eee);
- }
- }
- }
-}
-</style>
-
-<style lang="scss">
-//reset element css of el-icon-close
-.tags-view-wrapper {
- .tags-view-item {
- .el-icon-close {
- width: 16px;
- height: 16px;
- vertical-align: 2px;
- border-radius: 50%;
- text-align: center;
- transition: all .3s cubic-bezier(.645, .045, .355, 1);
- transform-origin: 100% 50%;
-
- &:before {
- transform: scale(.6);
- display: inline-block;
- vertical-align: -3px;
- }
-
- &:hover {
- background-color: var(--tags-close-hover, #b4bccc);
- color: #fff;
- width: 12px !important;
- height: 12px !important;
- }
- }
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/layout/components/index.js b/src/layout/components/index.js
deleted file mode 100644
index d1308ce..0000000
--- a/src/layout/components/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export { default as AppMain } from './AppMain'
-export { default as Navbar } from './Navbar'
-export { default as Settings } from './Settings'
-export { default as TagsView } from './TagsView/index.vue'
diff --git a/src/layout/index.vue b/src/layout/index.vue
deleted file mode 100644
index 67ac803..0000000
--- a/src/layout/index.vue
+++ /dev/null
@@ -1,114 +0,0 @@
-<template>
- <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
- <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
- <sidebar v-if="!sidebar.hide" class="sidebar-container" />
- <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
- <div :class="{ 'fixed-header': fixedHeader }">
- <navbar @setLayout="setLayout" />
- <tags-view v-if="needTagsView" />
- </div>
- <app-main />
- <settings ref="settingRef" />
- </div>
- </div>
-</template>
-
-<script setup>
-import { useWindowSize } from '@vueuse/core'
-import Sidebar from './components/Sidebar/index.vue'
-import { AppMain, Navbar, Settings, TagsView } from './components'
-import defaultSettings from '@/settings'
-
-import useAppStore from '@/store/modules/app'
-import useSettingsStore from '@/store/modules/settings'
-
-const settingsStore = useSettingsStore()
-const theme = computed(() => settingsStore.theme)
-const sideTheme = computed(() => settingsStore.sideTheme)
-const sidebar = computed(() => useAppStore().sidebar)
-const device = computed(() => useAppStore().device)
-const needTagsView = computed(() => settingsStore.tagsView)
-const fixedHeader = computed(() => settingsStore.fixedHeader)
-
-const classObj = computed(() => ({
- hideSidebar: !sidebar.value.opened,
- openSidebar: sidebar.value.opened,
- withoutAnimation: sidebar.value.withoutAnimation,
- mobile: device.value === 'mobile'
-}))
-
-const { width, height } = useWindowSize()
-const WIDTH = 992 // refer to Bootstrap's responsive design
-
-watch(() => device.value, () => {
- if (device.value === 'mobile' && sidebar.value.opened) {
- useAppStore().closeSideBar({ withoutAnimation: false })
- }
-})
-
-watchEffect(() => {
- if (width.value - 1 < WIDTH) {
- useAppStore().toggleDevice('mobile')
- useAppStore().closeSideBar({ withoutAnimation: true })
- } else {
- useAppStore().toggleDevice('desktop')
- }
-})
-
-function handleClickOutside() {
- useAppStore().closeSideBar({ withoutAnimation: false })
-}
-
-const settingRef = ref(null)
-function setLayout() {
- settingRef.value.openSetting()
-}
-</script>
-
-<style lang="scss" scoped>
- @import "@/assets/styles/mixin.scss";
- @import "@/assets/styles/variables.module.scss";
-
-.app-wrapper {
- @include clearfix;
- position: relative;
- height: 100%;
- width: 100%;
-
- &.mobile.openSidebar {
- position: fixed;
- top: 0;
- }
-}
-
-.drawer-bg {
- background: #000;
- opacity: 0.3;
- width: 100%;
- top: 0;
- height: 100%;
- position: absolute;
- z-index: 999;
-}
-
-.fixed-header {
- position: fixed;
- top: 0;
- right: 0;
- z-index: 9;
- width: calc(100% - #{$base-sidebar-width});
- transition: width 0.28s;
-}
-
-.hideSidebar .fixed-header {
- width: calc(100% - 54px);
-}
-
-.sidebarHide .fixed-header {
- width: 100%;
-}
-
-.mobile .fixed-header {
- width: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index ef7b341..dd44bf7 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,113 +1,10 @@
-import { createApp } from "vue";
-
-import Cookies from "js-cookie";
-
-import ElementPlus from "element-plus";
-import "element-plus/dist/index.css";
-import "element-plus/theme-chalk/dark/css-vars.css";
-import locale from "element-plus/es/locale/lang/zh-cn";
-
-import "@/assets/styles/index.scss"; // global css
-
-import App from "./App";
-import store from "./store";
-import router from "./router";
-import directive from "./directive"; // directive
-
-// 娉ㄥ唽鎸囦护
-import plugins from "./plugins"; // plugins
-import { download } from "@/utils/request";
-
-// svg鍥炬爣
-import "virtual:svg-icons-register";
-import SvgIcon from "@/components/SvgIcon";
-import elementIcons from "@/components/SvgIcon/svgicon";
-import "./assets/fonts/font.css";
-
-import "./permission"; // permission control
-
-import { useDict } from "@/utils/dict";
import {
- parseTime,
- resetForm,
- addDateRange,
- handleTree,
- selectDictLabel,
- selectDictLabels,
-} from "@/utils/ruoyi";
-
-// 鍒嗛〉缁勪欢
-import Pagination from "@/components/Pagination";
-// 鑷畾涔夎〃鏍煎伐鍏风粍浠�
-import RightToolbar from "@/components/RightToolbar";
-// 瀵屾枃鏈粍浠�
-import Editor from "@/components/Editor";
-// 鏂囦欢涓婁紶缁勪欢
-import FileUpload from "@/components/FileUpload";
-// 鍥剧墖涓婁紶缁勪欢
-import ImageUpload from "@/components/ImageUpload";
-// 鍥剧墖棰勮缁勪欢
-import ImagePreview from "@/components/ImagePreview";
-// 瀛楀吀鏍囩缁勪欢
-import DictTag from "@/components/DictTag";
-// 琛ㄦ牸缁勪欢
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-
-import { getToken } from "@/utils/auth";
-import {
- calculateTaxExclusiveTotalPrice,
- summarizeTable,
- calculateTaxIncludeTotalPrice,
-} from "@/utils/summarizeTable.js";
-
-const app = createApp(App);
-
-// 鍏ㄥ眬鏂规硶鎸傝浇
-app.config.globalProperties.useDict = useDict;
-app.config.globalProperties.download = download;
-app.config.globalProperties.parseTime = parseTime;
-app.config.globalProperties.resetForm = resetForm;
-app.config.globalProperties.summarizeTable = summarizeTable;
-app.config.globalProperties.calculateTaxExclusiveTotalPrice =
- calculateTaxExclusiveTotalPrice;
-app.config.globalProperties.calculateTaxIncludeTotalPrice =
- calculateTaxIncludeTotalPrice;
-app.config.globalProperties.handleTree = handleTree;
-app.config.globalProperties.addDateRange = addDateRange;
-app.config.globalProperties.selectDictLabel = selectDictLabel;
-app.config.globalProperties.selectDictLabels = selectDictLabels;
-app.config.globalProperties.javaApi = "http://114.132.189.42:9033";
-app.config.globalProperties.HaveJson = (val) => {
- return JSON.parse(JSON.stringify(val));
-};
-app.config.globalProperties.uploadHeader = {
- Authorization: "Bearer " + getToken(),
-};
-
-// 鍏ㄥ眬缁勪欢鎸傝浇
-app.component("DictTag", DictTag);
-app.component("Pagination", Pagination);
-app.component("FileUpload", FileUpload);
-app.component("ImageUpload", ImageUpload);
-app.component("ImagePreview", ImagePreview);
-app.component("RightToolbar", RightToolbar);
-app.component("Editor", Editor);
-app.component("PIMTable", PIMTable);
-
-app.use(router);
-app.use(store);
-app.use(plugins);
-app.use(elementIcons);
-app.component("svg-icon", SvgIcon);
-
-directive(app);
-
-// 浣跨敤element-plus 骞朵笖璁剧疆鍏ㄥ眬鐨勫ぇ灏�
-app.use(ElementPlus, {
- locale: locale,
- // 鏀寔 large銆乨efault銆乻mall
- size: Cookies.get("size") || "default",
-});
-app._context.components.ElDialog.props.closeOnClickModal.default = false;
-
-app.mount("#app");
+ createSSRApp
+} from "vue";
+import App from "./App.vue";
+export function createApp() {
+ const app = createSSRApp(App);
+ return {
+ app,
+ };
+}
diff --git a/src/manifest.json b/src/manifest.json
new file mode 100644
index 0000000..2e875be
--- /dev/null
+++ b/src/manifest.json
@@ -0,0 +1,72 @@
+{
+ "name" : "",
+ "appid" : "",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App鐗规湁鐩稿叧 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 妯″潡閰嶇疆 */
+ "modules" : {},
+ /* 搴旂敤鍙戝竷淇℃伅 */
+ "distribute" : {
+ /* android鎵撳寘閰嶇疆 */
+ "android" : {
+ "permissions" : [
+ "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+ "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+ "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+ "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+ "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+ "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+ "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+ "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+ "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+ "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+ "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+ "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+ "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+ "<uses-feature android:name=\"android.hardware.camera\"/>",
+ "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+ ]
+ },
+ /* ios鎵撳寘閰嶇疆 */
+ "ios" : {},
+ /* SDK閰嶇疆 */
+ "sdkConfigs" : {}
+ }
+ },
+ /* 蹇簲鐢ㄧ壒鏈夌浉鍏� */
+ "quickapp" : {},
+ /* 灏忕▼搴忕壒鏈夌浉鍏� */
+ "mp-weixin" : {
+ "appid" : "wxc52c6347b57afd4b",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion" : "3"
+}
diff --git a/src/pages.json b/src/pages.json
new file mode 100644
index 0000000..8c0e009
--- /dev/null
+++ b/src/pages.json
@@ -0,0 +1,46 @@
+{
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴"
+ }
+ },
+{
+ "path": "pages/plan/form",
+ "style": {
+ "navigationBarTitleText": "淇℃伅濉姤"
+ }
+ },
+ {
+ "path": "pages/login/login",
+ "style": {
+ "navigationBarTitleText": "鐧诲綍"
+ }
+ },
+ {
+ "path": "pages/register/register",
+ "style": {
+ "navigationBarTitleText": "娉ㄥ唽璐﹀彿"
+ }
+ },
+ {
+ "path": "pages/forgot/forgot",
+ "style": {
+ "navigationBarTitleText": "蹇樿瀵嗙爜"
+ }
+ },
+ {
+ "path": "pages/password/change",
+ "style": {
+ "navigationBarTitleText": "淇敼瀵嗙爜"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "white",
+ "navigationBarTitleText": "浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴",
+ "navigationBarBackgroundColor": "#1F4788",
+ "backgroundColor": "#EEF2F8"
+ }
+}
diff --git a/src/pages/forgot/forgot.vue b/src/pages/forgot/forgot.vue
new file mode 100644
index 0000000..0dab023
--- /dev/null
+++ b/src/pages/forgot/forgot.vue
@@ -0,0 +1,170 @@
+<template>
+ <view class="page">
+ <view class="brand">
+ <image class="brand-watermark" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <image class="brand-logo" src="/static/logo-head-white.png" mode="aspectFit" />
+ <view class="brand-title">蹇樿瀵嗙爜</view>
+ <view class="brand-sub">鐢ㄦ敞鍐屾椂濉啓鐨勨�滃鍙� + 濮撳悕 + 鎵嬫満鍙封�濊嚜鍔╅噸缃紱涓嶄竴鑷磋鑱旂郴鐝富浠�</view>
+ </view>
+
+ <view class="card">
+ <view class="field" :class="{ 'field-err': errors.studentNo }">
+ <text class="label">瀛﹀彿</text>
+ <input class="input" v-model="form.studentNo" placeholder="璇疯緭鍏ュ鍙�" placeholder-class="ph" @input="clearErr('studentNo')" />
+ <view v-if="errors.studentNo" class="err-text">{{ errors.studentNo }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.name }">
+ <text class="label">濮撳悕</text>
+ <input class="input" v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" placeholder-class="ph" @input="clearErr('name')" />
+ <view v-if="errors.name" class="err-text">{{ errors.name }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.phone }">
+ <text class="label">娉ㄥ唽鎵嬫満鍙�</text>
+ <input class="input" v-model="form.phone" type="number" maxlength="11" placeholder="娉ㄥ唽鏃跺~鍐欑殑鎵嬫満鍙�" placeholder-class="ph" @input="clearErr('phone')" />
+ <view v-if="errors.phone" class="err-text">{{ errors.phone }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.password }">
+ <text class="label">鏂板瘑鐮�</text>
+ <input class="input" v-model="form.password" type="password" placeholder="8-20浣嶏紝椤诲惈瀛楁瘝鍜屾暟瀛�" placeholder-class="ph" @input="clearErr('password')" />
+ <view v-if="errors.password" class="err-text">{{ errors.password }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.confirm }">
+ <text class="label">纭鏂板瘑鐮�</text>
+ <input class="input" v-model="form.confirm" type="password" placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜" placeholder-class="ph" @input="clearErr('confirm')" />
+ <view v-if="errors.confirm" class="err-text">{{ errors.confirm }}</view>
+ </view>
+
+ <view class="field" v-if="captchaEnabled" :class="{ 'field-err': errors.code }">
+ <text class="label">楠岃瘉鐮�</text>
+ <view class="captcha-row">
+ <input class="input captcha-input" v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" placeholder-class="ph" maxlength="6" @input="clearErr('code')" />
+ <image class="captcha-img" :src="captchaImg" mode="aspectFit" @click="loadCaptcha" />
+ </view>
+ <view v-if="errors.code" class="err-text">{{ errors.code }}</view>
+ </view>
+
+ <button class="btn btn-primary btn-block" :loading="submitting" :disabled="submitting" @click="doReset">
+ {{ submitting ? '鎻愪氦涓��' : '閲嶇疆瀵嗙爜' }}
+ </button>
+
+ <view class="links">
+ <text class="link" @click="go('/pages/login/login')">杩斿洖鐧诲綍</text>
+ </view>
+ <view class="tip">閲嶇疆鎴愬姛鍚庡師鐧诲綍鐘舵�佷細鍦ㄦ墍鏈夎澶囧け鏁堬紱10 鍒嗛挓鍐呮渶澶氬皾璇� 3 娆�</view>
+ </view>
+ </view>
+</template>
+
+<script>
+import { getCaptcha, accountReset } from '@/api/auth.js'
+import { clearToken } from '@/utils/request.js'
+
+export default {
+ data() {
+ return {
+ submitting: false,
+ form: { studentNo: '', name: '', phone: '', password: '', confirm: '', code: '', uuid: '' },
+ errors: {},
+ captchaEnabled: true,
+ captchaImg: '',
+ }
+ },
+ onLoad() { this.loadCaptcha() },
+ methods: {
+ async loadCaptcha() {
+ try {
+ const res = await getCaptcha()
+ this.captchaEnabled = res.captchaEnabled !== false
+ this.captchaImg = res.img ? 'data:image/jpg;base64,' + res.img : ''
+ this.form.uuid = res.uuid || ''
+ this.form.code = ''
+ } catch (e) { /* ignore */ }
+ },
+ clearErr(k) { if (this.errors[k]) delete this.errors[k] },
+ validate() {
+ const errs = {}
+ if (!this.form.studentNo.trim()) errs.studentNo = '璇疯緭鍏ュ鍙�'
+ if (!this.form.name.trim()) errs.name = '璇疯緭鍏ュ鍚�'
+ if (!/^1[3-9]\d{9}$/.test(this.form.phone)) errs.phone = '璇疯緭鍏�11浣嶆墜鏈哄彿'
+ const p = this.form.password
+ if (!p) errs.password = '璇疯緭鍏ユ柊瀵嗙爜'
+ else if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!@#$%^&*_.\-+=?]{8,20}$/.test(p)) errs.password = '8-20浣嶏紝椤诲悓鏃跺寘鍚瓧姣嶅拰鏁板瓧'
+ else if (p === this.form.studentNo.trim()) errs.password = '瀵嗙爜涓嶈兘涓庡鍙风浉鍚�'
+ if (this.form.confirm !== p) errs.confirm = '涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�'
+ if (this.captchaEnabled && !this.form.code.trim()) errs.code = '璇疯緭鍏ラ獙璇佺爜'
+ this.errors = errs
+ return !Object.keys(errs).length
+ },
+ async doReset() {
+ if (!this.validate()) return
+ this.submitting = true
+ try {
+ await accountReset({
+ studentNo: this.form.studentNo.trim(),
+ name: this.form.name.trim(),
+ phone: this.form.phone.trim(),
+ newPassword: this.form.password,
+ code: this.form.code.trim(),
+ uuid: this.form.uuid,
+ })
+ clearToken() // 鏃т細璇濆凡琚湇鍔$浣滃簾锛屾湰鍦� token 涓�骞舵竻鎺�
+ uni.showToast({ title: '閲嶇疆鎴愬姛锛岃鐧诲綍', icon: 'success' })
+ setTimeout(() => uni.redirectTo({ url: '/pages/login/login' }), 800)
+ } catch (e) {
+ if (this.captchaEnabled) this.loadCaptcha()
+ } finally {
+ this.submitting = false
+ }
+ },
+ go(url) { uni.navigateTo({ url }) },
+ },
+}
+</script>
+
+<style scoped>
+button { margin: 0; padding: 0; }
+button::after { border: none; }
+
+.page { min-height: 100vh; background: #EEF2F8; padding: 0 0 60rpx; box-sizing: border-box; }
+.brand {
+ position: relative;
+ padding: 48rpx 44rpx 96rpx;
+ overflow: hidden;
+ background:
+ radial-gradient(420rpx 260rpx at 88% -20%, rgba(120, 165, 225, 0.38), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 55%, #2a5aa8 100%);
+ border-radius: 0 0 30rpx 30rpx;
+}
+.brand-watermark { position: absolute; right: -36rpx; bottom: -60rpx; width: 280rpx; height: 280rpx; opacity: 0.12; }
+.brand-logo { width: 380rpx; height: 84rpx; display: block; }
+.brand-title { position: relative; margin-top: 26rpx; font-size: 40rpx; font-weight: 700; color: #fff; letter-spacing: 8rpx; }
+.brand-sub { position: relative; margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); line-height: 1.5; }
+
+.card { position: relative; z-index: 1; background: #fff; margin: -56rpx 24rpx 0; border-radius: 16rpx; padding: 40rpx 30rpx 44rpx; box-shadow: 0 12rpx 36rpx rgba(31, 71, 136, 0.12); }
+
+.field { margin-bottom: 28rpx; }
+.label { display: block; font-size: 27rpx; color: #303133; margin-bottom: 12rpx; }
+.field-err .label { color: #C03; }
+.input { height: 88rpx; line-height: 88rpx; background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 22rpx; font-size: 29rpx; color: #1F2D3D; }
+.input.err, .field-err .input { border-color: #E5484D; background: #FDF3F3; }
+.err-text { margin-top: 8rpx; color: #E5484D; font-size: 24rpx; }
+.ph { color: #C0C4CC; }
+
+.captcha-row { display: flex; align-items: center; }
+.captcha-input { flex: 1; }
+.captcha-img { width: 200rpx; height: 88rpx; margin-left: 20rpx; border: 1rpx solid #DCDFE6; border-radius: 8rpx; background: #F0F2F6; }
+
+.btn { height: 88rpx; line-height: 88rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 4rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-block { width: 100%; }
+.btn[disabled] { opacity: .6; }
+.btn-primary[disabled] { color: #fff; }
+
+.links { display: flex; justify-content: center; margin-top: 26rpx; }
+.link { color: #1F4788; font-size: 26rpx; }
+.tip { margin-top: 20rpx; text-align: center; font-size: 23rpx; color: #B4BAC6; }
+</style>
diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue
new file mode 100644
index 0000000..f74c8b9
--- /dev/null
+++ b/src/pages/index/index.vue
@@ -0,0 +1,259 @@
+<template>
+ <view class="page">
+ <!-- 鏈櫥褰� -->
+ <view v-if="!loading && !student">
+ <view class="brand">
+ <image class="brand-watermark" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <image class="brand-logo" src="/static/logo-head-white.png" mode="aspectFit" />
+ <view class="brand-title">{{ titles.platformTitle }}</view>
+ <view class="brand-sub">{{ titles.platformSubtitle }}</view>
+ </view>
+ <view class="login-card">
+ <button class="btn btn-primary btn-block" @click="goLogin">鐧诲綍骞跺~鎶�</button>
+ <view class="login-links">
+ <text class="link" @click="goRegister">娉ㄥ唽璐﹀彿</text>
+ </view>
+ <view class="login-tip">鎺ㄨ崘鎵彮涓讳换鍙戠殑鐝骇浜岀淮鐮佹敞鍐岋紙鑷姩甯﹀叆鐝骇锛夛紱鏃犱簩缁寸爜涔熷彲娉ㄥ唽鏃舵墜鍔ㄩ�夌彮</view>
+ </view>
+ </view>
+
+ <!-- 宸茬櫥褰� -->
+ <block v-else-if="student">
+ <!-- 璐﹀彿寮曞鏉� -->
+ <view v-if="!student.hasPassword" class="notice" @click="goRegister">
+ 璐﹀彿瀹夊叏锛氫綘杩樻湭璁剧疆鐧诲綍瀵嗙爜锛岀偣鍑昏缃� 鈫�
+ </view>
+ <view v-else-if="student.mustChangePwd" class="notice notice-warn" @click="goChangePwd">
+ 瀵嗙爜宸茶绠$悊鍛橀噸缃紝璇风珛鍗充慨鏀逛负浣犺嚜宸辩殑瀵嗙爜 鈫�
+ </view>
+
+ <view class="profile">
+ <image class="profile-badge" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <view class="profile-main">
+ <view class="profile-name">{{ student.name }}
+ <text class="profile-no">{{ student.studentNo }}</text>
+ </view>
+ <view class="profile-org">{{ student.collegeName }} 路 {{ student.className }}</view>
+ </view>
+ <view class="profile-ops">
+ <view class="p-link" @click="goChangePwd">淇敼瀵嗙爜</view>
+ <view class="p-link p-link-plain" @click="doLogout">閫�鍑虹櫥褰�</view>
+ </view>
+ </view>
+
+ <view class="section">
+ <view class="section-title">鎴戠殑濉姤浠诲姟</view>
+
+ <view v-if="loadingTasks" class="state">鍔犺浇涓��</view>
+ <view v-else-if="!tasks.length" class="state">
+ <text>鏆傛棤鍙~鎶ョ殑浠诲姟</text>
+ <text class="state-sub">璇峰叧娉ㄥ鏍″彂甯冪殑濉姤閫氱煡</text>
+ </view>
+ <view v-else class="task-list">
+ <view class="task" v-for="t in tasks" :key="t.taskId" @click="openTask(t)">
+ <view class="task-top">
+ <text class="task-name">{{ t.taskName }}</text>
+ <text class="task-status" :class="statusClass(t)">{{ statusText(t) }}</text>
+ </view>
+ <view class="task-meta">濉姤鏃堕棿锛歿{ t.fillStartDate }} ~ {{ t.fillEndDate }}</view>
+ <view class="task-meta" v-if="t.recordStatus === '1'">鎻愪氦鏃堕棿锛歿{ t.submitTime }}</view>
+ <view class="task-op">{{ opText(t) }}</view>
+ </view>
+ </view>
+ </view>
+
+ <view class="footer">濡傛湁闂璇疯仈绯荤彮绾х鐞嗕汉</view>
+ </block>
+ <view v-else class="state">鍔犺浇涓��</view>
+ </view>
+</template>
+
+<script>
+import { getStudentInfo, resolveBind, accountRebind } from '@/api/auth.js'
+import { getTasks } from '@/api/task.js'
+import { clearToken } from '@/utils/request.js'
+import { getTitles, DEFAULT_TITLES } from '@/utils/site.js'
+
+const BIND_CODE_KEY = '***'
+
+export default {
+ data() {
+ return { loading: true, student: null, tasks: [], loadingTasks: false, rebinding: false, titles: DEFAULT_TITLES }
+ },
+ // 鐝骇浜岀淮鐮� URL锛�/#/?c=娉ㄥ唽鐮� 鈥斺�� 鎹曡幏鍚庯細鏈櫥褰曗啋娉ㄥ唽鐢紱宸茬櫥褰曗啋鎹㈢彮纭
+ onLoad(options) {
+ const c = options && options.c
+ if (c) uni.setStorageSync(BIND_CODE_KEY, String(c).trim())
+ this.loadTitles()
+ },
+ onShow() { this.checkLogin() },
+ methods: {
+ async loadTitles() {
+ this.titles = await getTitles()
+ },
+ async checkLogin() {
+ this.loading = true
+ const token = uni.getStorageSync('cj_student_token')
+ if (token) {
+ try {
+ const res = await getStudentInfo()
+ this.student = res.data
+ this.loadTasks()
+ this.maybeRebind()
+ } catch (e) { this.student = null }
+ }
+ this.loading = false
+ },
+ /** 宸茬櫥褰曞鐢熸壂浜嗘柊鐝骇鐮� 鈫� 鎹㈢彮纭锛堝凡鎻愪氦琛ㄥ崟淇濈暀鍘熺彮绾у綊灞烇級 */
+ async maybeRebind() {
+ const code = uni.getStorageSync(BIND_CODE_KEY)
+ if (!code || !this.student || this.rebinding) return
+ this.rebinding = true
+ try {
+ const r = await resolveBind(code)
+ const cls = r.data || {}
+ if (cls.className && cls.className !== this.student.className) {
+ uni.showModal({
+ title: '鐢宠鎹㈢彮',
+ content: `浣犲綋鍓嶅湪"${this.student.className}"锛屾壂鐮佺彮绾т负"${cls.collegeName || ''} ${cls.majorName || ''} ${cls.className}"銆傜‘璁ゆ崲鐝紵锛堟鍓嶅凡鎻愪氦鐨勮〃鍗曚粛褰掑睘鍘熺彮绾э級`,
+ confirmText: '纭鎹㈢彮',
+ cancelText: '鐣欏湪鍘熺彮',
+ success: async (m) => {
+ if (m.confirm) {
+ try {
+ await accountRebind(code)
+ uni.showToast({ title: '鎹㈢彮鎴愬姛', icon: 'success' })
+ this.checkLogin()
+ } catch (e) { /* request.js 宸插脊閿� */ }
+ }
+ },
+ })
+ }
+ } catch (e) { /* 鐮佹棤鏁堝垯蹇界暐 */ }
+ uni.removeStorageSync(BIND_CODE_KEY)
+ this.rebinding = false
+ },
+ async loadTasks() {
+ this.loadingTasks = true
+ try {
+ const res = await getTasks()
+ this.tasks = (res.data && res.data.tasks) || []
+ } catch (e) { this.tasks = [] }
+ this.loadingTasks = false
+ },
+ goLogin() { uni.navigateTo({ url: '/pages/login/login' }) },
+ goRegister() { uni.navigateTo({ url: '/pages/register/register' }) },
+ goChangePwd() { uni.navigateTo({ url: '/pages/password/change' }) },
+ openTask(t) { uni.navigateTo({ url: '/pages/plan/form?taskId=' + t.taskId }) },
+ doLogout() {
+ clearToken()
+ // 鍏煎娓呯悊鏃х増 H5 鈥滃亣璁惧鐮佲�濈紦瀛橈紙璇ユ満鍒跺凡涓嬬嚎锛�
+ uni.removeStorageSync('cj_h5_dev_code')
+ this.student = null
+ this.tasks = []
+ uni.reLaunch({ url: '/pages/login/login' })
+ },
+ statusText(t) {
+ if (t.recordStatus === '1') return '宸叉彁浜�'
+ if (t.recordStatus === '0') return '鑽夌'
+ return t.open ? '寰呭~鍐�' : '鏈紑鏀�'
+ },
+ statusClass(t) {
+ if (t.recordStatus === '1') return 'st-ok'
+ if (t.recordStatus === '0') return 'st-draft'
+ return t.open ? 'st-todo' : 'st-off'
+ },
+ opText(t) {
+ if (t.recordStatus === '1') return '鏌ョ湅濉姤鍐呭'
+ if (t.recordStatus === '0') return '缁х画濉啓'
+ return '绔嬪嵆濉啓'
+ },
+ },
+}
+</script>
+
+<style scoped>
+/* 鎸夐挳榛樿鏍峰紡鏀舵暃锛岄伩鍏嶈竟妗�/闂磋窛寮傚父 */
+button { margin: 0; padding: 0; background: none; }
+button::after { border: none; }
+.btn { height: 92rpx; line-height: 92rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 4rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-block { width: 100%; }
+.btn[disabled] { opacity: .6; color: #fff; }
+
+.page { min-height: 100vh; background: #EEF2F8; padding: 0 0 60rpx; box-sizing: border-box; }
+
+/* 鍝佺墝澶村箙 */
+.brand {
+ position: relative;
+ padding: 56rpx 44rpx 110rpx;
+ overflow: hidden;
+ background:
+ radial-gradient(420rpx 260rpx at 88% -20%, rgba(120, 165, 225, 0.38), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 55%, #2a5aa8 100%);
+ border-radius: 0 0 30rpx 30rpx;
+}
+.brand-watermark { position: absolute; right: -36rpx; bottom: -60rpx; width: 300rpx; height: 300rpx; opacity: 0.12; }
+.brand-logo { width: 380rpx; height: 84rpx; display: block; }
+.brand-title { position: relative; margin-top: 26rpx; font-size: 38rpx; font-weight: 700; color: #fff; letter-spacing: 4rpx; }
+.brand-sub { position: relative; margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); line-height: 1.5; }
+
+/* 鏈櫥褰曞崱鐗� */
+.login-card {
+ position: relative;
+ z-index: 1;
+ background: #fff;
+ margin: -64rpx 24rpx 0;
+ border-radius: 16rpx;
+ padding: 44rpx 34rpx;
+ box-shadow: 0 12rpx 36rpx rgba(31, 71, 136, 0.12);
+}
+.login-links { margin-top: 30rpx; display: flex; justify-content: center; gap: 60rpx; }
+.login-tip { margin-top: 24rpx; font-size: 24rpx; color: #B4BAC6; text-align: center; line-height: 1.5; }
+
+/* 璐﹀彿寮曞鏉� */
+.notice { background: #E8EFF9; color: #1F4788; border: 1rpx solid #D5E2F5; border-radius: 12rpx; padding: 20rpx 24rpx; font-size: 25rpx; margin: 24rpx 24rpx 0; }
+.notice-warn { background: #FBF4E2; color: #B36A00; border-color: #F2E2BC; }
+
+/* 涓汉鏉★紙娣辫摑鍝佺墝鍗★級 */
+.profile {
+ margin: 24rpx 24rpx 0;
+ background:
+ radial-gradient(320rpx 200rpx at 92% -30%, rgba(120, 165, 225, 0.4), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 60%, #2a5aa8 100%);
+ border-radius: 16rpx;
+ padding: 30rpx 28rpx;
+ display: flex;
+ align-items: center;
+ box-shadow: 0 10rpx 30rpx rgba(31, 71, 136, 0.25);
+}
+.profile-badge { width: 88rpx; height: 88rpx; border-radius: 50%; background: rgba(255, 255, 255, 0.14); padding: 12rpx; flex-shrink: 0; box-sizing: content-box; }
+.profile-main { flex: 1; margin-left: 24rpx; min-width: 0; }
+.profile-name { font-size: 32rpx; font-weight: 600; color: #fff; }
+.profile-no { margin-left: 16rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); font-weight: 400; }
+.profile-org { margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); }
+.profile-ops { display: flex; flex-direction: column; align-items: flex-end; gap: 14rpx; flex-shrink: 0; }
+.p-link { color: #fff; font-size: 24rpx; padding: 8rpx 22rpx; border: 1rpx solid rgba(255, 255, 255, 0.55); border-radius: 999rpx; }
+.p-link-plain { color: rgba(255, 255, 255, 0.78); border-color: rgba(255, 255, 255, 0.3); }
+.link { color: #1F4788; font-size: 26rpx; }
+.link-plain { color: #7C8698; }
+
+/* 鍒楄〃 */
+.section { margin: 28rpx 24rpx 0; }
+.section-title { font-size: 30rpx; font-weight: 600; color: #1F2D3D; padding: 0 4rpx 14rpx; position: relative; padding-left: 20rpx; }
+.section-title::before { content: ''; position: absolute; left: 0; top: 8rpx; bottom: 22rpx; width: 8rpx; border-radius: 4rpx; background: linear-gradient(#1F4788, #2a5aa8); }
+.state { background: #fff; border-radius: 12rpx; padding: 90rpx 0; text-align: center; color: #8A94A6; font-size: 27rpx; border: 1rpx solid #EBEDF1; }
+.state-sub { display: block; margin-top: 10rpx; font-size: 24rpx; color: #B4BAC6; }
+.task { background: #fff; border: 1rpx solid #EBEDF1; border-radius: 16rpx; padding: 26rpx 26rpx; margin-bottom: 18rpx; box-shadow: 0 4rpx 14rpx rgba(31, 71, 136, 0.05); }
+.task:active { background: #F7F9FC; }
+.task-top { display: flex; justify-content: space-between; align-items: flex-start; }
+.task-name { flex: 1; font-size: 29rpx; font-weight: 600; color: #1F2D3D; line-height: 1.4; }
+.task-status { margin-left: 16rpx; font-size: 22rpx; padding: 2rpx 12rpx; border-radius: 6rpx; flex-shrink: 0; }
+.st-ok { color: #1D9D5F; background: #EAF7F0; }
+.st-draft { color: #B36A00; background: #FBF4E2; }
+.st-todo { color: #1F4788; background: #E8EFF9; }
+.st-off { color: #7C8698; background: #F0F2F6; }
+.task-meta { margin-top: 12rpx; font-size: 24rpx; color: #7C8698; }
+.task-op { margin-top: 16rpx; padding-top: 14rpx; border-top: 1rpx solid #F2F3F6; color: #1F4788; font-weight: 600; font-size: 27rpx; }
+.footer { text-align: center; margin-top: 36rpx; font-size: 22rpx; color: #B4BAC6; }
+</style>
diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue
new file mode 100644
index 0000000..d7a529a
--- /dev/null
+++ b/src/pages/login/login.vue
@@ -0,0 +1,166 @@
+<template>
+ <view class="page">
+ <view class="brand">
+ <image class="brand-watermark" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <image class="brand-logo" src="/static/logo-head-white.png" mode="aspectFit" />
+ <view class="brand-title">鐧� 褰�</view>
+ <view class="brand-sub">{{ titles.loginSubtitle }}</view>
+ </view>
+
+ <view class="card">
+ <view class="field" :class="{ 'field-err': errors.studentNo }">
+ <text class="label">瀛﹀彿</text>
+ <input class="input" v-model="form.studentNo" placeholder="璇疯緭鍏ュ鍙�" placeholder-class="ph" @input="clearErr('studentNo')" />
+ <view v-if="errors.studentNo" class="err-text">{{ errors.studentNo }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.name }">
+ <text class="label">濮撳悕</text>
+ <input class="input" v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" placeholder-class="ph" @input="clearErr('name')" />
+ <view v-if="errors.name" class="err-text">{{ errors.name }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.password }">
+ <text class="label">瀵嗙爜</text>
+ <input class="input" v-model="form.password" type="password" placeholder="璇疯緭鍏ュ瘑鐮�" placeholder-class="ph" @input="clearErr('password')" />
+ <view v-if="errors.password" class="err-text">{{ errors.password }}</view>
+ </view>
+
+ <view class="field" v-if="captchaEnabled" :class="{ 'field-err': errors.code }">
+ <text class="label">楠岃瘉鐮�</text>
+ <view class="captcha-row">
+ <input class="input captcha-input" v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" placeholder-class="ph" maxlength="6" @input="clearErr('code')" />
+ <image class="captcha-img" :src="captchaImg" mode="aspectFit" @click="loadCaptcha" />
+ </view>
+ <view v-if="errors.code" class="err-text">{{ errors.code }}</view>
+ </view>
+
+ <button class="btn btn-primary btn-block" :loading="submitting" :disabled="submitting" @click="doLogin">
+ {{ submitting ? '鐧诲綍涓��' : '鐧� 褰�' }}
+ </button>
+
+ <view class="links">
+ <text class="link" @click="go('/pages/register/register')">娉ㄥ唽璐﹀彿</text>
+ <text class="link" @click="go('/pages/forgot/forgot')">蹇樿瀵嗙爜锛�</text>
+ </view>
+ <view class="tip">棣栨浣跨敤璇锋壂鎻忕彮涓讳换鍙戠殑鐝骇浜岀淮鐮佹敞鍐�</view>
+ </view>
+ </view>
+</template>
+
+<script>
+import { getCaptcha, accountLogin } from '@/api/auth.js'
+import { setToken } from '@/utils/request.js'
+import { getTitles, DEFAULT_TITLES } from '@/utils/site.js'
+
+export default {
+ data() {
+ return {
+ submitting: false,
+ form: { studentNo: '', name: '', password: '', code: '', uuid: '' },
+ errors: {},
+ captchaEnabled: true,
+ captchaImg: '',
+ titles: DEFAULT_TITLES,
+ }
+ },
+ onLoad() {
+ this.loadCaptcha()
+ this.loadTitles()
+ },
+ methods: {
+ async loadTitles() {
+ this.titles = await getTitles()
+ },
+ async loadCaptcha() {
+ try {
+ const res = await getCaptcha()
+ this.captchaEnabled = res.captchaEnabled !== false
+ this.captchaImg = res.img ? 'data:image/jpg;base64,' + res.img : ''
+ this.form.uuid = res.uuid || ''
+ this.form.code = ''
+ } catch (e) { /* request.js 宸插脊 toast */ }
+ },
+ clearErr(k) { if (this.errors[k]) delete this.errors[k] },
+ validate() {
+ const errs = {}
+ if (!this.form.studentNo.trim()) errs.studentNo = '璇疯緭鍏ュ鍙�'
+ if (!this.form.name.trim()) errs.name = '璇疯緭鍏ュ鍚�'
+ if (!this.form.password) errs.password = '璇疯緭鍏ュ瘑鐮�'
+ if (this.captchaEnabled && !this.form.code.trim()) errs.code = '璇疯緭鍏ラ獙璇佺爜'
+ this.errors = errs
+ return !Object.keys(errs).length
+ },
+ async doLogin() {
+ if (!this.validate()) return
+ this.submitting = true
+ try {
+ const res = await accountLogin({
+ studentNo: this.form.studentNo.trim(),
+ name: this.form.name.trim(),
+ password: this.form.password,
+ code: this.form.code.trim(),
+ uuid: this.form.uuid,
+ })
+ setToken(res.data.token)
+ if (res.data.mustChange) {
+ uni.showToast({ title: '绠$悊鍛樺凡閲嶇疆浣犵殑瀵嗙爜锛岃淇敼', icon: 'none', duration: 2000 })
+ setTimeout(() => uni.redirectTo({ url: '/pages/password/change' }), 800)
+ } else {
+ uni.showToast({ title: '鐧诲綍鎴愬姛', icon: 'success' })
+ setTimeout(() => uni.reLaunch({ url: '/pages/index/index' }), 500)
+ }
+ } catch (e) {
+ if (this.captchaEnabled) this.loadCaptcha() // 楠岃瘉鐮佷竴娆℃�э紝澶辫触鍚庡埛鏂�
+ } finally {
+ this.submitting = false
+ }
+ },
+ go(url) { uni.navigateTo({ url }) },
+ },
+}
+</script>
+
+<style scoped>
+button { margin: 0; padding: 0; }
+button::after { border: none; }
+
+.page { min-height: 100vh; background: #EEF2F8; padding: 0 0 60rpx; box-sizing: border-box; }
+.brand {
+ position: relative;
+ padding: 48rpx 44rpx 96rpx;
+ overflow: hidden;
+ background:
+ radial-gradient(420rpx 260rpx at 88% -20%, rgba(120, 165, 225, 0.38), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 55%, #2a5aa8 100%);
+ border-radius: 0 0 30rpx 30rpx;
+}
+.brand-watermark { position: absolute; right: -36rpx; bottom: -60rpx; width: 280rpx; height: 280rpx; opacity: 0.12; }
+.brand-logo { width: 380rpx; height: 84rpx; display: block; }
+.brand-title { position: relative; margin-top: 26rpx; font-size: 40rpx; font-weight: 700; color: #fff; letter-spacing: 10rpx; }
+.brand-sub { position: relative; margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); letter-spacing: 2rpx; }
+
+.card { position: relative; z-index: 1; background: #fff; margin: -56rpx 24rpx 0; border-radius: 16rpx; padding: 40rpx 30rpx 44rpx; box-shadow: 0 12rpx 36rpx rgba(31, 71, 136, 0.12); }
+
+.field { margin-bottom: 28rpx; }
+.label { display: block; font-size: 27rpx; color: #303133; margin-bottom: 12rpx; }
+.field-err .label { color: #C03; }
+.input { height: 88rpx; line-height: 88rpx; background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 22rpx; font-size: 29rpx; color: #1F2D3D; }
+.input.err, .field-err .input { border-color: #E5484D; background: #FDF3F3; }
+.err-text { margin-top: 8rpx; color: #E5484D; font-size: 24rpx; }
+.ph { color: #C0C4CC; }
+
+.captcha-row { display: flex; align-items: center; }
+.captcha-input { flex: 1; }
+.captcha-img { width: 200rpx; height: 88rpx; margin-left: 20rpx; border: 1rpx solid #DCDFE6; border-radius: 8rpx; background: #F0F2F6; }
+
+.btn { height: 88rpx; line-height: 88rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 6rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-block { width: 100%; }
+.btn[disabled] { opacity: .6; }
+.btn-primary[disabled] { color: #fff; }
+
+.links { display: flex; justify-content: space-between; margin-top: 26rpx; }
+.link { color: #1F4788; font-size: 26rpx; }
+.tip { margin-top: 20rpx; text-align: center; font-size: 23rpx; color: #B4BAC6; }
+</style>
diff --git a/src/pages/password/change.vue b/src/pages/password/change.vue
new file mode 100644
index 0000000..2f21366
--- /dev/null
+++ b/src/pages/password/change.vue
@@ -0,0 +1,108 @@
+<template>
+ <view class="page">
+ <view class="brand">
+ <image class="brand-watermark" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <image class="brand-logo" src="/static/logo-head-white.png" mode="aspectFit" />
+ <view class="brand-title">淇敼瀵嗙爜</view>
+ <view class="brand-sub">淇敼鎴愬姛鍚庯紝鍏朵粬璁惧涓婄殑鐧诲綍浼氳閫�鍑�</view>
+ </view>
+
+ <view class="card">
+ <view class="field" :class="{ 'field-err': errors.old }">
+ <text class="label">鍘熷瘑鐮�</text>
+ <input class="input" v-model="form.old" type="password" placeholder="璇疯緭鍏ュ綋鍓嶅瘑鐮�" placeholder-class="ph" @input="clearErr('old')" />
+ <view v-if="errors.old" class="err-text">{{ errors.old }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.password }">
+ <text class="label">鏂板瘑鐮�</text>
+ <input class="input" v-model="form.password" type="password" placeholder="8-20浣嶏紝椤诲惈瀛楁瘝鍜屾暟瀛�" placeholder-class="ph" @input="clearErr('password')" />
+ <view v-if="errors.password" class="err-text">{{ errors.password }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.confirm }">
+ <text class="label">纭鏂板瘑鐮�</text>
+ <input class="input" v-model="form.confirm" type="password" placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜" placeholder-class="ph" @input="clearErr('confirm')" />
+ <view v-if="errors.confirm" class="err-text">{{ errors.confirm }}</view>
+ </view>
+
+ <button class="btn btn-primary btn-block" :loading="submitting" :disabled="submitting" @click="doChange">
+ {{ submitting ? '鎻愪氦涓��' : '纭淇敼' }}
+ </button>
+ <view class="tip">蹇樿鍘熷瘑鐮侊紵鍙��鍑哄悗鍦ㄧ櫥褰曢〉鐢ㄢ�滃繕璁板瘑鐮佲�濊嚜鍔╅噸缃�</view>
+ </view>
+ </view>
+</template>
+
+<script>
+import { accountChange } from '@/api/auth.js'
+import { setToken } from '@/utils/request.js'
+
+export default {
+ data() {
+ return { submitting: false, form: { old: '', password: '', confirm: '' }, errors: {} }
+ },
+ methods: {
+ clearErr(k) { if (this.errors[k]) delete this.errors[k] },
+ validate() {
+ const errs = {}
+ if (!this.form.old) errs.old = '璇疯緭鍏ュ師瀵嗙爜'
+ const p = this.form.password
+ if (!p) errs.password = '璇疯緭鍏ユ柊瀵嗙爜'
+ else if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!@#$%^&*_.\-+=?]{8,20}$/.test(p)) errs.password = '8-20浣嶏紝椤诲悓鏃跺寘鍚瓧姣嶅拰鏁板瓧'
+ else if (p === this.form.old) errs.password = '鏂板瘑鐮佷笉鑳戒笌鍘熷瘑鐮佺浉鍚�'
+ if (this.form.confirm !== p) errs.confirm = '涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�'
+ this.errors = errs
+ return !Object.keys(errs).length
+ },
+ async doChange() {
+ if (!this.validate()) return
+ this.submitting = true
+ try {
+ const res = await accountChange({ oldPassword: this.form.old, newPassword: this.form.password })
+ if (res.data && res.data.token) setToken(res.data.token) // 褰撳墠璁惧淇濇寔鐧诲綍锛堟崲鍙戞柊 token锛�
+ uni.showToast({ title: '瀵嗙爜淇敼鎴愬姛', icon: 'success' })
+ setTimeout(() => uni.reLaunch({ url: '/pages/index/index' }), 700)
+ } catch (e) { /* request.js 宸插脊 toast */ }
+ this.submitting = false
+ },
+ },
+}
+</script>
+
+<style scoped>
+button { margin: 0; padding: 0; }
+button::after { border: none; }
+
+.page { min-height: 100vh; background: #EEF2F8; padding: 0 0 60rpx; box-sizing: border-box; }
+.brand {
+ position: relative;
+ padding: 48rpx 44rpx 96rpx;
+ overflow: hidden;
+ background:
+ radial-gradient(420rpx 260rpx at 88% -20%, rgba(120, 165, 225, 0.38), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 55%, #2a5aa8 100%);
+ border-radius: 0 0 30rpx 30rpx;
+}
+.brand-watermark { position: absolute; right: -36rpx; bottom: -60rpx; width: 280rpx; height: 280rpx; opacity: 0.12; }
+.brand-logo { width: 380rpx; height: 84rpx; display: block; }
+.brand-title { position: relative; margin-top: 26rpx; font-size: 40rpx; font-weight: 700; color: #fff; letter-spacing: 8rpx; }
+.brand-sub { position: relative; margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); line-height: 1.5; }
+
+.card { position: relative; z-index: 1; background: #fff; margin: -56rpx 24rpx 0; border-radius: 16rpx; padding: 40rpx 30rpx 44rpx; box-shadow: 0 12rpx 36rpx rgba(31, 71, 136, 0.12); }
+
+.field { margin-bottom: 28rpx; }
+.label { display: block; font-size: 27rpx; color: #303133; margin-bottom: 12rpx; }
+.field-err .label { color: #C03; }
+.input { height: 88rpx; line-height: 88rpx; background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 22rpx; font-size: 29rpx; color: #1F2D3D; }
+.input.err, .field-err .input { border-color: #E5484D; background: #FDF3F3; }
+.err-text { margin-top: 8rpx; color: #E5484D; font-size: 24rpx; }
+.ph { color: #C0C4CC; }
+
+.btn { height: 88rpx; line-height: 88rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 4rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-block { width: 100%; }
+.btn[disabled] { opacity: .6; }
+.btn-primary[disabled] { color: #fff; }
+.tip { margin-top: 26rpx; text-align: center; font-size: 23rpx; color: #B4BAC6; }
+</style>
diff --git a/src/pages/plan/form.vue b/src/pages/plan/form.vue
new file mode 100644
index 0000000..95d932e
--- /dev/null
+++ b/src/pages/plan/form.vue
@@ -0,0 +1,597 @@
+<template>
+ <view class="form-page">
+ <view v-if="loading" class="state">鍔犺浇涓��</view>
+
+ <!-- 鏈粦瀹�/涓嶅湪濉姤鑼冨洿锛氫笉灞曠ず琛ㄥ崟 -->
+ <view v-else-if="errorMsg" class="err-state">
+ <view class="err-icon">!</view>
+ <view class="err-title">鏆傛椂鏃犳硶濉姤</view>
+ <view class="err-msg">{{ errorMsg }}</view>
+ <button class="btn btn-primary err-btn" @click="goHome">鍘诲畬鎴愯韩浠界粦瀹� / 杩斿洖棣栭〉</button>
+ </view>
+
+ <block v-else>
+ <!-- 浠诲姟淇℃伅鏉� -->
+ <view class="task-head">
+ <view class="th-top">
+ <text class="th-title">{{ meta.taskName || '淇℃伅濉姤' }}</text>
+ <text class="th-tag" :class="meta.readonly ? 'ok' : (meta.recordStatus === '0' ? 'draft' : 'todo')">{{ statusText() }}</text>
+ </view>
+ <view class="th-meta">{{ meta.termText }}</view>
+ <view class="th-meta">濉姤鏃堕棿锛歿{ meta.fillStartDate }} ~ {{ meta.fillEndDate }}</view>
+ <view v-if="meta.readonly" class="th-note">宸叉寮忔彁浜わ紝鍐呭鍙锛涘闇�淇敼璇疯仈绯荤彮绾х鐞嗕汉閫�鍥炪��</view>
+ </view>
+
+ <!-- 鏍¢獙閿欒姹囨�� -->
+ <view v-if="Object.keys(errors).length && !meta.readonly" class="err-banner">
+ 杩樻湁 {{ Object.keys(errors).length }} 椤瑰~鍐欐湁璇紝璇锋寜绾㈣壊鎻愮ず淇敼鍚庢彁浜�
+ </view>
+
+ <!-- 鍒嗙粍琛ㄥ崟 -->
+ <view class="group" v-for="(g, gi) in groups" :key="gi">
+ <view class="group-title">{{ groupNo(gi) }}銆�{{ g.groupName }}</view>
+
+ <view class="field" v-for="f in g.fields" :key="f.code" :class="{ 'field-err': errors[f.code] }">
+ <view class="f-label"><text v-if="needReq(f)" class="req">*</text>{{ f.label }}</view>
+
+ <block v-if="isReadonly(f)">
+ <view class="f-ro" v-if="form[f.code] !== undefined && form[f.code] !== ''">{{ form[f.code] }}</view>
+ <view class="f-ro faint" v-else>{{ autoHint(f) }}</view>
+ </block>
+ <block v-else>
+ <!-- 涓嬫媺 -->
+ <picker v-if="f.type === 'select' && optLabels(f).length" :range="optLabels(f)" :value="curIndex(f)" @change="e => onSelect(f, e)">
+ <view class="f-ctrl" :class="{ err: errors[f.code] }">
+ <text :class="form[f.code] ? 'on' : 'off'">{{ curLabel(f) }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ <!-- 鍗曢�� -->
+ <view v-else-if="f.type === 'radio' && optLabels(f).length" class="f-radios" :class="{ err: errors[f.code] }">
+ <view v-for="o in f.options" :key="o.value" class="f-radio" :class="{ on: String(form[f.code]) === String(o.value) }" @click="pickRadio(f, o)">{{ o.label }}</view>
+ </view>
+ <!-- 鏃ユ湡 -->
+ <picker v-else-if="f.type === 'date'" mode="date" :value="form[f.code] || ''" @change="e => { form[f.code] = e.detail.value; clearErr(f.code) }">
+ <view class="f-ctrl" :class="{ err: errors[f.code] }">
+ <text :class="form[f.code] ? 'on' : 'off'">{{ form[f.code] || '璇烽�夋嫨鏃ユ湡' }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ <!-- 鐪佷唤 -->
+ <picker v-else-if="f.type === 'province'" :range="provinceNames" :value="provinceIndex(f)" @change="e => onProvinceChange(f, e)">
+ <view class="f-ctrl" :class="{ err: errors[f.code] }">
+ <text :class="form[f.code] ? 'on' : 'off'">{{ form[f.code] || '璇烽�夋嫨鐪佷唤' }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ <!-- 鍩庡競锛氶殢鐪佷唤浜岀骇鑱斿姩锛屾湭閫夌渷浠藉墠涓嶅彲鐐� -->
+ <picker v-else-if="f.type === 'city'" :range="cityList(f)" :value="cityIndex(f)"
+ :disabled="!cityList(f).length" @change="e => onCityChange(f, e)">
+ <view class="f-ctrl" :class="{ err: errors[f.code], off: !cityList(f).length }">
+ <text :class="form[f.code] ? 'on' : 'off'">{{ form[f.code] || (cityList(f).length ? '璇烽�夋嫨鍩庡競' : '璇峰厛閫夋嫨鐪佷唤') }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ <!-- 鍦板尯锛氫竴涓瓧娈甸噷杩炵潃閫夌渷鍜屽競锛屽悎骞跺瓨涓恒�岀渷/甯傘�� -->
+ <view v-else-if="f.type === 'region'" class="f-region">
+ <picker class="f-region-p" :range="provinceNames" :value="regionProvinceIndex(f)" @change="e => onRegionProvince(f, e)">
+ <view class="f-ctrl" :class="{ err: errors[f.code] }">
+ <text :class="regionProvince(f) ? 'on' : 'off'">{{ regionProvince(f) || '璇烽�夋嫨鐪佷唤' }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ <picker class="f-region-p" :range="regionCityList(f)" :value="regionCityIndex(f)" :disabled="!regionCityList(f).length"
+ @change="e => onRegionCity(f, e)">
+ <view class="f-ctrl" :class="{ err: errors[f.code], off: !regionCityList(f).length }">
+ <text :class="regionCity(f) ? 'on' : 'off'">{{ regionCity(f) || (regionCityList(f).length ? '璇烽�夋嫨鍩庡競' : '璇峰厛閫夋嫨鐪佷唤') }}</text>
+ <text class="caret">鈻�</text>
+ </view>
+ </picker>
+ </view>
+ <!-- 鏂囦欢涓婁紶锛堝浘鐗�/PDF/Office 鏉愭枡缁熶竴鍏ュ彛锛� -->
+ <view v-else-if="f.type === 'file'" class="f-files">
+ <view class="f-up-grid" v-if="imgList(f).length">
+ <view class="f-up-cell" v-for="(p, i) in imgList(f)" :key="'i' + i">
+ <image class="f-up-img" :src="fullUrl(p)" mode="aspectFill" @click="previewImg(f, i)" />
+ <view v-if="!meta.readonly" class="f-up-del" @click.stop="removeFileByPath(f, p)">脳</view>
+ </view>
+ </view>
+ <view class="f-file-row" v-for="(p, i) in docList(f)" :key="'d' + i">
+ <text class="f-file-name" @click="openFile(p)">{{ fileNameOf(p) }}</text>
+ <text v-if="!meta.readonly" class="f-file-del" @click="removeFileByPath(f, p)">鍒犻櫎</text>
+ </view>
+ <view v-if="!meta.readonly && fileList(f).length < maxCount(f)" class="f-file-add" :class="{ err: errors[f.code] }" @click="chooseFiles(f)">
+ 锛� 涓婁紶鏂囦欢锛坽{ fileList(f).length }}/{{ maxCount(f) }}锛屽崟涓墹{{ MAX_UPLOAD_MB }}M锛�
+ </view>
+ </view>
+ <!-- 澶氳 -->
+ <textarea v-else-if="f.type === 'textarea'" v-model="form[f.code]" :placeholder="f.placeholder || '璇疯緭鍏�'" :maxlength="f.maxLen || 500" class="f-area" :class="{ err: errors[f.code] }" auto-height @input="clearErr(f.code)" />
+ <!-- 鏂囨湰/鏁板瓧/鐢佃瘽/淇$敤浠g爜 -->
+ <input v-else class="f-input" :class="{ err: errors[f.code] }" :type="f.type === 'number' ? 'number' : 'text'"
+ v-model="form[f.code]" :placeholder="f.placeholder || '璇疯緭鍏�'" :maxlength="f.maxLen || 200"
+ @input="e => onInput(e, f)" />
+ </block>
+
+ <view v-if="errors[f.code]" class="err-text">{{ errors[f.code] }}</view>
+ <view v-else-if="f.help" class="f-help">{{ f.help }}</view>
+ </view>
+ </view>
+
+ <!-- 搴曢儴鎿嶄綔 -->
+ <view v-if="!meta.readonly" class="bottom-bar">
+ <button class="btn btn-draft" @click="doSave('draft')">鏆傚瓨鑽夌</button>
+ <button class="btn btn-submit" :loading="submitting" @click="doSave('submit')">姝e紡鎻愪氦</button>
+ </view>
+ </block>
+ </view>
+</template>
+
+<script>
+import { getTaskForm, saveTaskDraft, submitTask } from '@/api/task.js'
+import { PROVINCES, citiesOf } from '@/utils/region.js'
+import { uploadFile } from '@/utils/request.js'
+import config from '@/config.js'
+
+export default {
+ data() {
+ // 鍗曚釜涓婁紶鏂囦欢澶у皬涓婇檺锛圡B锛夛紝涓庢湇鍔$ spring.servlet.multipart.max-file-size=10MB 淇濇寔涓�鑷�
+ return { MAX_UPLOAD_MB: 10, taskId: null, loading: true, submitting: false, meta: {}, groups: [], form: {}, errors: {}, errorMsg: '', provinceNames: PROVINCES }
+ },
+ onLoad(options) {
+ this.taskId = options.taskId
+ this.load()
+ },
+ methods: {
+ async load() {
+ this.loading = true
+ this.errorMsg = ''
+ try {
+ const res = await getTaskForm(this.taskId)
+ const d = res.data
+ this.meta = d
+ this.groups = this.normalizeGroups((d.schema && d.schema.groups) || [])
+ this.form = d.form || {}
+ if (!d.open && !d.readonly && !this.meta.recordStatus) {
+ this.errorMsg = '璇ュ~鎶ヤ换鍔″綋鍓嶄笉鍦ㄥ紑鏀炬湡鍐咃紝鎴栦綘鐨勮韩浠藉皻鏈畬鎴愮粦瀹�/鐝骇鐧昏銆�'
+ }
+ } catch (e) {
+ this.errorMsg = (e && e.msg) || '鏃犳硶鎵撳紑璇ュ~鎶ヤ换鍔★紝璇峰厛瀹屾垚韬唤缁戝畾/鐝骇鐧昏銆�'
+ }
+ this.loading = false
+ },
+ goHome() {
+ uni.reLaunch({ url: '/pages/index/index' })
+ },
+ statusText() {
+ if (this.meta.readonly) return '宸叉彁浜�'
+ if (this.meta.recordStatus === '0') return '鑽夌'
+ return this.meta.open ? '寰呭~鍐�' : '宸叉埅姝�'
+ },
+ groupNo(gi) {
+ const map = ['涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�']
+ return map[gi] || (gi + 1)
+ },
+ needReq(f) { return f.required === true },
+ isReadonly(f) { return f.readonly === true || !!f.auto },
+ autoHint(f) {
+ if (f.auto === 'roster') return '锛堝鐢熸。妗堣嚜鍔ㄥ甫鍑猴級'
+ if (f.auto === 'task') return '锛堜换鍔¤嚜鍔ㄥ甫鍑猴級'
+ if (f.auto === 'server') return '锛堢敱绯荤粺鍒ゅ畾锛�'
+ return '锛堝彧璇伙級'
+ },
+ optList(f) { return Array.isArray(f.options) ? f.options : [] },
+ optLabels(f) { return this.optList(f).map(o => o.label) },
+ curIndex(f) {
+ const idx = this.optList(f).findIndex(o => String(o.value) === String(this.form[f.code]))
+ return idx < 0 ? 0 : idx
+ },
+ curLabel(f) {
+ const idx = this.curIndex(f)
+ const opts = this.optList(f)
+ return this.form[f.code] && opts[idx] ? opts[idx].label : '璇烽�夋嫨'
+ },
+ onSelect(f, e) {
+ const o = this.optList(f)[Number(e.detail.value)]
+ this.form[f.code] = o ? o.value : ''
+ // 璇ヤ笅鎷夎嫢姝h鍩庡競褰撲綔鐪佷唤鑱斿姩婧愶紝鎹㈠�煎悗鍚屾牱娓呮帀璺熼殢鐨勫煄甯�
+ this.allFields().forEach(x => {
+ if (x.type === 'city' && this.linkCodeOf(x) === f.code) this.form[x.code] = ''
+ })
+ this.clearErr(f.code)
+ },
+ pickRadio(f, o) { this.form[f.code] = o.value; this.clearErr(f.code) },
+
+ // ---- 鐪佷唤 / 鍩庡競锛堜簩绾ц仈鍔級----
+ /**
+ * 鍏煎鏃╂湡 schema 蹇収锛氱渷甯傚瓧娈垫浘缁熶竴鏍囦负宸插簾寮冪殑 region 绫诲瀷銆�
+ * 浠诲姟 schema 鏄彂甯冩椂钀藉簱鐨勫揩鐓э紝鏀瑰姩瀛楁绫诲瀷涓嶄細鍥炴函鏃т换鍔★紝鏁呭湪姝よ繕鍘熴��
+ */
+ normalizeGroups(groups) {
+ const all = []
+ for (const g of groups) for (const f of (g.fields || [])) {
+ // 浠呭唴缃瓧娈碉紙缂栫爜鍥哄畾涓� province / city锛夋墠浠� region 鎷嗗紑锛�
+ // 鐢ㄦ埛鏂板鐨勩�屽湴鍖恒�嶅瓧娈垫湰韬氨鏄� region锛屽繀椤诲師鏍蜂繚鐣�
+ if (f.type === 'region' && (f.code === 'province' || f.code === 'city')) {
+ f.type = f.code === 'city' ? 'city' : 'province'
+ }
+ // 銆屽浘鐗囦笂浼犮�嶅凡骞跺叆銆屾枃浠朵笂浼犮�嶏細鑰佷换鍔� schema 蹇収鎸夋杩佺Щ锛屼繚鐣欏師 6 寮犻粯璁や笂闄�
+ if (f.type === 'image') {
+ if (!f.maxCount) f.maxCount = 6
+ f.type = 'file'
+ }
+ // 鍘嗗彶鐗堟湰鎶娿�屽煄甯傘�嶅瓨鎴愬甫琛屾斂鍖哄垝鏍囪鐨勬櫘閫氫笅鎷夛紙閫夐」鏄叏閲忓煄甯傚垪琛級銆�
+ // 鍗囩骇涓� city 绫诲瀷璧扮渷甯傝仈鍔ㄦ覆鏌擄紝蹇界暐鍏跺揩鐓ч噷鐨勯潤鎬侀�夐」銆�
+ if (f.type === 'select' && f.optionSource === 'region' && (f.code === 'city' || f.linkTo)) {
+ f.type = 'city'
+ }
+ all.push(f)
+ }
+ const first = all.find(f => this.isProvinceSource(f))
+ all.forEach(f => { if (f.type === 'city' && !f.linkTo && first) f.linkTo = first.code })
+ return groups
+ },
+ /**
+ * 瀛楁鑳藉惁浣滀负鍩庡競鐨勭渷浠借仈鍔ㄦ簮锛氬唴缃�岀渷浠姐�嶇被鍨嬶紝
+ * 鎴栭�夐」閲屽瓨鏈夊彲璇嗗埆鐪佷唤鍚嶇殑銆屼笅鎷�/鍗曢�夈�嶅瓧娈碉紙绠$悊绔墜鍔ㄩ厤鐪佷唤涓嬫媺鐨勫満鏅級銆�
+ */
+ isProvinceSource(f) {
+ if (f.type === 'province') return true
+ if (f.type === 'select' || f.type === 'radio') {
+ return this.optList(f).some(o => citiesOf(String(o.value || o.label || '')).length > 0)
+ }
+ return false
+ },
+ allFields() {
+ const out = []
+ for (const g of this.groups) for (const f of (g.fields || [])) out.push(f)
+ return out
+ },
+ /** 鍩庡競瀛楁鑱斿姩鐨勭渷浠藉瓧娈� code锛氫紭鍏堝彇閰嶇疆鐨� linkTo锛屽惁鍒欓��鍥炶〃鍗曢噷绗竴涓渷浠芥簮瀛楁 */
+ linkCodeOf(f) {
+ const all = this.allFields()
+ if (f.linkTo && all.some(x => this.isProvinceSource(x) && x.code === f.linkTo)) return f.linkTo
+ const first = all.find(x => this.isProvinceSource(x))
+ return first ? first.code : ''
+ },
+ /** 褰撳墠鐪佷唤涓嬪彲閫夌殑鍦板競锛涚渷浠芥湭閫夋椂涓虹┖鏁扮粍锛宲icker 闅忎箣绂佺敤 */
+ cityList(f) {
+ return citiesOf(this.form[this.linkCodeOf(f)])
+ },
+ provinceIndex(f) {
+ const i = PROVINCES.indexOf(this.form[f.code])
+ return i < 0 ? 0 : i
+ },
+ cityIndex(f) {
+ const i = this.cityList(f).indexOf(this.form[f.code])
+ return i < 0 ? 0 : i
+ },
+ onProvinceChange(f, e) {
+ this.form[f.code] = PROVINCES[Number(e.detail.value)] || ''
+ // 鎹㈢渷鍚庢竻绌鸿窡闅忓畠鐨勫煄甯傦紝閬垮厤鐣欎笅銆屾睙鑻� + 娣卞湷銆嶈繖绫荤煕鐩剧粍鍚�
+ this.allFields().forEach(x => {
+ if (x.type === 'city' && this.linkCodeOf(x) === f.code) this.form[x.code] = ''
+ })
+ this.clearErr(f.code)
+ },
+ onCityChange(f, e) {
+ const list = this.cityList(f)
+ this.form[f.code] = list[Number(e.detail.value)] || ''
+ this.clearErr(f.code)
+ },
+
+ // ---- 鍦板尯锛堢渷+甯傚悎骞舵垚涓�涓瓧娈碉紝瀛樸�岀渷/甯傘�嶏級----
+ /** 鎷嗗嚭宸插瓨鐨勭渷甯傦紱鏃犲�兼垨鏍煎紡寮傚父鏃惰繑鍥炵┖锛屼笉鎶涢敊 */
+ regionParts(f) {
+ const v = this.form[f.code] == null ? '' : String(this.form[f.code])
+ const i = v.indexOf('/')
+ return i < 0 ? { p: v, c: '' } : { p: v.slice(0, i), c: v.slice(i + 1) }
+ },
+ regionProvince(f) { return this.regionParts(f).p },
+ regionCity(f) { return this.regionParts(f).c },
+ regionCityList(f) { return citiesOf(this.regionProvince(f)) },
+ regionProvinceIndex(f) {
+ const i = PROVINCES.indexOf(this.regionProvince(f))
+ return i < 0 ? 0 : i
+ },
+ regionCityIndex(f) {
+ const i = this.regionCityList(f).indexOf(this.regionCity(f))
+ return i < 0 ? 0 : i
+ },
+ onRegionProvince(f, e) {
+ // 鎹㈢渷鍗虫竻绌哄凡閫夊競锛岄伩鍏嶇暀涓嬨�屾睙鑻忕渷/娣卞湷甯傘�嶈繖绫荤煕鐩惧��
+ this.form[f.code] = PROVINCES[Number(e.detail.value)] || ''
+ this.clearErr(f.code)
+ },
+ onRegionCity(f, e) {
+ const p = this.regionProvince(f)
+ const c = this.regionCityList(f)[Number(e.detail.value)] || ''
+ this.form[f.code] = c ? (p + '/' + c) : p
+ this.clearErr(f.code)
+ },
+ onInput(e, f) {
+ let val = e.detail.value
+ if (f.type === 'creditCode') val = val.toUpperCase()
+ this.form[f.code] = val
+ this.clearErr(f.code)
+ },
+
+ // ---- 鍥剧墖 / 鏂囦欢涓婁紶 ----
+ /** 鍙栧瓧娈电殑宸蹭笂浼犺矾寰勫垪琛紱鍏煎銆屾暟缁勩�嶄笌鍘嗗彶銆岄�楀彿鎷兼帴瀛楃涓层�嶄袱绉嶅瓨鍌� */
+ fileList(f) {
+ const v = this.form[f.code]
+ if (Array.isArray(v)) return v.filter(Boolean)
+ if (typeof v === 'string' && v.trim()) return v.split(',').map(s => s.trim()).filter(Boolean)
+ return []
+ },
+ maxCount(f) {
+ const n = Number(f.maxCount)
+ if (n > 0) return Math.min(n, 9)
+ return 3
+ },
+ /** 鏄惁鍥剧墖鏂囦欢锛堟寜鎵╁睍鍚嶅垽鏂紝鐢ㄤ簬缂╃暐鍥鹃瑙堬級 */
+ isImg(p) { return /\.(bmp|gif|jpe?g|png)$/i.test(String(p || '')) },
+ imgList(f) { return this.fileList(f).filter(p => this.isImg(p)) },
+ docList(f) { return this.fileList(f).filter(p => !this.isImg(p)) },
+ /** 鐩稿璺緞 鈫� 鍙闂� URL锛�/profile/** 宸叉斁琛岋紝璧板悓涓�鍩熷悕鍓嶇紑锛� */
+ fullUrl(p) {
+ if (!p) return ''
+ if (/^https?:\/\//.test(p)) return p
+ return config.baseUrl + p
+ },
+ fileNameOf(p) {
+ const s = String(p || '')
+ return s.slice(s.lastIndexOf('/') + 1)
+ },
+ /** 瓒呭嚭 10MB 鐨勬枃浠跺厛琛屾嫤鎴紝缁欏嚭鏄庣‘鎻愮ず */
+ filterOversize(items, sizeOf) {
+ const keep = []
+ let skipped = 0
+ for (const it of items) {
+ if (sizeOf(it) > this.MAX_UPLOAD_MB * 1024 * 1024) skipped++
+ else keep.push(it)
+ }
+ if (skipped) uni.showToast({ title: '鏂囦欢涓嶅緱澶т簬' + this.MAX_UPLOAD_MB + 'M锛屽凡璺宠繃 ' + skipped + ' 涓秴澶ф枃浠�', icon: 'none', duration: 2600 })
+ return keep
+ },
+ chooseImages(f) {
+ const left = this.maxCount(f) - this.fileList(f).length
+ if (left <= 0) { uni.showToast({ title: '鏈�澶氫笂浼� ' + this.maxCount(f) + ' 涓枃浠�', icon: 'none' }); return }
+ uni.chooseImage({
+ count: Math.min(left, 9),
+ sizeType: ['compressed'],
+ success: (res) => {
+ const paths = res.tempFilePaths || []
+ const metas = res.tempFiles || []
+ // 閮ㄥ垎骞冲彴 tempFiles 甯� size锛屽彲鍓嶇棰勫垽锛涙嬁涓嶅埌鏃剁敱鏈嶅姟绔� 10MB 涓婇檺鍏滃簳
+ if (metas.length && metas.every(m => typeof m.size === 'number')) {
+ const zipped = paths.map((p, i) => ({ p, size: (metas[i] || {}).size || 0 }))
+ this.uploadPaths(f, this.filterOversize(zipped, x => x.size).map(x => x.p))
+ } else {
+ this.uploadPaths(f, paths)
+ }
+ }
+ })
+ },
+ chooseFiles(f) {
+ const left = this.maxCount(f) - this.fileList(f).length
+ if (left <= 0) { uni.showToast({ title: '鏈�澶氫笂浼� ' + this.maxCount(f) + ' 涓枃浠�', icon: 'none' }); return }
+ // #ifdef H5
+ const input = document.createElement('input')
+ input.type = 'file'
+ input.multiple = true
+ input.accept = '.bmp,.gif,.jpg,.jpeg,.png,.pdf,.doc,.docx,.xls,.xlsx,.txt'
+ input.onchange = () => {
+ const all = Array.from(input.files || [])
+ const files = this.filterOversize(all, x => x.size).slice(0, left)
+ this.uploadFiles(f, files)
+ }
+ input.click()
+ // #endif
+ // #ifndef H5
+ // 灏忕▼搴忕鏆備互閫夊浘鏂瑰紡涓婁紶锛坲ni.uploadFile 瀵规湰鍦颁复鏃惰矾寰勯�氱敤锛�
+ this.chooseImages(f)
+ // #endif
+ },
+ /** H5锛氱洿鎺ヤ笂浼� File 瀵硅薄 */
+ uploadFiles(f, files) {
+ this.doUpload(f, files.map(file => ({ file })))
+ },
+ /** 灏忕▼搴�/H5锛氭寜涓存椂璺緞閫愪釜涓婁紶 */
+ uploadPaths(f, paths) {
+ this.doUpload(f, paths.map(p => ({ filePath: p })))
+ },
+ async doUpload(f, jobs) {
+ if (!jobs.length) return
+ uni.showLoading({ title: '涓婁紶涓��', mask: true })
+ const names = this.fileList(f).slice()
+ try {
+ for (const job of jobs) {
+ if (names.length >= this.maxCount(f)) break
+ const res = await uploadFile(job)
+ if (res && res.fileName) names.push(res.fileName)
+ else uni.showToast({ title: '涓婁紶鍝嶅簲寮傚父锛氭湭杩斿洖鏂囦欢鍦板潃', icon: 'none' })
+ }
+ this.form[f.code] = names
+ this.clearErr(f.code)
+ } catch (e) { /* uploadFile 宸插脊閿� */ }
+ uni.hideLoading()
+ },
+ removeFile(f, i) {
+ const names = this.fileList(f).slice()
+ names.splice(i, 1)
+ this.form[f.code] = names
+ },
+ removeFileByPath(f, p) {
+ const i = this.fileList(f).indexOf(p)
+ if (i >= 0) this.removeFile(f, i)
+ },
+ previewImg(f, i) {
+ const urls = this.imgList(f).map(p => this.fullUrl(p))
+ if (urls.length) uni.previewImage({ urls, current: i })
+ },
+ openFile(p) {
+ const url = this.fullUrl(p)
+ // #ifdef H5
+ window.open(url)
+ // #endif
+ // #ifndef H5
+ uni.downloadFile({
+ url,
+ success: (res) => uni.openDocument({
+ filePath: res.tempFilePath,
+ fail: () => uni.showToast({ title: '鏆備笉鏀寔棰勮璇ユ枃浠剁被鍨�', icon: 'none' })
+ })
+ })
+ // #endif
+ },
+ clearErr(code) {
+ if (this.errors[code]) {
+ const o = {}
+ Object.keys(this.errors).forEach(k => { if (k !== code) o[k] = this.errors[k] })
+ this.errors = o
+ }
+ },
+ doSave(mode) {
+ if (mode === 'submit') {
+ const errs = this.validate()
+ this.errors = errs
+ const keys = Object.keys(errs)
+ if (keys.length) {
+ // 鍙脊绗竴鏉★紝浣嗗甫涓婃潯鏁帮紝閬垮厤鐢ㄦ埛浠ヤ负鍙湁杩欎竴澶勯敊
+ const title = errs[keys[0]] + (keys.length > 1 ? `锛堝叡 ${keys.length} 椤瑰緟淇敼锛塦 : '')
+ uni.showToast({ title, icon: 'none', duration: 2600 })
+ return
+ }
+ }
+ this.submitting = true
+ const api = mode === 'submit' ? submitTask : saveTaskDraft
+ api({ taskId: this.taskId, form: this.form })
+ .then(() => {
+ uni.showToast({ title: mode === 'submit' ? '鎻愪氦鎴愬姛' : '鑽夌宸蹭繚瀛�', icon: 'success' })
+ setTimeout(() => uni.navigateBack(), 600)
+ })
+ .catch(() => {})
+ .finally(() => { this.submitting = false })
+ },
+ validate() {
+ const errs = {}
+ for (const g of this.groups) {
+ for (const f of g.fields || []) {
+ if (this.isReadonly(f)) continue
+ const code = f.code
+ // 鍥剧墖/鏂囦欢瀛楁锛氭寜鍒楄〃鍒ゅ繀濉紝涓嶈蛋鏂囨湰/鏁板瓧绫绘牎楠�
+ if (f.type === 'image' || f.type === 'file') {
+ if (f.required === true && this.fileList(f).length === 0) errs[code] = '璇蜂笂浼犮��' + f.label + '銆�'
+ continue
+ }
+ const v = (this.form[code] === undefined || this.form[code] === null) ? '' : String(this.form[code]).trim()
+ if (f.required === true && !v) { errs[code] = '璇峰~鍐欍��' + f.label + '銆�'; continue }
+ if (!v) continue
+ if (f.type === 'province' && PROVINCES.indexOf(v) < 0) { errs[code] = '璇烽�夋嫨鏈夋晥鐨勩��' + f.label + '銆�'; continue }
+ if (f.type === 'city') {
+ if (!this.linkCodeOf(f)) { errs[code] = '璇峰厛閫夋嫨鐪佷唤锛屽啀閫夈��' + f.label + '銆�'; continue }
+ const cities = this.cityList(f)
+ if (cities.length && cities.indexOf(v) < 0) { errs[code] = '銆�' + f.label + '銆嶄笌鎵�閫夌渷浠戒笉绗︼紝璇烽噸鏂伴�夋嫨'; continue }
+ }
+ if (f.type === 'region') {
+ const p = this.regionProvince(f), c = this.regionCity(f)
+ if (!p || !c) { errs[code] = '璇烽�夋嫨瀹屾暣鐨勩��' + f.label + '銆嶏紙鐪佸拰甯傦級'; continue }
+ if (citiesOf(p).indexOf(c) < 0) { errs[code] = '銆�' + f.label + '銆嶆墍閫夊煄甯備笉灞炰簬璇ョ渷浠斤紝璇烽噸鏂伴�夋嫨'; continue }
+ }
+ if (f.type === 'phone' && !/^1[3-9]\d{9}$/.test(v)) { errs[code] = '銆�' + f.label + '銆嶈濉啓 11 浣嶅ぇ闄嗘墜鏈哄彿'; continue }
+ if (f.type === 'creditCode' && !/^[0-9A-HJ-NPQRTUWXY]{18}$/.test(v)) { errs[code] = '銆�' + f.label + '銆嶉』涓� 18 浣嶇粺涓�绀句細淇$敤浠g爜'; continue }
+ if (f.type === 'number') {
+ const n = Number(v)
+ if (Number.isNaN(n)) { errs[code] = '銆�' + f.label + '銆嶈杈撳叆鏁板瓧'; continue }
+ if (f.min !== undefined && f.min !== null && n < Number(f.min)) { errs[code] = '銆�' + f.label + '銆嶄笉鑳藉皬浜� ' + f.min; continue }
+ if (f.max !== undefined && f.max !== null && n > Number(f.max)) { errs[code] = '銆�' + f.label + '銆嶄笉鑳藉ぇ浜� ' + f.max; continue }
+ }
+ if (f.minLen && v.length < Number(f.minLen)) { errs[code] = '銆�' + f.label + '銆嶈嚦灏� ' + f.minLen + ' 涓瓧'; continue }
+ if (f.maxLen && v.length > Number(f.maxLen)) { errs[code] = '銆�' + f.label + '銆嶆渶澶� ' + f.maxLen + ' 涓瓧'; continue }
+ }
+ }
+ return errs
+ },
+ },
+}
+</script>
+
+<style scoped>
+button { margin: 0; padding: 0; }
+button::after { border: none; }
+
+.form-page { background: #EEF2F8; min-height: 100vh; padding: 24rpx 24rpx 200rpx; box-sizing: border-box; }
+.state { padding-top: 200rpx; text-align: center; color: #8A94A6; }
+
+/* 鏃犳硶濉姤鎻愮ず */
+.err-state { padding: 160rpx 60rpx 0; display: flex; flex-direction: column; align-items: center; text-align: center; }
+.err-icon { width: 96rpx; height: 96rpx; line-height: 96rpx; border-radius: 50%; background: #FBF0EE; color: #E5484D; font-size: 52rpx; font-weight: 700; text-align: center; }
+.err-title { margin-top: 26rpx; font-size: 34rpx; font-weight: 600; color: #1F2D3D; }
+.err-msg { margin-top: 16rpx; font-size: 26rpx; color: #8A94A6; line-height: 1.6; }
+.err-btn { margin-top: 60rpx; width: 100%; }
+.btn { height: 88rpx; line-height: 88rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 4rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+
+/* 浠诲姟淇℃伅 */
+.task-head { background: #fff; border: 1rpx solid #EBEDF1; border-top: 6rpx solid #1F4788; border-radius: 16rpx; padding: 26rpx 28rpx; margin-bottom: 18rpx; box-shadow: 0 4rpx 14rpx rgba(31, 71, 136, 0.05); }
+.th-top { display: flex; justify-content: space-between; align-items: flex-start; }
+.th-title { flex: 1; font-size: 31rpx; font-weight: 600; color: #1F2D3D; line-height: 1.4; }
+.th-tag { margin-left: 16rpx; font-size: 23rpx; padding: 3rpx 14rpx; border-radius: 6rpx; flex-shrink: 0; }
+.th-tag.ok { color: #1D9D5F; background: #EAF7F0; }
+.th-tag.draft { color: #B36A00; background: #FBF4E2; }
+.th-tag.todo { color: #1F4788; background: #E8EFF9; }
+.th-meta { margin-top: 10rpx; font-size: 24rpx; color: #7C8698; }
+.th-note { margin-top: 12rpx; font-size: 24rpx; color: #B36A00; }
+
+/* 閿欒姹囨�� */
+.err-banner { background: #FDF3F3; border: 1rpx solid #F5C6C8; color: #C03; border-radius: 8rpx; padding: 16rpx 20rpx; font-size: 25rpx; margin-bottom: 18rpx; }
+
+/* 鍒嗙粍 */
+.group { background: #fff; border: 1rpx solid #EBEDF1; border-radius: 12rpx; padding: 6rpx 28rpx 18rpx; margin-bottom: 18rpx; }
+.group-title { font-size: 29rpx; font-weight: 600; color: #1F2D3D; padding: 22rpx 0 4rpx 20rpx; border-bottom: 1rpx solid #F2F3F6; margin-bottom: 4rpx; border-left: 8rpx solid #1F4788; border-top-left-radius: 4rpx; }
+
+/* 瀛楁 */
+.field { padding: 18rpx 0 2rpx; }
+.field-err .f-label { color: #C03; }
+.f-label { font-size: 26rpx; color: #303133; margin-bottom: 12rpx; }
+.req { color: #E5484D; margin-right: 6rpx; font-weight: 700; }
+
+.f-input, .f-area, .f-ctrl { background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 20rpx; font-size: 28rpx; color: #1F2D3D; width: 100%; box-sizing: border-box; }
+.f-input { height: 84rpx; line-height: 84rpx; }
+.f-ctrl { height: 84rpx; line-height: 84rpx; display: flex; justify-content: space-between; align-items: center; }
+.f-area { padding: 18rpx 20rpx; min-height: 120rpx; }
+.f-input.err, .f-area.err, .f-ctrl.err { border-color: #E5484D; background: #FDF3F3; }
+.f-radios.err { border-color: #E5484D; }
+.off { color: #B4BAC6; }
+.on { color: #1F2D3D; }
+.caret { color: #B4BAC6; }
+.f-region { display: flex; gap: 16rpx; }
+.f-region-p { flex: 1; min-width: 0; }
+.f-radios { display: flex; flex-wrap: wrap; gap: 18rpx; border: 1rpx solid transparent; border-radius: 8rpx; padding: 4rpx; }
+.f-radio { border: 1rpx solid #DCDFE6; color: #6B7280; border-radius: 8rpx; padding: 12rpx 26rpx; font-size: 26rpx; }
+.f-radio.on { border-color: #1F4788; color: #1F4788; background: #E8EFF9; font-weight: 600; }
+.f-ro { font-size: 28rpx; color: #303133; padding: 16rpx 20rpx; background: #F7F8FA; border-radius: 8rpx; }
+.f-ro.faint { color: #B4BAC6; }
+.err-text { margin-top: 8rpx; font-size: 23rpx; color: #E5484D; }
+.f-help { margin-top: 8rpx; font-size: 22rpx; color: #9AA2B1; }
+
+/* 涓婁紶鍖猴細鍥剧墖缂╃暐鍥� */
+.f-up-grid { display: flex; flex-wrap: wrap; gap: 16rpx; }
+.f-up-cell { position: relative; width: 160rpx; height: 160rpx; border-radius: 8rpx; overflow: hidden; }
+.f-up-img { width: 100%; height: 100%; background: #F2F3F6; }
+.f-up-del { position: absolute; top: 0; right: 0; width: 40rpx; height: 40rpx; line-height: 36rpx; text-align: center; background: rgba(0,0,0,.55); color: #fff; font-size: 28rpx; border-bottom-left-radius: 8rpx; }
+
+/* 鏂囦欢涓婁紶锛堝浘鐗�/PDF/Office 缁熶竴锛� */
+.f-files { display: flex; flex-direction: column; gap: 12rpx; }
+.f-file-row { display: flex; justify-content: space-between; align-items: center; background: #F7F8FA; border: 1rpx solid #EBEDF1; border-radius: 8rpx; padding: 16rpx 20rpx; }
+.f-file-name { font-size: 26rpx; color: #1F4788; word-break: break-all; flex: 1; min-width: 0; }
+.f-file-del { font-size: 24rpx; color: #E5484D; margin-left: 20rpx; flex-shrink: 0; }
+.f-file-add { border: 1rpx dashed #C0C6D2; background: #FAFBFD; color: #7C8698; border-radius: 8rpx; padding: 20rpx; text-align: center; font-size: 26rpx; }
+.f-file-add.err { border-color: #E5484D; background: #FDF3F3; color: #E5484D; }
+
+/* 搴曢儴 */
+.bottom-bar { position: fixed; left: 0; right: 0; bottom: 0; background: #fff; border-top: 1rpx solid #EBEDF1; padding: 16rpx 24rpx calc(16rpx + env(safe-area-inset-bottom)); display: flex; gap: 18rpx; }
+.btn-draft { flex: 1; background: #fff; color: #1F4788; border: 1rpx solid #1F4788; }
+.btn-submit { flex: 1.4; background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-submit[disabled] { opacity: .6; }
+</style>
diff --git a/src/pages/register/register.vue b/src/pages/register/register.vue
new file mode 100644
index 0000000..3baa812
--- /dev/null
+++ b/src/pages/register/register.vue
@@ -0,0 +1,238 @@
+<template>
+ <view class="page">
+ <view class="brand">
+ <image class="brand-watermark" src="/static/logo-emblem-white.png" mode="aspectFit" />
+ <image class="brand-logo" src="/static/logo-head-white.png" mode="aspectFit" />
+ <view class="brand-title">娉ㄥ唽璐﹀彿</view>
+ <view class="brand-sub">鎵弿鐝骇浜岀淮鐮佽繘鍏ワ紝濉啓瀛﹀彿涓庢墜鏈哄彿骞惰缃瘑鐮�</view>
+ </view>
+
+ <view class="card">
+ <!-- 鎵爜鐝骇灞曠ず -->
+ <view v-if="classInfo.className" class="class-banner">
+ <text class="class-banner-label">浣犳鍦ㄥ姞鍏�</text>
+ <text class="class-banner-name">{{ [classInfo.collegeName, classInfo.majorName, classInfo.className].filter(Boolean).join(' 路 ') }}</text>
+ </view>
+
+ <!-- 鏈壂鐮侊細鎵嬪姩閫夋嫨鐝骇 -->
+ <view v-else-if="!checkingCode" class="field" :class="{ 'field-err': errors.classId }">
+ <text class="label">鎵�鍦ㄧ彮绾�</text>
+ <picker mode="selector" :range="classLabels" :value="classIndex" @change="onClassChange">
+ <view class="picker" :class="{ ph: classIndex < 0 }">
+ {{ classIndex >= 0 ? classLabels[classIndex] : '璇烽�夋嫨浣犵殑鐝骇锛堝闄⒙蜂笓涓毬风彮绾э級' }}
+ </view>
+ </picker>
+ <view v-if="errors.classId" class="err-text">{{ errors.classId }}</view>
+ <view v-else class="class-tip">鎷夸笉鍑嗙彮绾ф椂锛岃鍜ㄨ鐝富浠伙紱鎵爜娉ㄥ唽鍙嚜鍔ㄥ甫鍏ョ彮绾�</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.studentNo }">
+ <text class="label">瀛﹀彿</text>
+ <input class="input" v-model="form.studentNo" placeholder="璇疯緭鍏ュ鍙�" placeholder-class="ph" @input="clearErr('studentNo')" />
+ <view v-if="errors.studentNo" class="err-text">{{ errors.studentNo }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.name }">
+ <text class="label">濮撳悕</text>
+ <input class="input" v-model="form.name" placeholder="璇疯緭鍏ョ湡瀹炲鍚�" placeholder-class="ph" @input="clearErr('name')" />
+ <view v-if="errors.name" class="err-text">{{ errors.name }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.phone }">
+ <text class="label">鎵嬫満鍙�</text>
+ <input class="input" v-model="form.phone" type="number" maxlength="11" placeholder="鏈汉鎵嬫満鍙凤紙蹇呭~锛岀敤浜庢壘鍥炲瘑鐮侊級" placeholder-class="ph" @input="clearErr('phone')" />
+ <view v-if="errors.phone" class="err-text">{{ errors.phone }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.password }">
+ <text class="label">璁剧疆瀵嗙爜</text>
+ <input class="input" v-model="form.password" type="password" placeholder="8-20浣嶏紝椤诲惈瀛楁瘝鍜屾暟瀛�" placeholder-class="ph" @input="clearErr('password')" />
+ <view v-if="errors.password" class="err-text">{{ errors.password }}</view>
+ </view>
+
+ <view class="field" :class="{ 'field-err': errors.confirm }">
+ <text class="label">纭瀵嗙爜</text>
+ <input class="input" v-model="form.confirm" type="password" placeholder="璇峰啀娆¤緭鍏ュ瘑鐮�" placeholder-class="ph" @input="clearErr('confirm')" />
+ <view v-if="errors.confirm" class="err-text">{{ errors.confirm }}</view>
+ </view>
+
+ <view class="field" v-if="captchaEnabled" :class="{ 'field-err': errors.code }">
+ <text class="label">楠岃瘉鐮�</text>
+ <view class="captcha-row">
+ <input class="input captcha-input" v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" placeholder-class="ph" maxlength="6" @input="clearErr('code')" />
+ <image class="captcha-img" :src="captchaImg" mode="aspectFit" @click="loadCaptcha" />
+ </view>
+ <view v-if="errors.code" class="err-text">{{ errors.code }}</view>
+ </view>
+
+ <button class="btn btn-primary btn-block" :loading="submitting" :disabled="submitting" @click="doRegister">
+ {{ submitting ? '鎻愪氦涓��' : '娉ㄥ唽骞跺紑濮嬪~鎶�' }}
+ </button>
+
+ <view class="links">
+ <text class="link" @click="go('/pages/login/login')">宸叉湁璐﹀彿锛熷幓鐧诲綍</text>
+ </view>
+ <view class="tip">娉ㄥ唽鍗充唬琛ㄦ壙璇烘墍濉俊鎭笌鐝骇鐪熷疄鍑嗙‘锛涘鍙蜂笌濮撳悕涓嶅彲閲嶅娉ㄥ唽</view>
+ </view>
+ </view>
+</template>
+
+<script>
+import { getCaptcha, accountRegister, resolveBind, getRegClasses } from '@/api/auth.js'
+import { setToken } from '@/utils/request.js'
+
+const BIND_CODE_KEY = '***'
+
+export default {
+ data() {
+ return {
+ submitting: false,
+ checkingCode: true,
+ bindCode: '',
+ classInfo: {},
+ // 鏈壂鐮佹椂鐨勭彮绾ц嚜閫�
+ regClasses: [],
+ classIndex: -1,
+ form: { studentNo: '', name: '', phone: '', password: '', confirm: '', code: '', uuid: '' },
+ errors: {},
+ captchaEnabled: true,
+ captchaImg: '',
+ }
+ },
+ computed: {
+ classLabels() {
+ return this.regClasses.map((c) => c.label)
+ },
+ },
+ async onLoad() {
+ this.loadCaptcha()
+ this.bindCode = uni.getStorageSync(BIND_CODE_KEY) || ''
+ if (this.bindCode) {
+ try {
+ const res = await resolveBind(this.bindCode)
+ this.classInfo = res.data || {}
+ } catch (e) {
+ this.bindCode = '' // 鐮佹棤鏁堬細闄嶇骇涓烘墜鍔ㄩ�夌彮
+ }
+ }
+ if (!this.bindCode) {
+ try {
+ const res = await getRegClasses()
+ this.regClasses = res.data || []
+ } catch (e) { this.regClasses = [] }
+ }
+ this.checkingCode = false
+ },
+ methods: {
+ onClassChange(e) {
+ this.classIndex = Number(e.detail.value)
+ if (this.errors.classId) delete this.errors.classId
+ },
+ async loadCaptcha() {
+ try {
+ const res = await getCaptcha()
+ this.captchaEnabled = res.captchaEnabled !== false
+ this.captchaImg = res.img ? 'data:image/jpg;base64,' + res.img : ''
+ this.form.uuid = res.uuid || ''
+ this.form.code = ''
+ } catch (e) { /* ignore */ }
+ },
+ clearErr(k) { if (this.errors[k]) delete this.errors[k] },
+ validate() {
+ const errs = {}
+ if (!this.bindCode && this.classIndex < 0) errs.classId = '璇烽�夋嫨浣犵殑鐝骇'
+ if (!this.form.studentNo.trim()) errs.studentNo = '璇疯緭鍏ュ鍙�'
+ if (!this.form.name.trim()) errs.name = '璇疯緭鍏ュ鍚�'
+ if (!/^1[3-9]\d{9}$/.test(this.form.phone)) errs.phone = '璇疯緭鍏�11浣嶆墜鏈哄彿'
+ const p = this.form.password
+ if (!p) errs.password = '璇疯缃瘑鐮�'
+ else if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!@#$%^&*_.\-+=?]{8,20}$/.test(p)) errs.password = '8-20浣嶏紝椤诲悓鏃跺寘鍚瓧姣嶅拰鏁板瓧'
+ else if (p === this.form.studentNo.trim()) errs.password = '瀵嗙爜涓嶈兘涓庡鍙风浉鍚�'
+ if (!this.form.confirm) errs.confirm = '璇峰啀娆¤緭鍏ュ瘑鐮�'
+ else if (this.form.confirm !== p) errs.confirm = '涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�'
+ if (this.captchaEnabled && !this.form.code.trim()) errs.code = '璇疯緭鍏ラ獙璇佺爜'
+ this.errors = errs
+ return !Object.keys(errs).length
+ },
+ async doRegister() {
+ if (!this.validate()) return
+ this.submitting = true
+ try {
+ const payload = {
+ studentNo: this.form.studentNo.trim(),
+ name: this.form.name.trim(),
+ phone: this.form.phone.trim(),
+ password: this.form.password,
+ code: this.form.code.trim(),
+ uuid: this.form.uuid,
+ }
+ // 鎵爜浼樺厛锛涙湭鎵爜鍒欐惡甯︽墜鍔ㄩ�夋嫨鐨勭彮绾�
+ if (this.bindCode) payload.bindCode = this.bindCode
+ else payload.classId = String(this.regClasses[this.classIndex].classId)
+ const res = await accountRegister(payload)
+ setToken(res.data.token)
+ uni.removeStorageSync(BIND_CODE_KEY)
+ uni.showToast({ title: '娉ㄥ唽鎴愬姛', icon: 'success' })
+ setTimeout(() => uni.reLaunch({ url: '/pages/index/index' }), 600)
+ } catch (e) {
+ if (this.captchaEnabled) this.loadCaptcha()
+ } finally {
+ this.submitting = false
+ }
+ },
+ go(url) { uni.navigateTo({ url }) },
+ },
+}
+</script>
+
+<style scoped>
+button { margin: 0; padding: 0; }
+button::after { border: none; }
+
+.page { min-height: 100vh; background: #EEF2F8; padding: 0 0 60rpx; box-sizing: border-box; }
+.brand {
+ position: relative;
+ padding: 48rpx 44rpx 96rpx;
+ overflow: hidden;
+ background:
+ radial-gradient(420rpx 260rpx at 88% -20%, rgba(120, 165, 225, 0.38), transparent 60%),
+ linear-gradient(135deg, #16345e 0%, #1F4788 55%, #2a5aa8 100%);
+ border-radius: 0 0 30rpx 30rpx;
+}
+.brand-watermark { position: absolute; right: -36rpx; bottom: -60rpx; width: 280rpx; height: 280rpx; opacity: 0.12; }
+.brand-logo { width: 380rpx; height: 84rpx; display: block; }
+.brand-title { position: relative; margin-top: 26rpx; font-size: 40rpx; font-weight: 700; color: #fff; letter-spacing: 8rpx; }
+.brand-sub { position: relative; margin-top: 10rpx; font-size: 24rpx; color: rgba(255, 255, 255, 0.72); line-height: 1.5; }
+
+.card { position: relative; z-index: 1; background: #fff; margin: -56rpx 24rpx 0; border-radius: 16rpx; padding: 40rpx 30rpx 44rpx; box-shadow: 0 12rpx 36rpx rgba(31, 71, 136, 0.12); }
+
+/* 鎵爜鐝骇妯箙 */
+.class-banner { display: flex; flex-direction: column; background: #E8EFF9; border: 1rpx solid #D5E2F5; border-radius: 12rpx; padding: 20rpx 24rpx; margin-bottom: 30rpx; }
+.class-banner-label { font-size: 22rpx; color: #7C8698; }
+.class-banner-name { margin-top: 6rpx; font-size: 28rpx; font-weight: 600; color: #1F4788; }
+.picker { height: 88rpx; line-height: 88rpx; background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 22rpx; font-size: 29rpx; color: #1F2D3D; box-sizing: border-box; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.field-err .picker { border-color: #E5484D; background: #FDF3F3; }
+.class-tip { margin-top: 10rpx; font-size: 22rpx; color: #B4BAC6; }
+
+.field { margin-bottom: 28rpx; }
+.label { display: block; font-size: 27rpx; color: #303133; margin-bottom: 12rpx; }
+.field-err .label { color: #C03; }
+.input { height: 88rpx; line-height: 88rpx; background: #fff; border: 1rpx solid #DCDFE6; border-radius: 8rpx; padding: 0 22rpx; font-size: 29rpx; color: #1F2D3D; }
+.input.err, .field-err .input { border-color: #E5484D; background: #FDF3F3; }
+.err-text { margin-top: 8rpx; color: #E5484D; font-size: 24rpx; }
+.ph { color: #C0C4CC; }
+
+.captcha-row { display: flex; align-items: center; }
+.captcha-input { flex: 1; }
+.captcha-img { width: 200rpx; height: 88rpx; margin-left: 20rpx; border: 1rpx solid #DCDFE6; border-radius: 8rpx; background: #F0F2F6; }
+
+.btn { height: 88rpx; line-height: 88rpx; border-radius: 12rpx; font-size: 30rpx; letter-spacing: 4rpx; text-align: center; box-sizing: border-box; }
+.btn-primary { background: linear-gradient(90deg, #16345e, #1F4788 55%, #2a5aa8); color: #fff; box-shadow: 0 8rpx 20rpx rgba(31, 71, 136, 0.28); }
+.btn-block { width: 100%; }
+.btn[disabled] { opacity: .6; }
+.btn-primary[disabled] { color: #fff; }
+
+.links { display: flex; justify-content: center; margin-top: 26rpx; }
+.link { color: #1F4788; font-size: 26rpx; }
+.tip { margin-top: 20rpx; text-align: center; font-size: 23rpx; color: #B4BAC6; }
+</style>
diff --git a/src/permission.js b/src/permission.js
deleted file mode 100644
index 809df37..0000000
--- a/src/permission.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import router from './router'
-import { ElMessage } from 'element-plus'
-import NProgress from 'nprogress'
-import 'nprogress/nprogress.css'
-import { getToken } from '@/utils/auth'
-import { isHttp, isPathMatch } from '@/utils/validate'
-import { isRelogin } from '@/utils/request'
-import useUserStore from '@/store/modules/user'
-import useSettingsStore from '@/store/modules/settings'
-import usePermissionStore from '@/store/modules/permission'
-
-NProgress.configure({ showSpinner: false })
-
-const whiteList = ['/login', '/register', '/callbacklccpn']
-
-const isWhiteList = (path) => {
- return whiteList.some(pattern => isPathMatch(pattern, path))
-}
-
-router.beforeEach((to, from, next) => {
- NProgress.start()
- if (getToken()) {
- to.meta.title && useSettingsStore().setTitle(to.meta.title)
- /* has token*/
- if (to.path === '/login') {
- next({ path: '/' })
- NProgress.done()
- } else if (isWhiteList(to.path)) {
- next()
- } else {
- if (useUserStore().roles.length === 0) {
- isRelogin.show = true
- // 鍒ゆ柇褰撳墠鐢ㄦ埛鏄惁宸叉媺鍙栧畬user_info淇℃伅
- useUserStore().getInfo().then(() => {
- isRelogin.show = false
- usePermissionStore().generateRoutes().then(accessRoutes => {
- // 鏍规嵁roles鏉冮檺鐢熸垚鍙闂殑璺敱琛�
- accessRoutes.forEach(route => {
- if (!isHttp(route.path)) {
- router.addRoute(route) // 鍔ㄦ�佹坊鍔犲彲璁块棶璺敱琛�
- }
- })
- next({ ...to, replace: true }) // hack鏂规硶 纭繚addRoutes宸插畬鎴�
- })
- }).catch(err => {
- useUserStore().logOut().then(() => {
- ElMessage.error(err)
- next({ path: '/' })
- })
- })
- } else {
- next()
- }
- }
- } else {
- // 娌℃湁token
- if (isWhiteList(to.path)) {
- // 鍦ㄥ厤鐧诲綍鐧藉悕鍗曪紝鐩存帴杩涘叆
- next()
- } else {
- next(`/login?redirect=${to.fullPath}`) // 鍚﹀垯鍏ㄩ儴閲嶅畾鍚戝埌鐧诲綍椤�
- NProgress.done()
- }
- }
-})
-
-router.afterEach(() => {
- NProgress.done()
-})
diff --git a/src/plugins/auth.js b/src/plugins/auth.js
deleted file mode 100644
index 9b6ed1f..0000000
--- a/src/plugins/auth.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import useUserStore from '@/store/modules/user'
-
-function authPermission(permission) {
- const all_permission = "*:*:*"
- const permissions = useUserStore().permissions
- if (permission && permission.length > 0) {
- return permissions.some(v => {
- return all_permission === v || v === permission
- })
- } else {
- return false
- }
-}
-
-function authRole(role) {
- const super_admin = "admin"
- const roles = useUserStore().roles
- if (role && role.length > 0) {
- return roles.some(v => {
- return super_admin === v || v === role
- })
- } else {
- return false
- }
-}
-
-export default {
- // 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄�
- hasPermi(permission) {
- return authPermission(permission)
- },
- // 楠岃瘉鐢ㄦ埛鏄惁鍚湁鎸囧畾鏉冮檺锛屽彧闇�鍖呭惈鍏朵腑涓�涓�
- hasPermiOr(permissions) {
- return permissions.some(item => {
- return authPermission(item)
- })
- },
- // 楠岃瘉鐢ㄦ埛鏄惁鍚湁鎸囧畾鏉冮檺锛屽繀椤诲叏閮ㄦ嫢鏈�
- hasPermiAnd(permissions) {
- return permissions.every(item => {
- return authPermission(item)
- })
- },
- // 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愯鑹�
- hasRole(role) {
- return authRole(role)
- },
- // 楠岃瘉鐢ㄦ埛鏄惁鍚湁鎸囧畾瑙掕壊锛屽彧闇�鍖呭惈鍏朵腑涓�涓�
- hasRoleOr(roles) {
- return roles.some(item => {
- return authRole(item)
- })
- },
- // 楠岃瘉鐢ㄦ埛鏄惁鍚湁鎸囧畾瑙掕壊锛屽繀椤诲叏閮ㄦ嫢鏈�
- hasRoleAnd(roles) {
- return roles.every(item => {
- return authRole(item)
- })
- }
-}
diff --git a/src/plugins/cache.js b/src/plugins/cache.js
deleted file mode 100644
index 4d29dfe..0000000
--- a/src/plugins/cache.js
+++ /dev/null
@@ -1,79 +0,0 @@
-const sessionCache = {
- set (key, value) {
- if (!sessionStorage) {
- return
- }
- if (key != null && value != null) {
- sessionStorage.setItem(key, value)
- }
- },
- get (key) {
- if (!sessionStorage) {
- return null
- }
- if (key == null) {
- return null
- }
- return sessionStorage.getItem(key)
- },
- setJSON (key, jsonValue) {
- if (jsonValue != null) {
- this.set(key, JSON.stringify(jsonValue))
- }
- },
- getJSON (key) {
- const value = this.get(key)
- if (value != null) {
- return JSON.parse(value)
- }
- return null
- },
- remove (key) {
- sessionStorage.removeItem(key)
- }
-}
-const localCache = {
- set (key, value) {
- if (!localStorage) {
- return
- }
- if (key != null && value != null) {
- localStorage.setItem(key, value)
- }
- },
- get (key) {
- if (!localStorage) {
- return null
- }
- if (key == null) {
- return null
- }
- return localStorage.getItem(key)
- },
- setJSON (key, jsonValue) {
- if (jsonValue != null) {
- this.set(key, JSON.stringify(jsonValue))
- }
- },
- getJSON (key) {
- const value = this.get(key)
- if (value != null) {
- return JSON.parse(value)
- }
- return null
- },
- remove (key) {
- localStorage.removeItem(key)
- }
-}
-
-export default {
- /**
- * 浼氳瘽绾х紦瀛�
- */
- session: sessionCache,
- /**
- * 鏈湴缂撳瓨
- */
- local: localCache
-}
diff --git a/src/plugins/download.js b/src/plugins/download.js
deleted file mode 100644
index 2705310..0000000
--- a/src/plugins/download.js
+++ /dev/null
@@ -1,91 +0,0 @@
-锘縤mport axios from "axios";
-import { ElLoading, ElMessage } from "element-plus";
-import { saveAs } from "file-saver";
-import { getToken } from "@/utils/auth";
-import errorCode from "@/utils/errorCode";
-import { blobValidate } from "@/utils/ruoyi";
-
-const baseURL = import.meta.env.VITE_APP_BASE_API;
-let downloadLoadingInstance;
-
-export default {
- name(name, isDelete = true) {
- var url =
- baseURL +
- "/common/download?fileName=" +
- encodeURIComponent(name) +
- "&delete=" +
- isDelete;
- axios({
- method: "get",
- url: url,
- responseType: "blob",
- headers: { Authorization: "Bearer " + getToken() },
- }).then((res) => {
- const isBlob = blobValidate(res.data);
- if (isBlob) {
- const blob = new Blob([res.data]);
- this.saveAs(blob, decodeURIComponent(res.headers["download-filename"]));
- } else {
- this.printErrMsg(res.data);
- }
- });
- },
- resource(resource) {
- var url =
- baseURL +
- "/common/download/resource?resource=" +
- encodeURIComponent(resource);
- axios({
- method: "get",
- url: url,
- responseType: "blob",
- headers: { Authorization: "Bearer " + getToken() },
- }).then((res) => {
- const isBlob = blobValidate(res.data);
- if (isBlob) {
- const blob = new Blob([res.data]);
- this.saveAs(blob, decodeURIComponent(res.headers["download-filename"]));
- } else {
- this.printErrMsg(res.data);
- }
- });
- },
- zip(url, name) {
- var url = baseURL + url;
- downloadLoadingInstance = ElLoading.service({
- text: "姝e湪涓嬭浇鏁版嵁锛岃绋嶅��",
- background: "rgba(0, 0, 0, 0.7)",
- });
- axios({
- method: "get",
- url: url,
- responseType: "blob",
- headers: { Authorization: "Bearer " + getToken() },
- })
- .then((res) => {
- const isBlob = blobValidate(res.data);
- if (isBlob) {
- const blob = new Blob([res.data], { type: "application/zip" });
- this.saveAs(blob, name);
- } else {
- this.printErrMsg(res.data);
- }
- downloadLoadingInstance.close();
- })
- .catch((r) => {
- console.error(r);
- ElMessage.error("涓嬭浇鏂囦欢鍑虹幇閿欒锛岃鑱旂郴绠$悊鍛橈紒");
- downloadLoadingInstance.close();
- });
- },
- saveAs(text, name, opts) {
- saveAs(text, name, opts);
- },
- async printErrMsg(data) {
- const resText = await data.text();
- const rspObj = JSON.parse(resText);
- const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
- ElMessage.error(errMsg);
- },
-};
diff --git a/src/plugins/index.js b/src/plugins/index.js
deleted file mode 100644
index fb75c63..0000000
--- a/src/plugins/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import tab from './tab'
-import auth from './auth'
-import cache from './cache'
-import modal from './modal'
-import download from './download'
-
-export default function installPlugins(app){
- // 椤电鎿嶄綔
- app.config.globalProperties.$tab = tab
- // 璁よ瘉瀵硅薄
- app.config.globalProperties.$auth = auth
- // 缂撳瓨瀵硅薄
- app.config.globalProperties.$cache = cache
- // 妯℃�佹瀵硅薄
- app.config.globalProperties.$modal = modal
- // 涓嬭浇鏂囦欢
- app.config.globalProperties.$download = download
-}
diff --git a/src/plugins/modal.js b/src/plugins/modal.js
deleted file mode 100644
index 8695360..0000000
--- a/src/plugins/modal.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
-
-let loadingInstance
-
-export default {
- // 娑堟伅鎻愮ず
- msg(content) {
- ElMessage.info(content)
- },
- // 閿欒娑堟伅
- msgError(content) {
- ElMessage.error(content)
- },
- // 鎴愬姛娑堟伅
- msgSuccess(content) {
- ElMessage.success(content)
- },
- // 璀﹀憡娑堟伅
- msgWarning(content) {
- ElMessage.warning(content)
- },
- // 寮瑰嚭鎻愮ず
- alert(content) {
- ElMessageBox.alert(content, "绯荤粺鎻愮ず")
- },
- // 閿欒鎻愮ず
- alertError(content) {
- ElMessageBox.alert(content, "绯荤粺鎻愮ず", { type: 'error' })
- },
- // 鎴愬姛鎻愮ず
- alertSuccess(content) {
- ElMessageBox.alert(content, "绯荤粺鎻愮ず", { type: 'success' })
- },
- // 璀﹀憡鎻愮ず
- alertWarning(content) {
- ElMessageBox.alert(content, "绯荤粺鎻愮ず", { type: 'warning' })
- },
- // 閫氱煡鎻愮ず
- notify(content) {
- ElNotification.info(content)
- },
- // 閿欒閫氱煡
- notifyError(content) {
- ElNotification.error(content)
- },
- // 鎴愬姛閫氱煡
- notifySuccess(content) {
- ElNotification.success(content)
- },
- // 璀﹀憡閫氱煡
- notifyWarning(content) {
- ElNotification.warning(content)
- },
- // 纭绐椾綋
- confirm(content) {
- return ElMessageBox.confirm(content, "绯荤粺鎻愮ず", {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: "warning",
- })
- },
- // 鎻愪氦鍐呭
- prompt(content) {
- return ElMessageBox.prompt(content, "绯荤粺鎻愮ず", {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: "warning",
- })
- },
- // 鎵撳紑閬僵灞�
- loading(content) {
- loadingInstance = ElLoading.service({
- lock: true,
- text: content,
- background: "rgba(0, 0, 0, 0.7)",
- })
- },
- // 鍏抽棴閬僵灞�
- closeLoading() {
- loadingInstance.close()
- }
-}
diff --git a/src/plugins/tab.js b/src/plugins/tab.js
deleted file mode 100644
index 16755f0..0000000
--- a/src/plugins/tab.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import useTagsViewStore from '@/store/modules/tagsView'
-import router from '@/router'
-
-export default {
- // 鍒锋柊褰撳墠tab椤电
- refreshPage(obj) {
- const { path, query, matched } = router.currentRoute.value
- if (obj === undefined) {
- matched.forEach((m) => {
- if (m.components && m.components.default && m.components.default.name) {
- if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
- obj = { name: m.components.default.name, path: path, query: query }
- }
- }
- })
- }
- return useTagsViewStore().delCachedView(obj).then(() => {
- const { path, query } = obj
- router.replace({
- path: '/redirect' + path,
- query: query
- })
- })
- },
- // 鍏抽棴褰撳墠tab椤电锛屾墦寮�鏂伴〉绛�
- closeOpenPage(obj) {
- useTagsViewStore().delView(router.currentRoute.value)
- if (obj !== undefined) {
- return router.push(obj)
- }
- },
- // 鍏抽棴鎸囧畾tab椤电
- closePage(obj) {
- if (obj === undefined) {
- return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => {
- const latestView = visitedViews.slice(-1)[0]
- if (latestView) {
- return router.push(latestView.fullPath)
- }
- return router.push('/')
- })
- }
- return useTagsViewStore().delView(obj)
- },
- // 鍏抽棴鎵�鏈塼ab椤电
- closeAllPage() {
- return useTagsViewStore().delAllViews()
- },
- // 鍏抽棴宸︿晶tab椤电
- closeLeftPage(obj) {
- return useTagsViewStore().delLeftTags(obj || router.currentRoute.value)
- },
- // 鍏抽棴鍙充晶tab椤电
- closeRightPage(obj) {
- return useTagsViewStore().delRightTags(obj || router.currentRoute.value)
- },
- // 鍏抽棴鍏朵粬tab椤电
- closeOtherPage(obj) {
- return useTagsViewStore().delOthersViews(obj || router.currentRoute.value)
- },
- // 鎵撳紑tab椤电
- openPage(title, url, params) {
- const obj = { path: url, meta: { title: title } }
- useTagsViewStore().addView(obj)
- return router.push({ path: url, query: params })
- },
- // 淇敼tab椤电
- updatePage(obj) {
- return useTagsViewStore().updateVisitedView(obj)
- }
-}
diff --git a/src/router/index.js b/src/router/index.js
deleted file mode 100644
index 9cfde33..0000000
--- a/src/router/index.js
+++ /dev/null
@@ -1,201 +0,0 @@
-import { createWebHistory, createRouter } from 'vue-router'
-/* Layout */
-import Layout from '@/layout'
-
-/**
- * Note: 璺敱閰嶇疆椤�
- *
- * hidden: true // 褰撹缃� true 鐨勬椂鍊欒璺敱涓嶄細鍐嶄晶杈规爮鍑虹幇 濡�401锛宭ogin绛夐〉闈紝鎴栬�呭涓�浜涚紪杈戦〉闈�/edit/1
- * alwaysShow: true // 褰撲綘涓�涓矾鐢变笅闈㈢殑 children 澹版槑鐨勮矾鐢卞ぇ浜�1涓椂锛岃嚜鍔ㄤ細鍙樻垚宓屽鐨勬ā寮�--濡傜粍浠堕〉闈�
- * // 鍙湁涓�涓椂锛屼細灏嗛偅涓瓙璺敱褰撳仛鏍硅矾鐢辨樉绀哄湪渚ц竟鏍�--濡傚紩瀵奸〉闈�
- * // 鑻ヤ綘鎯充笉绠¤矾鐢变笅闈㈢殑 children 澹版槑鐨勪釜鏁伴兘鏄剧ず浣犵殑鏍硅矾鐢�
- * // 浣犲彲浠ヨ缃� alwaysShow: true锛岃繖鏍峰畠灏变細蹇界暐涔嬪墠瀹氫箟鐨勮鍒欙紝涓�鐩存樉绀烘牴璺敱
- * redirect: noRedirect // 褰撹缃� noRedirect 鐨勬椂鍊欒璺敱鍦ㄩ潰鍖呭睉瀵艰埅涓笉鍙鐐瑰嚮
- * name:'router-name' // 璁惧畾璺敱鐨勫悕瀛楋紝涓�瀹氳濉啓涓嶇劧浣跨敤<keep-alive>鏃朵細鍑虹幇鍚勭闂
- * query: '{"id": 1, "name": "ry"}' // 璁块棶璺敱鐨勯粯璁や紶閫掑弬鏁�
- * roles: ['admin', 'common'] // 璁块棶璺敱鐨勮鑹叉潈闄�
- * permissions: ['a:a:a', 'b:b:b'] // 璁块棶璺敱鐨勮彍鍗曟潈闄�
- * meta : {
- noCache: true // 濡傛灉璁剧疆涓簍rue锛屽垯涓嶄細琚� <keep-alive> 缂撳瓨(榛樿 false)
- title: 'title' // 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛�
- icon: 'svg-name' // 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/assets/icons/svg
- breadcrumb: false // 濡傛灉璁剧疆涓篺alse锛屽垯涓嶄細鍦╞readcrumb闈㈠寘灞戜腑鏄剧ず
- activeMenu: '/system/user' // 褰撹矾鐢辫缃簡璇ュ睘鎬э紝鍒欎細楂樹寒鐩稿搴旂殑渚ц竟鏍忋��
- }
- */
-
-// 鍏叡璺敱
-export const constantRoutes = [
- {
- path: '/redirect',
- component: Layout,
- hidden: true,
- children: [
- {
- path: '/redirect/:path(.*)',
- component: () => import('@/views/redirect/index.vue')
- }
- ]
- },
- {
- path: '/login',
- component: () => import('@/views/login'),
- hidden: true
- },
- {
- path: "/callbacklccpn",
- component: () => import("@/views/tideLogin.vue"),
- hidden: true,
- },
- {
- path: '/register',
- component: () => import('@/views/register'),
- hidden: true
- },
- {
- path: "/:pathMatch(.*)*",
- component: () => import('@/views/error/404'),
- hidden: true
- },
- {
- path: '/401',
- component: () => import('@/views/error/401'),
- hidden: true
- },
-
- {
- path: '',
- component: Layout,
- redirect: '/index',
- children: [
- {
- path: '/index',
- component: () => import('@/views/index'),
- name: 'Index',
- meta: { title: '棣栭〉', icon: 'dashboard', affix: true }
- }
- ]
- },
- {
- path: '/main/MobileChat',
- component: Layout,
- redirect: '',
- hidden: true,
- children: [
- {
- path: '',
- component: () => import('@/views/chatHome/chatHomeIndex/MobileChat'),
- name: 'MobileChat',
- meta: { title: 'AI瀵硅瘽', icon: 'dashboard', affix: true}
- }
- ]
- },
- {
- path: '/user',
- component: Layout,
- hidden: true,
- redirect: 'noredirect',
- children: [
- {
- path: "profile",
- component: () => import("@/views/system/user/profile/index"),
- name: "Profile",
- meta: { title: "涓汉涓績", icon: "user" },
- },
- ],
- },
- {
- path: "/device-info",
- component: () => import("@/views/equipmentManagement/deviceInfo/index.vue"),
- hidden: true,
- name: "DeviceInfo",
- meta: { title: "璁惧淇℃伅", icon: "monitor" },
- },
-];
-
-// 鍔ㄦ�佽矾鐢憋紝鍩轰簬鐢ㄦ埛鏉冮檺鍔ㄦ�佸幓鍔犺浇
-export const dynamicRoutes = [
- {
- path: '/system/user-auth',
- component: Layout,
- hidden: true,
- permissions: ['system:user:edit'],
- children: [
- {
- path: 'role/:userId(\\d+)',
- component: () => import('@/views/system/user/authRole'),
- name: 'AuthRole',
- meta: { title: '鍒嗛厤瑙掕壊', activeMenu: '/system/user' }
- }
- ]
- },
- {
- path: '/system/role-auth',
- component: Layout,
- hidden: true,
- permissions: ['system:role:edit'],
- children: [
- {
- path: 'user/:roleId(\\d+)',
- component: () => import('@/views/system/role/authUser'),
- name: 'AuthUser',
- meta: { title: '鍒嗛厤鐢ㄦ埛', activeMenu: '/system/role' }
- }
- ]
- },
- {
- path: '/system/dict-data',
- component: Layout,
- hidden: true,
- permissions: ['system:dict:list'],
- children: [
- {
- path: 'index/:dictId(\\d+)',
- component: () => import('@/views/system/dict/data'),
- name: 'Data',
- meta: { title: '瀛楀吀鏁版嵁', activeMenu: '/system/dict' }
- }
- ]
- },
- {
- path: '/monitor/job-log',
- component: Layout,
- hidden: true,
- permissions: ['monitor:job:list'],
- children: [
- {
- path: 'index/:jobId(\\d+)',
- component: () => import('@/views/monitor/job/log'),
- name: 'JobLog',
- meta: { title: '璋冨害鏃ュ織', activeMenu: '/monitor/job' }
- }
- ]
- },
- {
- path: '/tool/gen-edit',
- component: Layout,
- hidden: true,
- permissions: ['tool:gen:edit'],
- children: [
- {
- path: 'index/:tableId(\\d+)',
- component: () => import('@/views/tool/gen/editTable'),
- name: 'GenEdit',
- meta: { title: '淇敼鐢熸垚閰嶇疆', activeMenu: '/tool/gen' }
- }
- ]
- }
-]
-
-const router = createRouter({
- history: createWebHistory(),
- routes: constantRoutes,
- scrollBehavior(to, from, savedPosition) {
- if (savedPosition) {
- return savedPosition
- }
- return { top: 0 }
- },
-})
-
-export default router
diff --git a/src/settings.js b/src/settings.js
deleted file mode 100644
index f944e2d..0000000
--- a/src/settings.js
+++ /dev/null
@@ -1,47 +0,0 @@
-export default {
- /**
- * 缃戦〉鏍囬
- */
- title: import.meta.env.VITE_APP_TITLE,
- /**
- * 渚ц竟鏍忎富棰� 娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light
- */
- sideTheme: 'theme-light',
- /**
- * 鏄惁绯荤粺甯冨眬閰嶇疆
- */
- showSettings: true,
-
- /**
- * 鏄惁鏄剧ず椤堕儴瀵艰埅
- */
- topNav: false,
-
- /**
- * 鏄惁鏄剧ず tagsView
- */
- tagsView: true,
-
- /**
- * 鏄惁鍥哄畾澶撮儴
- */
- fixedHeader: true,
-
- /**
- * 鏄惁鏄剧ずlogo
- */
- sidebarLogo: true,
-
- /**
- * 鏄惁鏄剧ず鍔ㄦ�佹爣棰�
- */
- dynamicTitle: false,
-
- /**
- * @type {string | array} 'production' | ['production', 'development']
- * @description Need show err logs component.
- * The default is only used in the production env
- * If you want to also use it in dev, you can pass ['production', 'development']
- */
- errorLog: 'production'
-}
diff --git a/src/shime-uni.d.ts b/src/shime-uni.d.ts
new file mode 100644
index 0000000..b3d3cc9
--- /dev/null
+++ b/src/shime-uni.d.ts
@@ -0,0 +1,6 @@
+export {};
+
+declare module "vue" {
+ type Hooks = App.AppInstance & Page.PageInstance;
+ interface ComponentCustomOptions extends Hooks {}
+}
\ No newline at end of file
diff --git a/src/static/logo-emblem-white.png b/src/static/logo-emblem-white.png
new file mode 100644
index 0000000..26eac43
--- /dev/null
+++ b/src/static/logo-emblem-white.png
Binary files differ
diff --git a/src/static/logo-head-white.png b/src/static/logo-head-white.png
new file mode 100644
index 0000000..a1e071d
--- /dev/null
+++ b/src/static/logo-head-white.png
Binary files differ
diff --git a/src/static/logo-navy.png b/src/static/logo-navy.png
new file mode 100644
index 0000000..55c3e05
--- /dev/null
+++ b/src/static/logo-navy.png
Binary files differ
diff --git a/src/static/logo.png b/src/static/logo.png
new file mode 100644
index 0000000..834a6e3
--- /dev/null
+++ b/src/static/logo.png
Binary files differ
diff --git a/src/store/index.js b/src/store/index.js
deleted file mode 100644
index cd73385..0000000
--- a/src/store/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const store = createPinia()
-
-export default store
\ No newline at end of file
diff --git a/src/store/modules/app.js b/src/store/modules/app.js
deleted file mode 100644
index 71414be..0000000
--- a/src/store/modules/app.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import Cookies from 'js-cookie'
-
-const useAppStore = defineStore(
- 'app',
- {
- state: () => ({
- sidebar: {
- opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
- withoutAnimation: false,
- hide: false
- },
- device: 'desktop',
- size: Cookies.get('size') || 'default'
- }),
- actions: {
- toggleSideBar(withoutAnimation) {
- if (this.sidebar.hide) {
- return false
- }
- this.sidebar.opened = !this.sidebar.opened
- this.sidebar.withoutAnimation = withoutAnimation
- if (this.sidebar.opened) {
- Cookies.set('sidebarStatus', 1)
- } else {
- Cookies.set('sidebarStatus', 0)
- }
- },
- closeSideBar({ withoutAnimation }) {
- Cookies.set('sidebarStatus', 0)
- this.sidebar.opened = false
- this.sidebar.withoutAnimation = withoutAnimation
- },
- toggleDevice(device) {
- this.device = device
- },
- setSize(size) {
- this.size = size
- Cookies.set('size', size)
- },
- toggleSideBarHide(status) {
- this.sidebar.hide = status
- }
- }
- })
-
-export default useAppStore
diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js
deleted file mode 100644
index af1a3fa..0000000
--- a/src/store/modules/dict.js
+++ /dev/null
@@ -1,57 +0,0 @@
-const useDictStore = defineStore(
- 'dict',
- {
- state: () => ({
- dict: new Array()
- }),
- actions: {
- // 鑾峰彇瀛楀吀
- getDict(_key) {
- if (_key == null && _key == "") {
- return null
- }
- try {
- for (let i = 0; i < this.dict.length; i++) {
- if (this.dict[i].key == _key) {
- return this.dict[i].value
- }
- }
- } catch (e) {
- return null
- }
- },
- // 璁剧疆瀛楀吀
- setDict(_key, value) {
- if (_key !== null && _key !== "") {
- this.dict.push({
- key: _key,
- value: value
- })
- }
- },
- // 鍒犻櫎瀛楀吀
- removeDict(_key) {
- var bln = false
- try {
- for (let i = 0; i < this.dict.length; i++) {
- if (this.dict[i].key == _key) {
- this.dict.splice(i, 1)
- return true
- }
- }
- } catch (e) {
- bln = false
- }
- return bln
- },
- // 娓呯┖瀛楀吀
- cleanDict() {
- this.dict = new Array()
- },
- // 鍒濆瀛楀吀
- initDict() {
- }
- }
- })
-
-export default useDictStore
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
deleted file mode 100644
index 6a16d9d..0000000
--- a/src/store/modules/permission.js
+++ /dev/null
@@ -1,127 +0,0 @@
-import auth from '@/plugins/auth'
-import router, { constantRoutes, dynamicRoutes } from '@/router'
-import { getRouters } from '@/api/menu'
-import Layout from '@/layout/index'
-import ParentView from '@/components/ParentView'
-import InnerLink from '@/layout/components/InnerLink'
-
-// 鍖归厤views閲岄潰鎵�鏈夌殑.vue鏂囦欢
-const modules = import.meta.glob('./../../views/**/*.vue')
-
-const usePermissionStore = defineStore(
- 'permission',
- {
- state: () => ({
- routes: [],
- addRoutes: [],
- defaultRoutes: [],
- topbarRouters: [],
- sidebarRouters: []
- }),
- actions: {
- setRoutes(routes) {
- this.addRoutes = routes
- this.routes = constantRoutes.concat(routes)
- },
- setDefaultRoutes(routes) {
- this.defaultRoutes = constantRoutes.concat(routes)
- },
- setTopbarRoutes(routes) {
- this.topbarRouters = routes
- },
- setSidebarRouters(routes) {
- this.sidebarRouters = routes
- },
- generateRoutes(roles) {
- return new Promise(resolve => {
- // 鍚戝悗绔姹傝矾鐢辨暟鎹�
- getRouters().then(res => {
- const sdata = JSON.parse(JSON.stringify(res.data))
- const rdata = JSON.parse(JSON.stringify(res.data))
- const defaultData = JSON.parse(JSON.stringify(res.data))
- const sidebarRoutes = filterAsyncRouter(sdata)
- const rewriteRoutes = filterAsyncRouter(rdata, false, true)
- const defaultRoutes = filterAsyncRouter(defaultData)
- const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
- asyncRoutes.forEach(route => { router.addRoute(route) })
- this.setRoutes(rewriteRoutes)
- this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
- this.setDefaultRoutes(sidebarRoutes)
- this.setTopbarRoutes(defaultRoutes)
- resolve(rewriteRoutes)
- })
- })
- }
- }
- })
-
-// 閬嶅巻鍚庡彴浼犳潵鐨勮矾鐢卞瓧绗︿覆锛岃浆鎹负缁勪欢瀵硅薄
-function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
- return asyncRouterMap.filter(route => {
- if (type && route.children) {
- route.children = filterChildren(route.children)
- }
- if (route.component) {
- // Layout ParentView 缁勪欢鐗规畩澶勭悊
- if (route.component === 'Layout') {
- route.component = Layout
- } else if (route.component === 'ParentView') {
- route.component = ParentView
- } else if (route.component === 'InnerLink') {
- route.component = InnerLink
- } else {
- route.component = loadView(route.component)
- }
- }
- if (route.children != null && route.children && route.children.length) {
- route.children = filterAsyncRouter(route.children, route, type)
- } else {
- delete route['children']
- delete route['redirect']
- }
- return true
- })
-}
-
-function filterChildren(childrenMap, lastRouter = false) {
- var children = []
- childrenMap.forEach(el => {
- el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path
- if (el.children && el.children.length && el.component === 'ParentView') {
- children = children.concat(filterChildren(el.children, el))
- } else {
- children.push(el)
- }
- })
- return children
-}
-
-// 鍔ㄦ�佽矾鐢遍亶鍘嗭紝楠岃瘉鏄惁鍏峰鏉冮檺
-export function filterDynamicRoutes(routes) {
- const res = []
- routes.forEach(route => {
- if (route.permissions) {
- if (auth.hasPermiOr(route.permissions)) {
- res.push(route)
- }
- } else if (route.roles) {
- if (auth.hasRoleOr(route.roles)) {
- res.push(route)
- }
- }
- })
- return res
-}
-
-export const loadView = (view) => {
- let res
- for (const path in modules) {
- const dir = path.split('views/')[1].split('.vue')[0]
- if (dir === view) {
- res = () => modules[path]()
- }
- }
- return res
-}
-
-export default usePermissionStore
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
deleted file mode 100644
index e526da0..0000000
--- a/src/store/modules/settings.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import defaultSettings from "@/settings";
-import { useDark, useToggle } from "@vueuse/core";
-import { useDynamicTitle } from "@/utils/dynamicTitle";
-
-const isDark = useDark();
-const toggleDark = useToggle(isDark);
-
-const {
- sideTheme,
- showSettings,
- topNav,
- tagsView,
- fixedHeader,
- sidebarLogo,
- dynamicTitle,
-} = defaultSettings;
-
-const storageSetting = JSON.parse(localStorage.getItem("layout-setting")) || "";
-
-const useSettingsStore = defineStore("settings", {
- state: () => ({
- title: "",
- theme: storageSetting.theme || "#002fa7",
- sideTheme: storageSetting.sideTheme || sideTheme,
- showSettings: showSettings,
- topNav:
- storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
- tagsView:
- storageSetting.tagsView === undefined
- ? tagsView
- : storageSetting.tagsView,
- fixedHeader:
- storageSetting.fixedHeader === undefined
- ? fixedHeader
- : storageSetting.fixedHeader,
- sidebarLogo:
- storageSetting.sidebarLogo === undefined
- ? sidebarLogo
- : storageSetting.sidebarLogo,
- dynamicTitle:
- storageSetting.dynamicTitle === undefined
- ? dynamicTitle
- : storageSetting.dynamicTitle,
- isDark: isDark.value,
- }),
- actions: {
- // 淇敼甯冨眬璁剧疆
- changeSetting(data) {
- const { key, value } = data;
- if (this.hasOwnProperty(key)) {
- this[key] = value;
- }
- },
- // 璁剧疆缃戦〉鏍囬
- setTitle(title) {
- this.title = title;
- useDynamicTitle();
- },
- // 鍒囨崲鏆楅粦妯″紡
- toggleTheme() {
- this.isDark = !this.isDark;
- toggleDark();
- },
- },
-});
-
-export default useSettingsStore;
diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js
deleted file mode 100644
index b0d4ca1..0000000
--- a/src/store/modules/tagsView.js
+++ /dev/null
@@ -1,182 +0,0 @@
-const useTagsViewStore = defineStore(
- 'tags-view',
- {
- state: () => ({
- visitedViews: [],
- cachedViews: [],
- iframeViews: []
- }),
- actions: {
- addView(view) {
- this.addVisitedView(view)
- this.addCachedView(view)
- },
- addIframeView(view) {
- if (this.iframeViews.some(v => v.path === view.path)) return
- this.iframeViews.push(
- Object.assign({}, view, {
- title: view.meta.title || 'no-name'
- })
- )
- },
- addVisitedView(view) {
- if (this.visitedViews.some(v => v.path === view.path)) return
- this.visitedViews.push(
- Object.assign({}, view, {
- title: view.meta.title || 'no-name'
- })
- )
- },
- addCachedView(view) {
- if (this.cachedViews.includes(view.name)) return
- if (!view.meta.noCache) {
- this.cachedViews.push(view.name)
- }
- },
- delView(view) {
- return new Promise(resolve => {
- this.delVisitedView(view)
- this.delCachedView(view)
- resolve({
- visitedViews: [...this.visitedViews],
- cachedViews: [...this.cachedViews]
- })
- })
- },
- delVisitedView(view) {
- return new Promise(resolve => {
- for (const [i, v] of this.visitedViews.entries()) {
- if (v.path === view.path) {
- this.visitedViews.splice(i, 1)
- break
- }
- }
- this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
- resolve([...this.visitedViews])
- })
- },
- delIframeView(view) {
- return new Promise(resolve => {
- this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
- resolve([...this.iframeViews])
- })
- },
- delCachedView(view) {
- return new Promise(resolve => {
- const index = this.cachedViews.indexOf(view.name)
- index > -1 && this.cachedViews.splice(index, 1)
- resolve([...this.cachedViews])
- })
- },
- delOthersViews(view) {
- return new Promise(resolve => {
- this.delOthersVisitedViews(view)
- this.delOthersCachedViews(view)
- resolve({
- visitedViews: [...this.visitedViews],
- cachedViews: [...this.cachedViews]
- })
- })
- },
- delOthersVisitedViews(view) {
- return new Promise(resolve => {
- this.visitedViews = this.visitedViews.filter(v => {
- return v.meta.affix || v.path === view.path
- })
- this.iframeViews = this.iframeViews.filter(item => item.path === view.path)
- resolve([...this.visitedViews])
- })
- },
- delOthersCachedViews(view) {
- return new Promise(resolve => {
- const index = this.cachedViews.indexOf(view.name)
- if (index > -1) {
- this.cachedViews = this.cachedViews.slice(index, index + 1)
- } else {
- this.cachedViews = []
- }
- resolve([...this.cachedViews])
- })
- },
- delAllViews(view) {
- return new Promise(resolve => {
- this.delAllVisitedViews(view)
- this.delAllCachedViews(view)
- resolve({
- visitedViews: [...this.visitedViews],
- cachedViews: [...this.cachedViews]
- })
- })
- },
- delAllVisitedViews(view) {
- return new Promise(resolve => {
- const affixTags = this.visitedViews.filter(tag => tag.meta.affix)
- this.visitedViews = affixTags
- this.iframeViews = []
- resolve([...this.visitedViews])
- })
- },
- delAllCachedViews(view) {
- return new Promise(resolve => {
- this.cachedViews = []
- resolve([...this.cachedViews])
- })
- },
- updateVisitedView(view) {
- for (let v of this.visitedViews) {
- if (v.path === view.path) {
- v = Object.assign(v, view)
- break
- }
- }
- },
- delRightTags(view) {
- return new Promise(resolve => {
- const index = this.visitedViews.findIndex(v => v.path === view.path)
- if (index === -1) {
- return
- }
- this.visitedViews = this.visitedViews.filter((item, idx) => {
- if (idx <= index || (item.meta && item.meta.affix)) {
- return true
- }
- const i = this.cachedViews.indexOf(item.name)
- if (i > -1) {
- this.cachedViews.splice(i, 1)
- }
- if(item.meta.link) {
- const fi = this.iframeViews.findIndex(v => v.path === item.path)
- this.iframeViews.splice(fi, 1)
- }
- return false
- })
- resolve([...this.visitedViews])
- })
- },
- delLeftTags(view) {
- return new Promise(resolve => {
- const index = this.visitedViews.findIndex(v => v.path === view.path)
- if (index === -1) {
- return
- }
- this.visitedViews = this.visitedViews.filter((item, idx) => {
- if (idx >= index || (item.meta && item.meta.affix)) {
- return true
- }
- const i = this.cachedViews.indexOf(item.name)
- if (i > -1) {
- this.cachedViews.splice(i, 1)
- }
- if(item.meta.link) {
- const fi = this.iframeViews.findIndex(v => v.path === item.path)
- this.iframeViews.splice(fi, 1)
- }
- return false
- })
- resolve([...this.visitedViews])
- })
- }
- }
- })
-
-export default useTagsViewStore
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
deleted file mode 100644
index d52efa6..0000000
--- a/src/store/modules/user.js
+++ /dev/null
@@ -1,131 +0,0 @@
-import {login, logout, getInfo, loginCheck, loginCheckFactory,tideLogin} from '@/api/login'
-import { getToken, setToken, removeToken } from '@/utils/auth'
-import { isHttp, isEmpty } from "@/utils/validate"
-import defAva from '@/assets/images/profile.jpg'
-
-const useUserStore = defineStore(
- 'user',
- {
- state: () => ({
- token: getToken(),
- id: '',
- name: '',
- avatar: '',
- roles: [],
- permissions: []
- }),
- actions: {
- // 鐧诲綍
- login(userInfo) {
- const username = userInfo.username.trim()
- const password = userInfo.password
- const code = userInfo.code
- const uuid = userInfo.uuid
- return new Promise((resolve, reject) => {
- login(username, password, code, uuid).then(res => {
- setToken(res.token)
- this.token = res.token
- resolve()
- }).catch(error => {
- reject(error)
- })
- })
- },
- getCurrentTime() {
- const now = new Date();
- const year = now.getFullYear(); // 鑾峰彇骞翠唤
- const month = String(now.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮嬶紝瑕�+1锛屽苟琛ラ浂
- const day = String(now.getDate()).padStart(2, '0'); // 鏃ユ湡琛ラ浂
- const hours = String(now.getHours()).padStart(2, '0'); // 灏忔椂琛ラ浂
- const minutes = String(now.getMinutes()).padStart(2, '0'); // 鍒嗛挓琛ラ浂
- const seconds = String(now.getSeconds()).padStart(2, '0'); // 绉掓暟琛ラ浂
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
- },
- // 鑾峰彇鐢ㄦ埛淇℃伅
- getInfo() {
- return new Promise((resolve, reject) => {
- getInfo().then(res => {
- const user = res.user
- let avatar = user.avatar || ""
- avatar = import.meta.env.VITE_APP_BASE_API + '/profile/' + avatar
- if (res.roles && res.roles.length > 0) { // 楠岃瘉杩斿洖鐨剅oles鏄惁鏄竴涓潪绌烘暟缁�
- this.roles = res.roles
- this.permissions = res.permissions
- } else {
- this.roles = ['ROLE_DEFAULT']
- }
- this.id = user.userId
- this.name = user.userName
- this.avatar = avatar
- this.currentFactoryName = user.currentFactoryName
- this.nickName = user.nickName
- this.roleName = user.roles[0].roleName
- this.currentDeptId = user.tenantId
- this.currentLoginTime = this.getCurrentTime()
- resolve(res)
- }).catch(error => {
- reject(error)
- })
- })
- },
- // 閫�鍑虹郴缁�
- logOut() {
- return new Promise((resolve, reject) => {
- logout(this.token).then(() => {
- this.token = ''
- this.roles = []
- this.permissions = []
- removeToken()
- resolve()
- }).catch(error => {
- reject(error)
- })
- })
- },
- // 鐧诲綍鏍¢獙
- loginCheck(userInfo) {
- const username = userInfo.username.trim()
- const password = userInfo.password
- return new Promise((resolve, reject) => {
- loginCheck(username, password).then(res => {
- resolve(res)
- }).catch(error => {
- reject(error)
- })
- })
- },
- // 閮ㄩ棬鐧诲綍
- loginCheckFactory(userInfo) {
- const username = userInfo.username.trim()
- const password = userInfo.password
- const factoryId = userInfo.currentFatoryId
- return new Promise((resolve, reject) => {
- loginCheckFactory(username, password, factoryId).then(res => {
- setToken(res.token)
- this.token = res.token
- resolve()
- }).catch(error => {
- reject(error)
- })
- })
- },
- TideLogin(code) {
- return new Promise((resolve, reject) => {
- tideLogin(code)
- .then((res) => {
- setToken(res.token);
- this.token = res.token
- Vue.prototype.uploadHeader = {
- Authorization: "Bearer " + res.token,
- };
- resolve();
- })
- .catch((error) => {
- reject(error);
- });
- });
- },
- }
- })
-
-export default useUserStore
diff --git a/src/uni.scss b/src/uni.scss
new file mode 100644
index 0000000..288300d
--- /dev/null
+++ b/src/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 杩欓噷鏄痷ni-app鍐呯疆鐨勫父鐢ㄦ牱寮忓彉閲�
+ *
+ * uni-app 瀹樻柟鎵╁睍鎻掍欢鍙婃彃浠跺競鍦猴紙https://ext.dcloud.net.cn锛変笂寰堝涓夋柟鎻掍欢鍧囦娇鐢ㄤ簡杩欎簺鏍峰紡鍙橀噺
+ * 濡傛灉浣犳槸鎻掍欢寮�鍙戣�咃紝寤鸿浣犱娇鐢╯css棰勫鐞嗭紝骞跺湪鎻掍欢浠g爜涓洿鎺ヤ娇鐢ㄨ繖浜涘彉閲忥紙鏃犻渶 import 杩欎釜鏂囦欢锛夛紝鏂逛究鐢ㄦ埛閫氳繃鎼Н鏈ㄧ殑鏂瑰紡寮�鍙戞暣浣撻鏍间竴鑷寸殑App
+ *
+ */
+
+/**
+ * 濡傛灉浣犳槸App寮�鍙戣�咃紙鎻掍欢浣跨敤鑰咃級锛屼綘鍙互閫氳繃淇敼杩欎簺鍙橀噺鏉ュ畾鍒惰嚜宸辩殑鎻掍欢涓婚锛屽疄鐜拌嚜瀹氫箟涓婚鍔熻兘
+ *
+ * 濡傛灉浣犵殑椤圭洰鍚屾牱浣跨敤浜唖css棰勫鐞嗭紝浣犱篃鍙互鐩存帴鍦ㄤ綘鐨� scss 浠g爜涓娇鐢ㄥ涓嬪彉閲忥紝鍚屾椂鏃犻渶 import 杩欎釜鏂囦欢
+ */
+
+/* 棰滆壊鍙橀噺 */
+
+/* 琛屼负鐩稿叧棰滆壊 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 鏂囧瓧鍩烘湰棰滆壊 */
+$uni-text-color: #333; // 鍩烘湰鑹�
+$uni-text-color-inverse: #fff; // 鍙嶈壊
+$uni-text-color-grey: #999; // 杈呭姪鐏拌壊锛屽鍔犺浇鏇村鐨勬彁绀轰俊鎭�
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable: #c0c0c0;
+
+/* 鑳屾櫙棰滆壊 */
+$uni-bg-color: #fff;
+$uni-bg-color-grey: #f8f8f8;
+$uni-bg-color-hover: #f1f1f1; // 鐐瑰嚮鐘舵�侀鑹�
+$uni-bg-color-mask: rgba(0, 0, 0, 0.4); // 閬僵棰滆壊
+
+/* 杈规棰滆壊 */
+$uni-border-color: #c8c7cc;
+
+/* 灏哄鍙橀噺 */
+
+/* 鏂囧瓧灏哄 */
+$uni-font-size-sm: 12px;
+$uni-font-size-base: 14px;
+$uni-font-size-lg: 16;
+
+/* 鍥剧墖灏哄 */
+$uni-img-size-sm: 20px;
+$uni-img-size-base: 26px;
+$uni-img-size-lg: 40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 姘村钩闂磋窛 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 鍨傜洿闂磋窛 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 閫忔槑搴� */
+$uni-opacity-disabled: 0.3; // 缁勪欢绂佺敤鎬佺殑閫忔槑搴�
+
+/* 鏂囩珷鍦烘櫙鐩稿叧 */
+$uni-color-title: #2c405a; // 鏂囩珷鏍囬棰滆壊
+$uni-font-size-title: 20px;
+$uni-color-subtitle: #555; // 浜岀骇鏍囬棰滆壊
+$uni-font-size-subtitle: 18px;
+$uni-color-paragraph: #3f536e; // 鏂囩珷娈佃惤棰滆壊
+$uni-font-size-paragraph: 15px;
\ No newline at end of file
diff --git a/src/utils/auth.js b/src/utils/auth.js
deleted file mode 100644
index 88d7b6c..0000000
--- a/src/utils/auth.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import Cookies from 'js-cookie'
-
-const TokenKey = 'Admin-Token'
-
-export function getToken() {
- return Cookies.get(TokenKey)
-}
-
-export function setToken(token) {
- return Cookies.set(TokenKey, token)
-}
-
-export function removeToken() {
- return Cookies.remove(TokenKey)
-}
diff --git a/src/utils/dict.js b/src/utils/dict.js
deleted file mode 100644
index a6db068..0000000
--- a/src/utils/dict.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import useDictStore from '@/store/modules/dict'
-import { getDicts } from '@/api/system/dict/data'
-
-/**
- * 鑾峰彇瀛楀吀鏁版嵁
- */
-export function useDict(...args) {
- const res = ref({})
- return (() => {
- args.forEach((dictType, index) => {
- res.value[dictType] = []
- const dicts = useDictStore().getDict(dictType)
- if (dicts) {
- res.value[dictType] = dicts
- } else {
- getDicts(dictType).then(resp => {
- res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))
- useDictStore().setDict(dictType, res.value[dictType])
- })
- }
- })
- return toRefs(res.value)
- })()
-}
\ No newline at end of file
diff --git a/src/utils/dynamicTitle.js b/src/utils/dynamicTitle.js
deleted file mode 100644
index 2005758..0000000
--- a/src/utils/dynamicTitle.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import store from '@/store'
-import defaultSettings from '@/settings'
-import useSettingsStore from '@/store/modules/settings'
-
-/**
- * 鍔ㄦ�佷慨鏀规爣棰�
- */
-export function useDynamicTitle() {
- const settingsStore = useSettingsStore()
- if (settingsStore.dynamicTitle) {
- document.title = settingsStore.title + ' - ' + defaultSettings.title
- } else {
- document.title = defaultSettings.title
- }
-}
\ No newline at end of file
diff --git a/src/utils/errorCode.js b/src/utils/errorCode.js
deleted file mode 100644
index b72d026..0000000
--- a/src/utils/errorCode.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default {
- '401': '璁よ瘉澶辫触锛屾棤娉曡闂郴缁熻祫婧�',
- '403': '褰撳墠鎿嶄綔娌℃湁鏉冮檺',
- '404': '璁块棶璧勬簮涓嶅瓨鍦�',
- 'default': '绯荤粺鏈煡閿欒锛岃鍙嶉缁欑鐞嗗憳'
-}
diff --git a/src/utils/generator/config.js b/src/utils/generator/config.js
deleted file mode 100644
index 449715f..0000000
--- a/src/utils/generator/config.js
+++ /dev/null
@@ -1,452 +0,0 @@
-export const formConf = {
- formRef: 'formRef',
- formModel: 'formData',
- size: 'default',
- labelPosition: 'right',
- labelWidth: 100,
- formRules: 'rules',
- gutter: 15,
- disabled: false,
- span: 24,
- formBtns: true,
-}
-
-export const inputComponents = [
- {
- label: '鍗曡鏂囨湰',
- tag: 'el-input',
- tagIcon: 'input',
- type: 'text',
- placeholder: '璇疯緭鍏�',
- defaultValue: undefined,
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- clearable: true,
- prepend: '',
- append: '',
- 'prefix-icon': '',
- 'suffix-icon': '',
- maxlength: null,
- 'show-word-limit': false,
- readonly: false,
- disabled: false,
- required: true,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/input',
- },
- {
- label: '澶氳鏂囨湰',
- tag: 'el-input',
- tagIcon: 'textarea',
- type: 'textarea',
- placeholder: '璇疯緭鍏�',
- defaultValue: undefined,
- span: 24,
- labelWidth: null,
- autosize: {
- minRows: 4,
- maxRows: 4,
- },
- style: { width: '100%' },
- maxlength: null,
- 'show-word-limit': false,
- readonly: false,
- disabled: false,
- required: true,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/input',
- },
- {
- label: '瀵嗙爜',
- tag: 'el-input',
- tagIcon: 'password',
- type: 'password',
- placeholder: '璇疯緭鍏�',
- defaultValue: undefined,
- span: 24,
- 'show-password': true,
- labelWidth: null,
- style: { width: '100%' },
- clearable: true,
- prepend: '',
- append: '',
- 'prefix-icon': '',
- 'suffix-icon': '',
- maxlength: null,
- 'show-word-limit': false,
- readonly: false,
- disabled: false,
- required: true,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/input',
- },
- {
- label: '璁℃暟鍣�',
- tag: 'el-input-number',
- tagIcon: 'number',
- placeholder: '',
- defaultValue: undefined,
- span: 24,
- labelWidth: null,
- min: undefined,
- max: undefined,
- step: undefined,
- 'step-strictly': false,
- precision: undefined,
- 'controls-position': '',
- disabled: false,
- required: true,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/input-number',
- },
-]
-
-export const selectComponents = [
- {
- label: '涓嬫媺閫夋嫨',
- tag: 'el-select',
- tagIcon: 'select',
- placeholder: '璇烽�夋嫨',
- defaultValue: undefined,
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- clearable: true,
- disabled: false,
- required: true,
- filterable: false,
- multiple: false,
- options: [
- {
- label: '閫夐」涓�',
- value: 1,
- },
- {
- label: '閫夐」浜�',
- value: 2,
- },
- ],
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/select',
- },
- {
- label: '绾ц仈閫夋嫨',
- tag: 'el-cascader',
- tagIcon: 'cascader',
- placeholder: '璇烽�夋嫨',
- defaultValue: [],
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- props: {
- props: {
- multiple: false,
- },
- },
- 'show-all-levels': true,
- disabled: false,
- clearable: true,
- filterable: false,
- required: true,
- options: [
- {
- id: 1,
- value: 1,
- label: '閫夐」1',
- children: [
- {
- id: 2,
- value: 2,
- label: '閫夐」1-1',
- },
- ],
- },
- ],
- dataType: 'dynamic',
- labelKey: 'label',
- valueKey: 'value',
- childrenKey: 'children',
- separator: '/',
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/cascader',
- },
- {
- label: '鍗曢�夋缁�',
- tag: 'el-radio-group',
- tagIcon: 'radio',
- defaultValue: 0,
- span: 24,
- labelWidth: null,
- style: {},
- optionType: 'default',
- border: false,
- size: 'default',
- disabled: false,
- required: true,
- options: [
- {
- label: '閫夐」涓�',
- value: 1,
- },
- {
- label: '閫夐」浜�',
- value: 2,
- },
- ],
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/radio',
- },
- {
- label: '澶氶�夋缁�',
- tag: 'el-checkbox-group',
- tagIcon: 'checkbox',
- defaultValue: [],
- span: 24,
- labelWidth: null,
- style: {},
- optionType: 'default',
- border: false,
- size: 'default',
- disabled: false,
- required: true,
- options: [
- {
- label: '閫夐」涓�',
- value: 1,
- },
- {
- label: '閫夐」浜�',
- value: 2,
- },
- ],
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/checkbox',
- },
- {
- label: '寮�鍏�',
- tag: 'el-switch',
- tagIcon: 'switch',
- defaultValue: false,
- span: 24,
- labelWidth: null,
- style: {},
- disabled: false,
- required: true,
- 'active-text': '',
- 'inactive-text': '',
- 'active-color': null,
- 'inactive-color': null,
- 'active-value': true,
- 'inactive-value': false,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/switch',
- },
- {
- label: '婊戝潡',
- tag: 'el-slider',
- tagIcon: 'slider',
- defaultValue: null,
- span: 24,
- labelWidth: null,
- disabled: false,
- required: true,
- min: 0,
- max: 100,
- step: 1,
- 'show-stops': false,
- range: false,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/slider',
- },
- {
- label: '鏃堕棿閫夋嫨',
- tag: 'el-time-picker',
- tagIcon: 'time',
- placeholder: '璇烽�夋嫨',
- defaultValue: '',
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- disabled: false,
- clearable: true,
- required: true,
- format: 'HH:mm:ss',
- 'value-format': 'HH:mm:ss',
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/time-picker',
- },
- {
- label: '鏃堕棿鑼冨洿',
- tag: 'el-time-picker',
- tagIcon: 'time-range',
- defaultValue: null,
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- disabled: false,
- clearable: true,
- required: true,
- 'is-range': true,
- 'range-separator': '鑷�',
- 'start-placeholder': '寮�濮嬫椂闂�',
- 'end-placeholder': '缁撴潫鏃堕棿',
- format: 'HH:mm:ss',
- 'value-format': 'HH:mm:ss',
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/time-picker',
- },
- {
- label: '鏃ユ湡閫夋嫨',
- tag: 'el-date-picker',
- tagIcon: 'date',
- placeholder: '璇烽�夋嫨',
- defaultValue: null,
- type: 'date',
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- disabled: false,
- clearable: true,
- required: true,
- format: 'YYYY-MM-DD',
- 'value-format': 'YYYY-MM-DD',
- readonly: false,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/date-picker',
- },
- {
- label: '鏃ユ湡鑼冨洿',
- tag: 'el-date-picker',
- tagIcon: 'date-range',
- defaultValue: null,
- span: 24,
- labelWidth: null,
- style: { width: '100%' },
- type: 'daterange',
- 'range-separator': '鑷�',
- 'start-placeholder': '寮�濮嬫棩鏈�',
- 'end-placeholder': '缁撴潫鏃ユ湡',
- disabled: false,
- clearable: true,
- required: true,
- format: 'YYYY-MM-DD',
- 'value-format': 'YYYY-MM-DD',
- readonly: false,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/date-picker',
- },
- {
- label: '璇勫垎',
- tag: 'el-rate',
- tagIcon: 'rate',
- defaultValue: 0,
- span: 24,
- labelWidth: null,
- style: {},
- max: 5,
- 'allow-half': false,
- 'show-text': false,
- 'show-score': false,
- disabled: false,
- required: true,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/rate',
- },
- {
- label: '棰滆壊閫夋嫨',
- tag: 'el-color-picker',
- tagIcon: 'color',
- defaultValue: null,
- labelWidth: null,
- 'show-alpha': false,
- 'color-format': '',
- disabled: false,
- required: true,
- size: 'default',
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/color-picker',
- },
- {
- label: '涓婁紶',
- tag: 'el-upload',
- tagIcon: 'upload',
- action: 'https://jsonplaceholder.typicode.com/posts/',
- defaultValue: null,
- labelWidth: null,
- disabled: false,
- required: true,
- accept: '',
- name: 'file',
- 'auto-upload': true,
- showTip: false,
- buttonText: '鐐瑰嚮涓婁紶',
- fileSize: 2,
- sizeUnit: 'MB',
- 'list-type': 'text',
- multiple: false,
- regList: [],
- changeTag: true,
- document: 'https://element-plus.org/zh-CN/component/upload',
- tip: '鍙兘涓婁紶涓嶈秴杩� 2MB 鐨勬枃浠�',
- style: { width: '100%' },
- },
-]
-
-export const layoutComponents = [
- {
- layout: 'rowFormItem',
- tagIcon: 'row',
- type: 'default',
- justify: 'start',
- align: 'top',
- label: '琛屽鍣�',
- layoutTree: true,
- children: [],
- document: 'https://element-plus.org/zh-CN/component/layout',
- },
- {
- layout: 'colFormItem',
- label: '鎸夐挳',
- changeTag: true,
- labelWidth: null,
- tag: 'el-button',
- tagIcon: 'button',
- span: 24,
- default: '涓昏鎸夐挳',
- type: 'primary',
- icon: 'Search',
- size: 'default',
- disabled: false,
- document: 'https://element-plus.org/zh-CN/component/button',
- },
-]
-
-// 缁勪欢rule鐨勮Е鍙戞柟寮忥紝鏃犺Е鍙戞柟寮忕殑缁勪欢涓嶇敓鎴恟ule
-export const trigger = {
- 'el-input': 'blur',
- 'el-input-number': 'blur',
- 'el-select': 'change',
- 'el-radio-group': 'change',
- 'el-checkbox-group': 'change',
- 'el-cascader': 'change',
- 'el-time-picker': 'change',
- 'el-date-picker': 'change',
- 'el-rate': 'change',
-}
diff --git a/src/utils/generator/css.js b/src/utils/generator/css.js
deleted file mode 100644
index c1c62e6..0000000
--- a/src/utils/generator/css.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const styles = {
- 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}',
- 'el-upload': '.el-upload__tip{line-height: 1.2;}'
-}
-
-function addCss(cssList, el) {
- const css = styles[el.tag]
- css && cssList.indexOf(css) === -1 && cssList.push(css)
- if (el.children) {
- el.children.forEach(el2 => addCss(cssList, el2))
- }
-}
-
-export function makeUpCss(conf) {
- const cssList = []
- conf.fields.forEach(el => addCss(cssList, el))
- return cssList.join('\n')
-}
diff --git a/src/utils/generator/drawingDefalut.js b/src/utils/generator/drawingDefalut.js
deleted file mode 100644
index 1105c28..0000000
--- a/src/utils/generator/drawingDefalut.js
+++ /dev/null
@@ -1,29 +0,0 @@
-export default [
- {
- layout: 'colFormItem',
- tagIcon: 'input',
- label: '鎵嬫満鍙�',
- vModel: 'mobile',
- formId: 6,
- tag: 'el-input',
- placeholder: '璇疯緭鍏ユ墜鏈哄彿',
- defaultValue: '',
- span: 24,
- style: { width: '100%' },
- clearable: true,
- prepend: '',
- append: '',
- 'prefix-icon': 'Cellphone',
- 'suffix-icon': '',
- maxlength: 11,
- 'show-word-limit': true,
- readonly: false,
- disabled: false,
- required: true,
- changeTag: true,
- regList: [{
- pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
- message: '鎵嬫満鍙锋牸寮忛敊璇�'
- }]
- }
-]
diff --git a/src/utils/generator/html.js b/src/utils/generator/html.js
deleted file mode 100644
index 4b29841..0000000
--- a/src/utils/generator/html.js
+++ /dev/null
@@ -1,359 +0,0 @@
-/* eslint-disable max-len */
-import { trigger } from './config'
-
-let confGlobal
-let someSpanIsNot24
-
-export function dialogWrapper(str) {
- return `<el-dialog v-model="dialogVisible" @open="onOpen" @close="onClose" title="Dialog Titile">
- ${str}
- <template #footer>
- <el-button @click="close">鍙栨秷</el-button>
- <el-button type="primary" @click="handelConfirm">纭畾</el-button>
- </template>
- </el-dialog>`
-}
-
-export function vueTemplate(str) {
- return `<template>
- <div class="app-container">
- ${str}
- </div>
- </template>`
-}
-
-export function vueScript(str) {
- return `<script setup>
- ${str}
- </script>`
-}
-
-export function cssStyle(cssStr) {
- return `<style>
- ${cssStr}
- </style>`
-}
-
-function buildFormTemplate(conf, child, type) {
- let labelPosition = ''
- if (conf.labelPosition !== 'right') {
- labelPosition = `label-position="${conf.labelPosition}"`
- }
- const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : ''
- let str = `<el-form ref="${conf.formRef}" :model="${conf.formModel}" :rules="${conf.formRules}" size="${conf.size}" ${disabled} label-width="${conf.labelWidth}px" ${labelPosition}>
- ${child}
- ${buildFromBtns(conf, type)}
- </el-form>`
- if (someSpanIsNot24) {
- str = `<el-row :gutter="${conf.gutter}">
- ${str}
- </el-row>`
- }
- return str
-}
-
-function buildFromBtns(conf, type) {
- let str = ''
- if (conf.formBtns && type === 'file') {
- str = `<el-form-item>
- <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
- <el-button @click="resetForm">閲嶇疆</el-button>
- </el-form-item>`
- if (someSpanIsNot24) {
- str = `<el-col :span="24">
- ${str}
- </el-col>`
- }
- }
- return str
-}
-
-// span涓嶄负24鐨勭敤el-col鍖呰9
-function colWrapper(element, str) {
- if (someSpanIsNot24 || element.span !== 24) {
- return `<el-col :span="${element.span}">
- ${str}
- </el-col>`
- }
- return str
-}
-
-const layouts = {
- colFormItem(element) {
- let labelWidth = ''
- if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) {
- labelWidth = `label-width="${element.labelWidth}px"`
- }
- const required = !trigger[element.tag] && element.required ? 'required' : ''
- const tagDom = tags[element.tag] ? tags[element.tag](element) : null
- let str = `<el-form-item ${labelWidth} label="${element.label}" prop="${element.vModel}" ${required}>
- ${tagDom}
- </el-form-item>`
- str = colWrapper(element, str)
- return str
- },
- rowFormItem(element) {
- const type = element.type === 'default' ? '' : `type="${element.type}"`
- const justify = element.type === 'default' ? '' : `justify="${element.justify}"`
- const align = element.type === 'default' ? '' : `align="${element.align}"`
- const gutter = element.gutter ? `gutter="${element.gutter}"` : ''
- const children = element.children.map(el => layouts[el.layout](el))
- let str = `<el-row ${type} ${justify} ${align} ${gutter}>
- ${children.join('\n')}
- </el-row>`
- str = colWrapper(element, str)
- return str
- }
-}
-
-const tags = {
- 'el-button': el => {
- const {
- tag, disabled
- } = attrBuilder(el)
- const type = el.type ? `type="${el.type}"` : ''
- const icon = el.icon ? `icon="${el.icon}"` : ''
- const size = el.size ? `size="${el.size}"` : ''
- let child = buildElButtonChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}</${el.tag}>`
- },
- 'el-input': el => {
- const {
- disabled, vModel, clearable, placeholder, width
- } = attrBuilder(el)
- const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
- const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
- const readonly = el.readonly ? 'readonly' : ''
- const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
- const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
- const showPassword = el['show-password'] ? 'show-password' : ''
- const type = el.type ? `type="${el.type}"` : ''
- const autosize = el.autosize && el.autosize.minRows
- ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
- : ''
- let child = buildElInputChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${el.tag}>`
- },
- 'el-input-number': el => {
- const { disabled, vModel, placeholder } = attrBuilder(el)
- const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
- const min = el.min ? `:min='${el.min}'` : ''
- const max = el.max ? `:max='${el.max}'` : ''
- const step = el.step ? `:step='${el.step}'` : ''
- const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
- const precision = el.precision ? `:precision='${el.precision}'` : ''
-
- return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${el.tag}>`
- },
- 'el-select': el => {
- const {
- disabled, vModel, clearable, placeholder, width
- } = attrBuilder(el)
- const filterable = el.filterable ? 'filterable' : ''
- const multiple = el.multiple ? 'multiple' : ''
- let child = buildElSelectChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${el.tag}>`
- },
- 'el-radio-group': el => {
- const { disabled, vModel } = attrBuilder(el)
- const size = `size="${el.size}"`
- let child = buildElRadioGroupChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${vModel} ${size} ${disabled}>${child}</${el.tag}>`
- },
- 'el-checkbox-group': el => {
- const { disabled, vModel } = attrBuilder(el)
- const size = `size="${el.size}"`
- const min = el.min ? `:min="${el.min}"` : ''
- const max = el.max ? `:max="${el.max}"` : ''
- let child = buildElCheckboxGroupChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${el.tag}>`
- },
- 'el-switch': el => {
- const { disabled, vModel } = attrBuilder(el)
- const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
- const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
- const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
- const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
- const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
- const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
-
- return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${el.tag}>`
- },
- 'el-cascader': el => {
- const {
- disabled, vModel, clearable, placeholder, width
- } = attrBuilder(el)
- const options = el.options ? `:options="${el.vModel}Options"` : ''
- const props = el.props ? `:props="${el.vModel}Props"` : ''
- const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
- const filterable = el.filterable ? 'filterable' : ''
- const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
-
- return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${el.tag}>`
- },
- 'el-slider': el => {
- const { disabled, vModel } = attrBuilder(el)
- const min = el.min ? `:min='${el.min}'` : ''
- const max = el.max ? `:max='${el.max}'` : ''
- const step = el.step ? `:step='${el.step}'` : ''
- const range = el.range ? 'range' : ''
- const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
-
- return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${el.tag}>`
- },
- 'el-time-picker': el => {
- const {
- disabled, vModel, clearable, placeholder, width
- } = attrBuilder(el)
- const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
- const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
- const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
- const isRange = el['is-range'] ? 'is-range' : ''
- const format = el.format ? `format="${el.format}"` : ''
- const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
- const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
-
- return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${el.tag}>`
- },
- 'el-date-picker': el => {
- const {
- disabled, vModel, clearable, placeholder, width
- } = attrBuilder(el)
- const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
- const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
- const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
- const format = el.format ? `format="${el.format}"` : ''
- const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
- const type = el.type === 'date' ? '' : `type="${el.type}"`
- const readonly = el.readonly ? 'readonly' : ''
-
- return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${el.tag}>`
- },
- 'el-rate': el => {
- const { disabled, vModel } = attrBuilder(el)
- const max = el.max ? `:max='${el.max}'` : ''
- const allowHalf = el['allow-half'] ? 'allow-half' : ''
- const showText = el['show-text'] ? 'show-text' : ''
- const showScore = el['show-score'] ? 'show-score' : ''
-
- return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}></${el.tag}>`
- },
- 'el-color-picker': el => {
- const { disabled, vModel } = attrBuilder(el)
- const size = `size="${el.size}"`
- const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
- const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
-
- return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${el.tag}>`
- },
- 'el-upload': el => {
- const disabled = el.disabled ? ':disabled=\'true\'' : ''
- const action = el.action ? `:action="${el.vModel}Action"` : ''
- const multiple = el.multiple ? 'multiple' : ''
- const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
- const accept = el.accept ? `accept="${el.accept}"` : ''
- const name = el.name !== 'file' ? `name="${el.name}"` : ''
- const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
- const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"`
- const fileList = `:file-list="${el.vModel}fileList"`
- const ref = `ref="${el.vModel}"`
- let child = buildElUploadChild(el)
-
- if (child) child = `\n${child}\n` // 鎹㈣
- return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${el.tag}>`
- }
-}
-
-function attrBuilder(el) {
- return {
- vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`,
- clearable: el.clearable ? 'clearable' : '',
- placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
- width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
- disabled: el.disabled ? ':disabled=\'true\'' : ''
- }
-}
-
-// el-buttin 瀛愮骇
-function buildElButtonChild(conf) {
- const children = []
- if (conf.default) {
- children.push(conf.default)
- }
- return children.join('\n')
-}
-
-// el-input innerHTML
-function buildElInputChild(conf) {
- const children = []
- if (conf.prepend) {
- children.push(`<template slot="prepend">${conf.prepend}</template>`)
- }
- if (conf.append) {
- children.push(`<template slot="append">${conf.append}</template>`)
- }
- return children.join('\n')
-}
-
-function buildElSelectChild(conf) {
- const children = []
- if (conf.options && conf.options.length) {
- children.push(`<el-option v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`)
- }
- return children.join('\n')
-}
-
-function buildElRadioGroupChild(conf) {
- const children = []
- if (conf.options && conf.options.length) {
- const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio'
- const border = conf.border ? 'border' : ''
- children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :value="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
- }
- return children.join('\n')
-}
-
-function buildElCheckboxGroupChild(conf) {
- const children = []
- if (conf.options && conf.options.length) {
- const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
- const border = conf.border ? 'border' : ''
- children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :value="item.label" :disabled="item.disabled" ${border} />`)
- }
- return children.join('\n')
-}
-
-function buildElUploadChild(conf) {
- const list = []
- if (conf['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>')
- else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${conf.buttonText}</el-button>`)
- if (conf.showTip) list.push(`<div slot="tip" class="el-upload__tip">鍙兘涓婁紶涓嶈秴杩� ${conf.fileSize}${conf.sizeUnit} 鐨�${conf.accept}鏂囦欢</div>`)
- return list.join('\n')
-}
-
-export function makeUpHtml(conf, type) {
- const htmlList = []
- confGlobal = conf
- someSpanIsNot24 = conf.fields.some(item => item.span !== 24)
- conf.fields.forEach(el => {
- htmlList.push(layouts[el.layout](el))
- })
- const htmlStr = htmlList.join('\n')
-
- let temp = buildFormTemplate(conf, htmlStr, type)
- if (type === 'dialog') {
- temp = dialogWrapper(temp)
- }
- confGlobal = null
- return temp
-}
diff --git a/src/utils/generator/icon.json b/src/utils/generator/icon.json
deleted file mode 100644
index 2d9999a..0000000
--- a/src/utils/generator/icon.json
+++ /dev/null
@@ -1 +0,0 @@
-["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"]
\ No newline at end of file
diff --git a/src/utils/generator/js.js b/src/utils/generator/js.js
deleted file mode 100644
index dc38bfe..0000000
--- a/src/utils/generator/js.js
+++ /dev/null
@@ -1,370 +0,0 @@
-import { titleCase } from '@/utils/index'
-import { trigger } from './config'
-// 鏂囦欢澶у皬璁剧疆
-const units = {
- KB: '1024',
- MB: '1024 / 1024',
- GB: '1024 / 1024 / 1024',
-}
-/**
- * @name: 鐢熸垚js闇�瑕佺殑鏁版嵁
- * @description: 鐢熸垚js闇�瑕佺殑鏁版嵁
- * @param {*} conf
- * @param {*} type 寮圭獥鎴栬〃鍗�
- * @return {*}
- */
-export function makeUpJs(conf, type) {
- conf = JSON.parse(JSON.stringify(conf))
- const dataList = []
- const ruleList = []
- const optionsList = []
- const propsList = []
- const methodList = []
- const uploadVarList = []
-
- conf.fields.forEach((el) => {
- buildAttributes(
- el,
- dataList,
- ruleList,
- optionsList,
- methodList,
- propsList,
- uploadVarList
- )
- })
-
- const script = buildexport(
- conf,
- type,
- dataList.join('\n'),
- ruleList.join('\n'),
- optionsList.join('\n'),
- uploadVarList.join('\n'),
- propsList.join('\n'),
- methodList.join('\n')
- )
-
- return script
-}
-/**
- * @name: 鐢熸垚鍙傛暟
- * @description: 鐢熸垚鍙傛暟锛屽寘鎷〃鍗曟暟鎹〃鍗曢獙璇佹暟鎹紝澶氶�夐�夐」鏁版嵁锛屼笂浼犳暟鎹瓑
- * @return {*}
- */
-function buildAttributes(
- el,
- dataList,
- ruleList,
- optionsList,
- methodList,
- propsList,
- uploadVarList
-){
- buildData(el, dataList)
- buildRules(el, ruleList)
-
- if (el.options && el.options.length) {
- buildOptions(el, optionsList)
- if (el.dataType === 'dynamic') {
- const model = `${el.vModel}Options`
- const options = titleCase(model)
- buildOptionMethod(`get${options}`, model, methodList)
- }
- }
-
- if (el.props && el.props.props) {
- buildProps(el, propsList)
- }
-
- if (el.action && el.tag === 'el-upload') {
- uploadVarList.push(
- `
- // 涓婁紶璇锋眰璺緞
- const ${el.vModel}Action = ref('${el.action}')
- // 涓婁紶鏂囦欢鍒楄〃
- const ${el.vModel}fileList = ref([])`
- )
- methodList.push(buildBeforeUpload(el))
- if (!el['auto-upload']) {
- methodList.push(buildSubmitUpload(el))
- }
- }
-
- if (el.children) {
- el.children.forEach((el2) => {
- buildAttributes(
- el2,
- dataList,
- ruleList,
- optionsList,
- methodList,
- propsList,
- uploadVarList
- )
- })
- }
-}
-/**
- * @name: 鐢熸垚琛ㄥ崟鏁版嵁formData
- * @description: 鐢熸垚琛ㄥ崟鏁版嵁formData
- * @param {*} conf
- * @param {*} dataList 鏁版嵁鍒楄〃
- * @return {*}
- */
-function buildData(conf, dataList) {
- if (conf.vModel === undefined) return
- let defaultValue
- if (typeof conf.defaultValue === 'string' && !conf.multiple) {
- defaultValue = `'${conf.defaultValue}'`
- } else {
- defaultValue = `${JSON.stringify(conf.defaultValue)}`
- }
- dataList.push(`${conf.vModel}: ${defaultValue},`)
-}
-/**
- * @name: 鐢熸垚琛ㄥ崟楠岃瘉鏁版嵁rule
- * @description: 鐢熸垚琛ㄥ崟楠岃瘉鏁版嵁rule
- * @param {*} conf
- * @param {*} ruleList 楠岃瘉鏁版嵁鍒楄〃
- * @return {*}
- */
-function buildRules(conf, ruleList) {
- if (conf.vModel === undefined) return
- const rules = []
- if (trigger[conf.tag]) {
- if (conf.required) {
- const type = Array.isArray(conf.defaultValue) ? "type: 'array'," : ''
- let message = Array.isArray(conf.defaultValue)
- ? `璇疯嚦灏戦�夋嫨涓�涓�${conf.vModel}`
- : conf.placeholder
- if (message === undefined) message = `${conf.label}涓嶈兘涓虹┖`
- rules.push(
- `{ required: true, ${type} message: '${message}', trigger: '${
- trigger[conf.tag]
- }' }`
- )
- }
- if (conf.regList && Array.isArray(conf.regList)) {
- conf.regList.forEach((item) => {
- if (item.pattern) {
- rules.push(
- `{ pattern: new RegExp(${item.pattern}), message: '${
- item.message
- }', trigger: '${trigger[conf.tag]}' }`
- )
- }
- })
- }
- ruleList.push(`${conf.vModel}: [${rules.join(',')}],`)
- }
-}
-/**
- * @name: 鐢熸垚閫夐」鏁版嵁
- * @description: 鐢熸垚閫夐」鏁版嵁锛屽崟閫夊閫変笅鎷夌瓑
- * @param {*} conf
- * @param {*} optionsList 閫夐」鏁版嵁鍒楄〃
- * @return {*}
- */
-function buildOptions(conf, optionsList) {
- if (conf.vModel === undefined) return
- if (conf.dataType === 'dynamic') {
- conf.options = []
- }
- const str = `const ${conf.vModel}Options = ref(${JSON.stringify(conf.options)})`
- optionsList.push(str)
-}
-/**
- * @name: 鐢熸垚鏂规硶
- * @description: 鐢熸垚鏂规硶
- * @param {*} methodName 鏂规硶鍚�
- * @param {*} model
- * @param {*} methodList 鏂规硶鍒楄〃
- * @return {*}
- */
-function buildOptionMethod(methodName, model, methodList) {
- const str = `function ${methodName}() {
- // TODO 鍙戣捣璇锋眰鑾峰彇鏁版嵁
- ${model}.value
- }`
- methodList.push(str)
-}
-/**
- * @name: 鐢熸垚琛ㄥ崟缁勪欢闇�瑕佺殑props璁剧疆
- * @description: 鐢熸垚琛ㄥ崟缁勪欢闇�瑕佺殑props璁剧疆锛屽锛涚骇鑱旂粍浠�
- * @param {*} conf
- * @param {*} propsList
- * @return {*}
- */
-function buildProps(conf, propsList) {
- if (conf.dataType === 'dynamic') {
- conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey)
- conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey)
- conf.childrenKey !== 'children' &&
- (conf.props.props.children = conf.childrenKey)
- }
- const str = `
- // props璁剧疆
- const ${conf.vModel}Props = ref(${JSON.stringify(conf.props.props)})`
- propsList.push(str)
-}
-/**
- * @name: 鐢熸垚涓婁紶缁勪欢鐨勭浉鍏冲唴瀹�
- * @description: 鐢熸垚涓婁紶缁勪欢鐨勭浉鍏冲唴瀹�
- * @param {*} conf
- * @return {*}
- */
-function buildBeforeUpload(conf) {
- const unitNum = units[conf.sizeUnit]
- let rightSizeCode = ''
- let acceptCode = ''
- const returnList = []
- if (conf.fileSize) {
- rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize}
- if(!isRightSize){
- proxy.$modal.msgError('鏂囦欢澶у皬瓒呰繃 ${conf.fileSize}${conf.sizeUnit}')
- }`
- returnList.push('isRightSize')
- }
- if (conf.accept) {
- acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type)
- if(!isAccept){
- proxy.$modal.msgError('搴旇閫夋嫨${conf.accept}绫诲瀷鐨勬枃浠�')
- }`
- returnList.push('isAccept')
- }
- const str = `
- /**
- * @name: 涓婁紶涔嬪墠鐨勬枃浠跺垽鏂�
- * @description: 涓婁紶涔嬪墠鐨勬枃浠跺垽鏂紝鍒ゆ柇鏂囦欢澶у皬鏂囦欢绫诲瀷绛�
- * @param {*} file
- * @return {*}
- */
- function ${conf.vModel}BeforeUpload(file) {
- ${rightSizeCode}
- ${acceptCode}
- return ${returnList.join('&&')}
- }`
- return returnList.length ? str : ''
-}
-/**
- * @name: 鐢熸垚鎻愪氦琛ㄥ崟鏂规硶
- * @description: 鐢熸垚鎻愪氦琛ㄥ崟鏂规硶
- * @param {Object} conf vModel 琛ㄥ崟ref
- * @return {*}
- */
-function buildSubmitUpload(conf) {
- const str = `function submitUpload() {
- this.$refs['${conf.vModel}'].submit()
- }`
- return str
-}
-/**
- * @name: 缁勮js浠g爜
- * @description: 缁勮js浠g爜鏂规硶
- * @return {*}
- */
-function buildexport(
- conf,
- type,
- data,
- rules,
- selectOptions,
- uploadVar,
- props,
- methods
-) {
- let str = `
- const { proxy } = getCurrentInstance()
- const ${conf.formRef} = ref()
- const data = reactive({
- ${conf.formModel}: {
- ${data}
- },
- ${conf.formRules}: {
- ${rules}
- }
- })
-
- const {${conf.formModel}, ${conf.formRules}} = toRefs(data)
-
- ${selectOptions}
-
- ${uploadVar}
-
- ${props}
-
- ${methods}
- `
-
- if(type === 'dialog') {
- str += `
- // 寮圭獥璁剧疆
- const dialogVisible = defineModel()
- // 寮圭獥纭鍥炶皟
- const emit = defineEmits(['confirm'])
- /**
- * @name: 寮圭獥鎵撳紑鍚庢墽琛�
- * @description: 寮圭獥鎵撳紑鍚庢墽琛屾柟娉�
- * @return {*}
- */
- function onOpen(){
-
- }
- /**
- * @name: 寮圭獥鍏抽棴鏃舵墽琛�
- * @description: 寮圭獥鍏抽棴鏂规硶锛岄噸缃〃鍗�
- * @return {*}
- */
- function onClose(){
- ${conf.formRef}.value.resetFields()
- }
- /**
- * @name: 寮圭獥鍙栨秷
- * @description: 寮圭獥鍙栨秷鏂规硶
- * @return {*}
- */
- function close(){
- dialogVisible.value = false
- }
- /**
- * @name: 寮圭獥琛ㄥ崟鎻愪氦
- * @description: 寮圭獥琛ㄥ崟鎻愪氦鏂规硶
- * @return {*}
- */
- function handelConfirm(){
- ${conf.formRef}.value.validate((valid) => {
- if (!valid) return
- // TODO 鎻愪氦琛ㄥ崟
-
- close()
- // 鍥炶皟鐖剁骇缁勪欢
- emit('confirm')
- })
- }
- `
- } else {
- str += `
- /**
- * @name: 琛ㄥ崟鎻愪氦
- * @description: 琛ㄥ崟鎻愪氦鏂规硶
- * @return {*}
- */
- function submitForm() {
- ${conf.formRef}.value.validate((valid) => {
- if (!valid) return
- // TODO 鎻愪氦琛ㄥ崟
- })
- }
- /**
- * @name: 琛ㄥ崟閲嶇疆
- * @description: 琛ㄥ崟閲嶇疆鏂规硶
- * @return {*}
- */
- function resetForm() {
- ${conf.formRef}.value.resetFields()
- }
- `
- }
- return str
-}
diff --git a/src/utils/generator/render.js b/src/utils/generator/render.js
deleted file mode 100644
index d6d4414..0000000
--- a/src/utils/generator/render.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { makeMap } from '@/utils/index'
-
-const isAttr = makeMap(
- 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' +
- 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' +
- 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' +
- 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' +
- 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' +
- 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' +
- 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' +
- 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' +
- 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' +
- 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' +
- 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' +
- 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' +
- 'target,title,type,usemap,value,width,wrap' + 'prefix-icon'
-)
-const isNotProps = makeMap(
- 'layout,prepend,regList,tag,document,changeTag,defaultValue'
-)
-
-function useVModel(props, emit) {
- return {
- modelValue: props.defaultValue,
- 'onUpdate:modelValue': (val) => emit('update:modelValue', val),
- }
-}
-const componentChild = {
- 'el-button': {
- default(h, conf, key) {
- return conf[key]
- },
- },
- 'el-select': {
- options(h, conf, key) {
- return conf.options.map(item => h(resolveComponent('el-option'), {
- label: item.label,
- value: item.value,
- }))
- }
- },
- 'el-radio-group': {
- options(h, conf, key) {
- return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), {
- label: item.value,
- }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-radio'), {
- label: item.value,
- border: conf.border,
- }, () => item.label))
- }
- },
- 'el-checkbox-group': {
- options(h, conf, key) {
- return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), {
- label: item.value,
- }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-checkbox'), {
- label: item.value,
- border: conf.border,
- }, () => item.label))
- }
- },
- 'el-upload': {
- 'list-type': (h, conf, key) => {
- const option = {}
- // if (conf.showTip) {
- // tip = h('div', {
- // class: "el-upload__tip"
- // }, () => '鍙兘涓婁紶涓嶈秴杩�' + conf.fileSize + conf.sizeUnit + '鐨�' + conf.accept + '鏂囦欢')
- // }
- if (conf['list-type'] === 'picture-card') {
- return h(resolveComponent('el-icon'), option, () => h(resolveComponent('Plus')))
- } else {
- // option.size = "small"
- option.type = "primary"
- option.icon = "Upload"
- return h(resolveComponent('el-button'), option, () => conf.buttonText)
- }
- },
-
- }
-}
-const componentSlot = {
- 'el-upload': {
- 'tip': (h, conf, key) => {
- if (conf.showTip) {
- return () => h('div', {
- class: "el-upload__tip"
- }, '鍙兘涓婁紶涓嶈秴杩�' + conf.fileSize + conf.sizeUnit + '鐨�' + conf.accept + '鏂囦欢')
- }
- },
- }
-}
-export default defineComponent({
-
- // 浣跨敤 render 鍑芥暟
- render() {
- const dataObject = {
- attrs: {},
- props: {},
- on: {},
- style: {}
- }
- const confClone = JSON.parse(JSON.stringify(this.conf))
- const children = []
- const slot = {}
- const childObjs = componentChild[confClone.tag]
- if (childObjs) {
- Object.keys(childObjs).forEach(key => {
- const childFunc = childObjs[key]
- if (confClone[key]) {
- children.push(childFunc(h, confClone, key))
- }
- })
- }
- const slotObjs = componentSlot[confClone.tag]
- if (slotObjs) {
- Object.keys(slotObjs).forEach(key => {
- const childFunc = slotObjs[key]
- if (confClone[key]) {
- slot[key] = childFunc(h, confClone, key)
- }
- })
- }
- Object.keys(confClone).forEach(key => {
- const val = confClone[key]
- if (dataObject[key]) {
- dataObject[key] = val
- } else if (isAttr(key)) {
- dataObject.attrs[key] = val
- } else if (!isNotProps(key)) {
- dataObject.props[key] = val
- }
- })
- if(children.length > 0){
- slot.default = () => children
- }
-
- return h(resolveComponent(this.conf.tag),
- {
- modelValue: this.$attrs.modelValue,
- ...dataObject.props,
- ...dataObject.attrs,
- style: {
- ...dataObject.style
- },
- }
- , slot ?? null)
- },
- props: {
- conf: {
- type: Object,
- required: true,
- },
- }
-})
\ No newline at end of file
diff --git a/src/utils/index.js b/src/utils/index.js
deleted file mode 100644
index e522c3c..0000000
--- a/src/utils/index.js
+++ /dev/null
@@ -1,398 +0,0 @@
-import { parseTime } from "./ruoyi";
-
-/**
- * 琛ㄦ牸鏃堕棿鏍煎紡鍖�
- */
-export function formatDate(cellValue) {
- if (cellValue == null || cellValue == "") return "";
- var date = new Date(cellValue);
- var year = date.getFullYear();
- var month =
- date.getMonth() + 1 < 10
- ? "0" + (date.getMonth() + 1)
- : date.getMonth() + 1;
- var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
- var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
- var minutes =
- date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
- var seconds =
- date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
- return (
- year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds
- );
-}
-
-/**
- * @param {number} time
- * @param {string} option
- * @returns {string}
- */
-export function formatTime(time, option) {
- if (("" + time).length === 10) {
- time = parseInt(time) * 1000;
- } else {
- time = +time;
- }
- const d = new Date(time);
- const now = Date.now();
-
- const diff = (now - d) / 1000;
-
- if (diff < 30) {
- return "鍒氬垰";
- } else if (diff < 3600) {
- // less 1 hour
- return Math.ceil(diff / 60) + "鍒嗛挓鍓�";
- } else if (diff < 3600 * 24) {
- return Math.ceil(diff / 3600) + "灏忔椂鍓�";
- } else if (diff < 3600 * 24 * 2) {
- return "1澶╁墠";
- }
- if (option) {
- return parseTime(time, option);
- } else {
- return (
- d.getMonth() +
- 1 +
- "鏈�" +
- d.getDate() +
- "鏃�" +
- d.getHours() +
- "鏃�" +
- d.getMinutes() +
- "鍒�"
- );
- }
-}
-
-/**
- * @param {string} url
- * @returns {Object}
- */
-export function getQueryObject(url) {
- url = url == null ? window.location.href : url;
- const search = url.substring(url.lastIndexOf("?") + 1);
- const obj = {};
- const reg = /([^?&=]+)=([^?&=]*)/g;
- search.replace(reg, (rs, $1, $2) => {
- const name = decodeURIComponent($1);
- let val = decodeURIComponent($2);
- val = String(val);
- obj[name] = val;
- return rs;
- });
- return obj;
-}
-
-/**
- * @param {string} input value
- * @returns {number} output value
- */
-export function byteLength(str) {
- // returns the byte length of an utf8 string
- let s = str.length;
- for (var i = str.length - 1; i >= 0; i--) {
- const code = str.charCodeAt(i);
- if (code > 0x7f && code <= 0x7ff) s++;
- else if (code > 0x7ff && code <= 0xffff) s += 2;
- if (code >= 0xdc00 && code <= 0xdfff) i--;
- }
- return s;
-}
-
-/**
- * @param {Array} actual
- * @returns {Array}
- */
-export function cleanArray(actual) {
- const newArray = [];
- for (let i = 0; i < actual.length; i++) {
- if (actual[i]) {
- newArray.push(actual[i]);
- }
- }
- return newArray;
-}
-
-/**
- * @param {Object} json
- * @returns {Array}
- */
-export function param(json) {
- if (!json) return "";
- return cleanArray(
- Object.keys(json).map((key) => {
- if (json[key] === undefined) return "";
- return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]);
- })
- ).join("&");
-}
-
-/**
- * @param {string} url
- * @returns {Object}
- */
-export function param2Obj(url) {
- const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " ");
- if (!search) {
- return {};
- }
- const obj = {};
- const searchArr = search.split("&");
- searchArr.forEach((v) => {
- const index = v.indexOf("=");
- if (index !== -1) {
- const name = v.substring(0, index);
- const val = v.substring(index + 1, v.length);
- obj[name] = val;
- }
- });
- return obj;
-}
-
-/**
- * @param {string} val
- * @returns {string}
- */
-export function html2Text(val) {
- const div = document.createElement("div");
- div.innerHTML = val;
- return div.textContent || div.innerText;
-}
-
-/**
- * Merges two objects, giving the last one precedence
- * @param {Object} target
- * @param {(Object|Array)} source
- * @returns {Object}
- */
-export function objectMerge(target, source) {
- if (typeof target !== "object") {
- target = {};
- }
- if (Array.isArray(source)) {
- return source.slice();
- }
- Object.keys(source).forEach((property) => {
- const sourceProperty = source[property];
- if (typeof sourceProperty === "object") {
- target[property] = objectMerge(target[property], sourceProperty);
- } else {
- target[property] = sourceProperty;
- }
- });
- return target;
-}
-
-/**
- * @param {HTMLElement} element
- * @param {string} className
- */
-export function toggleClass(element, className) {
- if (!element || !className) {
- return;
- }
- let classString = element.className;
- const nameIndex = classString.indexOf(className);
- if (nameIndex === -1) {
- classString += "" + className;
- } else {
- classString =
- classString.substr(0, nameIndex) +
- classString.substr(nameIndex + className.length);
- }
- element.className = classString;
-}
-
-/**
- * @param {string} type
- * @returns {Date}
- */
-export function getTime(type) {
- if (type === "start") {
- return new Date().getTime() - 3600 * 1000 * 24 * 90;
- } else {
- return new Date(new Date().toDateString());
- }
-}
-
-/**
- * @param {Function} func
- * @param {number} wait
- * @param {boolean} immediate
- * @return {*}
- */
-export function debounce(func, wait, immediate) {
- let timeout, args, context, timestamp, result;
-
- const later = function () {
- // 鎹笂涓�娆¤Е鍙戞椂闂撮棿闅�
- const last = +new Date() - timestamp;
-
- // 涓婃琚寘瑁呭嚱鏁拌璋冪敤鏃堕棿闂撮殧 last 灏忎簬璁惧畾鏃堕棿闂撮殧 wait
- if (last < wait && last > 0) {
- timeout = setTimeout(later, wait - last);
- } else {
- timeout = null;
- // 濡傛灉璁惧畾涓篿mmediate===true锛屽洜涓哄紑濮嬭竟鐣屽凡缁忚皟鐢ㄨ繃浜嗘澶勬棤闇�璋冪敤
- if (!immediate) {
- result = func.apply(context, args);
- if (!timeout) context = args = null;
- }
- }
- };
-
- return function (...args) {
- context = this;
- timestamp = +new Date();
- const callNow = immediate && !timeout;
- // 濡傛灉寤舵椂涓嶅瓨鍦紝閲嶆柊璁惧畾寤舵椂
- if (!timeout) timeout = setTimeout(later, wait);
- if (callNow) {
- result = func.apply(context, args);
- context = args = null;
- }
-
- return result;
- };
-}
-
-/**
- * This is just a simple version of deep copy
- * Has a lot of edge cases bug
- * If you want to use a perfect deep copy, use lodash's _.cloneDeep
- * @param {Object} source
- * @returns {Object}
- */
-export function deepClone(source) {
- if (!source && typeof source !== "object") {
- throw new Error("error arguments", "deepClone");
- }
- const targetObj = source.constructor === Array ? [] : {};
- Object.keys(source).forEach((keys) => {
- if (source[keys] && typeof source[keys] === "object") {
- targetObj[keys] = deepClone(source[keys]);
- } else {
- targetObj[keys] = source[keys];
- }
- });
- return targetObj;
-}
-
-/**
- * @param {Array} arr
- * @returns {Array}
- */
-export function uniqueArr(arr) {
- return Array.from(new Set(arr));
-}
-
-/**
- * @returns {string}
- */
-export function createUniqueString() {
- const timestamp = +new Date() + "";
- const randomNum = parseInt((1 + Math.random()) * 65536) + "";
- return (+(randomNum + timestamp)).toString(32);
-}
-
-/**
- * Check if an element has a class
- * @param {HTMLElement} elm
- * @param {string} cls
- * @returns {boolean}
- */
-export function hasClass(ele, cls) {
- return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
-}
-
-/**
- * Add class to element
- * @param {HTMLElement} elm
- * @param {string} cls
- */
-export function addClass(ele, cls) {
- if (!hasClass(ele, cls)) ele.className += " " + cls;
-}
-
-/**
- * Remove class from element
- * @param {HTMLElement} elm
- * @param {string} cls
- */
-export function removeClass(ele, cls) {
- if (hasClass(ele, cls)) {
- const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
- ele.className = ele.className.replace(reg, " ");
- }
-}
-
-export function makeMap(str, expectsLowerCase) {
- const map = Object.create(null);
- const list = str.split(",");
- for (let i = 0; i < list.length; i++) {
- map[list[i]] = true;
- }
- return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val];
-}
-
-export const exportDefault = "export default ";
-
-export const beautifierConf = {
- html: {
- indent_size: "2",
- indent_char: " ",
- max_preserve_newlines: "-1",
- preserve_newlines: false,
- keep_array_indentation: false,
- break_chained_methods: false,
- indent_scripts: "separate",
- brace_style: "end-expand",
- space_before_conditional: true,
- unescape_strings: false,
- jslint_happy: false,
- end_with_newline: true,
- wrap_line_length: "110",
- indent_inner_html: true,
- comma_first: false,
- e4x: true,
- indent_empty_lines: true,
- },
- js: {
- indent_size: "2",
- indent_char: " ",
- max_preserve_newlines: "-1",
- preserve_newlines: false,
- keep_array_indentation: false,
- break_chained_methods: false,
- indent_scripts: "normal",
- brace_style: "end-expand",
- space_before_conditional: true,
- unescape_strings: false,
- jslint_happy: true,
- end_with_newline: true,
- wrap_line_length: "110",
- indent_inner_html: true,
- comma_first: false,
- e4x: true,
- indent_empty_lines: true,
- },
-};
-
-// 棣栧瓧姣嶅ぇ灏�
-export function titleCase(str) {
- return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
-}
-
-// 涓嬪垝杞┘宄�
-export function camelCase(str) {
- return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase());
-}
-
-export function isNumberStr(str) {
- return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str);
-}
-
-export function isEqual(obj1, obj2) {
- return JSON.stringify(obj1) === JSON.stringify(obj2);
-}
diff --git a/src/utils/jsencrypt.js b/src/utils/jsencrypt.js
deleted file mode 100644
index 9f3a280..0000000
--- a/src/utils/jsencrypt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
-
-// 瀵嗛挜瀵圭敓鎴� http://web.chacuo.net/netrsakeypair
-
-const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
- 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
-
-const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
- '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
- 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
- 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
- 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
- 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
- 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
- 'UP8iWi1Qw0Y='
-
-// 鍔犲瘑
-export function encrypt(txt) {
- const encryptor = new JSEncrypt()
- encryptor.setPublicKey(publicKey) // 璁剧疆鍏挜
- return encryptor.encrypt(txt) // 瀵规暟鎹繘琛屽姞瀵�
-}
-
-// 瑙e瘑
-export function decrypt(txt) {
- const encryptor = new JSEncrypt()
- encryptor.setPrivateKey(privateKey) // 璁剧疆绉侀挜
- return encryptor.decrypt(txt) // 瀵规暟鎹繘琛岃В瀵�
-}
-
diff --git a/src/utils/permission.js b/src/utils/permission.js
deleted file mode 100644
index c736c0c..0000000
--- a/src/utils/permission.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import useUserStore from '@/store/modules/user'
-
-/**
- * 瀛楃鏉冮檺鏍¢獙
- * @param {Array} value 鏍¢獙鍊�
- * @returns {Boolean}
- */
-export function checkPermi(value) {
- if (value && value instanceof Array && value.length > 0) {
- const permissions = useUserStore().permissions
- const permissionDatas = value
- const all_permission = "*:*:*"
-
- const hasPermission = permissions.some(permission => {
- return all_permission === permission || permissionDatas.includes(permission)
- })
-
- if (!hasPermission) {
- return false
- }
- return true
- } else {
- console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
- return false
- }
-}
-
-/**
- * 瑙掕壊鏉冮檺鏍¢獙
- * @param {Array} value 鏍¢獙鍊�
- * @returns {Boolean}
- */
-export function checkRole(value) {
- if (value && value instanceof Array && value.length > 0) {
- const roles = useUserStore().roles
- const permissionRoles = value
- const super_admin = "admin"
-
- const hasRole = roles.some(role => {
- return super_admin === role || permissionRoles.includes(role)
- })
-
- if (!hasRole) {
- return false
- }
- return true
- } else {
- console.error(`need roles! Like checkRole="['admin','editor']"`)
- return false
- }
-}
\ No newline at end of file
diff --git a/src/utils/region.js b/src/utils/region.js
new file mode 100644
index 0000000..d565281
--- /dev/null
+++ b/src/utils/region.js
@@ -0,0 +1,77 @@
+/**
+ * 琛屾斂鍖哄垝鏁版嵁锛堢渷/甯備袱绾э級
+ *
+ * 鐢ㄩ�旓細濉〃閰嶇疆涓�岀渷浠姐�嶃�屽煄甯傘�嶄袱绉嶅瓧娈电被鍨嬬殑閫夐」鏉ユ簮锛屽煄甯傞殢鐪佷唤浜岀骇鑱斿姩銆�
+ * 鍙栧�间竴寰嬬敤涓枃鍚嶇О锛堜笌 companyNature / industryType 绛夊瓧娈靛瓨涓枃鍊肩殑绾﹀畾涓�鑷达級锛�
+ * 渚夸簬鍒楄〃鐩磋涓� Excel 瀵煎嚭锛屾棤闇�鍐嶅仛鐮佸�肩炕璇戙��
+ *
+ * 鏁版嵁涓洪潤鎬佸唴缃細鐪佸競涓ょ骇鍖哄垝鏋佸皯鍙樺姩锛屽閬囪皟鏁寸洿鎺ユ敼鏈枃浠跺嵆鍙��
+ *
+ * 娉ㄦ剰锛氭湰鏂囦欢涓� ruoyi-ui/src/utils/region.js 鍐呭涓�鑷达紙涓や釜宸ョ▼鐙珛鎵撳寘锛屾棤娉曞叡浜ā鍧楋級銆�
+ * 淇敼琛屾斂鍖哄垝鏁版嵁鏃惰鍚屾涓よ竟锛屽惁鍒欏悗鍙伴厤缃殑鍙�夐」涓庡皬绋嬪簭绔細瀵逛笉涓娿��
+ */
+
+/** 鐪佺骇琛屾斂鍖猴紙34 涓細23 鐪� + 5 鑷不鍖� + 4 鐩磋緰甯� + 2 鐗瑰埆琛屾斂鍖猴級 */
+export const PROVINCES = [
+ '鍖椾含甯�', '澶╂触甯�', '娌冲寳鐪�', '灞辫タ鐪�', '鍐呰挋鍙よ嚜娌诲尯',
+ '杈藉畞鐪�', '鍚夋灄鐪�', '榛戦緳姹熺渷', '涓婃捣甯�', '姹熻嫃鐪�',
+ '娴欐睙鐪�', '瀹夊窘鐪�', '绂忓缓鐪�', '姹熻タ鐪�', '灞变笢鐪�',
+ '娌冲崡鐪�', '婀栧寳鐪�', '婀栧崡鐪�', '骞夸笢鐪�', '骞胯タ澹棌鑷不鍖�',
+ '娴峰崡鐪�', '閲嶅簡甯�', '鍥涘窛鐪�', '璐靛窞鐪�', '浜戝崡鐪�',
+ '瑗胯棌鑷不鍖�', '闄曡タ鐪�', '鐢樿們鐪�', '闈掓捣鐪�', '瀹佸鍥炴棌鑷不鍖�',
+ '鏂扮枂缁村惥灏旇嚜娌诲尯', '鍙版咕鐪�', '棣欐腐鐗瑰埆琛屾斂鍖�', '婢抽棬鐗瑰埆琛屾斂鍖�'
+]
+
+/** 鐪� 鈫� 鍦板競銆傜洿杈栧競鍒楁墍杈栬鏀垮尯銆佹腐婢冲垪鍖�/鍫傚尯銆佸彴婀惧垪鍘垮競锛堝彛寰勪笌闄勮〃銆婄渷甯傚悕绉般�嬩竴鑷达級 */
+export const CITIES = {
+ 鍖椾含甯�: ['涓滃煄鍖�', '瑗垮煄鍖�', '鏈濋槼鍖�', '涓板彴鍖�', '鐭虫櫙灞卞尯', '娴锋穩鍖�', '闂ㄥご娌熷尯', '鎴垮北鍖�', '閫氬窞鍖�', '椤轰箟鍖�', '鏄屽钩鍖�', '澶у叴鍖�', '鎬�鏌斿尯', '骞宠胺鍖�', '瀵嗕簯鍖�', '寤跺簡鍖�'],
+ 澶╂触甯�: ['鍜屽钩鍖�', '娌充笢鍖�', '娌宠タ鍖�', '鍗楀紑鍖�', '娌冲寳鍖�', '绾㈡ˉ鍖�', '涓滀附鍖�', '瑗块潚鍖�', '娲ュ崡鍖�', '鍖楄景鍖�', '姝︽竻鍖�', '瀹濆澔鍖�', '婊ㄦ捣鏂板尯', '瀹佹渤鍖�', '闈欐捣鍖�', '钃熷窞鍖�'],
+ 涓婃捣甯�: ['榛勬郸鍖�', '寰愭眹鍖�', '闀垮畞鍖�', '闈欏畨鍖�', '鏅檧鍖�', '铏瑰彛鍖�', '鏉ㄦ郸鍖�', '闂佃鍖�', '瀹濆北鍖�', '鍢夊畾鍖�', '娴︿笢鏂板尯', '閲戝北鍖�', '鏉炬睙鍖�', '闈掓郸鍖�', '濂夎搐鍖�', '宕囨槑鍖�'],
+ 閲嶅簡甯�: ['涓囧窞鍖�', '娑櫟鍖�', '娓濅腑鍖�', '澶ф浮鍙e尯', '姹熷寳鍖�', '娌欏潽鍧濆尯', '涔濋緳鍧″尯', '鍗楀哺鍖�', '鍖楃鍖�', '缍︽睙鍖�', '澶ц冻鍖�', '娓濆寳鍖�', '宸村崡鍖�', '榛旀睙鍖�', '闀垮鍖�', '姹熸触鍖�', '鍚堝窛鍖�', '姘稿窛鍖�', '鍗楀窛鍖�', '鐠у北鍖�', '閾滄鍖�', '娼煎崡鍖�', '鑽f槍鍖�', '寮�宸炲尯', '姊佸钩鍖�', '姝﹂殕鍖�', '鍩庡彛鍘�', '涓伴兘鍘�', '鍨睙鍘�', '蹇犲幙', '浜戦槼鍘�', '濂夎妭鍘�', '宸北鍘�', '宸邯鍘�', '鐭虫煴鍦熷鏃忚嚜娌诲幙', '绉�灞卞湡瀹舵棌鑻楁棌鑷不鍘�', '閰夐槼鍦熷鏃忚嫍鏃忚嚜娌诲幙', '褰按鑻楁棌鍦熷鏃忚嚜娌诲幙'],
+ 娌冲寳鐪�: ['鐭冲搴勫競', '鍞愬北甯�', '绉︾殗宀涘競', '閭兏甯�', '閭㈠彴甯�', '淇濆畾甯�', '寮犲鍙e競', '鎵垮痉甯�', '娌у窞甯�', '寤婂潑甯�', '琛℃按甯�'],
+ 灞辫タ鐪�: ['澶師甯�', '澶у悓甯�', '闃虫硥甯�', '闀挎不甯�', '鏅嬪煄甯�', '鏈斿窞甯�', '鏅嬩腑甯�', '杩愬煄甯�', '蹇诲窞甯�', '涓存本甯�', '鍚曟甯�'],
+ 鍐呰挋鍙よ嚜娌诲尯: ['鍛煎拰娴╃壒甯�', '鍖呭ご甯�', '涔屾捣甯�', '璧ゅ嘲甯�', '閫氳窘甯�', '閯傚皵澶氭柉甯�', '鍛间鸡璐濆皵甯�', '宸村溅娣栧皵甯�', '涔屽叞瀵熷竷甯�', '鍏村畨鐩�', '閿℃灄閮嫆鐩�', '闃挎媺鍠勭洘'],
+ 杈藉畞鐪�: ['娌堥槼甯�', '澶ц繛甯�', '闉嶅北甯�', '鎶氶『甯�', '鏈邯甯�', '涓逛笢甯�', '閿﹀窞甯�', '钀ュ彛甯�', '闃滄柊甯�', '杈介槼甯�', '鐩橀敠甯�', '閾佸箔甯�', '鏈濋槼甯�', '钁姦宀涘競'],
+ 鍚夋灄鐪�: ['闀挎槬甯�', '鍚夋灄甯�', '鍥涘钩甯�', '杈芥簮甯�', '閫氬寲甯�', '鐧藉北甯�', '鏉惧師甯�', '鐧藉煄甯�', '寤惰竟鏈濋矞鏃忚嚜娌诲窞'],
+ 榛戦緳姹熺渷: ['鍝堝皵婊ㄥ競', '榻愰綈鍝堝皵甯�', '楦¤タ甯�', '楣ゅ矖甯�', '鍙岄腑灞卞競', '澶у簡甯�', '浼婃槬甯�', '浣虫湪鏂競', '涓冨彴娌冲競', '鐗′腹姹熷競', '榛戞渤甯�', '缁ュ寲甯�', '澶у叴瀹夊箔鍦板尯'],
+ 姹熻嫃鐪�: ['鍗椾含甯�', '鏃犻敗甯�', '寰愬窞甯�', '甯稿窞甯�', '鑻忓窞甯�', '鍗楅�氬競', '杩炰簯娓競', '娣畨甯�', '鐩愬煄甯�', '鎵窞甯�', '闀囨睙甯�', '娉板窞甯�', '瀹胯縼甯�'],
+ 娴欐睙鐪�: ['鏉窞甯�', '瀹佹尝甯�', '娓╁窞甯�', '鍢夊叴甯�', '婀栧窞甯�', '缁嶅叴甯�', '閲戝崕甯�', '琛㈠窞甯�', '鑸熷北甯�', '鍙板窞甯�', '涓芥按甯�'],
+ 瀹夊窘鐪�: ['鍚堣偉甯�', '鑺滄箹甯�', '铓屽煚甯�', '娣崡甯�', '椹瀺灞卞競', '娣寳甯�', '閾滈櫟甯�', '瀹夊簡甯�', '榛勫北甯�', '婊佸窞甯�', '闃滈槼甯�', '瀹垮窞甯�', '鍏畨甯�', '浜冲窞甯�', '姹犲窞甯�', '瀹e煄甯�'],
+ 绂忓缓鐪�: ['绂忓窞甯�', '鍘﹂棬甯�', '鑾嗙敯甯�', '涓夋槑甯�', '娉夊窞甯�', '婕冲窞甯�', '鍗楀钩甯�', '榫欏博甯�', '瀹佸痉甯�'],
+ 姹熻タ鐪�: ['鍗楁槍甯�', '鏅痉闀囧競', '钀嶄埂甯�', '涔濇睙甯�', '鏂颁綑甯�', '楣版江甯�', '璧e窞甯�', '鍚夊畨甯�', '瀹滄槬甯�', '鎶氬窞甯�', '涓婇ザ甯�'],
+ 灞变笢鐪�: ['娴庡崡甯�', '闈掑矝甯�', '娣勫崥甯�', '鏋e簞甯�', '涓滆惀甯�', '鐑熷彴甯�', '娼嶅潑甯�', '娴庡畞甯�', '娉板畨甯�', '濞佹捣甯�', '鏃ョ収甯�', '涓存矀甯�', '寰峰窞甯�', '鑱婂煄甯�', '婊ㄥ窞甯�', '鑿忔辰甯�'],
+ 娌冲崡鐪�: ['閮戝窞甯�', '寮�灏佸競', '娲涢槼甯�', '骞抽《灞卞競', '瀹夐槼甯�', '楣ゅ甯�', '鏂颁埂甯�', '鐒︿綔甯�', '婵槼甯�', '璁告槍甯�', '婕渤甯�', '涓夐棬宄″競', '鍗楅槼甯�', '鍟嗕笜甯�', '淇¢槼甯�', '鍛ㄥ彛甯�', '椹婚┈搴楀競', '娴庢簮甯�'],
+ 婀栧寳鐪�: ['姝︽眽甯�', '榛勭煶甯�', '鍗佸牥甯�', '瀹滄槍甯�', '瑗勯槼甯�', '閯傚窞甯�', '鑽嗛棬甯�', '瀛濇劅甯�', '鑽嗗窞甯�', '榛勫唸甯�', '鍜稿畞甯�', '闅忓窞甯�', '鎭╂柦鍦熷鏃忚嫍鏃忚嚜娌诲窞', '浠欐甯�', '娼滄睙甯�', '澶╅棬甯�', '绁炲啘鏋舵灄鍖�'],
+ 婀栧崡鐪�: ['闀挎矙甯�', '鏍床甯�', '婀樻江甯�', '琛¢槼甯�', '閭甸槼甯�', '宀抽槼甯�', '甯稿痉甯�', '寮犲鐣屽競', '鐩婇槼甯�', '閮村窞甯�', '姘稿窞甯�', '鎬�鍖栧競', '濞勫簳甯�', '婀樿タ鍦熷鏃忚嫍鏃忚嚜娌诲窞'],
+ 骞夸笢鐪�: ['骞垮窞甯�', '闊跺叧甯�', '娣卞湷甯�', '鐝犳捣甯�', '姹曞ご甯�', '浣涘北甯�', '姹熼棬甯�', '婀涙睙甯�', '鑼傚悕甯�', '鑲囧簡甯�', '鎯犲窞甯�', '姊呭窞甯�', '姹曞熬甯�', '娌虫簮甯�', '闃虫睙甯�', '娓呰繙甯�', '涓滆帪甯�', '涓北甯�', '娼窞甯�', '鎻槼甯�', '浜戞诞甯�'],
+ 骞胯タ澹棌鑷不鍖�: ['鍗楀畞甯�', '鏌冲窞甯�', '妗傛灄甯�', '姊у窞甯�', '鍖楁捣甯�', '闃插煄娓競', '閽﹀窞甯�', '璐垫腐甯�', '鐜夋灄甯�', '鐧捐壊甯�', '璐哄窞甯�', '娌虫睜甯�', '鏉ュ甯�', '宕囧乏甯�'],
+ 娴峰崡鐪�: ['娴峰彛甯�', '涓変簹甯�', '涓夋矙甯�', '鍎嬪窞甯�'],
+ 鍥涘窛鐪�: ['鎴愰兘甯�', '鑷础甯�', '鏀�鏋濊姳甯�', '娉稿窞甯�', '寰烽槼甯�', '缁甸槼甯�', '骞垮厓甯�', '閬傚畞甯�', '鍐呮睙甯�', '涔愬北甯�', '鍗楀厖甯�', '鐪夊北甯�', '瀹滃甯�', '骞垮畨甯�', '杈惧窞甯�', '闆呭畨甯�', '宸翠腑甯�', '璧勯槼甯�', '闃垮潩钘忔棌缇屾棌鑷不宸�', '鐢樺瓬钘忔棌鑷不宸�', '鍑夊北褰濇棌鑷不宸�'],
+ 璐靛窞鐪�: ['璐甸槼甯�', '鍏洏姘村競', '閬典箟甯�', '瀹夐『甯�', '姣曡妭甯�', '閾滀粊甯�', '榛旇タ鍗楀竷渚濇棌鑻楁棌鑷不宸�', '榛斾笢鍗楄嫍鏃忎緱鏃忚嚜娌诲窞', '榛斿崡甯冧緷鏃忚嫍鏃忚嚜娌诲窞'],
+ 浜戝崡鐪�: ['鏄嗘槑甯�', '鏇查潠甯�', '鐜夋邯甯�', '淇濆北甯�', '鏄�氬競', '涓芥睙甯�', '鏅幢甯�', '涓存钵甯�', '妤氶泟褰濇棌鑷不宸�', '绾㈡渤鍝堝凹鏃忓綕鏃忚嚜娌诲窞', '鏂囧北澹棌鑻楁棌鑷不宸�', '瑗垮弻鐗堢撼鍌f棌鑷不宸�', '澶х悊鐧芥棌鑷不宸�', '寰峰畯鍌f棌鏅鏃忚嚜娌诲窞', '鎬掓睙鍌堝兂鏃忚嚜娌诲窞', '杩簡钘忔棌鑷不宸�'],
+ 瑗胯棌鑷不鍖�: ['鎷夎惃甯�', '鏃ュ杸鍒欏競', '鏄岄兘甯�', '鏋楄姖甯�', '灞卞崡甯�', '閭f洸甯�', '闃块噷鍦板尯'],
+ 闄曡タ鐪�: ['瑗垮畨甯�', '閾滃窛甯�', '瀹濋浮甯�', '鍜搁槼甯�', '娓崡甯�', '寤跺畨甯�', '姹変腑甯�', '姒嗘灄甯�', '瀹夊悍甯�', '鍟嗘礇甯�'],
+ 鐢樿們鐪�: ['鍏板窞甯�', '鍢夊唱鍏冲競', '閲戞槍甯�', '鐧介摱甯�', '澶╂按甯�', '姝﹀▉甯�', '寮犳帠甯�', '骞冲噳甯�', '閰掓硥甯�', '搴嗛槼甯�', '瀹氳タ甯�', '闄囧崡甯�', '涓村鍥炴棌鑷不宸�', '鐢樺崡钘忔棌鑷不宸�'],
+ 闈掓捣鐪�: ['瑗垮畞甯�', '娴蜂笢甯�', '娴峰寳钘忔棌鑷不宸�', '榛勫崡钘忔棌鑷不宸�', '娴峰崡钘忔棌鑷不宸�', '鏋滄礇钘忔棌鑷不宸�', '鐜夋爲钘忔棌鑷不宸�', '娴疯タ钂欏彜鏃忚棌鏃忚嚜娌诲窞'],
+ 瀹佸鍥炴棌鑷不鍖�: ['閾跺窛甯�', '鐭冲槾灞卞競', '鍚村繝甯�', '鍥哄師甯�', '涓崼甯�'],
+ 鏂扮枂缁村惥灏旇嚜娌诲尯: ['涔岄瞾鏈ㄩ綈甯�', '鍏嬫媺鐜涗緷甯�', '鍚愰瞾鐣競', '鍝堝瘑甯�', '鏄屽悏鍥炴棌鑷不宸�', '鍗氬皵濉旀媺钂欏彜鑷不宸�', '宸撮煶閮钂欏彜鑷不宸�', '闃垮厠鑻忓湴鍖�', '鍏嬪瓬鍕掕嫃鏌皵鍏嬪瓬鑷不宸�', '鍠�浠�鍦板尯', '鍜岀敯鍦板尯', '浼婄妬鍝堣惃鍏嬭嚜娌诲窞', '濉斿煄鍦板尯', '闃垮嫆娉板湴鍖�', '鐭虫渤瀛愬競', '闃挎媺灏斿競', '鍥炬湪鑸掑厠甯�', '浜斿娓犲競', '鍖楀悲甯�', '閾侀棬鍏冲競', '鍙屾渤甯�', '鍙厠杈炬媺甯�', '鏄嗙帀甯�', '鑳℃潹娌冲競'],
+ 鍙版咕鐪�: ['鍙板寳', '楂橀泟', '鍙板崡', '鍙颁腑', '閲戦棬', '鍗楁姇', '鍩洪殕', '鏂扮', '鍢変箟', '鏂板寳', '瀹滃叞', '妗冨洯', '鑻楁牀', '褰板寲', '浜戞灄', '灞忎笢', '鍙颁笢', '鑺辫幉', '婢庢箹', '杩炴睙'],
+ 棣欐腐鐗瑰埆琛屾斂鍖�: ['涓タ鍖�', '婀句粩鍖�', '涓滃尯', '鍗楀尯', '娌瑰皷鏃哄尯', '娣辨按鍩楀尯', '涔濋緳鍩庡尯', '榛勫ぇ浠欏尯', '瑙傚鍖�', '鑽冩咕鍖�', '灞棬鍖�', '鍏冩湕鍖�', '鍖楀尯', '澶у煍鍖�', '瑗胯础鍖�', '娌欑敯鍖�', '钁甸潚鍖�', '绂诲矝鍖�'],
+ 婢抽棬鐗瑰埆琛屾斂鍖�: ['鑺卞湴鐜涘爞鍖�', '鑺辩帇鍫傚尯', '鏈涘痉鍫傚尯', '澶у爞鍖�', '椋庨『鍫傚尯', '鍢夋ā鍫傚尯', '璺嚰濉捣鍖�', '鍦f柟娴庡悇鍫傚尯']
+}
+
+/** 鐪佷笅鎷夐�夐」 */
+export const PROVINCE_OPTIONS = PROVINCES.map(p => ({ value: p, label: p }))
+
+/** 鍙栨煇鐪佷笅鐨勫湴甯傦紱鐪佷唤涓虹┖鎴栨棤鏁版嵁鏃惰繑鍥炵┖鏁扮粍銆傚閿欑畝鍐欙細濡傘�屾睙鑻忋�嶈嚜鍔ㄦ寜銆屾睙鑻忕渷銆嶈В鏋� */
+export function citiesOf(province) {
+ if (!province) return []
+ if (CITIES[province]) return CITIES[province]
+ const guess = [province + '鐪�', province + '甯�'].find(k => CITIES[k])
+ return guess ? CITIES[guess] : []
+}
+
+/** 鍦板競涓嬫媺閫夐」锛堝彲甯﹁嚜瀹氫箟棣栭」锛屽銆屽叾浠栥�嶏級 */
+export function cityOptions(province) {
+ return citiesOf(province).map(c => ({ value: c, label: c }))
+}
diff --git a/src/utils/request.js b/src/utils/request.js
index a8a6b67..46bc0ef 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -1,152 +1,114 @@
-import axios from 'axios'
-import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
-import { getToken } from '@/utils/auth'
-import errorCode from '@/utils/errorCode'
-import { tansParams, blobValidate } from '@/utils/ruoyi'
-import cache from '@/plugins/cache'
-import { saveAs } from 'file-saver'
-import useUserStore from '@/store/modules/user'
-
-let downloadLoadingInstance
-// 鏄惁鏄剧ず閲嶆柊鐧诲綍
-export let isRelogin = { show: false }
-
-axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
-// 鍒涘缓axios瀹炰緥
-const service = axios.create({
- // axios涓姹傞厤缃湁baseURL閫夐」锛岃〃绀鸿姹俇RL鍏叡閮ㄥ垎
- baseURL: import.meta.env.VITE_APP_BASE_API,
- // 瓒呮椂
- timeout: 60000
-})
-
-// request鎷︽埅鍣�
-service.interceptors.request.use(config => {
- // 鏄惁闇�瑕佽缃� token
- const isToken = (config.headers || {}).isToken === false
- // 鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�
- const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
- if (getToken() && !isToken) {
- config.headers['Authorization'] = 'Bearer ' + getToken() // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀�
- }
- // get璇锋眰鏄犲皠params鍙傛暟
- if (config.method === 'get' && config.params) {
- let url = config.url + '?' + tansParams(config.params)
- url = url.slice(0, -1)
- config.params = {}
- config.url = url
- }
- if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
- const requestObj = {
- url: config.url,
- data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
- time: new Date().getTime()
- }
- const requestSize = Object.keys(JSON.stringify(requestObj)).length // 璇锋眰鏁版嵁澶у皬
- const limitSize = 5 * 1024 * 1024 // 闄愬埗瀛樻斁鏁版嵁5M
- if (requestSize >= limitSize) {
- console.warn(`[${config.url}]: ` + '璇锋眰鏁版嵁澶у皬瓒呭嚭鍏佽鐨�5M闄愬埗锛屾棤娉曡繘琛岄槻閲嶅鎻愪氦楠岃瘉銆�')
- return config
- }
- const sessionObj = cache.session.getJSON('sessionObj')
- if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
- cache.session.setJSON('sessionObj', requestObj)
- } else {
- const s_url = sessionObj.url // 璇锋眰鍦板潃
- const s_data = sessionObj.data // 璇锋眰鏁版嵁
- const s_time = sessionObj.time // 璇锋眰鏃堕棿
- const interval = 1000 // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
- if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
- const message = '鏁版嵁姝e湪澶勭悊锛岃鍕块噸澶嶆彁浜�'
- console.warn(`[${s_url}]: ` + message)
- return Promise.reject(new Error(message))
- } else {
- cache.session.setJSON('sessionObj', requestObj)
- }
- }
- }
- return config
-}, error => {
- console.log(error)
- Promise.reject(error)
-})
-
-// 鍝嶅簲鎷︽埅鍣�
-service.interceptors.response.use(res => {
- // 鏈缃姸鎬佺爜鍒欓粯璁ゆ垚鍔熺姸鎬�
- const code = res.data.code || 200
- // 鑾峰彇閿欒淇℃伅
- const msg = errorCode[code] || res.data.msg || errorCode['default']
- // 浜岃繘鍒舵暟鎹垯鐩存帴杩斿洖
- if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
- return res.data
- }
- if (code === 401) {
- if (!isRelogin.show) {
- isRelogin.show = true
- ElMessageBox.confirm('鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�', '绯荤粺鎻愮ず', { confirmButtonText: '閲嶆柊鐧诲綍', cancelButtonText: '鍙栨秷', type: 'warning' }).then(() => {
- isRelogin.show = false
- useUserStore().logOut().then(() => {
- location.href = '/index'
- })
- }).catch(() => {
- isRelogin.show = false
- })
- }
- return Promise.reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�')
- } else if (code === 500) {
- ElMessage({ message: msg, type: 'error' })
- return Promise.reject(new Error(msg))
- } else if (code === 601) {
- ElMessage({ message: msg, type: 'warning' })
- return Promise.reject(new Error(msg))
- } else if (code !== 200) {
- ElNotification.error({ title: msg })
- return Promise.reject('error')
- } else {
- return Promise.resolve(res.data)
- }
- },
- error => {
- console.log('err' + error)
- let { message } = error
- if (message == "Network Error") {
- message = "鍚庣鎺ュ彛杩炴帴寮傚父"
- } else if (message.includes("timeout")) {
- message = "绯荤粺鎺ュ彛璇锋眰瓒呮椂"
- } else if (message.includes("Request failed with status code")) {
- message = "绯荤粺鎺ュ彛" + message.substr(message.length - 3) + "寮傚父"
- }
- ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
- return Promise.reject(error)
- }
-)
-
-// 閫氱敤涓嬭浇鏂规硶
-export function download(url, params, filename, config) {
- downloadLoadingInstance = ElLoading.service({ text: "姝e湪涓嬭浇鏁版嵁锛岃绋嶅��", background: "rgba(0, 0, 0, 0.7)", })
- return service.post(url, params, {
- transformRequest: [(params) => { return tansParams(params) }],
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
- responseType: 'blob',
- ...config
- }).then(async (data) => {
- const isBlob = blobValidate(data)
- if (isBlob) {
- const blob = new Blob([data])
- saveAs(blob, filename)
- } else {
- const resText = await data.text()
- const rspObj = JSON.parse(resText)
- const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
- ElMessage.error(errMsg)
- }
- downloadLoadingInstance.close()
- }).catch((r) => {
- console.error(r)
- ElMessage.error('涓嬭浇鏂囦欢鍑虹幇閿欒锛岃鑱旂郴绠$悊鍛橈紒')
- downloadLoadingInstance.close()
- })
-}
-
-export default service
+/**
+ * 璇锋眰灏佽锛堝熀浜� uni.request锛屾敮鎸� token銆侀敊璇粺涓�澶勭悊锛�
+ */
+import config from '@/config.js'
+
+// 瀛樺偍 token 鐨� key
+const TOKEN_KEY = 'cj_student_token'
+
+export function getToken() {
+ return uni.getStorageSync(TOKEN_KEY)
+}
+export function setToken(t) {
+ uni.setStorageSync(TOKEN_KEY, t)
+}
+export function clearToken() {
+ uni.removeStorageSync(TOKEN_KEY)
+}
+
+function request(method, url, data = {}, options = {}) {
+ return new Promise((resolve, reject) => {
+ const token = getToken()
+ uni.request({
+ url: config.baseUrl + url,
+ method,
+ data,
+ header: {
+ 'Content-Type': 'application/json',
+ ...(token ? { Authorization: 'Bearer ' + token } : {}),
+ ...(options.header || {}),
+ },
+ success: (res) => {
+ if (res.statusCode === 401) {
+ clearToken()
+ uni.showToast({ title: '璇烽噸鏂扮櫥褰�', icon: 'none' })
+ uni.reLaunch({ url: '/pages/login/login' })
+ reject(res.data)
+ return
+ }
+ if (res.data && res.data.code === 200) {
+ resolve(res.data)
+ } else {
+ // 鍚庣浠� HTTP 200 + body.code 401 琛ㄨ揪鐧诲綍澶辨晥锛氬悓姝ユ竻 token锛岃烦鐧诲綍椤�
+ if (res.data && res.data.code === 401) {
+ clearToken()
+ uni.showToast({ title: '鐧诲綍宸插け鏁堬紝璇烽噸鏂扮櫥褰�', icon: 'none' })
+ uni.reLaunch({ url: '/pages/login/login' })
+ } else {
+ uni.showToast({ title: (res.data && res.data.msg) || '璇锋眰澶辫触', icon: 'none' })
+ }
+ reject(res.data)
+ }
+ },
+ fail: (err) => {
+ uni.showToast({ title: '缃戠粶寮傚父锛岃妫�鏌ュ悗绔繛鎺�', icon: 'none' })
+ reject(err)
+ },
+ })
+ })
+}
+
+/**
+ * 涓婁紶鍗曚釜鏂囦欢鍒� /miniapp/upload銆�
+ * H5 鍙紶 file锛坕nput[type=file] 閫変腑鐨� File 瀵硅薄锛夛紱灏忕▼搴�/App 浼� filePath锛堜复鏃惰矾寰勶級銆�
+ * 鍚庣鍝嶅簲涓� { code, msg, data: { fileName, originalName } }锛�
+ * 鎴愬姛鏃� resolve 鍐呭眰 data锛坽 fileName, originalName }锛夛紝鍏煎涓埆鏃х粨鏋勭殑椤跺眰 fileName銆�
+ */
+export function uploadFile({ filePath, file }) {
+ return new Promise((resolve, reject) => {
+ const token = getToken()
+ // uni-h5 鐨� uploadFile 缂� filePath 浼氬厛 reject("file error")锛堜絾 XHR 浠嶄細鍙戝嚭锛屽鑷�
+ // 銆屽悗绔紶鎴愬姛銆佸墠绔姤澶辫触銆嶏級锛汬5 浼� File 瀵硅薄鏃惰ˉ涓�涓� blob URL 鍏滃簳銆�
+ let fp = filePath
+ if (!fp && file) {
+ try { fp = URL.createObjectURL(file) } catch (e) { /* 闈炴祻瑙堝櫒鐜蹇界暐 */ }
+ }
+ uni.uploadFile({
+ url: config.baseUrl + '/miniapp/upload',
+ filePath: fp,
+ file,
+ name: 'file',
+ header: token ? { Authorization: 'Bearer ' + token } : {},
+ success: (res) => {
+ let d = res.data
+ try { d = JSON.parse(res.data) } catch (e) { /* 淇濈暀鍘熷鏂囨湰 */ }
+ if (res.statusCode === 401) {
+ clearToken()
+ uni.showToast({ title: '璇烽噸鏂扮櫥褰�', icon: 'none' })
+ uni.reLaunch({ url: '/pages/login/login' })
+ reject(d)
+ return
+ }
+ if (d && d.code === 200) {
+ // 鐪熸鏈夌敤鐨勬槸 data 鍐呭眰锛涙棫浠g爜鐩存帴 resolve 鏁翠釜鍝嶅簲浣撳鑷� res.fileName 鎭掍负 undefined
+ resolve(d.data || d)
+ } else {
+ uni.showToast({ title: (d && d.msg) || '涓婁紶澶辫触', icon: 'none' })
+ reject(d)
+ }
+ },
+ fail: (err) => {
+ uni.showToast({ title: '涓婁紶澶辫触锛岃妫�鏌ョ綉缁�', icon: 'none' })
+ reject(err)
+ },
+ })
+ })
+}
+
+export default {
+ get: (url, data, opts) => request('GET', url, data, opts),
+ post: (url, data, opts) => request('POST', url, data, opts),
+ put: (url, data, opts) => request('PUT', url, data, opts),
+ delete: (url, data, opts) => request('DELETE', url, data, opts),
+ upload: uploadFile,
+}
diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js
deleted file mode 100644
index 0d72c1a..0000000
--- a/src/utils/ruoyi.js
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * 閫氱敤js鏂规硶灏佽澶勭悊
- * Copyright (c) 2019 ruoyi
- */
-
-// 鏃ユ湡鏍煎紡鍖�
-export function parseTime(time, pattern) {
- if (arguments.length === 0 || !time) {
- return null
- }
- const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
- let date
- if (typeof time === 'object') {
- date = time
- } else {
- if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
- time = parseInt(time)
- } else if (typeof time === 'string') {
- time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
- }
- if ((typeof time === 'number') && (time.toString().length === 10)) {
- time = time * 1000
- }
- date = new Date(time)
- }
- const formatObj = {
- y: date.getFullYear(),
- m: date.getMonth() + 1,
- d: date.getDate(),
- h: date.getHours(),
- i: date.getMinutes(),
- s: date.getSeconds(),
- a: date.getDay()
- }
- const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
- let value = formatObj[key]
- // Note: getDay() returns 0 on Sunday
- if (key === 'a') { return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value] }
- if (result.length > 0 && value < 10) {
- value = '0' + value
- }
- return value || 0
- })
- return time_str
-}
-
-// 琛ㄥ崟閲嶇疆
-export function resetForm(refName) {
- if (this.$refs[refName]) {
- this.$refs[refName].resetFields()
- }
-}
-
-// 娣诲姞鏃ユ湡鑼冨洿
-export function addDateRange(params, dateRange, propName) {
- let search = params
- search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}
- dateRange = Array.isArray(dateRange) ? dateRange : []
- if (typeof (propName) === 'undefined') {
- search.params['beginTime'] = dateRange[0]
- search.params['endTime'] = dateRange[1]
- } else {
- search.params['begin' + propName] = dateRange[0]
- search.params['end' + propName] = dateRange[1]
- }
- return search
-}
-
-// 鍥炴樉鏁版嵁瀛楀吀
-export function selectDictLabel(datas, value) {
- if (value === undefined) {
- return ""
- }
- var actions = []
- Object.keys(datas).some((key) => {
- if (datas[key].value == ('' + value)) {
- actions.push(datas[key].label)
- return true
- }
- })
- if (actions.length === 0) {
- actions.push(value)
- }
- return actions.join('')
-}
-
-// 鍥炴樉鏁版嵁瀛楀吀锛堝瓧绗︿覆銆佹暟缁勶級
-export function selectDictLabels(datas, value, separator) {
- if (value === undefined || value.length ===0) {
- return ""
- }
- if (Array.isArray(value)) {
- value = value.join(",")
- }
- var actions = []
- var currentSeparator = undefined === separator ? "," : separator
- var temp = value.split(currentSeparator)
- Object.keys(value.split(currentSeparator)).some((val) => {
- var match = false
- Object.keys(datas).some((key) => {
- if (datas[key].value == ('' + temp[val])) {
- actions.push(datas[key].label + currentSeparator)
- match = true
- }
- })
- if (!match) {
- actions.push(temp[val] + currentSeparator)
- }
- })
- return actions.join('').substring(0, actions.join('').length - 1)
-}
-
-// 瀛楃涓叉牸寮忓寲(%s )
-export function sprintf(str) {
- var args = arguments, flag = true, i = 1
- str = str.replace(/%s/g, function () {
- var arg = args[i++]
- if (typeof arg === 'undefined') {
- flag = false
- return ''
- }
- return arg
- })
- return flag ? str : ''
-}
-
-// 杞崲瀛楃涓诧紝undefined,null绛夎浆鍖栦负""
-export function parseStrEmpty(str) {
- if (!str || str == "undefined" || str == "null") {
- return ""
- }
- return str
-}
-
-// 鏁版嵁鍚堝苟
-export function mergeRecursive(source, target) {
- for (var p in target) {
- try {
- if (target[p].constructor == Object) {
- source[p] = mergeRecursive(source[p], target[p])
- } else {
- source[p] = target[p]
- }
- } catch (e) {
- source[p] = target[p]
- }
- }
- return source
-}
-
-/**
- * 鏋勯�犳爲鍨嬬粨鏋勬暟鎹�
- * @param {*} data 鏁版嵁婧�
- * @param {*} id id瀛楁 榛樿 'id'
- * @param {*} parentId 鐖惰妭鐐瑰瓧娈� 榛樿 'parentId'
- * @param {*} children 瀛╁瓙鑺傜偣瀛楁 榛樿 'children'
- */
-export function handleTree(data, id, parentId, children) {
- let config = {
- id: id || 'id',
- parentId: parentId || 'parentId',
- childrenList: children || 'children'
- }
-
- var childrenListMap = {}
- var tree = []
- for (let d of data) {
- let id = d[config.id]
- childrenListMap[id] = d
- if (!d[config.childrenList]) {
- d[config.childrenList] = []
- }
- }
-
- for (let d of data) {
- let parentId = d[config.parentId]
- let parentObj = childrenListMap[parentId]
- if (!parentObj) {
- tree.push(d)
- } else {
- parentObj[config.childrenList].push(d)
- }
- }
- return tree
-}
-
-/**
-* 鍙傛暟澶勭悊
-* @param {*} params 鍙傛暟
-*/
-export function tansParams(params) {
- let result = ''
- for (const propName of Object.keys(params)) {
- const value = params[propName]
- var part = encodeURIComponent(propName) + "="
- if (value !== null && value !== "" && typeof (value) !== "undefined") {
- if (typeof value === 'object') {
- for (const key of Object.keys(value)) {
- if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
- let params = propName + '[' + key + ']'
- var subPart = encodeURIComponent(params) + "="
- result += subPart + encodeURIComponent(value[key]) + "&"
- }
- }
- } else {
- result += part + encodeURIComponent(value) + "&"
- }
- }
- }
- return result
-}
-
-// 杩斿洖椤圭洰璺緞
-export function getNormalPath(p) {
- if (p.length === 0 || !p || p == 'undefined') {
- return p
- }
- let res = p.replace('//', '/')
- if (res[res.length - 1] === '/') {
- return res.slice(0, res.length - 1)
- }
- return res
-}
-
-// 楠岃瘉鏄惁涓篵lob鏍煎紡
-export function blobValidate(data) {
- return data.type !== 'application/json'
-}
diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js
deleted file mode 100644
index 709fa57..0000000
--- a/src/utils/scroll-to.js
+++ /dev/null
@@ -1,58 +0,0 @@
-Math.easeInOutQuad = function(t, b, c, d) {
- t /= d / 2
- if (t < 1) {
- return c / 2 * t * t + b
- }
- t--
- return -c / 2 * (t * (t - 2) - 1) + b
-}
-
-// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
-var requestAnimFrame = (function() {
- return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
-})()
-
-/**
- * Because it's so fucking difficult to detect the scrolling element, just move them all
- * @param {number} amount
- */
-function move(amount) {
- document.documentElement.scrollTop = amount
- document.body.parentNode.scrollTop = amount
- document.body.scrollTop = amount
-}
-
-function position() {
- return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
-}
-
-/**
- * @param {number} to
- * @param {number} duration
- * @param {Function} callback
- */
-export function scrollTo(to, duration, callback) {
- const start = position()
- const change = to - start
- const increment = 20
- let currentTime = 0
- duration = (typeof (duration) === 'undefined') ? 500 : duration
- var animateScroll = function() {
- // increment the time
- currentTime += increment
- // find the value with the quadratic in-out easing function
- var val = Math.easeInOutQuad(currentTime, start, change, duration)
- // move the document.body
- move(val)
- // do the animation unless its over
- if (currentTime < duration) {
- requestAnimFrame(animateScroll)
- } else {
- if (callback && typeof (callback) === 'function') {
- // the animation is done so lets callback
- callback()
- }
- }
- }
- animateScroll()
-}
diff --git a/src/utils/site.js b/src/utils/site.js
new file mode 100644
index 0000000..4f62e08
--- /dev/null
+++ b/src/utils/site.js
@@ -0,0 +1,36 @@
+/**
+ * 绔欑偣鏂囨锛堝悗鍙般�屽瓧鍏哥鐞� 鈫� 2024绾у鐢熶骇鏁欒瀺鍚堝疄璺垫暀瀛︿俊鎭~鎶ャ�嶉┍鍔級
+ *
+ * 鏂囨鐢� /miniapp/site-titles 涓嬪彂锛屽悗鍙版敼瀹屽嵆鏃剁敓鏁堬紝鍓嶇涓嶇敤閲嶆柊鎵撳寘銆�
+ * 鎺ュ彛鏈�� / 瀛楀吀椤硅鍒� / 鍊间负绌烘椂锛屼竴寰嬪洖閫�涓嬮潰鐨勫唴缃粯璁わ紝椤甸潰涓嶄細鍑虹幇绌虹櫧鏍囬銆�
+ * 涓�娆′細璇濆彧璇锋眰涓�娆★紙骞跺彂璋冪敤鍏辩敤鍚屼竴涓� pending Promise锛夛紝澶辫触涓嶇紦瀛樸�佷笅娆″彲閲嶈瘯銆�
+ */
+import { getSiteTitles } from '@/api/auth.js'
+
+// 鍏滃簳鏂囨锛氶』涓庡悗绔� MiniappController#siteTitles 鐨� fallback 淇濇寔涓�鑷�
+export const DEFAULT_TITLES = {
+ platformTitle: '浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴',
+ platformSubtitle: '姹熻嫃鍟嗚锤鑱屼笟瀛﹂櫌 路 瀛︾敓瀹炶返鏁欏淇℃伅濉姤',
+ loginSubtitle: '浜ф暀铻嶅悎瀹炶返鏁欏绠$悊骞冲彴 路 瀛︾敓璐﹀彿',
+}
+
+let cache = null
+let pending = null
+
+/** 鍙栫珯鐐规枃妗堬紙甯︾紦瀛橈級锛涙案杩� resolve锛屼笉浼� reject */
+export function getTitles() {
+ if (cache) return Promise.resolve(cache)
+ if (!pending) {
+ pending = getSiteTitles()
+ .then((res) => {
+ cache = { ...DEFAULT_TITLES, ...(res.data || {}) }
+ return cache
+ })
+ .catch(() => DEFAULT_TITLES)
+ .then((v) => {
+ pending = null
+ return v
+ })
+ }
+ return pending
+}
diff --git a/src/utils/summarizeTable.js b/src/utils/summarizeTable.js
deleted file mode 100644
index 1ad480d..0000000
--- a/src/utils/summarizeTable.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * 閫氱敤鐨勮〃鏍煎悎璁℃柟娉�
- * @param {Object} param - 鍖呭惈琛ㄦ牸鍒楅厤缃拰鏁版嵁婧愮殑瀵硅薄
- * @param {Array<string>} summaryProps - 闇�瑕佹眹鎬荤殑瀛楁鍚嶆暟缁�
- * @param {Object} specialFormat - 鐗规畩鏍煎紡鍖栬鍒欙細瀛楁鍚� -> 鏍煎紡鍖栭�夐」锛堝鏄惁鍘绘帀灏忔暟锛�
- * @returns {Array} 鍚堣琛屾暟鎹�
- */
-const summarizeTable = (param, summaryProps, specialFormat = {}) => {
- const { columns, data } = param;
- const sums = [];
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "鍚堣";
- return;
- }
- const prop = column.property;
- if (summaryProps.includes(prop)) {
- const values = data.map((item) => Number(item[prop]));
- // 鍙鏈夋晥鏁板瓧杩涜姹傚拰
- if (!values.every(isNaN)) {
- const sum = values.reduce(
- (acc, val) => (!isNaN(val) ? acc + val : acc),
- 0
- );
- if (specialFormat[prop] && specialFormat[prop].noDecimal) {
- // 濡傛灉鎸囧畾浜嗕笉闇�瑕佷繚鐣欏皬鏁帮紝鍒欑洿鎺ヨ浆鎹负鏁存暟
- sums[index] = Math.round(sum).toString();
- } else {
- // 榛樿淇濈暀涓や綅灏忔暟
- sums[index] = parseFloat(sum).toFixed(
- specialFormat[prop]?.decimalPlaces ?? 2
- );
- }
- } else {
- sums[index] = "";
- }
- } else {
- sums[index] = "";
- }
- });
- return sums;
-};
-// 涓嶅惈绋庢�讳环璁$畻
-const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate) => {
- const taxRateDecimal = taxRate / 100;
- return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(2);
-};
-// 鍚◣鎬讳环璁$畻
-const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity) => {
- return (taxInclusiveUnitPrice * quantity).toFixed(2);
-};
-// 瀵煎嚭鍑芥暟渚涘叾浠栨枃浠朵娇鐢�
-export {
- summarizeTable,
- calculateTaxExclusiveTotalPrice,
- calculateTaxIncludeTotalPrice,
-};
diff --git a/src/utils/theme.js b/src/utils/theme.js
deleted file mode 100644
index f4badc6..0000000
--- a/src/utils/theme.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// 澶勭悊涓婚鏍峰紡
-export function handleThemeStyle(theme) {
- document.documentElement.style.setProperty('--el-color-primary', theme)
- for (let i = 1; i <= 9; i++) {
- document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`)
- }
- for (let i = 1; i <= 9; i++) {
- document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`)
- }
-}
-
-// hex棰滆壊杞瑀gb棰滆壊
-export function hexToRgb(str) {
- str = str.replace('#', '')
- let hexs = str.match(/../g)
- for (let i = 0; i < 3; i++) {
- hexs[i] = parseInt(hexs[i], 16)
- }
- return hexs
-}
-
-// rgb棰滆壊杞琀ex棰滆壊
-export function rgbToHex(r, g, b) {
- let hexs = [r.toString(16), g.toString(16), b.toString(16)]
- for (let i = 0; i < 3; i++) {
- if (hexs[i].length == 1) {
- hexs[i] = `0${hexs[i]}`
- }
- }
- return `#${hexs.join('')}`
-}
-
-// 鍙樻祬棰滆壊鍊�
-export function getLightColor(color, level) {
- let rgb = hexToRgb(color)
- for (let i = 0; i < 3; i++) {
- rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
- }
- return rgbToHex(rgb[0], rgb[1], rgb[2])
-}
-
-// 鍙樻繁棰滆壊鍊�
-export function getDarkColor(color, level) {
- let rgb = hexToRgb(color)
- for (let i = 0; i < 3; i++) {
- rgb[i] = Math.floor(rgb[i] * (1 - level))
- }
- return rgbToHex(rgb[0], rgb[1], rgb[2])
-}
diff --git a/src/utils/util.js b/src/utils/util.js
deleted file mode 100644
index be08cc1..0000000
--- a/src/utils/util.js
+++ /dev/null
@@ -1,121 +0,0 @@
-//闃叉姈
-import dayjs from "dayjs";
-
-export function debounce(fn) {
- console.log(1)
- let t = null //鍙細鎵ц涓�娆�
- debugger
-
- return function (){
- if(t){
- clearTimeout(t)
- }
- t = setTimeout(()=>{
- console.log(temp); //鍙互鑾峰彇
- // console.log(arguments[0]) //undefined
- fn.apply(this,arguments)
- //鍦ㄨ繖涓洖璋冨嚱鏁伴噷闈㈢殑argument鏄繖涓洖璋冨嚱鏁扮殑鍙傛暟锛屽洜涓烘病鏈夊弬鏁版墍浠ndefined锛屽彲浠ラ�氳繃澶栭潰鐨勫嚱鏁拌祴鍊兼潵杩涜璁块棶
- //涔熷彲浠ユ敼鍙樻垚绠ご鍑芥暟,绠ご鍑芥暟鐨則his鏄寚鍚戝畾涔夊嚱鏁扮殑閭d竴灞傜殑锛屾墍浠ヨ闂埌鐨刟rguments鏄笂涓�灞傚嚱鏁扮殑arguments
- },1000)
-
- }
-}
-//鑺傛祦
-export function throttle(fn, delay = 200) {
- let timer = null
- console.log(fn);
- debugger
- return function () {
- if(timer) return
- timer = setTimeout(() => {
- debugger
- fn.apply(this,arguments)
- timer = null
- })
- }
- }
-//涓嬫媺鍔ㄧ敾
- export function animation(obj, target, fn1) {
- // console.log(fn1);
- // fn鏄竴涓洖璋冨嚱鏁帮紝鍦ㄥ畾鏃跺櫒缁撴潫鐨勬椂鍊欐坊鍔�
- // 姣忔寮�瀹氭椂鍣ㄤ箣鍓嶅厛娓呴櫎鎺夊畾鏃跺櫒
- clearInterval(obj.timer);
- obj.timer = setInterval(function () {
- // 姝ラ暱璁$畻鍏紡 瓒婃潵瓒婂皬
- // 姝ラ暱鍙栨暣
- var step = (target - obj.scrollTop) / 10;
- step = step > 0 ? Math.ceil(step) : Math.floor(step);
- if (obj.scrollTop >= target) {
- clearInterval(obj.timer);
- // 濡傛灉fn1瀛樺湪锛岃皟鐢╢n
- if (fn1) {
- fn1();
- }
- } else {
- // 姣�30姣灏卞皢鏂扮殑鍊肩粰obj.left
- obj.scrollTop = obj.scrollTop + step;
- }
- }, 10);
- }
-
- //鍒ゆ柇鏂囦欢绫诲瀷
- export function judgeFileType(file) {
- if (file == null||file == ""){
- alert("璇烽�夋嫨瑕佷笂浼犵殑鍥剧墖!");
- return false;
- }
- if (file.lastIndexOf('.')==-1){ //濡傛灉涓嶅瓨鍦�"."
- alert("璺緞涓嶆纭�!");
- return false;
- }
- var AllImgExt=".jpg|.jpeg|.gif|.bmp|.png|";
- var extName = file.substring(file.lastIndexOf(".")).toLowerCase();//锛堟妸璺緞涓殑鎵�鏈夊瓧姣嶅叏閮ㄨ浆鎹负灏忓啓锛�
- if(AllImgExt.indexOf(extName+"|")==-1)
- {
- ErrMsg="璇ユ枃浠剁被鍨嬩笉鍏佽涓婁紶銆傝涓婁紶 "+AllImgExt+" 绫诲瀷鐨勬枃浠讹紝褰撳墠鏂囦欢绫诲瀷涓�"+extName;
- alert(ErrMsg);
- return false;
- }
- }
-
- //鏂囦欢绫诲瀷
- export function fileType() {
- return {
- 'application/msword': 'word',
- 'application/pdf': 'pdf',
- 'application/vnd.ms-powerpoint': 'ppt',
- 'application/vnd.ms-excel': 'excel',
- 'aplication/zip': 'zpi',
- }
- }
- export const deepCopySameProperties = (source, target) =>{
- for (const key in source) {
- if (target.hasOwnProperty(key)) {
- if (typeof source[key] === 'object' && source[key] !== null &&
- typeof target[key] === 'object' && target[key] !== null) {
- // 閫掑綊澶勭悊瀵硅薄
- deepCopySameProperties(source[key], target[key]);
- } else {
- // 鍩烘湰绫诲瀷鐩存帴璧嬪��
- target[key] = source[key];
- }
- }
- }
- return target;
-}
- export function filterArr(arr) {
- return arr.filter(item => item.flag !== false);
- }
-
- export function getCurrentMonth () {
- let month = dayjs().month() + 1
- if (month <= 3) {
- return '1';
- } else if (month <= 6) {
- return '2';
- } else if (month <= 9) {
- return '3';
- } else if (month <= 12) {
- return '4';
- }
-}
\ No newline at end of file
diff --git a/src/utils/validate.js b/src/utils/validate.js
deleted file mode 100644
index 13b7a15..0000000
--- a/src/utils/validate.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * 璺緞鍖归厤鍣�
- * @param {string} pattern
- * @param {string} path
- * @returns {Boolean}
- */
-export function isPathMatch(pattern, path) {
- const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*')
- const regex = new RegExp(`^${regexPattern}$`)
- return regex.test(path)
-}
-
-/**
- * 鍒ゆ柇value瀛楃涓叉槸鍚︿负绌�
- * @param {string} value
- * @returns {Boolean}
- */
-export function isEmpty(value) {
- if (value == null || value == "" || value == undefined || value == "undefined") {
- return true
- }
- return false
-}
-
-/**
- * 鍒ゆ柇url鏄惁鏄痟ttp鎴杊ttps
- * @param {string} url
- * @returns {Boolean}
- */
-export function isHttp(url) {
- return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
-}
-
-/**
- * 鍒ゆ柇path鏄惁涓哄閾�
- * @param {string} path
- * @returns {Boolean}
- */
-export function isExternal(path) {
- return /^(https?:|mailto:|tel:)/.test(path)
-}
-
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validUsername(str) {
- const valid_map = ['admin', 'editor']
- return valid_map.indexOf(str.trim()) >= 0
-}
-
-/**
- * @param {string} url
- * @returns {Boolean}
- */
-export function validURL(url) {
- const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
- return reg.test(url)
-}
-
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validLowerCase(str) {
- const reg = /^[a-z]+$/
- return reg.test(str)
-}
-
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validUpperCase(str) {
- const reg = /^[A-Z]+$/
- return reg.test(str)
-}
-
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function validAlphabets(str) {
- const reg = /^[A-Za-z]+$/
- return reg.test(str)
-}
-
-/**
- * @param {string} email
- * @returns {Boolean}
- */
-export function validEmail(email) {
- const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
- return reg.test(email)
-}
-
-/**
- * @param {string} str
- * @returns {Boolean}
- */
-export function isString(str) {
- return typeof str === 'string' || str instanceof String
-}
-
-/**
- * @param {Array} arg
- * @returns {Boolean}
- */
-export function isArray(arg) {
- if (typeof Array.isArray === 'undefined') {
- return Object.prototype.toString.call(arg) === '[object Array]'
- }
- return Array.isArray(arg)
-}
diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
deleted file mode 100644
index 8043d1a..0000000
--- a/src/views/basicData/customerFile/index.vue
+++ /dev/null
@@ -1,598 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板瀹㈡埛</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport"
- >瀵煎叆</el-button
- >
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹㈡埛淇℃伅' : '缂栬緫瀹㈡埛淇℃伅'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="绾崇◣浜鸿瘑鍒彿锛�"
- prop="taxpayerIdentificationNumber"
- >
- <el-input
- v-model="form.taxpayerIdentificationNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress">
- <el-input
- v-model="form.companyAddress"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone">
- <el-input
- v-model="form.companyPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閾惰鍩烘湰鎴凤細" prop="basicBankAccount">
- <el-input
- v-model="form.basicBankAccount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閾惰璐﹀彿锛�" prop="bankAccount">
- <el-input
- v-model="form.bankAccount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�鎴疯鍙凤細" prop="bankCode">
- <el-input
- v-model="form.bankCode"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30" v-for="(contact, index) in formYYs.contactList" :key="index">
- <el-col :span="12">
- <el-form-item label="鑱旂郴浜猴細" prop="contactPerson">
- <el-input v-model="contact.contactPerson" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactPhone">
- <div style="display: flex; align-items: center;width: 100%;">
- <el-input v-model="contact.contactPhone" placeholder="璇疯緭鍏�" clearable />
- <el-button @click="removeContact(index)" type="danger" circle style="margin-left: 5px;">
- <el-icon><Close /></el-icon>
- </el-button>
- </div>
- </el-form-item>
- </el-col>
- </el-row>
- <el-button @click="addNewContact" style="margin-bottom: 10px;">+ 鏂板鑱旂郴浜�</el-button>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁存姢浜猴細" prop="maintainer">
- <el-select
- v-model="form.maintainer"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.nickName"
- :label="item.nickName"
- :value="item.nickName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁存姢鏃堕棿锛�" prop="maintenanceTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintenanceTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-<!-- <el-link-->
-<!-- type="primary"-->
-<!-- :underline="false"-->
-<!-- style="font-size: 12px; vertical-align: baseline"-->
-<!-- @click="importTemplate"-->
-<!-- >涓嬭浇妯℃澘</el-link-->
-<!-- >-->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { Search } from "@element-plus/icons-vue";
-import {
- addCustomer,
- delCustomer,
- getCustomer,
- listCustomer,
- updateCustomer,
-} from "@/api/basicData/customerFile.js";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import useUserStore from "@/store/modules/user";
-import { getToken } from "@/utils/auth.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-
-const tableColumn = ref([
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 220,
- },
- {
- label: "绾崇◣浜鸿瘑鍒爜",
- prop: "taxpayerIdentificationNumber",
- width: 220,
- },
- {
- label: "鍦板潃鍙婅仈绯绘柟寮�",
- prop: "addressPhone",
- width: 250,
- },
- {
- label: "鑱旂郴浜�",
- prop: "contactPerson",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "contactPhone",
- width:150
- },
- {
- label: "閾惰鍩烘湰鎴�",
- prop: "basicBankAccount",
- width: 220,
- },
- {
- label: "閾惰璐﹀彿",
- prop: "bankAccount",
- width: 220,
- },
- {
- label: "寮�鎴疯鍙�",
- prop: "bankCode",
- width:220
- },
- {
- label: "缁存姢浜�",
- prop: "maintainer",
- },
- {
- label: "缁存姢鏃堕棿",
- prop: "maintenanceTime",
- width: 100,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.maintainer !== userStore.nickName
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const userList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const formYYs = ref({ // 鍏朵粬瀛楁...
- contactList: [
- {
- contactPerson: "",
- contactPhone: ""
- }
- ]
-});
-const data = reactive({
- searchForm: {
- customerName: "",
- },
- form: {
- customerName: "",
- taxpayerIdentificationNumber: "",
- companyAddress: "",
- companyPhone: "",
- contactPerson: "",
- contactPhone: "",
- maintainer: "",
- maintenanceTime: "",
- basicBankAccount: "",
- bankAccount: "",
- bankCode: "",
- },
- rules: {
- customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxpayerIdentificationNumber: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- // contactPerson: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- // contactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- maintainer: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- maintenanceTime: [
- { required: false, message: "璇烽�夋嫨", trigger: "change" },
- ],
- basicBankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankCode: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgWarning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-const { searchForm, form, rules } = toRefs(data);
-const addNewContact = () => {
- formYYs.value.contactList.push({
- contactPerson: "",
- contactPhone: ""
- });
-};
-
-const removeContact = (index) => {
- if (formYYs.value.contactList.length > 1) {
- formYYs.value.contactList.splice(index, 1);
- }
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- listCustomer({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "瀹㈡埛瀵煎叆";
- upload.open = true;
-}
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- form.value.maintainer = userStore.nickName;
- formYYs.value.contactList = [
- {
- contactPerson: "",
- contactPhone: ""
- }
- ];
- form.value.maintenanceTime = getCurrentDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- getCustomer(row.id).then((res) => {
- form.value = { ...res.data };
- formYYs.value.contactList = res.data.contactPerson.split(",").map((item, index) => {
- return {
- contactPerson: item,
- contactPhone: res.data.contactPhone.split(",")[index]
- }
- });
-
- });
- }
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- if(formYYs.value.contactList.length < 1){
- return proxy.$modal.msgWarning("璇疯嚦灏戞坊鍔犱竴涓仈绯讳汉");
- }
- form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(",");
- form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(",");
- addCustomer(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(",");
- form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(",");
- updateCustomer(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/basic/customer/export", {}, "瀹㈡埛妗f.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delCustomer(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/basicData/product/ImportExcel/index.vue b/src/views/basicData/product/ImportExcel/index.vue
deleted file mode 100644
index c25d254..0000000
--- a/src/views/basicData/product/ImportExcel/index.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<template>
- <el-button type="info" plain icon="Upload" @click="handleImport">
- 瀵煎叆
- </el-button>
- <el-dialog v-model="upload.open" :title="upload.title">
- <FileUpload
- ref="fileUploadRef"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :showTip="false"
- @success="handleFileSuccess"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { reactive } from "vue";
-import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "浜у搧缁存姢瀵煎叆",
-});
-
-const emits = defineEmits(["uploadSuccess"]);
-const fileUploadRef = ref();
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
-});
-// 鐐瑰嚮瀵煎叆
-const handleImport = () => {
- upload.open = true;
- upload.title = "浜у搧瀵煎叆";
-};
-
-const submitFileForm = () => {
- fileUploadRef.value.uploadApi();
-};
-
-const handleFileSuccess = (response) => {
- const { code, msg } = response;
- if (code == 200) {
- ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
- upload.open = false;
- emits("uploadSuccess");
- } else {
- ElMessage({ message: msg, type: "error" });
- }
-};
-</script>
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
deleted file mode 100644
index b88d678..0000000
--- a/src/views/basicData/product/index.vue
+++ /dev/null
@@ -1,500 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="openProDia('addOne')"
- style="margin-left: 10px"
- >鏂板浜у搧澶х被</el-button
- >
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- <div>
- <el-button
- type="primary"
- link
- @click="openProDia('edit', data)"
- >
- 缂栬緫
- </el-button>
- <el-button type="primary" link @click="openProDia('add', data)" :disabled="node.level >= 3">
- 娣诲姞浜у搧
- </el-button>
- <el-button
- v-if="!node.childNodes.length"
- style="margin-left: 4px"
- type="danger"
- link
- @click="remove(node, data)"
- >
- 鍒犻櫎
- </el-button>
- </div>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px" v-if="isShowButton">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板瑙勬牸鍨嬪彿
- </el-button>
- <ImportExcel @uploadSuccess="getModelList" />
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog v-model="productDia" title="浜у搧" width="400px" @keydown.enter.prevent>
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productName">
- <el-input
- v-model="form.productName"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeProDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="modelDia"
- title="瑙勬牸鍨嬪彿"
- width="400px"
- @close="closeModelDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-row>
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input
- v-model="modelForm.model"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="modelForm.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import {
- addOrEditProduct,
- addOrEditProductModel,
- delProduct,
- delProductModel,
- modelListPage,
- productTreeList,
-} from "@/api/basicData/product.js";
-import ImportExcel from "./ImportExcel/index.vue";
-
-const { proxy } = getCurrentInstance();
-const tree = ref(null);
-const containerRef = ref(null);
-
-const productDia = ref(false);
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const search = ref("");
-const currentId = ref("");
-const currentParentId = ref("");
-const operationType = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const tableColumn = ref([
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const isShowButton = ref(false);
-const selectedRows = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
- total: 0,
-});
-const data = reactive({
- form: {
- productName: "",
- },
- rules: {
- productName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
- modelForm: {
- model: "",
- unit: "",
- },
- modelRules: {
- model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules, modelForm, modelRules } = toRefs(data);
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- productTreeList()
- .then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- })
- .catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 鎵撳紑浜у搧寮规
-const openProDia = (type, data) => {
- operationType.value = type;
- productDia.value = true;
- form.value.productName = "";
- if (type === "edit") {
- form.value.productName = data.productName;
- }
-};
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
-const openModelDia = (type, data) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.model = "";
- modelForm.value.model = "";
- modelForm.value.id = "";
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 鎻愪氦浜у搧鍚嶇О淇敼
-const submitForm = () => {
- proxy.$refs.formRef.validate((valid) => {
- if (valid) {
- if (operationType.value === "add") {
- form.value.parentId = currentId.value;
- form.value.id = "";
- } else if (operationType.value === "addOne") {
- form.value.id = "";
- form.value.parentId = "";
- } else {
- form.value.id = currentId.value;
- form.value.parentId = "";
- }
- addOrEditProduct(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProDia();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴浜у搧寮规
-const closeProDia = () => {
- proxy.$refs.formRef.resetFields();
- productDia.value = false;
-};
-
-// 鍒犻櫎浜у搧
-const remove = (node, data) => {
- let ids = [];
- ids.push(data.id);
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delProduct(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
- isShowButton.value = !(val.children && val.children.length > 0);
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList();
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.productId = currentId.value;
- addOrEditProductModel(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ瑙勬牸鍨嬪彿
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = () => {
- tableLoading.value = true;
- modelListPage({
- id: currentId.value,
- current: page.current,
- size: page.size,
- }).then((res) => {
- console.log("res", res);
- tableData.value = res.records;
- page.total = res.total;
- tableLoading.value = false;
- });
-};
-// 鍒犻櫎瑙勬牸鍨嬪彿
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delProductModel(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue
deleted file mode 100644
index 68c51d3..0000000
--- a/src/views/basicData/supplierManage/index.vue
+++ /dev/null
@@ -1,528 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗘。妗堬細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')"
- >鏂板渚涘簲鍟�</el-button
- >
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport"
- >瀵煎叆</el-button
- >
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板渚涘簲鍟嗕俊鎭�' : '缂栬緫渚涘簲鍟嗕俊鎭�'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="绾崇◣浜鸿瘑鍒彿锛�"
- prop="taxpayerIdentificationNum"
- >
- <el-input
- v-model="form.taxpayerIdentificationNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress">
- <el-input
- v-model="form.companyAddress"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone">
- <el-input
- v-model="form.companyPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�鎴疯锛�" prop="bankAccountName">
- <el-input
- v-model="form.bankAccountName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璐﹀彿锛�" prop="bankAccountNum">
- <el-input
- v-model="form.bankAccountNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴浜猴細" prop="contactUserName">
- <el-input
- v-model="form.contactUserName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactUserPhone">
- <el-input
- v-model="form.contactUserPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁存姢浜猴細" prop="maintainUserId">
- <el-select
- v-model="form.maintainUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.nickName"
- :label="item.nickName"
- :value="item.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁存姢鏃堕棿锛�" prop="maintainTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintainTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 渚涘簲鍟嗗鍏ュ璇濇 -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <!-- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- > -->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { onMounted, ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { delSupplier } from "@/api/basicData/supplierManageFile.js";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import {
- addSupplier,
- getSupplier,
- listSupplier,
- updateSupplier,
-} from "@/api/basicData/supplierManageFile.js";
-import useUserStore from "@/store/modules/user";
-import { getToken } from "@/utils/auth.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-
-const tableColumn = ref([
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width: 250,
- },
- {
- label: "绾崇◣浜鸿瘑鍒彿",
- prop: "taxpayerIdentificationNum",
- width: 230,
- },
- {
- label: "鍏徃鍦板潃",
- prop: "companyAddress",
- width: 220,
- },
- {
- label: "鑱旂郴鏂瑰紡",
- prop: "companyPhone",
- width:150
- },
- {
- label: "寮�鎴疯",
- prop: "bankAccountName",
- width: 220,
- },
- {
- label: "璐﹀彿",
- prop: "bankAccountNum",
- width: 220,
- },
- {
- label: "鑱旂郴浜�",
- prop: "contactUserName",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "contactUserPhone",
- width: 150,
- },
- {
- label: "缁存姢浜�",
- prop: "maintainUserName",
- },
-
- {
- label: "缁存姢鏃堕棿",
- prop: "maintainTime",
- width:100
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.maintainUserName !== userStore.nickName
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const userList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierName: "",
- },
- form: {
- supplierName: "",
- taxpayerIdentificationNum: "",
- companyAddress: "",
- companyPhone: "",
- bankAccountName: "",
- bankAccountNum: "",
- contactUserName: "",
- contactUserPhone: "",
- maintainUserId: "",
- maintainTime: "",
- },
- rules: {
- supplierName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxpayerIdentificationNum: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccountName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccountNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contactUserName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- contactUserPhone: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- maintainUserId: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- maintainTime: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- console.log(upload.url + '?updateSupport=' + upload.updateSupport)
- proxy.$refs["uploadRef"].submit();
-}
-const getList = () => {
- tableLoading.value = true;
- listSupplier({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "渚涘簲鍟嗗鍏�";
- upload.open = true;
-}
-
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- form.value.maintainUserId = userStore.id;
- form.value.maintainTime = getCurrentDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- getSupplier(row.id).then((res) => {
- form.value = { ...res.data };
- });
- }
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- addSupplier(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- updateSupplier(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/system/supplier/export", {}, "渚涘簲鍟嗘。妗�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.maintainUserName !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delSupplier(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/chatHome/chatHomeIndex/MobileChat.vue b/src/views/chatHome/chatHomeIndex/MobileChat.vue
deleted file mode 100644
index adeb5e7..0000000
--- a/src/views/chatHome/chatHomeIndex/MobileChat.vue
+++ /dev/null
@@ -1,461 +0,0 @@
-<template>
- <div class="mobile-chat-wrapper" style="height: 91vh;">
- <div class="chat-history">
- <div class="chat-content" ref="chatContent">
- <div class="chat-wrapper" v-for="(item, index) in chatList" :key="index">
- <div class="chat-friend" v-if="item.uid !== '1001'">
- <div class="info-time">
- <img :src="item.headImg" alt="" />
- <span>{{ item.name }}</span>
- <span>{{ item.time }}</span>
- </div>
- <div class="chat-text" v-if="item.chatType == 0">
- <template v-if="isSend && index === chatList.length - 1">
- <span class="flash_cursor"></span>
- </template>
- <template v-else>
- <pre style="font-family: none;">{{ item.msg }}</pre>
- </template>
- </div>
- <div class="chat-img" v-if="item.chatType == 1">
- <img :src="item.msg" alt="琛ㄦ儏" v-if="item.extend.imgType == 1" style="width: 100px; height: 100px" />
- <el-image :src="item.msg" :preview-src-list="srcImgList" v-else> </el-image>
- </div>
- <div class="chat-img" v-if="item.chatType == 2">
- <div class="word-file">
- <FileCard :fileType="item.extend.fileType" :file="item.msg"></FileCard>
- </div>
- </div>
- </div>
- <div class="chat-me" v-else>
- <div class="info-time">
- <span>{{ item.name }}</span>
- <span>{{ item.time }}</span>
- <img :src="item.headImg" alt="" />
- </div>
- <div class="chat-text" v-if="item.chatType == 0">
- {{ item.msg }}
- </div>
- <div class="chat-img" v-if="item.chatType == 1">
- <img :src="item.msg" alt="琛ㄦ儏" v-if="item.extend.imgType == 1" style="width: 100px; height: 100px" />
- <el-image style="max-width: 300px; border-radius: 10px" :src="item.msg" :preview-src-list="srcImgList" v-else> </el-image>
- </div>
- <div class="chat-img" v-if="item.chatType == 2">
- <div class="word-file">
- <FileCard :fileType="item.extend.fileType" :file="item.msg"></FileCard>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="chat-input-wrapper">
- <div style="display: flex; align-items: center">
- <input v-model="inputMsg" @change="sendText" :disabled="loading" class="input-text" autofocus placeholder="缁欏皬鏅哄彂閫佹秷鎭�" />
- <img class="send-icon" src="@/assets/img/emoji/rocket.png" alt="" @click="sendText" />
-
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, nextTick,onActivated } from 'vue'
-import { useRoute } from 'vue-router'
-import { animation } from '@/utils/util'
-import chatGPTHeadImg from '@/assets/img/head_portrait1.png'
-import headPortrait from '@/assets/img/head_portrait.jpg'
-import FileCard from '@/components/FileCard.vue'
-import { ElMessage } from "element-plus"
-import {checking} from './ai-wd.js'
-
-// 瀹氫箟鍝嶅簲寮忔暟鎹�
-const route = useRoute()
-const chatContent = ref(null)
-const ws = ref(null)
-const chatList = ref([
- {
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: ' 灏忔櫤涓烘偍鏈嶅姟',
- chatType: 0,
- uid: '1002'
- }
-])
-const inputMsg = ref('')
-const isSend = ref(false)
-const fileList = ref([])
-const isProcessing = ref(false)
-const loading = ref(true)
-const srcImgList = ref([])
-
-// 鍒犻櫎鍥剧墖
-const deleteImg = (index) => {
- if (index >= 0 && index < fileList.value.length) {
- fileList.value.splice(index, 1)
- }
-}
-
-// WebSocket娑堟伅鎺ユ敹
-const websocketonmessage = (e) => {
- const redata = JSON.parse(e.data)
- //鏁版嵁鎺ユ敹
- let chatGPT = {
- headImg: headPortrait,
- name: 'DeepSeek',
- time: new Date().toLocaleTimeString(),
- msg: redata[0].text,
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1002' //uid
- }
- sendMsg(chatGPT)
- isSend.value = false
-}
-
-// WebSocket鍙戦�佹秷鎭�
-const websocketsend = (Data) => {
- console.log("鍗冲皢鍙戦�佹秷鎭�", Data)
- if (ws.value && ws.value.readyState === WebSocket.OPEN) {
- console.log("鍙戦�佹秷鎭�", ws.value)
- console.log("鍙戦�佹秷鎭�", Data)
- let fileUrls = fileList.value.map(item => item.file.fileUrl)
- //鏁版嵁鍙戦��
- ws.value.send(Data + ":" + fileUrls.join(","))
- fileList.value = []
- inputMsg.value = ''
- }
-}
-
-// 鍙戦�佹枃鏈秷鎭�
-const sendText = () => {
- if (inputMsg.value) {
- let chatMsg = {
- headImg: headPortrait,
- name: '鍗ч緳',
- time: new Date().toLocaleTimeString(),
- msg: inputMsg.value,
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1001' //uid
- }
- chatList.value.push(chatMsg)
- let chatGPT = {
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: "",
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1002' //uid
- }
- chatList.value.push(chatGPT) // 灏嗘帴鏀跺埌鐨勬秷鎭瓨鍌ㄥ埌 messages 鏁扮粍
- simulateStreamingOutput(chatGPT, inputMsg.value)
- inputMsg.value = ''
-
- } else {
- ElMessage({
- message: '娑堟伅涓嶈兘涓虹┖鍝',
- type: 'warning'
- })
- }
-}
-
-// 鍙戦�佷俊鎭�
-const sendMsg = (msgList) => {
- chatList.value.push(msgList)
- scrollBottom()
-}
-
-// 鑾峰彇绐楀彛楂樺害骞舵粴鍔ㄨ嚦鏈�搴曞眰
-const scrollBottom = () => {
- nextTick(() => {
- const scrollDom = chatContent.value
- animation(scrollDom, scrollDom.scrollHeight - scrollDom.offsetHeight)
- })
-}
-
-// 缁勪欢鎸傝浇鏃舵墽琛�
-onActivated(() => {
- chatList.value = []
- chatList.value.push({
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: '灏忔櫤涓烘偍鏈嶅姟',
- chatType: 0,
- uid: '1002'
- })
- chatList.value.push({
- headImg: headPortrait,
- name: '鍗ч緳',
- time: new Date().toLocaleTimeString(),
- msg: route.query.keyWord,
- chatType: 0,
- uid: '1001'
- })
- // 娣诲姞涓�涓┖鐨勫洖澶嶆秷鎭崰浣�
- const replyMsg = {
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: '',
- chatType: 0,
- uid: '1002'
- }
- chatList.value.push(replyMsg)
- scrollBottom()
- loading.value = false
- // 濡傛灉鏈夋煡璇㈠叧閿瓧锛屽垯妯℃嫙娴佸紡杈撳嚭
- if (route.query.keyWord) {
- simulateStreamingOutput(replyMsg, route.query.keyWord)
- }
-})
-// 妯℃嫙娴佸紡杈撳嚭
-const simulateStreamingOutput = async (msgObj, keyWord) => {
- loading.value = true
- // 鐢熸垚0.8-1.3绉掍箣闂寸殑闅忔満寤惰繜
- const delay = Math.random() * 500 + 800
-
- // 妯℃嫙鍥炲鍐呭锛堝疄闄呭簲鐢ㄤ腑搴斾粠API鑾峰彇锛�
- const responseText = `鍏充簬"${keyWord}"鐨勯棶棰橈紝鎴戞潵涓烘偍瑙g瓟锛歕n` + checking(keyWord)
-
- isSend.value = true
-
- let index = 0
- setTimeout(() => {
- const interval = setInterval(() => {
- isSend.value = true
- if (index < responseText.length) {
- msgObj.msg += responseText.charAt(index)
- index++
- isSend.value = false
- scrollBottom()
- } else {
- clearInterval(interval)
- isSend.value = false
- loading.value = false
- }
- }, 50) // 姣�50ms杈撳嚭涓�涓瓧绗︼紝妯℃嫙娴佸紡鏁堟灉
- }, delay)
-
-}
-</script>
-
-<style lang="scss" scoped>
-.mobile-chat-wrapper {
- display: flex;
- flex-direction: column;
- overflow: hidden;
- height: 91vh;
- position: relative;
- background-color: white;
-
- .chat-history {
- flex: 1 1 0;
- overflow-y: auto;
- }
-
- .chat-input-wrapper {
- padding: 8px 16px 8px 8px;
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- .file-tt{
- flex-direction: column;
- width: 200px;
- display: flex;
- padding: 5px;
- border-radius: 5px;
- margin-right: 5px;
- background: #cacaca;
- .file-item{
- width: 200px;
- overflow:hidden;
- word-wrap: break-word;
- text-overflow:ellipsis;
- display:-webkit-box;
- -webkit-box-orient:vertical;
- -webkit-line-clamp:2;
- }
- }
-
- .send-icon {
- height: 40px;
- margin-left: 16px;
- }
- .input-text{
- font-size: 18px;
- width: 100%;
- border-radius: 20px;
- height: 80px;
- padding-left: 10px;
- //padding-top: 10px;
- border: none;
- color: black; /* 淇敼鏂囨湰棰滆壊涓虹櫧鑹� */
- background-color: #f5f4f4; /* 淇敼鑳屾櫙棰滆壊涓烘繁鐏拌壊 */
- }
- }
-
- .chat-content {
- width: 100%;
- height: 80%;
- overflow-y: scroll;
- padding: 20px;
- box-sizing: border-box;
-
- &::-webkit-scrollbar {
- width: 0;
- /* Safari,Chrome 闅愯棌婊氬姩鏉� */
- height: 0;
- /* Safari,Chrome 闅愯棌婊氬姩鏉� */
- display: none;
- /* 绉诲姩绔�乸ad 涓奡afari锛孋hrome锛岄殣钘忔粴鍔ㄦ潯 */
- }
-
- .chat-wrapper {
- position: relative;
- word-break: break-all;
-
- .chat-friend {
- width: 100%;
- float: left;
- margin-bottom: 20px;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
-
- .chat-text {
- max-width: 90%;
- padding: 20px;
- border-radius: 20px 20px 20px 5px;
- background-color: rgb(245, 248, 248);
- color: black;
-
- &:hover {
- background-color: rgb(232, 232, 232);
- }
-
- pre {
- white-space: break-spaces;
- }
- }
-
- .chat-img {
- img {
- width: 100px;
- height: 100px;
- }
- }
-
- .info-time {
- margin: 10px 0;
- color: black;
- font-size: 14px;
-
- img {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- vertical-align: middle;
- margin-right: 10px;
- }
-
- span:last-child {
- color: rgb(101, 104, 115);
- margin-left: 10px;
- vertical-align: middle;
- }
- }
- }
-
- .chat-me {
- width: 100%;
- float: right;
- margin-bottom: 20px;
- position: relative;
- display: flex;
- flex-direction: column;
- justify-content: flex-end;
- align-items: flex-end;
-
- .chat-text {
- float: right;
- max-width: 90%;
- padding: 20px;
- border-radius: 20px 20px 5px 20px;
- background-color: rgb(29, 144, 245);
- color: #fff;
-
- &:hover {
- background-color: rgb(26, 129, 219);
- }
- }
-
- .chat-img {
- img {
- max-width: 300px;
- max-height: 200px;
- border-radius: 10px;
- }
- }
-
- .info-time {
- margin: 10px 0;
- color: black;
- font-size: 14px;
- display: flex;
- justify-content: flex-end;
-
- img {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- vertical-align: middle;
- margin-left: 10px;
- }
-
- span {
- line-height: 30px;
- }
-
- span:first-child {
- color: rgb(101, 104, 115);
- margin-right: 10px;
- vertical-align: middle;
- }
- }
- }
- }
- }
- .flash_cursor {
- width: 20px;
- height: 30px;
- display: inline-block;
- background: #d6e3f5;
- opacity: 1;
- animation: glow 800ms ease-out infinite alternate;
- }
- @keyframes glow {
- 0% {
- opacity: 1;
- }
-
- 25% {
- opacity: 0.5;
- }
-
- 50% {
- opacity: 0;
- }
-
- 75% {
- opacity: 0.5;
- }
-
- 100% {
- opacity: 1;
- }
- }
-}
-</style>
diff --git a/src/views/chatHome/chatHomeIndex/ai-jz.js b/src/views/chatHome/chatHomeIndex/ai-jz.js
deleted file mode 100644
index 02ee6dc..0000000
--- a/src/views/chatHome/chatHomeIndex/ai-jz.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export function jam() {
- return ""
-}
\ No newline at end of file
diff --git a/src/views/chatHome/chatHomeIndex/ai-wd.js b/src/views/chatHome/chatHomeIndex/ai-wd.js
deleted file mode 100644
index c5b83d5..0000000
--- a/src/views/chatHome/chatHomeIndex/ai-wd.js
+++ /dev/null
@@ -1,393 +0,0 @@
-export function gasLeaks() {
- return "1. 璁捐涓庤澶囬�夋嫨\n" +
- "閫夌敤楂樿川閲忔潗鏂欙細绠¢亾銆侀榾闂ㄣ�佸偍缃愮瓑璁惧搴旈�夌敤鑰愯厫铓�銆佽�愰珮鍘嬬殑鏉愭枡锛屽苟绗﹀悎瀹夊叏鏍囧噯锛堝ASME銆丄PI绛夛級銆俓n" +
- "\n" +
- "瀹夊叏璁捐锛歕n" +
- "\n" +
- "瀹夎鍐椾綑鐨勫畨鍏ㄨ缃紙濡傚弻閲嶉榾闂ㄣ�佺垎鐮寸墖銆佸畨鍏ㄩ榾绛夛級銆俓n" +
- "\n" +
- "璁剧疆姘斾綋娉勬紡妫�娴嬬郴缁燂紙濡傚彲鐕冩皵浣撴姤璀﹀櫒銆佹湁姣掓皵浣撲紶鎰熷櫒锛夈�俓n" +
- "\n" +
- "閲囩敤灏侀棴寮忕郴缁熻璁★紝鍑忓皯寮�鏀炬帴鍙c�俓n" +
- "\n" +
- "閫氶绯荤粺锛氬湪鍙兘娉勬紡鐨勫尯鍩熷畨瑁呭己鍒堕�氶璁惧锛岄槻姝㈡皵浣撹仛闆嗐�俓n" +
- "\n" +
- "2. 瀹夎涓庣淮鎶n" +
- "瑙勮寖瀹夎锛氱敱涓撲笟浜哄憳杩涜璁惧瀹夎锛岀‘淇濈閬撶剨鎺ャ�佸瘑灏佺瓑鐜妭鏃犵己闄枫�俓n" +
- "\n" +
- "瀹氭湡妫�鏌ワ細\n" +
- "\n" +
- "瀵圭閬撱�侀榾闂ㄣ�佽繛鎺ュ杩涜娉勬紡妫�娴嬶紙濡傚帇鍔涙祴璇曘�佽秴澹版尝妫�娴嬨�佽偉鐨傛按妫�婕忥級銆俓n" +
- "\n" +
- "鏇存崲鑰佸寲鎴栬厫铓�鐨勯儴浠躲�俓n" +
- "\n" +
- "棰勯槻鎬х淮鎶わ細鍒跺畾缁存姢璁″垝锛屽畾鏈熸鼎婊戦榾闂ㄣ�佹洿鎹㈠瘑灏佷欢绛夈�俓n" +
- "\n" +
- "3. 鎿嶄綔绠$悊\n" +
- "涓ユ牸鎿嶄綔瑙勭▼锛歕n" +
- "\n" +
- "鎿嶄綔浜哄憳闇�鍩硅涓婂矖锛岀啛鎮夋皵浣撶壒鎬у拰搴旀�ユ祦绋嬨�俓n" +
- "\n" +
- "閬垮厤瓒呭帇銆佽秴娓╂垨閿欒鎿嶄綔銆俓n" +
- "\n" +
- "鐩戞帶绯荤粺锛歕n" +
- "\n" +
- "瀹炴椂鐩戞祴鍘嬪姏銆佹俯搴︺�佹祦閲忕瓑鍙傛暟锛岃缃嚜鍔ㄦ姤璀﹀拰鑱旈攣鍋滄満瑁呯疆銆俓n" +
- "\n" +
- "浣跨敤姘斾綋妫�娴嬩华锛堝绾㈠銆佺數鍖栧浼犳劅鍣級鐩戞祴鐜娴撳害銆俓n" +
- "\n" +
- "鏄庣‘鏍囪瘑锛氬湪鍗遍櫓鍖哄煙鏍囨槑姘斾綋绫诲瀷銆侀闄╃瓑绾у強闃叉姢瑕佹眰銆俓n" +
- "\n" +
- "4. 娉勬紡搴旀�ユ帾鏂絓n" +
- "搴旀�ヨ澶囷細\n" +
- "\n" +
- "閰嶅闃叉瘨闈㈠叿銆佸懠鍚稿櫒銆侀槻鎶ゆ湇绛変釜浜洪槻鎶よ澶囷紙PPE锛夈�俓n" +
- "\n" +
- "灏辫繎鏀剧疆娉勬紡搴旀�ュ寘锛堝鍫垫紡鑳躲�佸瘑灏佸甫锛夈�俓n" +
- "\n" +
- "绱ф�ュ搷搴旓細\n" +
- "\n" +
- "绔嬪嵆鍒囨柇姘旀簮锛堝叧闂笂娓搁榾闂ㄦ垨鍚姩绱ф�ュ垏鏂郴缁燂級銆俓n" +
- "\n" +
- "鍚姩閫氶璁惧绋�閲婃皵浣撴祿搴︺�俓n" +
- "\n" +
- "鐤忔暎浜哄憳骞朵笂鎶ヤ笓涓氶儴闂紙濡傛秷闃层�佺幆淇濓級銆俓n" +
- "\n" +
- "搴旀�ラ妗堬細瀹氭湡婕旂粌娉勬紡澶勭疆娴佺▼锛岀‘淇濅汉鍛樼啛鎮夊垎宸ャ�俓n" +
- "\n" +
- "5. 鍌ㄥ瓨涓庤繍杈撳畨鍏╘n" +
- "鍌ㄥ瓨瑕佹眰锛歕n" +
- "\n" +
- "鍌ㄧ綈杩滅鐏簮銆侀珮娓╁尯锛屽苟璁剧疆鍥村牥闃叉鎵╂暎銆俓n" +
- "\n" +
- "娑插寲姘斾綋鍌ㄧ綈闇�閰嶅娉勫帇瑁呯疆銆俓n" +
- "\n" +
- "杩愯緭瀹夊叏锛歕n" +
- "\n" +
- "浣跨敤鍚堣鐨勮繍杈撹溅杈嗭紝鍥哄畾姘旂摱闃叉纰版挒銆俓n" +
- "\n" +
- "杩愯緭閫斾腑鐩戞帶杞﹁締鐘舵�侊紙濡侴PS銆佹俯搴︿紶鎰熷櫒锛夈�俓n" +
- "\n" +
- "6. 浜哄憳鍩硅涓庢枃鍖朶n" +
- "瀹夊叏鍩硅锛氬畾鏈熷紑灞曟皵浣撳嵄瀹炽�侀槻鎶ゆ帾鏂藉拰搴旀�ュ鐞嗙殑鍩硅銆俓n" +
- "\n" +
- "瀹夊叏鏂囧寲锛氶紦鍔卞憳宸ユ姤鍛婃綔鍦ㄩ闄╋紝寤虹珛鈥滈浂娉勬紡鈥濈鐞嗙洰鏍囥�俓n" +
- "\n" +
- "7. 娉曡涓庢爣鍑哱n" +
- "閬靛畧鐩稿叧娉曡锛堝OSHA銆丟B 50493銆婄煶娌瑰寲宸ュ彲鐕冩皵浣撳拰鏈夋瘨姘斾綋妫�娴嬫姤璀﹁璁¤鑼冦�嬶級銆俓n" +
- "\n" +
- "瀹氭湡杩涜瀹夊叏瀹¤锛岀‘淇濈鍚堣涓氭爣鍑嗐�俓n" +
- "\n" +
- "甯歌鍗遍櫓姘斾綋娉勬紡鐨勯拡瀵规�ф帾鏂絓n" +
- "鍙噧姘斾綋锛堝鐢茬兎銆佹阿姘旓級锛氶槻鐖嗙數鍣ㄣ�佹秷闄ら潤鐢点�俓n" +
- "\n" +
- "鏈夋瘨姘斾綋锛堝姘皵銆佺~鍖栨阿锛夛細閰嶅涓撶敤杩囨护寮忔垨渚涙哀寮忓懠鍚稿櫒銆俓n" +
- "\n" +
- "绐掓伅鎬ф皵浣擄紙濡傛爱姘斻�佷簩姘у寲纰筹級锛氱洃娴嬫哀姘旀祿搴︼紝閬垮厤瀵嗛棴绌洪棿浣滀笟銆俓n" +
- "\n" +
- "閫氳繃浠ヤ笂鎺柦鐨勭患鍚堝簲鐢紝鍙ぇ骞呴檷浣庢皵浣撴硠婕忛闄╋紝淇濋殰浜哄憳瀹夊叏鍜岀幆澧冨仴搴枫�傝嫢鍙戠敓娉勬紡锛岄渶浼樺厛纭繚浜哄憳鎾ょ锛屽啀鐢变笓涓氫汉鍛樺缃�俓n" +
- "\n" +
- "鏈洖绛旂敱 AI 鐢熸垚锛屽唴瀹逛粎渚涘弬鑰冿紝璇蜂粩缁嗙攧鍒��"
-}
-
-export function shipping() {
- return "涓�銆佺珛鍗冲簲鎬ュ搷搴擻n" +
- "1. 鍙戠幇娉勬紡鏃剁殑绱ф�ヨ鍔╘n" +
- "鍋滆溅骞堕殧绂荤幇鍦猴細\n" +
- "\n" +
- "杩愯緭杞﹁締绔嬪嵆鍋滈潬鍦ㄧ┖鏃枫�佽繙绂讳汉缇ゅ拰鐏簮鐨勪綅缃�俓n" +
- "\n" +
- "璁剧疆璀︽垝绾匡紙鑷冲皯50~100绫冲崐寰勶紝鏍规嵁姘斾綋鎬ц川璋冩暣锛夛紝绂佹鏃犲叧浜哄憳杩涘叆銆俓n" +
- "\n" +
- "鍒囨柇娉勬紡婧愶細\n" +
- "\n" +
- "鍏抽棴瀹瑰櫒闃�闂ㄦ垨灏佸牭鐮存崯澶勶紙濡備娇鐢ㄥ簲鎬ュ牭婕忓伐鍏凤級銆俓n" +
- "\n" +
- "鑻ラ榾闂ㄦ崯鍧忥紝灏濊瘯杞Щ鍓╀綑姘斾綋鑷冲鐢ㄥ鍣紙闇�涓撲笟浜哄憳鎿嶄綔锛夈�俓n" +
- "\n" +
- "鎶ヨ涓庝笂鎶ワ細\n" +
- "\n" +
- "鎷ㄦ墦搴旀�ョ數璇濓紙濡傛秷闃�119銆佺幆淇濋儴闂級锛岃鏄庢皵浣撶被鍨嬨�佹硠婕忛噺銆佷綅缃瓑淇℃伅銆俓n" +
- "\n" +
- "鑱旂郴杩愯緭鍏徃鍙婅揣涓伙紝鑾峰彇鎶�鏈敮鎻达紙濡侻SDS瀹夊叏鏁版嵁琛級銆俓n" +
- "\n" +
- "2. 浜哄憳闃叉姢涓庣枏鏁n" +
- "绌挎埓闃叉姢瑁呭锛歕n" +
- "\n" +
- "鍙噧姘斾綋锛氶槻鐖嗗伐鍏�+闃查潤鐢垫湇锛涙湁姣掓皵浣擄細姝e帇寮忓懠鍚稿櫒+闃插寲鏈嶃�俓n" +
- "\n" +
- "鏃犻槻鎶よ澶囨椂锛岀珛鍗虫挙绂昏嚦涓婇鏂瑰悜銆俓n" +
- "\n" +
- "鐤忔暎鍛ㄨ竟鍖哄煙锛歕n" +
- "\n" +
- "鏍规嵁姘斾綋鎵╂暎鑼冨洿锛堝弬鑰冨簲鎬ュ搷搴旀寚鍗桬RG锛夌枏鏁e眳姘戞垨浣滀笟浜哄憳銆俓n" +
- "\n" +
- "閬垮厤浣庢醇澶勬粸鐣欙紙鏌愪簺姘斾綋姣旂┖姘旈噸锛屽纭寲姘級銆俓n" +
- "\n" +
- "3. 鎺у埗娉勬紡鎵╂暎\n" +
- "鐗╃悊鏂规硶锛歕n" +
- "\n" +
- "瑕嗙洊娉勬紡鍙o紙濡傜敤娴告按妫夎鍑忓皯鎸ュ彂锛屼絾绂佺敤浜庨亣姘村弽搴旀皵浣撳姘皵锛夈�俓n" +
- "\n" +
- "绛戝牑鍥村牭娑蹭綋娉勬紡鐗╋紝闃叉娴佸叆涓嬫按閬撴垨娌虫祦銆俓n" +
- "\n" +
- "鍖栧鏂规硶锛歕n" +
- "\n" +
- "涓拰澶勭悊锛堝姘ㄦ皵娉勬紡鍠锋磼绋�鐩愰吀锛岄渶涓撲笟浜哄憳鎿嶄綔锛夈�俓n" +
- "\n" +
- "浣跨敤鍚搁檮鏉愭枡锛堝娲绘�х偔銆佹矙鍦熷惛闄勬湁鏈烘皵浣擄級銆�"
-}
-
-export function operate(){
- return "涓�銆佹搷浣滀笉褰撳彂鐢熷悗鐨勫簲鎬ュ鐞哱n" +
- "1. 绔嬪嵆鎺у埗浜嬫晠\n" +
- "鍋滄鎿嶄綔锛歕n" +
- "\n" +
- "鎸変笅绱ф�ュ仠鏈烘寜閽紝鍏抽棴鏈�杩戠殑涓婃父闃�闂ㄣ�俓n" +
- "\n" +
- "鍚姩搴旀�ラ妗堬細\n" +
- "\n" +
- "灏忓瀷娉勬紡锛氫娇鐢ㄥ簲鎬ュ牭婕忓伐鍏凤紙濡傚瘑灏佽兌銆佸す鍏凤級銆俓n" +
- "\n" +
- "澶у瀷娉勬紡锛氱枏鏁d汉鍛橈紝鎶ヨ姹傚姪锛�119/鐜繚閮ㄩ棬锛夈�俓n" +
- "\n" +
- "2. 浜哄憳瀹夊叏\n" +
- "鎾ょ涓庨殧绂伙細\n" +
- "\n" +
- "閫嗛鎾ょ鑷充笂椋庡悜瀹夊叏鍖猴紝閬垮厤浣庢醇澶勶紙閲嶆皵浣撶Н鑱氾級銆俓n" +
- "\n" +
- "鎬ユ晳鎺柦锛歕n" +
- "\n" +
- "鍚稿叆鏈夋瘨姘斾綋锛氱Щ鑷崇┖姘旀柊椴滃锛屽繀瑕佹椂浜哄伐鍛煎惛銆俓n" +
- "\n" +
- "鐨偆鎺ヨЕ锛氱珛鍗崇敤娓呮按鍐叉礂15鍒嗛挓锛堣厫铓�鎬ф皵浣擄級銆俓n" +
- "\n" +
- "3. 浜嬫晠璋冩煡涓庢暣鏀筡n" +
- "鏍规湰鍘熷洜鍒嗘瀽锛圧CA锛夛細\n" +
- "\n" +
- "鏄搷浣滃け璇�佸煿璁笉瓒筹紝杩樻槸璁惧缂洪櫡锛焅n" +
- "\n" +
- "鏀硅繘鎺柦锛歕n" +
- "\n" +
- "淇鎿嶄綔瑙勭▼锛屽鍔犺绀烘爣璇嗐�俓n" +
- "\n" +
- "瀵硅矗浠讳汉鍐嶅煿璁紝蹇呰鏃惰皟宀椼��"
-}
-
-export function emergency(){
- return "涓�銆佷紭鍖栧簲鎬ュ搷搴旂殑鍏抽敭鎺柦\n" +
- "1. 瀹屽杽搴旀�ラ妗圽n" +
- "閽堝鎬ц璁★細\n" +
- "\n" +
- "鍩轰簬HAZOP锛堝嵄闄╀笌鍙搷浣滄�у垎鏋愶級璇嗗埆鎵�鏈夋綔鍦ㄩ闄╁満鏅�俓n" +
- "\n" +
- "鍒跺畾鍒嗙骇鍝嶅簲鏈哄埗锛堝皬娉勬紡鐜板満澶勭疆銆佸ぇ娉勬紡鍏ㄥ憳鐤忔暎锛夈�俓n" +
- "\n" +
- "鏄庣‘鑱岃矗锛歕n" +
- "\n" +
- "璁剧珛搴旀�ユ寚鎸ラ儴锛屾寚瀹氭�绘寚鎸ャ�侀�氳缁勩�佹姠闄╃粍銆佸尰鐤楃粍绛夈�俓n" +
- "\n" +
- "纭繚24灏忔椂鍊肩彮鍒跺害锛岃仈绯绘柟寮忓疄鏃舵洿鏂般�俓n" +
- "\n" +
- "鑱斿姩澶栭儴璧勬簮锛歕n" +
- "\n" +
- "涓庢秷闃层�佺幆淇濄�佸尰闄㈡彁鍓嶇璁㈡晳鎻村崗璁紝鏄庣‘鍗忎綔娴佺▼銆俓n" +
- "\n" +
- "2. 寮哄寲搴旀�ヨ祫婧愪繚闅淺n" +
- "瑁呭涓庣墿璧勶細\n" +
- "\n" +
- "閰嶅瓒抽噺涓旀湁鏁堢殑搴旀�ヨ澶囷紝鍖呮嫭锛歕n" +
- "\n" +
- "涓汉闃叉姢瑁呭锛圥PE锛夛細闃叉瘨闈㈠叿銆佸寲瀛﹂槻鎶ゆ湇銆俓n" +
- "\n" +
- "鍫垫紡宸ュ叿锛氬瘑灏佽兌銆佸す鍏枫�佸揩閫熷皝鍫靛櫒銆俓n" +
- "\n" +
- "鍚搁檮/涓拰鏉愭枡锛氭椿鎬х偔銆佹矙鍦熴�佺█纰辨恫锛堢敤浜庨吀鎬ф皵浣擄級銆俓n" +
- "\n" +
- "瀹氭湡妫�鏌ャ�佺淮鎶ゅ拰鏇存崲锛堝姘旂摱鍘嬪姏銆佷紶鎰熷櫒鐢垫睜锛夈�俓n" +
- "\n" +
- "搴旀�ヨ溅杈嗕笌閫氶亾锛歕n" +
- "\n" +
- "纭繚鏁戞彺杞﹁締鍙揩閫熸姷杈炬硠婕忕偣锛堟竻闄よ矾闅滐紝鏍囪瘑搴旀�ヨ矾绾匡級銆俓n" +
- "\n" +
- "鍏抽敭鍖哄煙璁剧疆搴旀�ユ礂鐪煎櫒銆佸柗娣嬬郴缁熴�俓n" +
- "\n" +
- "3. 鍔犲己浜哄憳鍩硅涓庤兘鍔涘缓璁綷n" +
- "鍒嗗眰鍩硅锛歕n" +
- "\n" +
- "鍩哄眰浜哄憳锛氭帉鎻″熀鏈簲鎬ュ缃紙濡傚叧闂榾闂ㄣ�佷娇鐢ㄧ伃鐏櫒锛夈�俓n" +
- "\n" +
- "搴旀�ュ皬缁勶細涓撲笟鍫垫紡銆佷激鍛樻�ユ晳銆佹皵浣撴娴嬫妧鑳姐�俓n" +
- "\n" +
- "绠$悊灞傦細鎸囨尌鍐崇瓥銆佸獟浣撴矡閫氥�佹硶寰嬪悎瑙勩�俓n" +
- "\n" +
- "瀹炴垬鍖栬�冩牳锛歕n" +
- "\n" +
- "閫氳繃妯℃嫙绐佸彂娉勬紡锛堝鐩叉紨锛夋楠屽搷搴旈�熷害銆俓n" +
- "\n" +
- "涓嶅悎鏍艰�呴渶閲嶆柊鍩硅銆俓n" +
- "\n" +
- "4. 瀹氭湡婕旂粌涓庢寔缁敼杩沑n" +
- "婕旂粌棰戠巼锛歕n" +
- "\n" +
- "姣忓搴﹁嚦灏�1娆℃闈㈡帹婕旓紝姣忓勾2娆$患鍚堝疄鎴樻紨缁冦�俓n" +
- "\n" +
- "鍦烘櫙璁捐锛歕n" +
- "\n" +
- "妯℃嫙澶嶆潅鎯呭喌锛堝澶滈棿鍋滅數銆佸浜哄彈浼わ級銆俓n" +
- "\n" +
- "寮曞叆鈥滅獊鍙戝彉閲忊�濓紙濡傞鍚戠獊鍙樸�佷簩娆℃硠婕忥級銆俓n" +
- "\n" +
- "澶嶇洏涓庝紭鍖栵細\n" +
- "\n" +
- "璁板綍婕旂粌涓殑闂锛堝閫氳寤惰繜銆佽澶囩己澶憋級銆俓n" +
- "\n" +
- "鏇存柊棰勬骞朵笅鍙戝涔犮�俓n" +
- "\n" +
- "5. 鎶�鏈崌绾т笌鏅鸿兘鍖栨敮鎸乗n" +
- "瀹炴椂鐩戞祴涓庨璀︼細\n" +
- "\n" +
- "閮ㄧ讲鐗╄仈缃戯紙IoT锛変紶鎰熷櫒锛岀洃娴嬫皵浣撴祿搴︺�佽澶囩姸鎬併�俓n" +
- "\n" +
- "璁剧疆鑷姩鑱旈攣鎺у埗锛堝娉勬紡鏃惰仈鍔ㄥ叧闂榾闂ㄥ苟鍚姩閫氶锛夈�俓n" +
- "\n" +
- "搴旀�ラ�氳绯荤粺锛歕n" +
- "\n" +
- "浣跨敤闃茬垎瀵硅鏈恒�佸崼鏄熺數璇濓紙淇濋殰淇″彿瑕嗙洊锛夈�俓n" +
- "\n" +
- "寤虹珛搴旀�ュ箍鎾郴缁燂紙濡傚巶鍖鸿鎶ャ�佺煭淇$兢鍙戯級銆俓n" +
- "\n" +
- "鏁板瓧鍖栭妗堬細\n" +
- "\n" +
- "灏嗗簲鎬ラ妗堝綍鍏ョЩ鍔ㄧ粓绔紝瀹炵幇涓�閿皟闃呫�佹楠ゆ寚寮曘��"
-}
-
-export function compliance(){
- return "涓�銆佸父瑙佺殑鍚堣鎬ч棶棰榎n" +
- "1. 璁稿彲涓庤祫璐ㄧ己澶盶n" +
- "闂锛歕n" +
- "\n" +
- "鏈彇寰楀嵄闄╁寲瀛﹀搧缁忚惀璁稿彲璇佹垨瀹夊叏鐢熶骇璁稿彲璇併�俓n" +
- "\n" +
- "鐗圭浣滀笟浜哄憳锛堝鍘嬪姏瀹瑰櫒鎿嶄綔宸ワ級鏃犺瘉涓婂矖銆俓n" +
- "\n" +
- "椋庨櫓锛歕n" +
- "\n" +
- "鐩戠閮ㄩ棬澶勭綒锛堝缃氭銆佽矗浠ゅ仠浜э級銆俓n" +
- "\n" +
- "淇濋櫓鎷掕禂锛堜簨鏁呭彂鐢熸椂锛夈�俓n" +
- "\n" +
- "2. 瀹夊叏璁捐涓嶈揪鏍嘰n" +
- "闂锛歕n" +
- "\n" +
- "鍌ㄧ綈銆佺閬撴湭鎸塆B/T 150锛堝帇鍔涘鍣ㄦ爣鍑嗭級璁捐銆俓n" +
- "\n" +
- "鏈畨瑁呭彲鐕�/鏈夋瘨姘斾綋鎶ヨ鍣紙杩濆弽GB 50493锛夈�俓n" +
- "\n" +
- "椋庨櫓锛歕n" +
- "\n" +
- "璁惧澶辨晥瀵艰嚧娉勬紡鎴栫垎鐐搞�俓n" +
- "\n" +
- "涓嶇鍚堝簲鎬ョ鐞嗛儴鎴朞SHA妫�鏌ヨ姹傘�俓n" +
- "\n" +
- "3. 鎿嶄綔涓庣淮鎶よ繚瑙刓n" +
- "闂锛歕n" +
- "\n" +
- "鏈墽琛屼綔涓氱エ鍒跺害锛堝鍔ㄧ伀浣滀笟鏈鎵癸級銆俓n" +
- "\n" +
- "鏈畾鏈熸楠屽帇鍔涘鍣紙杩濆弽TSG 21-2016锛夈�俓n" +
- "\n" +
- "椋庨櫓锛歕n" +
- "\n" +
- "杩濊鎿嶄綔寮曞彂浜嬫晠锛堝鐒婃帴寮曞彂鍙噧姘斾綋鐖嗙偢锛夈�俓n" +
- "\n" +
- "璁惧鑰佸寲瀵艰嚧绐佸彂娉勬紡銆俓n" +
- "\n" +
- "4. 搴旀�ョ鐞嗕笉鍚堣\n" +
- "闂锛歕n" +
- "\n" +
- "鏈埗瀹氬簲鎬ラ妗堟垨鏈妗堬紙杩濆弽銆婄敓浜у畨鍏ㄤ簨鏁呭簲鎬ユ潯渚嬨�嬶級銆俓n" +
- "\n" +
- "鏈厤澶囧簲鎬ョ墿璧勶紙濡傞槻姣掗潰鍏枫�佸牭婕忓伐鍏凤級銆俓n" +
- "\n" +
- "椋庨櫓锛歕n" +
- "\n" +
- "浜嬫晠鍙戠敓鏃舵棤娉曟湁鏁堟帶鍒讹紝瀵艰嚧鎹熷け鎵╁ぇ銆俓n" +
- "\n" +
- "闈复鐢熸�佺幆澧冮儴杩借矗锛堝鍖栧鍝佹薄鏌撳湡澹�/姘翠綋锛夈�俓n" +
- "\n" +
- "5. 璁板綍涓庢姤鍛婄己澶盶n" +
- "闂锛歕n" +
- "\n" +
- "鏈繚瀛樺畨鍏ㄦ鏌ヨ褰曟垨鍩硅妗f銆俓n" +
- "\n" +
- "鏈寜瑙勫畾涓婃姤娉勬紡浜嬫晠锛堝鐬掓姤銆佽繜鎶ワ級銆俓n" +
- "\n" +
- "椋庨櫓锛歕n" +
- "\n" +
- "浜嬫晠璋冩煡鏃舵棤娉曡嚜璇佸悎瑙勶紝鎵挎媴鍏ㄨ矗銆俓n" +
- "\n" +
- "琚垪鍏ュ畨鍏ㄧ敓浜ч粦鍚嶅崟锛屽奖鍝嶄紒涓氫俊瑾夈��"
-}
-
-export function monitoring(){
- return "涓�銆佸浐瀹氬紡鐩戞祴鎶�鏈痋n" +
- "1. 鍌寲鐕冪儳寮忎紶鎰熷櫒\n" +
- "鍘熺悊锛氬彲鐕冩皵浣撳湪閾備笣琛ㄩ潰鐕冪儳瀵艰嚧鐢甸樆鍙樺寲\n" +
- "\n" +
- "浼樺娍锛氭垚鏈綆锛堬骏500-2000/涓級銆佸搷搴斿揩锛�<10s锛塡n" +
- "\n" +
- "灞�闄愶細鏄撲腑姣掞紙纭�/纭寲鍚堢墿锛夈�佸鍛界煭锛�2-3骞达級\n" +
- "\n" +
- "閫傜敤锛氱煶鍖栧巶鍙噧姘旂洃娴嬶紙鐢茬兎銆佹阿姘旂瓑锛塡n" +
- "\n" +
- "2. 鐢靛寲瀛︿紶鎰熷櫒\n" +
- "鍘熺悊锛氭皵浣撲笌鐢佃В娑插彂鐢熸哀鍖栬繕鍘熷弽搴斾骇鐢熺數娴乗n" +
- "\n" +
- "浼樺娍锛歱pb绾ф娴嬶紙濡侶2S妫�娴嬩笅闄�0.1ppm锛塡n" +
- "\n" +
- "灞�闄愶細鍙楁俯婀垮害褰卞搷锛堥渶瀹氭湡鏍″噯锛塡n" +
- "\n" +
- "閫傜敤锛氭湁姣掓皵浣擄紙Cl鈧傘�丯H鈧冦�丆O绛夛級\n" +
- "\n" +
- "3. 绾㈠鍚告敹寮忥紙NDIR锛塡n" +
- "鍘熺悊锛氭皵浣撳鐗瑰畾绾㈠娉㈡鐨勫惛鏀剁巼妫�娴媆n" +
- "\n" +
- "浼樺娍锛氬厤鏍″噯锛堝鍛�5-10骞达級銆佹姉涓瘨\n" +
- "\n" +
- "灞�闄愶細楂樻垚鏈紙锟�5000+/涓級\n" +
- "\n" +
- "閫傜敤锛欳O鈧傘�丆H鈧勭瓑娓╁姘斾綋鐩戞祴\n" +
- "\n" +
- "4. 婵�鍏夊厜璋憋紙TDLAS锛塡n" +
- "鍘熺悊锛氬彲璋冭皭婵�鍏変簩鏋佺鎵弿姘斾綋鍚告敹绾縗n" +
- "\n" +
- "浼樺娍锛歱pm绾х簿搴︺�佸搷搴攎s绾n" +
- "\n" +
- "灞�闄愶細闇�鍏夊瀵瑰噯锛堝畨瑁呭鏉傦級\n" +
- "\n" +
- "閫傜敤锛氱閬撳井娉勬紡妫�娴嬶紙澶╃劧姘旈暱杈撶绾匡級"
-}
-
-export function checking(keyWord){
- if(keyWord.includes("姘斾綋娉勬紡")){
- return gasLeaks();
- }
- if(keyWord.includes("瀹瑰櫒澶辨晥")){
- return shipping();
- }
- if(keyWord.includes("鎿嶄綔涓嶅綋")){
- return operate();
- }
- if(keyWord.includes("鍝嶅簲涓嶈冻")){
- return emergency();
- }
- if(keyWord.includes("鍚堣鎬�")){
- return compliance();
- }
- if(keyWord.includes("鐩戞祴鎶�鏈�")){
- return monitoring();
- }
- return "涓嶅ソ鎰忔�濓紝灏忔櫤杩樺湪鎴愰暱杩囩▼涓紝鎮ㄧ殑闂宸茬粡瓒呰繃灏忔櫤鐨勫鐞嗚寖鍥翠簡銆�";
-
-}
\ No newline at end of file
diff --git a/src/views/chatHome/chatHomeIndex/home.vue b/src/views/chatHome/chatHomeIndex/home.vue
deleted file mode 100644
index 7796284..0000000
--- a/src/views/chatHome/chatHomeIndex/home.vue
+++ /dev/null
@@ -1,175 +0,0 @@
-<template>
-<div class="home">
- <div style="background: white;color: black;font-size: 30px;" class="logo">
- <div class="logo-one" style="font-weight: bold">
-<!-- <img src="/src/assets/img/logo.png" style="width: 50px;height: 50px;margin: 0 10px" />-->
- <div><i>澶фā鍨婣I灏忔櫤姝e湪涓烘偍鏈嶅姟</i></div>
- </div>
- <div class="input">
- <input type="text" v-model="keyWord" class="input-text" placeholder="缁欏皬鏅哄彂閫佹秷鎭�" @keyup.enter="sendMsg" />
- <div style="font-size: 13px;color: #808080;display: flex;justify-content: space-between;padding: 10px;">
- <div style="display: flex;justify-content: center;align-items: center;">
-<!-- <div style="display: flex;justify-content: center;align-items: center;">-->
-<!-- <img src="/src/assets/img/logo.png" style="width: 15px;height: 15px;margin: 0 5px" />-->
-<!-- <span>娣卞害鎬濊��(R1)</span>-->
-<!-- </div>-->
-<!-- <div style="display: flex;justify-content: center;align-items: center;">-->
-<!-- <img src="/src/assets/img/logo.png" style="width: 15px;height: 15px;margin: 0 5px" />-->
-<!-- <span>鑱旂綉鎼滅储</span>-->
-<!-- </div>-->
- </div>
- <div style="display: flex;justify-content: center;align-items: center;margin-right: 5px;">
-<!-- <img src="/src/assets/img/logo.png" style="width: 25px;height: 25px;margin: 0 5px" />-->
- <img src="@/assets/img/emoji/rocket.png" style="width: 25px;height: 25px;margin: 0 5px" @click="sendMsg"/>
- </div>
- </div>
- </div>
- <div style="width: 780px;">
- <div style="font-weight: bold;margin: 30px 0;">鐑棬鎺ㄨ崘</div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordOne)">
- <p class="fontSize aaa">{{keyWordOne}}</p>
- <p class="fontSize">闃�闂ㄣ�佺閬撴垨瀹瑰櫒瀵嗗皝澶辨晥瀵艰嚧姘斾綋娉勬紡锛堝姘皵銆佹皑姘旓級銆�</p>
- <p class="fontSize">鍚庢灉锛氫腑姣掋�佺垎鐐搞�佺幆澧冩薄鏌撱��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordTwo)">
- <p class="fontSize aaa">{{keyWordTwo}}</p>
- <p class="fontSize">閽㈢摱鎴栫綈浣撳洜鏉愭枡鐤插姵銆佽厫铓�鎴栬秴鍘嬬牬瑁�</p>
- <p class="fontSize">鍘熷洜锛氭湭瀹氭湡妫�娴嬨�佽繚瑙勫厖瑁呮垨澶栭儴鎾炲嚮銆傘��</p>
- </div>
- </div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordFive)">
- <p class="fontSize aaa">{{keyWordFive}}</p>
- <p class="fontSize">瑁呭嵏杩囩▼涓繚瑙勬搷浣滐紙濡傞噹铔惉杩愩�佹贩瑁呯蹇岀墿璐級銆�</p>
- <p class="fontSize">杩愯緭閫斾腑鏈浐瀹氬鍣紝瀵艰嚧纰版挒鎴栧�惧�掋��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordSix)">
- <p class="fontSize aaa">{{keyWordSix}}</p>
- <p class="fontSize">缂轰箯娉勬紡搴旀�ラ妗堬紝浜哄憳鍩硅涓嶈冻銆�</p>
- <p class="fontSize">鏁戞彺璁惧锛堝闃叉瘨闈㈠叿銆佸牭婕忓伐鍏凤級缂哄け鎴栧け鏁堛��</p>
- </div>
- </div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordServen)">
- <p class="fontSize aaa">{{keyWordServen}}</p>
- <p class="fontSize">鏈彇寰楄繍杈撹祫璐紙濡侫DR/RID绛夊浗闄呰鑼冿級銆�</p>
- <p class="fontSize">璺嚎瑙勫垝涓嶅悎瑙勶紙濡傜┛瓒婁汉鍙e瘑闆嗗尯锛夈��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordEight)">
- <p class="fontSize aaa">{{keyWordEight}}</p>
- <p class="fontSize">浼犳劅鍣ㄩ儴缃诧紙濡傜孩澶栨皵浣撴帰娴嬪櫒銆佺數鍖栧浼犳劅鍣級銆�</p>
- <p class="fontSize">瀹炴椂鏁版嵁浼犺緭鑷崇洃鎺у钩鍙帮紝瑙﹀彂鎶ヨ銆�</p>
- </div>
- </div>
- </div>
- </div>
-
- <div></div>
-</div>
-</template>
-
-<script setup>
-import { ref,onMounted } from "vue";
-import {useRoute,useRouter} from "vue-router"
-const route = useRoute();
-const router = useRouter();
-const keyWord = ref('');
-const keyWordOne = ref('鍗遍櫓姘斾綋娉勬紡鎬庝箞鍔�');
-const keyWordTwo = ref('杩愯緭瀹瑰櫒澶辨晥鎬庝箞鍔�');
-const keyWordFive = ref('鎿嶄綔涓嶅綋鎬庝箞鍔�');
-const keyWordSix = ref('搴旀�ュ搷搴斾笉瓒虫�庝箞鍔�');
-const keyWordServen = ref('鍚堣鎬ч棶棰�');
-const keyWordEight = ref('娉勬紡鐩戞祴鎶�鏈湁鍝簺');
-
-const sendMsg = () => {
- router.push({ path: '/main/MobileChat',query:{ keyWord: keyWord.value} })
-}
-
-const sendMsgDefault = (value) => {
- router.push({ path: '/main/MobileChat',query:{ keyWord: value} })
-}
-
-</script>
-
-<style lang="scss" scoped>
-.home {
- width: 100%;
- height: 91vh;
- display: flex;
- flex-direction: column;
- align-items: center;
-
- .logo {
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- z-index: 99;
- width: 100%;
- height: 100%;
- color: #fff;
- cursor: pointer;
- overflow: hidden;
- background-color: #F0F6F9;
-
- .keywords {
- display: flex;
- width: 100%;
- height: 90px;
- line-height: 80px;
- justify-content: space-between;
- margin: 10px 0;
-
- .keywordss {
- box-shadow: 0px 2px 5px #b8b8b8;
- width: 48%;
- background: #e0edfc;
- border-radius: 10px;
-
- .aaa {
- font-weight: bold;
- font-size: 15px !important;
- }
-
- .fontSize {
- font-size: 13px;
- height: 20px;
- line-height: 20px;
- margin: 6px;
- }
- }
- }
-
- .logo-one {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 20px;
- }
-
- .input {
- width: 780px;
- height: 150px;
- background: #f5f4f4;
- border-radius: 20px;
-
- .input-text {
- font-size: 18px;
- width: 568px;
- border-radius: 20px 20px 0 0;
- height: 90px;
- padding-left: 10px;
- border: none;
- color: black;
- background-color: #f5f4f4;
- }
-
- .input-text:focus {
- outline: none;
- border: none;
- }
- }
- }
-}
-</style>
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
deleted file mode 100644
index 403cab6..0000000
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ /dev/null
@@ -1,371 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹℃壒娴佺▼' : '缂栬緫瀹℃壒娴佺▼'"
- width="700px"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" ref="formRef">
- <el-row>
- <el-col :span="24">
- <el-form-item label="娴佺▼缂栧彿锛�" prop="approveId">
- <el-input v-model="form.approveId" placeholder="鑷姩缂栧彿" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId">
- <el-select
- disabled
- v-model="form.approveDeptId"
- placeholder="閫夋嫨閮ㄩ棬"
- >
- <el-option
- v-for="user in productOptions"
- :key="user.deptId"
- :label="user.deptName"
- :value="user.deptId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="瀹℃壒浜嬬敱锛�" prop="approveReason">
- <el-input v-model="form.approveReason" placeholder="璇疯緭鍏�" clearable type="textarea" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢宠浜猴細" prop="approveUser">
- <el-select
- v-model="form.approveUser"
- placeholder="閫夋嫨浜哄憳"
- disabled
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
- <el-date-picker
- v-model="form.approveTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <el-form :model="{ activities }" ref="formRef" label-position="top">
- <el-steps :active="getActiveStep()" finish-status="success" process-status="process" align-center direction="vertical">
- <el-step
- v-for="(activity, index) in activities"
- :key="index"
- finish-status="success"
- :title="getNodeTitle(index, activities.length)"
- :description="activity.approveNodeUser"
- :icon="getNodeIcon(activity, index)"
- >
- <template #icon>
- <el-icon v-if="activity.approveNodeStatus === 2" color="red" :size="22"><WarningFilled /></el-icon>
- <el-icon v-else-if="activity.isShen" color="#1890ff" :size="22"><Edit /></el-icon>
- <el-icon v-else-if="activity.approveNodeStatus === 1" color="#67C23A" :size="26"><Check /></el-icon>
- <el-icon v-else color="#C0C4CC" :size="22"><MoreFilled /></el-icon>
- </template>
- <template #title>
- <span style="color: #000000">{{ getNodeTitle(index, activities.length) }}</span>
- </template>
- <template #description>
- <div class="node-user">
- <div class="avatar-wrapper">
- <img :src="userStore.avatar" class="user-avatar" alt=""/>
- </div>
- <span style="color: #000000">{{ activity.approveNodeUser }}-{{activity.isApproval}}</span>
- </div>
- <div v-if="!activity.isShen" class="node-reason">
- <span>瀹℃壒鎰忚锛�</span>{{ activity.approveNodeReason }}
- </div>
- <div v-if="!activity.isShen" class="node-reason">
- <span>绛惧悕锛�</span>
- <img :src="activity.urlTem" class="signImg" alt="" v-if="activity.urlTem"/>
- </div>
- <div v-else-if="activity.isShen">
- <el-form-item
- :prop="'activities.' + index + '.approveNodeReason'"
- :rules="[{ required: true, message: '瀹℃壒鎰忚涓嶈兘涓虹┖', trigger: 'blur' }]"
- >
- <el-input v-model="activity.approveNodeReason" clearable type="textarea" :disabled="operationType === 'view'"></el-input>
- </el-form-item>
- </div>
- </template>
- </el-step>
- </el-steps>
- </el-form>
- <template #footer v-if="operationType === 'approval'">
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm(2)">涓嶉�氳繃</el-button>
- <el-button type="primary" @click="openSignatureDialog(1)">閫氳繃</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <!-- 鐢靛瓙绛惧悕寮圭獥锛坴ue3-signature-pad锛� -->
- <el-dialog v-model="signatureDialogVisible" title="鐢靛瓙绛惧悕" width="600px" append-to-body>
- <vueEsign
- ref="esign"
- class="mySign"
- :width="800"
- :height="300"
- :isCrop="isCrop"
- :lineWidth="lineWidth"
- :lineColor="lineColor"
- />
- <div style="margin-top:10px;">
- <el-button @click="clearSignature">娓呴櫎</el-button>
- <el-button type="primary" @click="confirmSignature">纭畾</el-button>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { getCurrentInstance, reactive, ref, toRefs } from "vue";
-import vueEsign from "vue-esign";
-import {
- approveProcessDetails,
- getDept,
- updateApproveNode
-} from "@/api/collaborativeApproval/approvalProcess.js";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue'
-import { getToken } from "@/utils/auth";
-const emit = defineEmits(['close'])
-const { proxy } = getCurrentInstance()
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const activities = ref([])
-const formRef = ref(null);
-const userStore = useUserStore()
-const productOptions = ref([]);
-const userList = ref([])
-const data = reactive({
- form: {
- approveTime: "",
- approveId: "",
- approveUser: "",
- approveDeptId: "",
- approveReason: "",
- checkResult: "",
- },
-});
-const { form } = toRefs(data);
-const signatureDialogVisible = ref(false);
-const signatureImg = ref('');
-let submitStatus = null; // 涓存椂瀛樺偍閫氳繃/涓嶉�氳繃鐘舵��
-const isCrop = ref("");
-const esign = ref(null);
-const lineWidth = ref(0);
-const lineColor = ref("#000000");
-
-// 涓婁紶閰嶇疆
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鑺傜偣鏍囬
-const getNodeTitle = (index, len) => {
- if (index === len - 1) return '缁撴潫';
- return '瀹℃壒';
-};
-
-// 鑾峰彇褰撳墠婵�娲绘楠�
-const getActiveStep = () => {
- // 濡傛灉鎵�鏈� isShen 閮戒负 false锛岃繑鍥炴渶鍚庝竴涓楠わ紙鍏ㄩ儴瀹屾垚锛�
- const hasActive = activities.value.some(a => a.isShen === true);
- if (!hasActive) return activities.value.length;
- // 褰撳墠鑺傜偣绱㈠紩
- return activities.value.findIndex(a => a.isShen == true);
-};
-// 姝ラicon
-const getNodeIcon = (activity, index) => {
- if (activity.approveNodeStatus === 2) return 'el-icon-warning'; // 涓嶉�氳繃
- if (activity.isShen) return 'Edit';
- return '';
-};
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- getProductOptions()
- approveProcessDetails(row.approveId).then((res) => {
- activities.value = res.data
- // 澧炲姞isApproval瀛楁
- activities.value.forEach(item => {
- if (item.url && item.url.includes('word')) {
- item.urlTem = item.url.replaceAll('word', 'img')
- } else {
- item.urlTem = item.url
- }
- if (item.approveNodeStatus === 2) {
- item.isApproval = '宸查┏鍥�';
- } else if (item.approveNodeStatus === 1) {
- item.isApproval = '宸插悓鎰�';
- } else {
- item.isApproval = '鏈鎵�';
- }
- })
- })
-}
-const getProductOptions = () => {
- getDept().then((res) => {
- productOptions.value = res.data;
- });
-};
-// 鎵撳紑绛惧悕寮圭獥
-const openSignatureDialog = (status) => {
- submitStatus = status;
- signatureDialogVisible.value = true;
-};
-// 娓呴櫎绛惧悕
-const clearSignature = () => {
- esign.value.reset();
-};
-// 纭绛惧悕
-const confirmSignature = () => {
- esign.value.generate().then((res) => {
- console.log(res);
- // 灏哹ase64杞崲涓轰簩杩涘埗
- const base64Data = res.split(',')[1]; // 绉婚櫎data:image/png;base64,鍓嶇紑
- const binaryString = atob(base64Data);
- const bytes = new Uint8Array(binaryString.length);
- for (let i = 0; i < binaryString.length; i++) {
- bytes[i] = binaryString.charCodeAt(i);
- }
- signatureImg.value = bytes;
-
- // 鍒涘缓鏂囦欢瀵硅薄鐢ㄤ簬涓婁紶
- const blob = new Blob([bytes], { type: 'image/png' });
- const file = new File([blob], 'signature.png', { type: 'image/png' });
-
- // 鍒涘缓FormData
- const formData = new FormData();
- formData.append('file', file);
-
- // 涓婁紶绛惧悕鍥剧墖
- fetch(upload.url, {
- method: 'POST',
- headers: upload.headers,
- body: formData
- })
- .then(response => response.json())
- .then(data => {
- if (data.code === 200) {
- console.log('data---', data)
- let tempFileIds = [];
- tempFileIds.push(data.data.tempId);
- signatureDialogVisible.value = false;
- clearSignature();
- // 鍙湁閫氳繃鏃舵墠浼犻�掔鍚嶆枃浠禝D
- if (submitStatus === 1) {
- submitForm(submitStatus, tempFileIds);
- } else {
- submitForm(submitStatus);
- }
- } else {
- proxy.$modal.msgError("绛惧悕鍥剧墖涓婁紶澶辫触锛�" + data.msg);
- }
- })
- .catch(error => {
- console.error('涓婁紶澶辫触:', error);
- proxy.$modal.msgError("绛惧悕鍥剧墖涓婁紶澶辫触");
- });
- }).catch((err) => {
- console.log(err);
- proxy.$modal.msgWarning("璇峰厛绛惧悕锛�");
- })
-};
-// 鎻愪氦瀹℃壒
-const submitForm = (status, tempFileIds) => {
- const filteredActivities = activities.value.filter(activity => activity.isShen);
- filteredActivities[0].approveNodeStatus = status;
- // 鍙湁閫氳繃鏃舵墠闇�瑕佺鍚�
- if (status === 1 && tempFileIds) {
- filteredActivities[0].tempFileIds = tempFileIds;
- }
- // 鍒ゆ柇鏄惁涓烘渶鍚庝竴姝�
- const isLast = activities.value.findIndex(a => a.isShen) === activities.value.length-1;
- updateApproveNode({ ...filteredActivities[0], isLast }).then(() => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-.node-user {
- margin: 10px 0;
- font-size: 16px;
- font-weight: 600;
- display: flex;
- align-items: center;
- gap: 8px;
-}
-.node-status {
- color: #1890ff;
- margin-left: 8px;
- font-size: 14px;
-}
-.node-reason {
- font-size: 15px;
- color: #333;
- margin: 10px 0;
-}
-.user-avatar {
- cursor: pointer;
- width: 30px;
- height: 30px;
- border-radius: 50px;
-}
-.signImg {
- cursor: pointer;
- width: 200px;
- height: 60px;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
deleted file mode 100644
index 83585a1..0000000
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ /dev/null
@@ -1,361 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹℃壒娴佺▼' : '缂栬緫瀹℃壒娴佺▼'"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row>
- <el-col :span="24">
- <el-form-item label="娴佺▼缂栧彿锛�" prop="approveId">
- <el-input v-model="form.approveId" placeholder="鑷姩缂栧彿" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId">
- <el-select
- disabled
- v-model="form.approveDeptId"
- placeholder="閫夋嫨閮ㄩ棬"
- >
- <el-option
- v-for="user in productOptions"
- :key="user.deptId"
- :label="user.deptName"
- :value="user.deptId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="瀹℃壒浜嬬敱锛�" prop="approveReason">
- <el-input v-model="form.approveReason" placeholder="璇疯緭鍏�" clearable type="textarea" />
- </el-form-item>
- </el-col>
- </el-row>
- <!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
- <el-row>
- <el-col :span="24">
- <el-form-item>
- <template #label>
- <span>瀹℃壒浜洪�夋嫨锛�</span>
- <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">鏂板鑺傜偣</el-button>
- </template>
- <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
- <div
- v-for="(node, index) in approverNodes"
- :key="node.id"
- style="margin-right: 30px; text-align: center; margin-bottom: 10px;"
- >
- <div>
- <span>瀹℃壒浜�</span>
- 鈫�
- </div>
- <el-select
- v-model="node.userId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 120px; margin-bottom: 8px;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- <div>
- <el-button
- type="danger"
- size="small"
- @click="removeApproverNode(index)"
- v-if="approverNodes.length > 1"
- >鍒犻櫎</el-button>
- </div>
- </div>
- </div>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢宠浜猴細" prop="approveUser">
- <el-select
- v-model="form.approveUser"
- placeholder="閫夋嫨浜哄憳"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
- <el-date-picker
- v-model="form.approveTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
- :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>
- <template #tip v-if="operationType !== 'view'">
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, toRefs, getCurrentInstance} from "vue";
-import {
- approveProcessAdd, approveProcessGetInfo,
- approveProcessUpdate,
- getDept
-} from "@/api/collaborativeApproval/approvalProcess.js";
-import {
- delLedgerFile,
-} from "@/api/salesManagement/salesLedger.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { getToken } from "@/utils/auth";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-import useUserStore from "@/store/modules/user";
-const userStore = useUserStore();
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-const data = reactive({
- form: {
- approveTime: "",
- approveId: "",
- approveUser: "",
- approveDeptId: "",
- approveReason: "",
- checkResult: "",
- tempFileIds: [],
- approverList: [] // 鏂板瀛楁锛屽瓨鍌ㄦ墍鏈夎妭鐐圭殑瀹℃壒浜篿d
- },
- rules: {
- approveTime: [{ required: false, message: "璇疯緭鍏�", trigger: "change" },],
- approveId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- approveUser: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- approveDeptId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- approveReason: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-const currentApproveStatus = ref(0)
-const props = defineProps({
- approveType: {
- type: [Number, String],
- default: 0
- }
-})
-
-// 瀹℃壒浜鸿妭鐐圭浉鍏�
-const approverNodes = ref([
- { id: 1, userId: null }
-])
-let nextApproverId = 2
-const userList = ref([])
-function addApproverNode() {
- approverNodes.value.push({ id: nextApproverId++, userId: null })
-}
-function removeApproverNode(index) {
- approverNodes.value.splice(index, 1)
-}
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- console.log('openDialog', type, row)
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- getProductOptions();
- form.value = {}
- approverNodes.value = [
- { id: 1, userId: null }
- ]
- form.value.approveUser = userStore.id;
- form.value.approveTime = getCurrentDate();
-
- // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅骞惰缃儴闂↖D
- form.value.approveDeptId = userStore.currentDeptId
- if (operationType.value === 'edit') {
- fileList.value = row.commonFileList
- form.value.tempFileIds = fileList.value.map(file => file.id)
- currentApproveStatus.value = row.approveStatus
- approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => {
- form.value = {...res.data}
- // 鍙嶆樉瀹℃壒浜�
- if (res.data && res.data.approveUserIds) {
- const userIds = res.data.approveUserIds.split(',')
- approverNodes.value = userIds.map((userId, idx) => ({
- id: idx + 1,
- userId: parseInt(userId.trim())
- }))
- nextApproverId = userIds.length + 1
- } else {
- approverNodes.value = [{ id: 1, userId: null }]
- nextApproverId = 2
- }
- })
- }
-}
-const getProductOptions = () => {
- getDept().then((res) => {
- productOptions.value = res.data;
- });
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
- form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
- form.value.approveType = props.approveType
- // 瀹℃壒浜哄繀濉牎楠�
- const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
- if (hasEmptyApprover) {
- proxy.$modal.msgError("璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒")
- return
- }
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add" || currentApproveStatus.value == 3) {
- approveProcessAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- approveProcessUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- fileList.value = []
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- // if (file.size > 1024 * 1024 * 10) {
- // proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- // return false;
- // }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- // 纭繚 tempFileIds 瀛樺湪涓斾负鏁扮粍
- if (!form.value.tempFileIds) {
- form.value.tempFileIds = [];
- }
- form.value.tempFileIds.push(res.data.tempId);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/fileList.vue b/src/views/collaborativeApproval/approvalProcess/fileList.vue
deleted file mode 100644
index da37db2..0000000
--- a/src/views/collaborativeApproval/approvalProcess/fileList.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="闄勪欢" width="40%" :before-close="handleClose">
- <el-table :data="tableData" border height="40vh">
- <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button>
- <el-button link type="primary" size="small" @click="lookFile(scope.row)">棰勮</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import filePreview from '@/components/filePreview/index.vue'
-
-const dialogVisible = ref(false)
-const tableData = ref([])
-const { proxy } = getCurrentInstance();
-const filePreviewRef = ref()
-const handleClose = () => {
- dialogVisible.value = false
-}
-const open = (list) => {
- dialogVisible.value = true
- tableData.value = list
-}
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-
-}
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-defineExpose({
- open
-})
-</script>
-
-<style></style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index.vue b/src/views/collaborativeApproval/approvalProcess/index.vue
deleted file mode 100644
index c3b713e..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index.vue
+++ /dev/null
@@ -1,272 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">娴佺▼缂栧彿锛�</span>
- <el-input
- v-model="searchForm.approveId"
- style="width: 240px"
- placeholder="璇疯緭鍏ユ祦绋嬬紪鍙锋悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">瀹℃壒鐘舵�侊細</span>
- <el-select v-model="searchForm.approveStatus" clearable @change="handleQuery" style="width: 240px">
- <el-option label="寰呭鏍�" :value="0" />
- <el-option label="瀹℃牳涓�" :value="1" />
- <el-option label="瀹℃牳瀹屾垚" :value="2" />
- <el-option label="瀹℃牳鏈�氳繃" :value="3" />
- <el-option label="宸查噸鏂版彁浜�" :value="4" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <info-form-dia ref="infoFormDia" @close="handleQuery" :approveType="approveType"></info-form-dia>
- <approval-dia ref="approvalDia" @close="handleQuery"></approval-dia>
- <FileList ref="fileListRef" />
- </div>
-</template>
-
-<script setup>
-import FileList from "./fileList.vue";
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue";
-import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue";
-import {approveProcessDelete, approveProcessListPage} from "@/api/collaborativeApproval/approvalProcess.js";
-import useUserStore from "@/store/modules/user";
-
-// 瀹氫箟缁勪欢鎺ユ敹鐨刾rops
-const props = defineProps({
- approveType: {
- type: [Number, String],
- default: 0
- }
-});
-
-const userStore = useUserStore();
-
-
-const data = reactive({
- searchForm: {
- approveId: "",
- approveStatus: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "瀹℃壒鐘舵��",
- prop: "approveStatus",
- dataType: "tag",
- width: 100,
- formatData: (params) => {
- if (params == 0) {
- return "寰呭鏍�";
- } else if (params == 1) {
- return "瀹℃牳涓�";
- } else if (params == 2) {
- return "瀹℃牳瀹屾垚";
- } else if (params == 4) {
- return "宸查噸鏂版彁浜�";
- } else {
- return '涓嶉�氳繃';
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "warning";
- } else if (params == 1) {
- return "primary";
- } else if (params == 2) {
- return "success";
- } else if (params == 4) {
- return "";
- } else {
- return 'danger';
- }
- },
- },
- {
- label: "娴佺▼缂栧彿",
- prop: "approveId",
- width: 170
- },
- {
- label: "鐢宠閮ㄩ棬",
- prop: "approveDeptName",
- width: 220
- },
- {
- label: "瀹℃壒浜嬬敱",
- prop: "approveReason",
- width: 200
- },
- {
- label: "鐢宠浜�",
- prop: "approveUserName",
- width: 120
- },
- {
- label: "鐢宠鏃ユ湡",
- prop: "approveTime",
- width: 200
- },
- {
- label: "缁撴潫鏃ユ湡",
- prop: "approveOverTime",
- width: 120
- },
- {
- label: "褰撳墠瀹℃壒浜�",
- prop: "approveUserCurrentName",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 230,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => row.approveStatus == 2 || row.approveStatus == 1 || row.approveStatus == 4
- },
- {
- name: "瀹℃牳",
- type: "text",
- clickFun: (row) => {
- openApprovalDia("approval", row);
- },
- disabled: (row) => row.approveUserCurrentId == null || row.approveStatus == 2 || row.approveStatus == 3 || row.approveStatus == 4 || row.approveUserCurrentId !== userStore.id
- },
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openApprovalDia('view', row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const infoFormDia = ref()
-const approvalDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const fileListRef = ref(null)
-const downLoadFile = (row) => {
- fileListRef.value.open(row.commonFileList)
-
-}
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- approveProcessListPage({...page, ...searchForm.value,approveType:props.approveType}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑鏂板銆佺紪杈戝脊妗�
-const openForm = (type, row) => {
- nextTick(() => {
- infoFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openApprovalDia = (type, row) => {
- nextTick(() => {
- approvalDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.approveId);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- approveProcessDelete(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/collaborativeApproval/approvalProcess/index1.vue b/src/views/collaborativeApproval/approvalProcess/index1.vue
deleted file mode 100644
index c46c68a..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index1.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="1" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
diff --git a/src/views/collaborativeApproval/approvalProcess/index2.vue b/src/views/collaborativeApproval/approvalProcess/index2.vue
deleted file mode 100644
index 7c15c3e..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index2.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="2" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index3.vue b/src/views/collaborativeApproval/approvalProcess/index3.vue
deleted file mode 100644
index 3afb6f5..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index3.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="3" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index4.vue b/src/views/collaborativeApproval/approvalProcess/index4.vue
deleted file mode 100644
index 77236af..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index4.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="4" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/attendanceManagement/index.vue b/src/views/collaborativeApproval/attendanceManagement/index.vue
deleted file mode 100644
index ce6709d..0000000
--- a/src/views/collaborativeApproval/attendanceManagement/index.vue
+++ /dev/null
@@ -1,923 +0,0 @@
-<template>
- <div class="app-container">
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 鍋囨湡璁剧疆 -->
- <el-tab-pane label="鍋囨湡璁剧疆" name="holiday">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('holiday', 'add')">鏂板鍋囨湡</el-button>
-
- <el-table :data="holidayData" border style="width: 100%; margin-top: 20px;">
- <el-table-column prop="name" label="鍋囨湡鍚嶇О" />
- <el-table-column prop="type" label="鍋囨湡绫诲瀷">
- <template #default="scope">
- <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" />
- <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" />
- <el-table-column prop="days" label="澶╂暟" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('holiday', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('holiday', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 骞村亣璁剧疆 -->
- <el-tab-pane label="骞村亣璁剧疆" name="annual">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('annual', 'add')">鏂板骞村亣瑙勫垯</el-button>
-
- <el-table :data="annualData" border style="width: 100%; margin-top: 20px;">
- <el-table-column prop="employeeType" label="鍛樺伐绫诲瀷">
- <template #default="scope">
- <el-tag :type="getTagType(scope.row.employeeType)">{{ getTypeLabel(scope.row.employeeType) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="workYears" label="宸ヤ綔骞撮檺" />
- <el-table-column prop="annualDays" label="骞村亣澶╂暟" align="center" />
- <el-table-column prop="maxCarryOver" label="鏈�澶х粨杞ぉ鏁�" align="center" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('annual', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('annual', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 鍔犵彮璁剧疆 -->
- <el-tab-pane label="鍔犵彮璁剧疆" name="overtime">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('overtime', 'add')">鏂板鍔犵彮瑙勫垯</el-button>
-
- <el-table :data="overtimeData" border style="width: 100%; margin-top: 20px;">
- <el-table-column prop="name" label="瑙勫垯鍚嶇О" />
- <el-table-column prop="type" label="鍔犵彮绫诲瀷" >
- <template #default="scope">
- <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="startTime" label="寮�濮嬫椂闂�" />
- <el-table-column prop="endTime" label="缁撴潫鏃堕棿" />
- <el-table-column prop="rate" label="鍊嶇巼" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('overtime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('overtime', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 涓婄彮鏃堕棿璁剧疆 -->
- <el-tab-pane label="涓婄彮鏃堕棿璁剧疆" name="worktime">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('worktime', 'add')">鏂板鏃堕棿娈�</el-button>
-
- <el-table :data="worktimeData" border style="width: 100%; margin-top: 20px;">
- <el-table-column prop="name" label="鏃堕棿娈靛悕绉�" />
- <el-table-column prop="startTime" label="涓婄彮鏃堕棿"/>
- <el-table-column prop="endTime" label="涓嬬彮鏃堕棿" />
- <el-table-column prop="flexibleStart" label="寮规�т笂鐝�">
- <template #default="scope">
- <el-tag :type="scope.row.flexibleStart === 'true' ? 'success' : 'info'">
- {{ scope.row.flexibleStart === 'true' ? '鏄�' : '鍚�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="flexibleMinutes" label="寮规�ф椂闂�(鍒嗛挓)" width="120" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('worktime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('worktime', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
- </el-tabs>
-
- <!-- 閫氱敤寮圭獥 -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
- <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
- <el-form-item label="鍚嶇О" prop="name" v-if="currentType !== 'annual'">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
- </el-form-item>
-
- <el-form-item label="绫诲瀷" prop="type" v-if="currentType === 'holiday' || currentType === 'overtime'">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨绫诲瀷" style="width: 100%">
- <el-option
- v-for="option in getTypeOptions()"
- :key="option.value"
- :label="option.label"
- :value="option.value"
- />
- </el-select>
- </el-form-item>
-
- <el-form-item label="鍛樺伐绫诲瀷" prop="employeeType" v-if="currentType === 'annual'">
- <el-select v-model="form.employeeType" placeholder="璇烽�夋嫨鍛樺伐绫诲瀷" style="width: 100%">
- <!-- <el-option label="姝e紡鍛樺伐" value="regular" />
- <el-option label="璇曠敤鏈熷憳宸�" value="probation" />
- <el-option label="瀹炰範鐢�" value="intern" /> -->
- <el-option
- v-for="option in getTypeOptions()"
- :key="option.value"
- :label="option.label"
- :value="option.value"
- />
- </el-select>
- </el-form-item>
-
- <el-form-item label="宸ヤ綔骞撮檺" prop="workYears" v-if="currentType === 'annual'">
- <el-input v-model="form.workYears" placeholder="濡傦細1-3骞淬��3-5骞寸瓑" />
- </el-form-item>
-
- <el-form-item label="骞村亣澶╂暟" prop="annualDays" v-if="currentType === 'annual'">
- <el-input-number v-model="form.annualDays" :min="0" :max="365" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鏈�澶х粨杞ぉ鏁�" prop="maxCarryOver" v-if="currentType === 'annual'">
- <el-input-number v-model="form.maxCarryOver" :min="0" :max="30" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鏃ユ湡鑼冨洿" prop="dateRange" v-if="currentType === 'holiday'">
- <el-date-picker
- v-model="form.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- style="width: 100%"
- @change="calculateDays"
- />
- </el-form-item>
-
- <el-form-item label="澶╂暟" prop="days" v-if="currentType === 'holiday'">
- <el-input-number v-model="form.days" :min="0" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="寮�濮嬫椂闂�" prop="startTime" v-if="currentType === 'overtime'">
- <el-time-picker
- v-model="form.startTime"
- placeholder="寮�濮嬫椂闂�"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('startTime')"
- />
- </el-form-item>
-
- <el-form-item label="缁撴潫鏃堕棿" prop="endTime" v-if="currentType === 'overtime'">
- <el-time-picker
- v-model="form.endTime"
- placeholder="缁撴潫鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('endTime')"
- />
- </el-form-item>
-
- <el-form-item label="鍊嶇巼" prop="rate" v-if="currentType === 'overtime'">
- <el-input-number v-model="form.rate" :min="1" :max="3" :step="0.5" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="涓婄彮鏃堕棿" prop="workStartTime" v-if="currentType === 'worktime'">
- <el-time-picker
- v-model="form.workStartTime"
- placeholder="涓婄彮鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('workStartTime')"
- />
- </el-form-item>
-
- <el-form-item label="涓嬬彮鏃堕棿" prop="workEndTime" v-if="currentType === 'worktime'">
- <el-time-picker
- v-model="form.workEndTime"
- placeholder="涓嬬彮鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('workEndTime')"
- />
- </el-form-item>
-
- <el-form-item label="寮规�т笂鐝�" prop="flexibleStart" v-if="currentType === 'worktime'">
- <el-switch v-model="form.flexibleStart" />
- </el-form-item>
-
- <el-form-item label="寮规�ф椂闂�(鍒嗛挓)" prop="flexibleMinutes" v-if="currentType === 'worktime' && form.flexibleStart">
- <el-input-number v-model="form.flexibleMinutes" :min="0" :max="120" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio value="active">鍚敤</el-radio>
- <el-radio value="inactive">鍋滅敤</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
-
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { listHolidaySettings, addHolidaySettings, updateHolidaySettings, delHolidaySettings, listAnnualLeaveSettingList, addAnnualLeaveSetting, updateAnnualLeaveSetting, delAnnualLeaveSetting, listOvertimeSettingList, addOvertimeSetting, updateOvertimeSetting, delOvertimeSetting, listWorkingHoursSettingList, addWorkingHoursSetting, updateWorkingHoursSetting, delWorkingHoursSetting } from '@/api/collaborativeApproval/attendanceManagement.js'
-
-// 褰撳墠婵�娲荤殑鏍囩椤�
-const activeTab = ref('holiday')
-
-// 寮圭獥鐩稿叧
-const dialogVisible = ref(false)
-const dialogTitle = ref('')
-const currentType = ref('')
-const currentAction = ref('')
-const currentEditId = ref('')
-const formRef = ref()
-const page = {
- current: 1,
- size: 20,
- total: 0,
- }
-const holidayData = ref([])
-const annualData = ref([])
-const overtimeData = ref([])
-const worktimeData = ref([])
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- name: '',
- type: '',
- dateRange: [],
- startDate: '',
- endDate: '',
- days: 0,
- employeeType: '',
- workYears: '',
- annualDays: 0,
- maxCarryOver: 0,
- startTime: '', // 鍔犵彮寮�濮嬫椂闂�
- endTime: '', // 鍔犵彮缁撴潫鏃堕棿
- workStartTime: '', // 涓婄彮鏃堕棿
- workEndTime: '', // 涓嬬彮鏃堕棿
- rate: 1.5,
- flexibleStart: false,
- flexibleMinutes: 30,
- status: 'active'
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
- type: [{ required: true, message: '璇烽�夋嫨绫诲瀷', trigger: 'change' }],
- dateRange: [{ required: true, message: '璇烽�夋嫨鏃ユ湡鑼冨洿', trigger: 'change' }],
- days: [{ required: true, message: '璇疯緭鍏ュぉ鏁�', trigger: 'blur' }],
- employeeType: [{ required: true, message: '璇烽�夋嫨鍛樺伐绫诲瀷', trigger: 'change' }],
- workYears: [{ required: true, message: '璇疯緭鍏ュ伐浣滃勾闄�', trigger: 'blur' }],
- annualDays: [{ required: true, message: '璇疯緭鍏ュ勾鍋囧ぉ鏁�', trigger: 'blur' }],
- maxCarryOver: [{ required: true, message: '璇疯緭鍏ユ渶澶х粨杞ぉ鏁�', trigger: 'blur' }],
- startTime: [{
- required: true,
- message: '璇烽�夋嫨寮�濮嬫椂闂�',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�'))
- } else {
- callback()
- }
- }
- }],
- endTime: [{
- required: true,
- message: '璇烽�夋嫨缁撴潫鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨缁撴潫鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- workStartTime: [{
- required: true,
- message: '璇烽�夋嫨涓婄彮鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨涓婄彮鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- workEndTime: [{
- required: true,
- message: '璇烽�夋嫨涓嬬彮鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨涓嬬彮鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- rate: [{ required: true, message: '璇疯緭鍏ュ�嶇巼', trigger: 'blur' }]
-}
-// 宸ュ叿鍑芥暟
-const getTagType = (type) => {
- const tagMap = {
- legal: 'success', adjustment: 'warning', special: 'info', company: 'primary',
- weekday: 'primary', weekend: 'warning', holiday: 'danger', night: 'info',
- regular: 'success', probation: 'info', intern: 'danger'
- }
- return tagMap[type] || 'info'
-}
-
-const getTypeLabel = (type) => {
- const labelMap = {
- legal: '娉曞畾鑺傚亣鏃�', adjustment: '璋冧紤鏃�', special: '鐗规畩鍋囨湡', company: '鍏徃鍋囨湡',
- weekday: '宸ヤ綔鏃ュ姞鐝�', weekend: '鍛ㄦ湯鍔犵彮', holiday: '鑺傚亣鏃ュ姞鐝�', night: '娣卞鍔犵彮',
- regular: '姝e紡鍛樺伐', probation: '璇曠敤鏈熷憳宸�', intern: '瀹炰範鐢�'
- }
- return labelMap[type] || type
-}
-
-const getTypeOptions = () => {
- if (currentType.value === 'holiday') {
- return [
- { label: '娉曞畾鑺傚亣鏃�', value: 'legal' },
- { label: '璋冧紤鏃�', value: 'adjustment' },
- { label: '鐗规畩鍋囨湡', value: 'special' },
- { label: '鍏徃鍋囨湡', value: 'company' }
- ]
- } else if (currentType.value === 'overtime') {
- return [
- { label: '宸ヤ綔鏃ュ姞鐝�', value: 'weekday' },
- { label: '鍛ㄦ湯鍔犵彮', value: 'weekend' },
- { label: '鑺傚亣鏃ュ姞鐝�', value: 'holiday' },
- { label: '娣卞鍔犵彮', value: 'night' }
- ]
- } else if (currentType.value === 'annual') {
- return [
- { label: '姝e紡鍛樺伐', value: 'regular' },
- { label: '璇曠敤鏈熷憳宸�', value: 'probation' },
- { label: '瀹炰範鐢�', value: 'intern' }
- ]
- }
- return []
-}
-
-// 璁$畻鍋囨湡澶╂暟
-const calculateDays = () => {
- try {
- if (form.dateRange && form.dateRange.length === 2 && form.dateRange[0] && form.dateRange[1]) {
- const start = new Date(form.dateRange[0])
- const end = new Date(form.dateRange[1])
- form.startDate = start.toISOString().split('T')[0]
- form.endDate = end.toISOString().split('T')[0]
-
- if (isNaN(start.getTime()) || isNaN(end.getTime())) {
- console.warn('鏃犳晥鐨勬棩鏈熸牸寮�')
- return
- }
-
- const diffTime = Math.abs(end - start)
- const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1
- form.days = diffDays
- }
- } catch (error) {
- console.error('璁$畻澶╂暟澶辫触:', error)
- }
-}
-
-// 楠岃瘉鏃堕棿鏍煎紡
-// const validateTime = (time) => {
-// if (!time) return ''
-// if (typeof time === 'string') return time
-// if (time instanceof Date) {
-// return time.toTimeString().slice(0, 5)
-// }
-// return ''
-// }
-
-// 楠岃瘉鏃堕棿瀛楁
-const validateTimeField = (fieldName) => {
- try {
- const value = form[fieldName]
- if (value && typeof value === 'object' && value.hour !== undefined) {
- // 濡傛灉鏄椂闂村璞★紝杞崲涓哄瓧绗︿覆鏍煎紡
- const hours = value.hour.toString().padStart(2, '0')
- const minutes = value.minute.toString().padStart(2, '0')
- form[fieldName] = `${hours}:${minutes}`
- }
- } catch (error) {
- console.error(`楠岃瘉鏃堕棿瀛楁 ${fieldName} 澶辫触:`, error)
- form[fieldName] = ''
- }
-}
-
-// 鎵撳紑寮圭獥
-const openDialog = (type, action, row = null) => {
- try {
- currentType.value = type
- currentAction.value = action
-
- if (action === 'add') {
- dialogTitle.value = `鏂板${getTypeName(type)}`
- currentEditId.value = ''
- resetForm()
- } else if (action === 'edit' && row) {
- dialogTitle.value = `缂栬緫${getTypeName(type)}`
- currentEditId.value = row.id
- fillForm(row)
- }
-
- dialogVisible.value = true
- } catch (error) {
- console.error('鎵撳紑寮圭獥澶辫触:', error)
- ElMessage.error('鎵撳紑寮圭獥澶辫触锛岃閲嶈瘯')
- }
-}
-
-const getTypeName = (type) => {
- const nameMap = {
- holiday: '鍋囨湡',
- annual: '骞村亣瑙勫垯',
- overtime: '鍔犵彮瑙勫垯',
- worktime: '鏃堕棿娈�'
- }
- return nameMap[type] || ''
-}
-
-const resetForm = () => {
- Object.assign(form, {
- name: '',
- type: '',
- dateRange: [],
- startDate: '',
- endDate: '',
- days: 0,
- employeeType: '',
- workYears: '',
- annualDays: 0,
- maxCarryOver: 0,
- startTime: '',
- endTime: '',
- workStartTime: '',
- workEndTime: '',
- rate: 1.5,
- flexibleStart: false,
- flexibleMinutes: 30,
- status: 'active'
- })
-}
-
-const fillForm = (row) => {
- if (currentType.value === 'holiday') {
- Object.assign(form, {
- name: row.name,
- type: row.type,
- dateRange: [new Date(row.startDate), new Date(row.endDate)],
- startDate: row.startDate,
- endDate: row.endDate,
- days: row.days,
- status: row.status
- })
- } else if (currentType.value === 'annual') {
- Object.assign(form, {
- employeeType: row.employeeType,
- workYears: row.workYears,
- annualDays: row.annualDays,
- maxCarryOver: row.maxCarryOver,
- status: row.status
- })
- } else if (currentType.value === 'overtime') {
- Object.assign(form, {
- name: row.name,
- type: row.type,
- startTime: row.startTime || '',
- endTime: row.endTime || '',
- rate: row.rate,
- status: row.status
- })
- } else if (currentType.value === 'worktime') {
- Object.assign(form, {
- name: row.name,
- workStartTime: row.startTime || '',
- workEndTime: row.endTime || '',
- flexibleStart: row.flexibleStart,
- flexibleMinutes: row.flexibleMinutes,
- status: row.status
- })
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- try {
- if (!formRef.value) {
- ElMessage.error('琛ㄥ崟寮曠敤涓嶅瓨鍦�')
- return
- }
-
- await formRef.value.validate()
-
- if (currentAction.value === 'add') {
- addItem()
- } else if (currentAction.value === 'edit') {
- editItem()
- }
-
- dialogVisible.value = false
- ElMessage.success('鎿嶄綔鎴愬姛')
- } catch (error) {
- console.error('琛ㄥ崟楠岃瘉澶辫触:', error)
- ElMessage.error('琛ㄥ崟楠岃瘉澶辫触锛岃妫�鏌ヨ緭鍏�')
- }
-}
-
-const addItem = () => {
-
- if (currentType.value === 'holiday') {
- const params = {
- name: form.name,
- type: form.type,
- startDate: form.startDate,
- endDate: form.endDate,
- days: form.days,
- status: form.status
- }
- addHolidaySettings(params).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- // dialogVisible.value = false;
- getHolidaySettingsList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else if (currentType.value === 'annual') {
- // annualData.value.push(newItem)
- const params = {
- employeeType: form.employeeType,
- workYears: form.workYears,
- annualDays: form.annualDays,
- maxCarryOver: form.maxCarryOver,
- status: form.status
- }
- addAnnualLeaveSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- // dialogVisible.value = false;
- getAnnualLeaveSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else if (currentType.value === 'overtime') {
- const params = {
- name: form.name,
- type: form.type,
- startTime: form.startTime || '',
- endTime: form.endTime || '',
- rate: form.rate,
- status: form.status
- }
- addOvertimeSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- // dialogVisible.value = false;
- getOvertimeSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // newItem.startTime = form.startTime || ''
- // newItem.endTime = form.endTime || ''
- // overtimeData.value.push(newItem)
- } else if (currentType.value === 'worktime') {
- const params = {
- name: form.name,
- startTime: form.workStartTime || '',
- endTime: form.workEndTime || '',
- flexibleStart: form.flexibleStart,
- flexibleMinutes: form.flexibleMinutes,
- status: form.status
- }
- addWorkingHoursSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- getWorkingHoursSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // newItem.startTime = form.workStartTime || ''
- // newItem.endTime = form.workEndTime || ''
- // worktimeData.value.push(newItem)
- }
-}
-
-const editItem = () => {
- let dataArray
- let index
-
- if (currentType.value === 'holiday') {
- const params = {
- id: currentEditId.value,
- name: form.name,
- type: form.type,
- startDate: form.dateRange[0].toISOString().split('T')[0],
- endDate: form.dateRange[1].toISOString().split('T')[0],
- days: form.days,
- status: form.status
- }
- updateHolidaySettings(params).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- // dialogVisible.value = false;
- getHolidaySettingsList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else if (currentType.value === 'annual') {
- const params = {
- id: currentEditId.value,
- employeeType: form.employeeType,
- workYears: form.workYears,
- annualDays: form.annualDays,
- maxCarryOver: form.maxCarryOver,
- status: form.status
- }
- updateAnnualLeaveSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- getAnnualLeaveSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else if (currentType.value === 'overtime') {
- const params = {
- id: currentEditId.value,
- name: form.name,
- type: form.type,
- startTime: form.startTime || '',
- endTime: form.endTime || '',
- rate: form.rate,
- status: form.status
- }
- updateOvertimeSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- getOvertimeSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-
- // dataArray = overtimeData.value
- // index = dataArray.findIndex(item => item.id === currentEditId.value)
- // if (index > -1) {
- // dataArray[index] = {
- // ...dataArray[index],
- // name: form.name,
- // type: form.type,
- // startTime: form.startTime || '',
- // endTime: form.endTime || '',
- // rate: form.rate,
- // status: form.status
- // }
- // }
- } else if (currentType.value === 'worktime') {
- const params = {
- id: currentEditId.value,
- name: form.name,
- startTime: form.workStartTime || '',
- endTime: form.workEndTime || '',
- flexibleStart: form.flexibleStart,
- flexibleMinutes: form.flexibleMinutes,
- status: form.status
- }
- updateWorkingHoursSetting(params).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- getWorkingHoursSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // dataArray = worktimeData.value
- // index = dataArray.findIndex(item => item.id === currentEditId.value)
- // if (index > -1) {
- // dataArray[index] = {
- // ...dataArray[index],
- // name: form.name,
- // startTime: form.workStartTime || '',
- // endTime: form.workEndTime || '',
- // flexibleStart: form.flexibleStart,
- // flexibleMinutes: form.flexibleMinutes,
- // status: form.status
- // }
- // }
- }
-}
-
-// 鍒犻櫎椤圭洰
-const deleteItem = (type, row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖涓」鐩悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- let ids = [];
- let dataArray
- if (type === 'holiday') {
- ids.push(row.id)
- delHolidaySettings(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- ids = []
- getHolidaySettingsList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- else if (type === 'annual') {
- ids.push(row.id)
- delAnnualLeaveSetting(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- ids = []
- getAnnualLeaveSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- else if (type === 'overtime') {
- ids.push(row.id)
- delOvertimeSetting(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- ids = []
- getOvertimeSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- else if (type === 'worktime') {
- ids.push(row.id)
- delWorkingHoursSetting(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- ids = []
- getWorkingHoursSettingList()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
-
- // const index = dataArray.findIndex(item => item.id === row.id)
- // if (index > -1) {
- // dataArray.splice(index, 1)
- // ElMessage.success('鍒犻櫎鎴愬姛')
- // }
- })
-}
-// 鑾峰彇鍋囨湡璁剧疆鍒楄〃
-const getHolidaySettingsList = () => {
- // tableLoading.value = true;
- listHolidaySettings({...page.value})
- .then(res => {
- // tableLoading.value = false;
- holidayData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- // tableLoading.value = false;
- })
-};
-// 鑾峰彇骞村亣瑙勫垯鍒楄〃
-const getAnnualLeaveSettingList = () => {
-
- listAnnualLeaveSettingList({...page.value})
- .then(res => {
- // console.log(res.data)
- annualData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- })
-};
-// 鑾峰彇鍔犵彮瑙勫垯鍒楄〃
-const getOvertimeSettingList = () => {
-
- listOvertimeSettingList({...page.value})
- .then(res => {
- // console.log(res.data)
- overtimeData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- })
-};
-// 鑾峰彇宸ヤ綔鏃堕棿瑙勫垯鍒楄〃
-const getWorkingHoursSettingList = () => {
-
- listWorkingHoursSettingList({...page.value})
- .then(res => {
- // console.log(res.data)
- worktimeData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- })
-};
-onMounted(() => {
- getHolidaySettingsList()
- getAnnualLeaveSettingList()
- getOvertimeSettingList()
- getWorkingHoursSettingList()
- console.log('鑰冨嫟绠$悊椤甸潰鍔犺浇瀹屾垚')
-})
-
-onUnmounted(() => {
- // 娓呯悊宸ヤ綔
- dialogVisible.value = false
- currentType.value = ''
- currentAction.value = ''
- currentEditId.value = ''
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.tab-content {
- padding: 20px 0;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-tabs__content) {
- padding: 20px;
-}
-
-:deep(.el-form-item) {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/collaborativeApproval/knowledgeBase/index.vue b/src/views/collaborativeApproval/knowledgeBase/index.vue
deleted file mode 100644
index 0839c16..0000000
--- a/src/views/collaborativeApproval/knowledgeBase/index.vue
+++ /dev/null
@@ -1,822 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鐭ヨ瘑鏍囬锛�</span>
- <el-input
- v-model="searchForm.title"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ煡璇嗘爣棰樻悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鐭ヨ瘑绫诲瀷锛�</span>
- <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鍚堝悓鐗规壒" :value="'contract'" />
- <el-option label="瀹℃壒妗堜緥" :value="'approval'" />
- <el-option label="瑙e喅鏂规" :value="'solution'" />
- <el-option label="缁忛獙鎬荤粨" :value="'experience'" />
- <el-option label="鎿嶄綔鎸囧崡" :value="'guide'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鐭ヨ瘑</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
-
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- 鏂板/缂栬緫鐭ヨ瘑寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="800px"
- :close-on-click-modal="false"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鐭ヨ瘑鏍囬" prop="title">
- <el-input v-model="form.title" placeholder="璇疯緭鍏ョ煡璇嗘爣棰�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐭ヨ瘑绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨鐭ヨ瘑绫诲瀷" style="width: 100%">
- <el-option label="鍚堝悓鐗规壒" value="contract" />
- <el-option label="瀹℃壒妗堜緥" value="approval" />
- <el-option label="瑙e喅鏂规" value="solution" />
- <el-option label="缁忛獙鎬荤粨" value="experience" />
- <el-option label="鎿嶄綔鎸囧崡" value="guide" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閫傜敤鍦烘櫙" prop="scenario">
- <el-input v-model="form.scenario" placeholder="璇疯緭鍏ラ�傜敤鍦烘櫙" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙e喅鏁堢巼" prop="efficiency">
- <el-select v-model="form.efficiency" placeholder="璇烽�夋嫨瑙e喅鏁堢巼" style="width: 100%">
- <el-option label="鏄捐憲鎻愬崌" value="high" />
- <el-option label="涓�鑸彁鍗�" value="medium" />
- <el-option label="杞诲井鎻愬崌" value="low" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="闂鎻忚堪" prop="problem">
- <el-input
- v-model="form.problem"
- type="textarea"
- :rows="3"
- placeholder="璇锋弿杩伴亣鍒扮殑闂"
- />
- </el-form-item>
- <el-form-item label="瑙e喅鏂规" prop="solution">
- <el-input
- v-model="form.solution"
- type="textarea"
- :rows="4"
- placeholder="璇疯缁嗘弿杩拌В鍐虫柟妗�"
- />
- </el-form-item>
- <el-form-item label="鍏抽敭瑕佺偣" prop="keyPoints">
- <el-input
- v-model="form.keyPoints"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ叧閿鐐癸紝鐢ㄩ�楀彿鍒嗛殧"
- />
- </el-form-item>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍒涘缓浜�" prop="creator">
- <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浣跨敤娆℃暟" prop="usageCount">
- <el-input-number v-model="form.usageCount" :min="0" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鏌ョ湅鐭ヨ瘑璇︽儏寮圭獥 -->
- <el-dialog
- v-model="viewDialogVisible"
- title="鐭ヨ瘑璇︽儏"
- width="900px"
- :close-on-click-modal="false"
- >
- <div class="knowledge-detail">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鐭ヨ瘑鏍囬" :span="2">
- <span class="detail-title">{{ currentKnowledge.title }}</span>
- </el-descriptions-item>
- <el-descriptions-item label="鐭ヨ瘑绫诲瀷">
- <el-tag :type="getTypeTagType(currentKnowledge.type)">
- {{ getTypeLabel(currentKnowledge.type) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="閫傜敤鍦烘櫙">
- {{ currentKnowledge.scenario }}
- </el-descriptions-item>
- <el-descriptions-item label="瑙e喅鏁堢巼">
- <el-tag :type="getEfficiencyTagType(currentKnowledge.efficiency)">
- {{ getEfficiencyLabel(currentKnowledge.efficiency) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="浣跨敤娆℃暟">
- <el-tag type="info">{{ currentKnowledge.usageCount }} 娆�</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鍒涘缓浜�">
- {{ currentKnowledge.creator }}
- </el-descriptions-item>
- <el-descriptions-item label="鍒涘缓鏃堕棿">
- {{ currentKnowledge.createTime }}
- </el-descriptions-item>
- </el-descriptions>
-
- <div class="detail-section">
- <h4>闂鎻忚堪</h4>
- <div class="detail-content">{{ currentKnowledge.problem }}</div>
- </div>
-
- <div class="detail-section">
- <h4>瑙e喅鏂规</h4>
- <div class="detail-content">{{ currentKnowledge.solution }}</div>
- </div>
-
- <div class="detail-section">
- <h4>鍏抽敭瑕佺偣</h4>
- <div class="key-points">
- <el-tag
- v-for="(point, index) in currentKnowledge.keyPoints.split(',')"
- :key="index"
- type="success"
- style="margin-right: 8px; margin-bottom: 8px;"
- >
- {{ point.trim() }}
- </el-tag>
- </div>
- </div>
-
- <div class="detail-section">
- <h4>浣跨敤缁熻</h4>
- <div class="usage-stats">
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ currentKnowledge.usageCount }}</div>
- <div class="stat-label">浣跨敤娆℃暟</div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ getEfficiencyScore(currentKnowledge.efficiency) }}%</div>
- <div class="stat-label">鏁堢巼鎻愬崌</div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ getTimeSaved(currentKnowledge.efficiency) }}</div>
- <div class="stat-label">骞冲潎鑺傜渷鏃堕棿</div>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- </div>
-
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="viewDialogVisible = false">鍏抽棴</el-button>
- <el-button type="primary" @click="copyKnowledge">澶嶅埗鐭ヨ瘑</el-button>
- <!-- <el-button type="success" @click="markAsFavorite">鏀惰棌@</el-button> -->
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import { listKnowledgeBase, delKnowledgeBaseBatch,addKnowledgeBase,updateKnowledgeBase } from "@/api/collaborativeApproval/knowledgeBase.js";
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- title: [
- { required: true, message: "璇疯緭鍏ョ煡璇嗘爣棰�", trigger: "blur" }
- ],
- type: [
- { required: true, message: "璇烽�夋嫨鐭ヨ瘑绫诲瀷", trigger: "change" }
- ],
- problem: [
- { required: true, message: "璇锋弿杩伴亣鍒扮殑闂", trigger: "blur" }
- ],
- solution: [
- { required: true, message: "璇疯缁嗘弿杩拌В鍐虫柟妗�", trigger: "blur" }
- ]
-};
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- title: "",
- type: "",
- },
- tableLoading: false,
- page: {
- current: 1,
- size: 20,
- total: 0,
- },
- tableData: [],
- selectedIds: [],
- form: {
- title: "",
- type: "",
- scenario: "",
- efficiency: "",
- problem: "",
- solution: "",
- keyPoints: "",
- creator: "",
- usageCount: 0
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- viewDialogVisible: false,
- currentKnowledge: {}
-});
-
-const {
- searchForm,
- tableLoading,
- page,
- tableData,
- selectedIds,
- form,
- dialogVisible,
- dialogTitle,
- dialogType,
- viewDialogVisible,
- currentKnowledge
-} = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "鐭ヨ瘑鏍囬",
- prop: "title",
- showOverflowTooltip: true,
- },
- {
- label: "鐭ヨ瘑绫诲瀷",
- prop: "type",
- dataType: "tag",
- formatData: (params) => {
- const typeMap = {
- contract: "鍚堝悓鐗规壒",
- approval: "瀹℃壒妗堜緥",
- solution: "瑙e喅鏂规",
- experience: "缁忛獙鎬荤粨",
- guide: "鎿嶄綔鎸囧崡"
- };
- return typeMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- contract: "success",
- approval: "warning",
- solution: "primary",
- experience: "info",
- guide: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "閫傜敤鍦烘櫙",
- prop: "scenario",
- width: 150,
- showOverflowTooltip: true,
- },
- {
- label: "瑙e喅鏁堢巼",
- prop: "efficiency",
- dataType: "tag",
- formatData: (params) => {
- const efficiencyMap = {
- high: "鏄捐憲鎻愬崌",
- medium: "涓�鑸彁鍗�",
- low: "杞诲井鎻愬崌"
- };
- return efficiencyMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- high: "success",
- medium: "warning",
- low: "info"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "浣跨敤娆℃暟",
- prop: "usageCount",
- width: 100,
- align: "center"
- },
- {
- label: "鍒涘缓浜�",
- prop: "creator",
- width: 120,
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 200,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- {
- name: "鏌ョ湅",
- type: "text",
- clickFun: (row) => {
- viewKnowledge(row);
- }
- }
- ]
- }
-]);
-
-// 妯℃嫙鏁版嵁
-// let mockData = [
-// {
-// id: "1",
-// title: "鐗规畩鍚堝悓瀹℃壒娴佺▼浼樺寲鏂规",
-// type: "contract",
-// scenario: "澶ч鍚堝悓蹇�熷鎵�",
-// efficiency: "high",
-// problem: "澶ч鍚堝悓瀹℃壒娴佺▼澶嶆潅锛屽鎵规椂闂撮暱锛屽奖鍝嶄笟鍔¤繘灞�",
-// solution: "寤虹珛缁胯壊閫氶亾锛屽绗﹀悎鏉′欢鐨勫悎鍚岄噰鐢ㄧ畝鍖栧鎵规祦绋嬶紝鐢遍儴闂ㄨ礋璐d汉鐩存帴瀹℃壒锛屽钩鍧囧鎵规椂闂翠粠3澶╃缉鐭嚦1澶�",
-// keyPoints: "缁胯壊閫氶亾鏉′欢,绠�鍖栨祦绋�,瀹℃壒鏉冮檺,鏃堕棿鎺у埗",
-// creator: "寮犵粡鐞�",
-// usageCount: 15,
-// createTime: "2024-01-15 10:30:00"
-// },
-// {
-// id: "2",
-// title: "璺ㄩ儴闂ㄥ崗浣滃鎵圭粡楠屾�荤粨",
-// type: "experience",
-// scenario: "澶氶儴闂ㄥ崗浣滈」鐩�",
-// efficiency: "medium",
-// problem: "璺ㄩ儴闂ㄩ」鐩鎵规椂锛屽悇閮ㄩ棬鎰忚涓嶇粺涓�锛屽鎵硅繘搴︾紦鎱�",
-// solution: "寤虹珛椤圭洰鍗忚皟鏈哄埗锛屾寚瀹氶」鐩礋璐d汉锛屽畾鏈熷彫寮�鍗忚皟浼氳锛岀粺涓�鍚勬柟鎰忚鍚庡啀杩涜瀹℃壒",
-// keyPoints: "椤圭洰鍗忚皟,瀹氭湡浼氳,缁熶竴鎰忚,璐熻矗浜哄埗搴�",
-// creator: "鏉庝富绠�",
-// usageCount: 8,
-// createTime: "2024-01-14 15:20:00"
-// },
-// {
-// id: "3",
-// title: "绱ф�ラ噰璐鎵规搷浣滄寚鍗�",
-// type: "guide",
-// scenario: "绱ф�ラ噰璐渶姹�",
-// efficiency: "high",
-// problem: "绱ф�ラ噰璐椂瀹℃壒娴佺▼澶嶆潅锛屾棤娉曟弧瓒崇揣鎬ラ渶姹�",
-// solution: "鍒跺畾绱ф�ラ噰璐鎵规爣鍑嗭紝鏄庣‘绱ф�ョ▼搴﹀垎绾э紝涓嶅悓绾у埆閲囩敤涓嶅悓瀹℃壒娴佺▼锛岀‘淇濈揣鎬ラ渶姹傚緱鍒板強鏃跺鐞�",
-// keyPoints: "绱ф�ュ垎绾�,鏍囧噯鍒跺畾,娴佺▼绠�鍖�,鍙婃椂澶勭悊",
-// creator: "鐜嬩笓鍛�",
-// usageCount: 12,
-// createTime: "2024-01-13 09:15:00"
-// }
-// ];
-
-// 鐭ヨ瘑鏍囬妯℃澘
-const titleTemplates = [
- "{type}瀹℃壒娴佺▼浼樺寲鏂规",
- "{scenario}澶勭悊缁忛獙鎬荤粨",
- "{type}鐗规畩鎯呭喌澶勭悊鎸囧崡",
- "{scenario}蹇�熷鎵规柟妗�",
- "{type}鏍囧噯鍖栨搷浣滄祦绋�",
- "{scenario}闂瑙e喅鏂规",
- "{type}鏈�浣冲疄璺垫�荤粨",
- "{scenario}鏁堢巼鎻愬崌鏂规"
-];
-
-// 鐭ヨ瘑绫诲瀷閰嶇疆
-const knowledgeTypes = [
- { type: "contract", label: "鍚堝悓鐗规壒", efficiency: "high" },
- { type: "approval", label: "瀹℃壒妗堜緥", efficiency: "medium" },
- { type: "solution", label: "瑙e喅鏂规", efficiency: "high" },
- { type: "experience", label: "缁忛獙鎬荤粨", efficiency: "medium" },
- { type: "guide", label: "鎿嶄綔鎸囧崡", efficiency: "low" }
-];
-
-// 鍦烘櫙鍒楄〃
-const scenarios = ["澶ч鍚堝悓瀹℃壒", "璺ㄩ儴闂ㄥ崗浣�", "绱ф�ラ噰璐�", "鐗规畩鐢宠", "娴佺▼浼樺寲", "闂澶勭悊", "鏍囧噯鍖栧缓璁�", "鏁堢巼鎻愬崌"];
-
-// 鑷姩鐢熸垚鏂版暟鎹�
-const generateNewData = () => {
- const newId = (mockData.length + 1).toString();
- const now = new Date();
- const randomType = knowledgeTypes[Math.floor(Math.random() * knowledgeTypes.length)];
- const randomScenario = scenarios[Math.floor(Math.random() * scenarios.length)];
-
- // 鐢熸垚闅忔満鏍囬
- let title = titleTemplates[Math.floor(Math.random() * titleTemplates.length)];
- title = title
- .replace('{type}', randomType.label)
- .replace('{scenario}', randomScenario);
-
- const newKnowledge = {
- id: newId,
- title: title,
- type: randomType.type,
- scenario: randomScenario,
- efficiency: randomType.efficiency,
- problem: `鍦�${randomScenario}杩囩▼涓亣鍒扮殑闂鎻忚堪...`,
- solution: `閽堝${randomScenario}鐨勮В鍐虫柟妗堝拰鎿嶄綔姝ラ...`,
- keyPoints: "鍏抽敭瑕佺偣1,鍏抽敭瑕佺偣2,鍏抽敭瑕佺偣3,鍏抽敭瑕佺偣4",
- creator: ["寮犵粡鐞�", "鏉庝富绠�", "鐜嬩笓鍛�", "鍒樻�荤洃"][Math.floor(Math.random() * 4)],
- usageCount: Math.floor(Math.random() * 20) + 1,
- createTime: now.toLocaleString()
- };
-
- // 娣诲姞鍒版暟鎹紑澶�
- mockData.unshift(newKnowledge);
-
- // 淇濇寔鏁版嵁閲忓湪鍚堢悊鑼冨洿鍐咃紙鏈�澶氫繚鐣�30鏉★級
- if (mockData.length > 30) {
- mockData = mockData.slice(0, 30);
- }
-
- console.log(`[${new Date().toLocaleString()}] 鑷姩鐢熸垚鏂扮煡璇�: ${title}`);
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
- startAutoRefresh();
-});
-
-// 寮�濮嬭嚜鍔ㄥ埛鏂�
-const startAutoRefresh = () => {
- setInterval(() => {
- generateNewData();
- getList();
- }, 600000); // 10鍒嗛挓鍒锋柊涓�娆� (10 * 60 * 1000 = 600000ms)
-};
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- listKnowledgeBase({...page.value, ...searchForm.value})
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row = null) => {
- dialogType.value = type;
- if (type === "add") {
- dialogTitle.value = "鏂板鐭ヨ瘑";
- // 閲嶇疆琛ㄥ崟
- Object.assign(form.value, {
- title: "",
- type: "",
- scenario: "",
- efficiency: "",
- problem: "",
- solution: "",
- keyPoints: "",
- creator: "",
- usageCount: 0
- });
- } else if (type === "edit" && row) {
- dialogTitle.value = "缂栬緫鐭ヨ瘑";
- Object.assign(form.value, {
- id: row.id,
- title: row.title,
- type: row.type,
- scenario: row.scenario,
- efficiency: row.efficiency,
- problem: row.problem,
- solution: row.solution,
- keyPoints: row.keyPoints,
- creator: row.creator,
- usageCount: row.usageCount
- });
- }
- dialogVisible.value = true;
-};
-
-// 鏌ョ湅鐭ヨ瘑璇︽儏
-const viewKnowledge = (row) => {
- currentKnowledge.value = { ...row };
- viewDialogVisible.value = true;
-};
-
-// 鑾峰彇绫诲瀷鏍囩绫诲瀷
-const getTypeTagType = (type) => {
- const typeMap = {
- contract: "success",
- approval: "warning",
- solution: "primary",
- experience: "info",
- guide: "danger"
- };
- return typeMap[type] || "info";
-};
-
-// 鑾峰彇绫诲瀷鏍囩鏂囨湰
-const getTypeLabel = (type) => {
- const typeMap = {
- contract: "鍚堝悓鐗规壒",
- approval: "瀹℃壒妗堜緥",
- solution: "瑙e喅鏂规",
- experience: "缁忛獙鎬荤粨",
- guide: "鎿嶄綔鎸囧崡"
- };
- return typeMap[type] || type;
-};
-
-// 鑾峰彇鏁堢巼鏍囩绫诲瀷
-const getEfficiencyTagType = (efficiency) => {
- const typeMap = {
- high: "success",
- medium: "warning",
- low: "info"
- };
- return typeMap[efficiency] || "info";
-};
-
-// 鑾峰彇鏁堢巼鏍囩鏂囨湰
-const getEfficiencyLabel = (efficiency) => {
- const efficiencyMap = {
- high: "鏄捐憲鎻愬崌",
- medium: "涓�鑸彁鍗�",
- low: "杞诲井鎻愬崌"
- };
- return efficiencyMap[efficiency] || efficiency;
-};
-
-// 鑾峰彇鏁堢巼鎻愬崌鐧惧垎姣�
-const getEfficiencyScore = (efficiency) => {
- const scoreMap = {
- high: 40,
- medium: 25,
- low: 15
- };
- return scoreMap[efficiency] || 0;
-};
-
-// 鑾峰彇骞冲潎鑺傜渷鏃堕棿
-const getTimeSaved = (efficiency) => {
- const timeMap = {
- high: "2-3澶�",
- medium: "1-2澶�",
- low: "0.5-1澶�"
- };
- return timeMap[efficiency] || "鏈煡";
-};
-
-// 澶嶅埗鐭ヨ瘑
-const copyKnowledge = () => {
- const knowledgeText = `
- 鐭ヨ瘑鏍囬锛�${currentKnowledge.value.title}
- 鐭ヨ瘑绫诲瀷锛�${getTypeLabel(currentKnowledge.value.type)}
- 閫傜敤鍦烘櫙锛�${currentKnowledge.value.scenario}
- 闂鎻忚堪锛�${currentKnowledge.value.problem}
- 瑙e喅鏂规锛�${currentKnowledge.value.solution}
- 鍏抽敭瑕佺偣锛�${currentKnowledge.value.keyPoints}
- 鍒涘缓浜猴細${currentKnowledge.value.creator}
- `.trim();
-
- // 澶嶅埗鍒板壀璐存澘
- navigator.clipboard.writeText(knowledgeText).then(() => {
- ElMessage.success("鐭ヨ瘑鍐呭宸插鍒跺埌鍓创鏉�");
- }).catch(() => {
- ElMessage.error("澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗");
- });
-};
-
-// 鏀惰棌鐭ヨ瘑
-const markAsFavorite = () => {
- // 澧炲姞浣跨敤娆℃暟
- const index = mockData.findIndex(item => item.id === currentKnowledge.value.id);
- if (index !== -1) {
- mockData[index].usageCount += 1;
- currentKnowledge.value.usageCount += 1;
- }
-
- ElMessage.success("宸叉敹钘忥紝浣跨敤娆℃暟+1");
-};
-
-// 鎻愪氦鐭ヨ瘑琛ㄥ崟
-const submitForm = async () => {
- try {
- await formRef.value.validate();
- if (dialogType.value === "add") {
- // 鏂板鐭ヨ瘑
- addKnowledgeBase({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else {
- updateKnowledgeBase({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍒犻櫎鐭ヨ瘑
-const handleDelete = () => {
- if (selectedIds.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑鐭ヨ瘑");
- return;
- }
-
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- // 浠巑ockData涓垹闄ら�変腑鐨勯」
- selectedIds.value.forEach(id => {
- const index = mockData.findIndex(item => item.id === id);
- if (index !== -1) {
- mockData.splice(index, 1);
- }
- });
-
- ElMessage.success("鍒犻櫎鎴愬姛");
- selectedIds.value = [];
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-</script>
-
-<style scoped>
-.auto-refresh-info {
- margin-bottom: 15px;
-}
-
-.auto-refresh-info .el-alert {
- border-radius: 8px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-.knowledge-detail {
- padding: 20px 0;
-}
-
-.detail-title {
- font-size: 18px;
- font-weight: bold;
- color: #303133;
-}
-
-.detail-section {
- margin-top: 24px;
-}
-
-.detail-section h4 {
- margin: 0 0 12px 0;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- border-left: 4px solid #409eff;
- padding-left: 12px;
-}
-
-.detail-content {
- background: #f8f9fa;
- padding: 16px;
- border-radius: 6px;
- line-height: 1.6;
- color: #606266;
- white-space: pre-wrap;
-}
-
-.key-points {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
-}
-
-.usage-stats {
- margin-top: 16px;
-}
-
-.stat-item {
- text-align: center;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-}
-
-.stat-number {
- font-size: 24px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #909399;
-}
-</style>
diff --git a/src/views/collaborativeApproval/meetingBoard/index.vue b/src/views/collaborativeApproval/meetingBoard/index.vue
deleted file mode 100644
index b6b803b..0000000
--- a/src/views/collaborativeApproval/meetingBoard/index.vue
+++ /dev/null
@@ -1,498 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>浼氳鐪嬫澘</h2>
-<!-- <el-button type="primary" @click="createMeeting">鍒涘缓浼氳</el-button>-->
- </div>
-
- <!-- 浼氳缁熻鍗$墖 -->
- <div class="stats-cards">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.total }}</div>
- <div class="stat-label">鎬讳細璁暟</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.ongoing }}</div>
- <div class="stat-label">杩涜涓�</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.completed }}</div>
- <div class="stat-label">宸插畬鎴�</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.upcoming }}</div>
- <div class="stat-label">鍗冲皢寮�濮�</div>
- </div>
- </el-card>
- </div>
-
- <!-- 浼氳鍒楄〃 -->
- <div class="meeting-list">
- <el-card v-for="meeting in meetings" :key="meeting.id" class="meeting-card">
- <div class="meeting-header">
- <div class="meeting-title">
- <h3>{{ meeting.title }}</h3>
- <el-tag :type="getStatusType(meeting.status)" size="small">
- {{ getStatusText(meeting.status) }}
- </el-tag>
- </div>
- <div class="meeting-time">
- <el-icon><Clock /></el-icon>
- {{ formatTime(meeting.startTime) }} - {{ formatTime(meeting.endTime) }}
- </div>
- </div>
-
- <div class="meeting-info">
- <div class="info-item">
- <el-icon><Location /></el-icon>
- <span>{{ meeting.location }}</span>
- </div>
- <div class="info-item">
- <el-icon><User /></el-icon>
- <span>涓绘寔浜�: {{ meeting.host }}</span>
- </div>
- <div class="info-item">
- <el-icon><UserFilled /></el-icon>
- <span>鍙備細浜烘暟: {{ meeting.participants.length }}浜�</span>
- </div>
- </div>
-
- <div class="meeting-agenda">
- <h4>璁▼瀹夋帓</h4>
- <div class="agenda-list">
- <div
- v-for="(agenda, index) in meeting.agenda"
- :key="index"
- class="agenda-item"
- :class="{ 'active': agenda.status === 'active', 'completed': agenda.status === 'completed' }"
- >
- <span class="agenda-time">{{ agenda.time }}</span>
- <span class="agenda-content">{{ agenda.content }}</span>
- <el-tag
- :type="getAgendaStatusType(agenda.status)"
- size="small"
- >
- {{ getAgendaStatusText(agenda.status) }}
- </el-tag>
- </div>
- </div>
- </div>
-
-<!-- <div class="meeting-actions">-->
-<!-- <el-button type="primary" size="small" @click="joinMeeting(meeting)">-->
-<!-- 鍔犲叆浼氳-->
-<!-- </el-button>-->
-<!-- <el-button type="info" size="small" @click="viewDetails(meeting)">-->
-<!-- 鏌ョ湅璇︽儏-->
-<!-- </el-button>-->
-<!-- <el-button type="warning" size="small" @click="editMeeting(meeting)">-->
-<!-- 缂栬緫-->
-<!-- </el-button>-->
-<!-- </div>-->
- </el-card>
- </div>
-
- <!-- 鍒涘缓浼氳瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" title="鍒涘缓浼氳" width="600px">
- <el-form :model="meetingForm" label-width="100px">
- <el-form-item label="浼氳鏍囬">
- <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁爣棰�" />
- </el-form-item>
- <el-form-item label="浼氳鏃堕棿">
- <el-date-picker
- v-model="meetingForm.timeRange"
- type="datetimerange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- format="YYYY-MM-DD HH:mm"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- <el-form-item label="浼氳鍦扮偣">
- <el-input v-model="meetingForm.location" placeholder="璇疯緭鍏ヤ細璁湴鐐�" />
- </el-form-item>
- <el-form-item label="涓绘寔浜�">
- <el-input v-model="meetingForm.host" placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕" />
- </el-form-item>
- <el-form-item label="浼氳鎻忚堪">
- <el-input
- v-model="meetingForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ヤ細璁弿杩�"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitMeeting">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-import { Clock, Location, User, UserFilled } from '@element-plus/icons-vue'
-
-// 缁熻鏁版嵁
-const stats = reactive({
- total: 12,
- ongoing: 3,
- completed: 7,
- upcoming: 2
-})
-
-// 浼氳鏁版嵁
-const meetings = ref([
- {
- id: 1,
- title: '浜у搧寮�鍙戝懆浼�',
- status: 'ongoing',
- startTime: '2025-01-15 09:00:00',
- endTime: '2025-01-15 10:30:00',
- location: '浼氳瀹',
- host: '闄堝織寮�',
- participants: ['闄堝織寮�', '鍒橀泤濠�', '鐜嬪缓鍥�', '璧典附鍗�'],
- agenda: [
- { time: '09:00-09:15', content: '涓婂懆宸ヤ綔鎬荤粨', status: 'completed' },
- { time: '09:15-09:45', content: '鏈懆寮�鍙戣鍒�', status: 'active' },
- { time: '09:45-10:00', content: '鎶�鏈毦鐐硅璁�', status: 'pending' },
- { time: '10:00-10:30', content: '闂鍙嶉涓庤В鍐�', status: 'pending' }
- ]
- },
- {
- id: 2,
- title: '瀹㈡埛闇�姹傝瘎瀹′細',
- status: 'upcoming',
- startTime: '2025-01-15 14:00:00',
- endTime: '2025-01-15 15:00:00',
- location: '绾夸笂浼氳',
- host: '闄堝織寮�',
- participants: ['闄堝織寮�', '鍒橀泤濠�', '瀛欐槑鍗�', '瀹㈡埛浠h〃'],
- agenda: [
- { time: '14:00-14:20', content: '闇�姹傝儗鏅粙缁�', status: 'pending' },
- { time: '14:20-14:40', content: '鍔熻兘闇�姹傚垎鏋�', status: 'pending' },
- { time: '14:40-15:00', content: '鎶�鏈彲琛屾�ц瘎浼�', status: 'pending' }
- ]
- },
- {
- id: 3,
- title: '鍥㈤槦寤鸿娲诲姩',
- status: 'completed',
- startTime: '2025-01-14 16:00:00',
- endTime: '2025-01-14 18:00:00',
- location: '鍏徃澶у巺',
- host: '浜轰簨閮�',
- participants: ['鍏ㄤ綋鍛樺伐'],
- agenda: [
- { time: '16:00-16:30', content: '鍥㈤槦娓告垙', status: 'completed' },
- { time: '16:30-17:00', content: '缁忛獙鍒嗕韩', status: 'completed' },
- { time: '17:00-18:00', content: '鑷敱浜ゆ祦', status: 'completed' }
- ]
- }
-])
-
-// 瀵硅瘽妗嗙浉鍏�
-const dialogVisible = ref(false)
-const meetingForm = reactive({
- title: '',
- timeRange: [],
- location: '',
- host: '',
- description: ''
-})
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- 'ongoing': 'success',
- 'upcoming': 'warning',
- 'completed': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- 'ongoing': '杩涜涓�',
- 'upcoming': '鍗冲皢寮�濮�',
- 'completed': '宸插畬鎴�'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鑾峰彇璁▼鐘舵�佺被鍨�
-const getAgendaStatusType = (status) => {
- const statusMap = {
- 'completed': 'success',
- 'active': 'warning',
- 'pending': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇璁▼鐘舵�佹枃鏈�
-const getAgendaStatusText = (status) => {
- const statusMap = {
- 'completed': '宸插畬鎴�',
- 'active': '杩涜涓�',
- 'pending': '寰呭紑濮�'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鏍煎紡鍖栨椂闂�
-const formatTime = (timeStr) => {
- const date = new Date(timeStr)
- return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
-}
-
-// 鍒涘缓浼氳
-const createMeeting = () => {
- dialogVisible.value = true
- // 閲嶇疆琛ㄥ崟
- Object.assign(meetingForm, {
- title: '',
- timeRange: [],
- location: '',
- host: '',
- description: ''
- })
-}
-
-// 鎻愪氦浼氳
-const submitMeeting = () => {
- if (!meetingForm.title || !meetingForm.timeRange.length || !meetingForm.location || !meetingForm.host) {
- ElMessage.warning('璇峰~鍐欏畬鏁寸殑浼氳淇℃伅')
- return
- }
-
- // 鍒涘缓鏂颁細璁�
- const newMeeting = {
- id: Date.now(),
- title: meetingForm.title,
- status: 'upcoming',
- startTime: meetingForm.timeRange[0],
- endTime: meetingForm.timeRange[1],
- location: meetingForm.location,
- host: meetingForm.host,
- participants: [meetingForm.host],
- agenda: [
- { time: '寰呭畾', content: '璁▼寰呭畾', status: 'pending' }
- ]
- }
-
- meetings.value.unshift(newMeeting)
- stats.total++
- stats.upcoming++
-
- ElMessage.success('浼氳鍒涘缓鎴愬姛')
- dialogVisible.value = false
-}
-
-// 鍔犲叆浼氳
-const joinMeeting = (meeting) => {
- ElMessage.success(`宸插姞鍏ヤ細璁細${meeting.title}`)
-}
-
-// 鏌ョ湅璇︽儏
-const viewDetails = (meeting) => {
- ElMessage.info(`鏌ョ湅浼氳璇︽儏锛�${meeting.title}`)
-}
-
-// 缂栬緫浼氳
-const editMeeting = (meeting) => {
- ElMessage.info(`缂栬緫浼氳锛�${meeting.title}`)
-}
-
-onMounted(() => {
- console.log('浼氳鐪嬫澘椤甸潰鍔犺浇瀹屾垚')
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
-
-.page-header h2 {
- margin: 0;
- color: #303133;
-}
-
-.stats-cards {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.stat-card {
- text-align: center;
-}
-
-.stat-content {
- padding: 10px;
-}
-
-.stat-number {
- font-size: 32px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #606266;
-}
-
-.meeting-list {
- display: grid;
- gap: 20px;
-}
-
-.meeting-card {
- border-radius: 8px;
-}
-
-.meeting-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 15px;
-}
-
-.meeting-title {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.meeting-title h3 {
- margin: 0;
- color: #303133;
-}
-
-.meeting-time {
- display: flex;
- align-items: center;
- gap: 5px;
- color: #606266;
- font-size: 14px;
-}
-
-.meeting-info {
- display: flex;
- gap: 20px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.info-item {
- display: flex;
- align-items: center;
- gap: 5px;
- color: #606266;
- font-size: 14px;
-}
-
-.meeting-agenda {
- margin-bottom: 20px;
-}
-
-.meeting-agenda h4 {
- margin: 0 0 15px 0;
- color: #303133;
- font-size: 16px;
-}
-
-.agenda-list {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-
-.agenda-item {
- display: flex;
- align-items: center;
- gap: 15px;
- padding: 10px;
- border-radius: 6px;
- background-color: #f5f7fa;
-}
-
-.agenda-item.active {
- background-color: #fdf6ec;
- border-left: 3px solid #e6a23c;
-}
-
-.agenda-item.completed {
- background-color: #f0f9ff;
- border-left: 3px solid #409eff;
-}
-
-.agenda-time {
- font-weight: bold;
- color: #606266;
- min-width: 80px;
-}
-
-.agenda-content {
- flex: 1;
- color: #303133;
-}
-
-.meeting-actions {
- display: flex;
- gap: 10px;
- justify-content: flex-end;
-}
-
-.dialog-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
-}
-
-@media (max-width: 768px) {
- .stats-cards {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .meeting-header {
- flex-direction: column;
- gap: 10px;
- }
-
- .meeting-info {
- flex-direction: column;
- gap: 10px;
- }
-
- .meeting-actions {
- flex-direction: column;
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/noticeManagement/index.vue b/src/views/collaborativeApproval/noticeManagement/index.vue
deleted file mode 100644
index 16cee35..0000000
--- a/src/views/collaborativeApproval/noticeManagement/index.vue
+++ /dev/null
@@ -1,711 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 鎼滅储琛ㄥ崟 -->
- <div class="search_form">
- <!-- <div>-->
- <!-- <span class="search_title">鍏憡鏍囬锛�</span>-->
- <!-- <el-input-->
- <!-- v-model="searchForm.title"-->
- <!-- style="width: 240px"-->
- <!-- placeholder="璇疯緭鍏ュ叕鍛婃爣棰樻悳绱�"-->
- <!-- @change="handleQuery"-->
- <!-- clearable-->
- <!-- :prefix-icon="Search"-->
- <!-- />-->
- <!-- <span class="search_title ml10">鍏憡绫诲瀷锛�</span>-->
- <!-- <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px">-->
- <!-- <el-option label="鏀惧亣閫氱煡" :value="1"/>-->
- <!-- <el-option label="璁惧缁翠慨閫氱煡" :value="2"/>-->
- <!-- </el-select>-->
- <!-- <span class="search_title ml10">鐘舵�侊細</span>-->
- <!-- <el-select v-model="searchForm.status" clearable @change="handleQuery" style="width: 240px">-->
- <!-- <el-option label="鑽夌" :value="0"/>-->
- <!-- <el-option label="宸插彂甯�" :value="1"/>-->
- <!-- <el-option label="宸蹭笅绾�" :value="2"/>-->
- <!-- </el-select>-->
- <!-- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>-->
- <!-- <el-button @click="resetQuery" style="margin-left: 10px">閲嶇疆</el-button>-->
- <!-- </div>-->
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏憡</el-button>
- <el-button type="danger" plain @click="handleDelete" :disabled="!selectedIds.length">鍒犻櫎</el-button>
- </div>
- </div>
-
- <!-- 閫氱煡鍏憡鏉� -->
- <div class="notice-board">
- <!-- 鏀惧亣閫氱煡鍖哄煙 -->
- <div class="notice-section" v-if="holidayNoticeCount > 0">
- <div class="section-header">
- <h3>馃搮 鏀惧亣閫氱煡</h3>
- <span class="section-count">{{ holidayNoticeCount }}鏉�</span>
- </div>
- <div class="notice-cards">
- <div
- v-for="notice in holidayNotices"
- :key="notice.id"
- class="notice-card holiday-card"
- :class="{ 'urgent': notice.priority === '3' }"
- >
- <div class="card-header">
- <div class="card-title">
- <el-icon class="holiday-icon">
- <Calendar/>
- </el-icon>
- {{ notice.title }}
- </div>
- <div class="card-actions">
- <el-button link type="primary" @click="handleEdit(notice)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(notice.id)">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="card-content">
- <p>{{ notice.content }}</p>
- </div>
- <div class="card-footer">
- <div class="card-meta">
- <span class="priority" :class="'priority-' + notice.priority">
- {{ getPriorityText(notice.priority) }}
- </span>
- <span class="status" :class="'status-' + notice.status">
- {{ getStatusText(notice.status) }}
- </span>
- </div>
- <div class="card-info">
- <span class="creator">{{ notice.createUserName }}</span>
- <span class="time">{{ notice.createTime }}</span>
- </div>
- </div>
- <div class="card-remark" v-if="notice.remark">
- <el-icon>
- <InfoFilled/>
- </el-icon>
- <span>{{ notice.remark }}</span>
- </div>
- </div>
- </div>
- </div>
-
- <pagination
- v-if="holidayNoticePage.total > 0"
- :total="holidayNoticePage.total"
- :page="holidayNoticePage.current"
- :limit="holidayNoticePage.size"
- @pagination="handleHolidayNoticeCurrentChange"
- />
-
- <!-- 璁惧缁翠慨閫氱煡鍖哄煙 -->
- <div class="notice-section" v-if="maintenanceNoticeCount > 0">
- <div class="section-header">
- <h3>馃敡 璁惧缁翠慨閫氱煡</h3>
- <span class="section-count">{{ maintenanceNoticeCount }}鏉�</span>
- </div>
- <div class="notice-cards">
- <div
- v-for="notice in maintenanceNotices"
- :key="notice.id"
- class="notice-card maintenance-card"
- :class="{ 'urgent': notice.priority === '3' }"
- >
- <div class="card-header">
- <div class="card-title">
- <el-icon class="maintenance-icon">
- <Tools/>
- </el-icon>
- {{ notice.title }}
- </div>
- <div class="card-actions">
- <el-button link type="primary" @click="handleEdit(notice)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(notice.id)">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="card-content">
- <p>{{ notice.content }}</p>
- </div>
- <div class="card-footer">
- <div class="card-meta">
- <span class="priority" :class="'priority-' + notice.priority">
- {{ getPriorityText(notice.priority) }}
- </span>
- <span class="status" :class="'status-' + notice.status">
- {{ getStatusText(notice.status) }}
- </span>
- </div>
- <div class="card-info">
- <span class="creator">{{ notice.createUserName }}</span>
- <span class="time">{{ notice.createTime }}</span>
- </div>
- </div>
- <div class="card-remark" v-if="notice.remark">
- <el-icon>
- <InfoFilled/>
- </el-icon>
- <span>{{ notice.remark }}</span>
- </div>
- </div>
- </div>
- </div>
-
- <pagination
- v-if="maintenanceNoticePage.total > 0"
- :total="maintenanceNoticePage.total"
- :page="maintenanceNoticePage.current"
- :limit="maintenanceNoticePage.size"
- @pagination="handleMaintenanceNoticeCurrentChange"
- />
-
- <!-- 绌虹姸鎬� -->
- <div class="empty-state" v-if="holidayNotices.length === 0 && maintenanceNotices.length === 0">
- <el-empty description="鏆傛棤閫氱煡鍏憡"/>
- </div>
- </div>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- :title="dialogTitle"
- v-model="dialogVisible"
- width="800px"
- append-to-body
- @close="resetForm"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鍏憡鏍囬" prop="title">
- <el-input v-model="form.title" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏憡绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨鍏憡绫诲瀷" style="width: 100%">
- <el-option label="鏀惧亣閫氱煡" :value="1"/>
- <el-option label="璁惧缁翠慨閫氱煡" :value="2"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio :value="0">鑽夌</el-radio>
- <el-radio :value="1">宸插彂甯�</el-radio>
- <el-radio :value="2">宸蹭笅绾�</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浼樺厛绾�">
- <el-select v-model="form.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
- <el-option label="鏅��" :value="1"/>
- <el-option label="閲嶈" :value="2"/>
- <el-option label="绱ф��" :value="3"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍏憡鍐呭" prop="noticeContent">
- <el-input
- v-model="form.content"
- type="textarea"
- :rows="6"
- placeholder="璇疯緭鍏ュ叕鍛婂唴瀹�"
- maxlength="500"
- show-word-limit
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="澶囨敞">
- <el-input
- v-model="form.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- maxlength="200"
- show-word-limit
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {Search, Calendar, Tools, InfoFilled} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, toRefs, computed} from "vue";
-import {ElMessage, ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user";
-import {
- addNotice,
- delNotice,
- getCount,
- listNotice,
- updateNotice
-} from "../../../api/collaborativeApproval/noticeManagement.js";
-import pagination from "../../../components/PIMTable/Pagination.vue";
-
-const userStore = useUserStore();
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- title: "",
- type: undefined,
- status: undefined,
- },
- form: {
- id: undefined,
- title: "",
- type: null,
- content: "",
- status: 0,
- priority: 1,
- remark: "",
- },
- rules: {
- title: [
- {required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur"}
- ],
- type: [
- {required: true, message: "璇烽�夋嫨鍏憡绫诲瀷", trigger: "change"}
- ],
- content: [
- {required: true, message: "鍏憡鍐呭涓嶈兘涓虹┖", trigger: "blur"}
- ]
- }
-});
-
-const {searchForm, form, rules} = toRefs(data);
-
-// 椤甸潰鐘舵��
-const dialogVisible = ref(false);
-const dialogTitle = ref("");
-const selectedIds = ref([]);
-const formRef = ref();
-
-
-// 璁$畻灞炴��
-const filteredNotices = computed(() => {
- let filtered = [...mockData];
-
- if (searchForm.value.noticeTitle) {
- filtered = filtered.filter(item =>
- item.noticeTitle.includes(searchForm.value.noticeTitle)
- );
- }
- if (searchForm.value.noticeType) {
- filtered = filtered.filter(item =>
- item.noticeType === searchForm.value.noticeType
- );
- }
- if (searchForm.value.status !== "") {
- filtered = filtered.filter(item =>
- item.status === searchForm.value.status
- );
- }
-
- return filtered;
-});
-
-// 鏂规硶瀹氫箟
-const handleQuery = () => {
- // 鎼滅储鍔熻兘淇濇寔涓嶅彉锛屼絾鏁版嵁閫氳繃璁$畻灞炴�ц嚜鍔ㄨ繃婊�
-};
-
-const resetQuery = () => {
- searchForm.value = {
- title: "",
- type: "",
- status: ""
- };
-};
-
-const getPriorityText = (priority) => {
- const priorityMap = {"1": "鏅��", "2": "閲嶈", "3": "绱ф��"};
- return priorityMap[priority] || "鏅��";
-};
-
-const getStatusText = (status) => {
- const statusMap = {"0": "鑽夌", "1": "宸插彂甯�", "2": "宸蹭笅绾�"};
- return statusMap[status] || "鏈煡";
-};
-
-const openForm = (type) => {
- if (type === 'add') {
- dialogTitle.value = "鏂板鍏憡";
- form.value = {
- id: undefined,
- title: "",
- type: undefined,
- content: "",
- status: 0,
- priority: 1,
- remark: "",
- };
- }
- dialogVisible.value = true;
-};
-
-const handleEdit = (row) => {
- dialogTitle.value = "缂栬緫鍏憡";
- form.value = {...row};
- dialogVisible.value = true;
-};
-
-const handleDelete = (id) => {
- ElMessageBox.confirm(
- "纭鍒犻櫎杩欐潯鍏憡鍚楋紵",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- ).then(() => {
- delNotice(id).then(res => {
- ElMessage.success("鍒犻櫎鎴愬姛");
- resetTable()
- })
- });
-};
-
-const submitForm = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (form.value.id) {
- // 缂栬緫妯″紡
- updateNotice(form.value).then(res => {
- ElMessage.success("淇敼鎴愬姛");
- resetTable()
- })
- } else {
- // 鏂板妯″紡
- addNotice(form.value).then(res => {
- ElMessage.success("鏂板鎴愬姛");
- resetTable()
- })
- }
- dialogVisible.value = false;
- }
- });
-};
-
-const holidayNoticeCount = ref()
-const maintenanceNoticeCount = ref()
-const fetchCount = () => {
- getCount().then(res => {
- holidayNoticeCount.value = res.data.filter(item => {
- return item.type === 1
- })[0].count;
- maintenanceNoticeCount.value = res.data.filter(item => {
- return item.type === 2
- })[0].count;
- });
-}
-
-const holidayNotices = ref([])
-const maintenanceNotices = ref([])
-const holidayNoticePage = ref({
- total: 0,
- current: 1,
- size: 6
-})
-
-const maintenanceNoticePage = ref({
- total: 0,
- current: 1,
- size: 6
-})
-
-const fetchHolidayNotices = () => {
- listNotice({...holidayNoticePage.value, type: 1}).then(res => {
- holidayNotices.value = res.data.records
- holidayNoticePage.value.total = res.data.total
- });
-};
-
-const fetchMaintenanceNotices = () => {
- listNotice({...holidayNoticePage.value, type: 2}).then(res => {
- maintenanceNotices.value = res.data.records
- maintenanceNoticePage.value.total = res.data.total
- });
-};
-
-const handleHolidayNoticeCurrentChange = (val) => {
- holidayNoticePage.value.size = val.limit
- holidayNoticePage.value.current = val.page
- fetchHolidayNotices()
-};
-
-const handleMaintenanceNoticeCurrentChange = (val) => {
- maintenanceNoticePage.value.size = val.limit
- maintenanceNoticePage.value.current = val.page
- fetchMaintenanceNotices()
-};
-
-const resetTable = () => {
- holidayNoticePage.value.current = 1
- holidayNoticePage.value.size = 6
- maintenanceNoticePage.value.current = 1
- maintenanceNoticePage.value.size = 6
- fetchHolidayNotices()
- fetchMaintenanceNotices()
- fetchCount()
-};
-
-const resetForm = () => {
- formRef.value?.resetFields();
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- fetchCount()
- fetchHolidayNotices()
- fetchMaintenanceNotices()
-});
-</script>
-
-<style scoped>
-.search_form {
- background: #fff;
- padding: 20px;
- margin-bottom: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.search_title {
- font-weight: 500;
- color: #333;
- margin-right: 8px;
-}
-
-.ml10 {
- margin-left: 10px;
-}
-
-.notice-board {
- background: #f5f7fa;
- padding: 20px;
- border-radius: 8px;
-}
-
-.notice-section {
- margin-bottom: 30px;
-}
-
-.section-header {
- display: flex;
- align-items: center;
- margin-bottom: 20px;
- padding: 0 10px;
-}
-
-.section-header h3 {
- margin: 0;
- color: #303133;
- font-size: 18px;
- font-weight: 600;
-}
-
-.section-count {
- margin-left: 10px;
- background: #409eff;
- color: white;
- padding: 2px 8px;
- border-radius: 12px;
- font-size: 12px;
-}
-
-.notice-cards {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
- gap: 20px;
-}
-
-.notice-card {
- background: white;
- border-radius: 12px;
- padding: 20px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- transition: all 0.3s ease;
- border-left: 4px solid transparent;
-}
-
-.notice-card:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
-}
-
-.holiday-card {
- border-left-color: #67c23a;
-}
-
-.maintenance-card {
- border-left-color: #e6a23c;
-}
-
-.urgent {
- border-left-color: #f56c6c;
- background: linear-gradient(135deg, #fff5f5 0%, #ffffff 100%);
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 15px;
-}
-
-.card-title {
- display: flex;
- align-items: center;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- flex: 1;
-}
-
-.holiday-icon {
- color: #67c23a;
- margin-right: 8px;
- font-size: 18px;
-}
-
-.maintenance-icon {
- color: #e6a23c;
- margin-right: 8px;
- font-size: 18px;
-}
-
-.card-actions {
- display: flex;
- gap: 8px;
-}
-
-.card-content {
- margin-bottom: 15px;
-}
-
-.card-content p {
- margin: 0;
- color: #606266;
- line-height: 1.6;
- font-size: 14px;
-}
-
-.card-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 10px;
-}
-
-.card-meta {
- display: flex;
- gap: 8px;
-}
-
-.priority, .status {
- padding: 2px 8px;
- border-radius: 12px;
- font-size: 12px;
- font-weight: 500;
-}
-
-.priority-1 {
- background: #f0f9ff;
- color: #0369a1;
-}
-
-.priority-2 {
- background: #fef3c7;
- color: #d97706;
-}
-
-.priority-3 {
- background: #fef2f2;
- color: #dc2626;
-}
-
-.status-0 {
- background: #f3f4f6;
- color: #6b7280;
-}
-
-.status-1 {
- background: #d1fae5;
- color: #059669;
-}
-
-.status-2 {
- background: #fef3c7;
- color: #d97706;
-}
-
-.card-info {
- display: flex;
- flex-direction: column;
- align-items: flex-end;
- font-size: 12px;
- color: #909399;
-}
-
-.creator {
- font-weight: 500;
- margin-bottom: 2px;
-}
-
-.card-remark {
- display: flex;
- align-items: center;
- gap: 6px;
- padding: 8px 12px;
- background: #f8f9fa;
- border-radius: 6px;
- font-size: 12px;
- color: #606266;
- border-left: 3px solid #409eff;
-}
-
-.empty-state {
- text-align: center;
- padding: 60px 20px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .notice-cards {
- grid-template-columns: 1fr;
- }
-
- .search_form {
- flex-direction: column;
- gap: 15px;
- }
-
- .search_form > div {
- width: 100%;
- }
-}
-</style>
diff --git a/src/views/collaborativeApproval/notificationManagement/index.vue b/src/views/collaborativeApproval/notificationManagement/index.vue
deleted file mode 100644
index 8e1b792..0000000
--- a/src/views/collaborativeApproval/notificationManagement/index.vue
+++ /dev/null
@@ -1,1202 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閫氱煡鏍囬锛�</span>
- <el-input
- v-model="searchForm.title"
- style="width: 240px"
- placeholder="璇疯緭鍏ラ�氱煡鏍囬鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">閫氱煡绫诲瀷锛�</span>
- <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鏀惧亣閫氱煡" :value="'holiday'" />
- <el-option label="澶勭綒閫氱煡" :value="'penalty'" />
- <el-option label="寮�浼氶�氱煡" :value="'meeting'" />
- <el-option label="涓存椂閫氱煡" :value="'temporary'" />
- <el-option label="姝e紡閫氱煡" :value="'formal'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板閫氱煡</el-button>
- <el-button type="success" @click="openMeetingDialog">鍦ㄧ嚎浼氳</el-button>
- <el-button type="warning" @click="openFileShareDialog">鏂囦欢鍏变韩</el-button>
- <!-- <el-button type="info" @click="refreshEmployees">鍒锋柊鍛樺伐</el-button> -->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- 鏂板/缂栬緫閫氱煡寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="800px"
- :close-on-click-modal="false"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閫氱煡鏍囬" prop="title">
- <el-input v-model="form.title" placeholder="璇疯緭鍏ラ�氱煡鏍囬" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閫氱煡绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨閫氱煡绫诲瀷" style="width: 100%">
- <el-option label="鏀惧亣閫氱煡" value="holiday" />
- <el-option label="澶勭綒閫氱煡" value="penalty" />
- <el-option label="寮�浼氶�氱煡" value="meeting" />
- <el-option label="涓存椂閫氱煡" value="temporary" />
- <el-option label="姝e紡閫氱煡" value="formal" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浼樺厛绾�" prop="priority">
- <el-select v-model="form.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
- <el-option label="鏅��" value="low" />
- <el-option label="閲嶈" value="medium" />
- <el-option label="绱ф��" value="high" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈夋晥鏈熻嚦" prop="expireDate">
- <el-date-picker
- v-model="form.expireDate"
- type="date"
- placeholder="璇烽�夋嫨鏈夋晥鏈�"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="鎺ユ敹閮ㄩ棬" prop="departments">
- <el-select
- v-model="form.departments"
- multiple
- placeholder="璇烽�夋嫨鎺ユ敹閮ㄩ棬"
- style="width: 100%"
- >
- <el-option
- v-for="dept in departments"
- :key="dept"
- :label="dept"
- :value="dept"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍚屾鏂瑰紡" prop="syncMethods">
- <el-checkbox-group v-model="form.syncMethods">
- <el-checkbox
- v-for="method in syncMethods"
- :key="method.value"
- :label="method.value"
- >
- {{ method.label }}
- </el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- <el-form-item label="閫氱煡鍐呭" prop="content">
- <el-input
- v-model="form.content"
- type="textarea"
- :rows="4"
- placeholder="璇疯緭鍏ラ�氱煡鍐呭"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鍦ㄧ嚎浼氳寮圭獥 -->
- <el-dialog
- v-model="meetingDialogVisible"
- title="鍒涘缓鍦ㄧ嚎浼氳"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form ref="meetingFormRef" :model="meetingForm" :rules="meetingRules" label-width="120px">
- <el-form-item label="浼氳鏍囬" prop="title">
- <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁爣棰�" />
- </el-form-item>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
- <el-date-picker
- v-model="meetingForm.startTime"
- type="datetime"
- value-format="YYYY-MM-DD HH:mm:ss"
- format="YYYY-MM-DD HH:mm:ss"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浼氳鏃堕暱" prop="duration">
- <el-input-number
- v-model="meetingForm.duration"
- :min="15"
- :max="480"
- :step="15"
- style="width: 100%"
- />
- <span style="margin-left: 10px">鍒嗛挓</span>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="浼氳骞冲彴" prop="platform">
- <el-select v-model="meetingForm.platform" placeholder="璇烽�夋嫨浼氳骞冲彴" style="width: 100%">
- <el-option
- v-for="platform in meetingPlatforms"
- :key="platform.value"
- :label="platform.label"
- :value="platform.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙備細浜哄憳" prop="participants">
- <el-select
- v-model="meetingForm.participants"
- multiple
- filterable
- remote
- :remote-method="filterEmployees"
- :loading="employeesLoading"
- placeholder="璇烽�夋嫨鍙備細浜哄憳"
- style="width: 100%"
- >
- <el-option-group
- v-for="group in employeeGroups"
- :key="group.label"
- :label="group.label"
- >
- <el-option
- v-for="employee in group.options"
- :key="employee.value"
- :label="`${employee.label} (${employee.dept})`"
- :value="employee.value"
- >
- <div style="display: flex; justify-content: space-between; align-items: center;">
- <div>
- <div style="font-weight: 500;">{{ employee.label }}</div>
- <div style="color: #909399; font-size: 12px;">{{ employee.dept }}</div>
- </div>
- <div style="text-align: right; font-size: 12px; color: #909399;">
- <div v-if="employee.phone">{{ employee.phone }}</div>
- <div v-if="employee.email">{{ employee.email }}</div>
- </div>
- </div>
- </el-option>
- </el-option-group>
- </el-select>
- <div style="margin-top: 8px; color: #909399; font-size: 12px;">
- 宸查�夋嫨 {{ meetingForm.participants.length }} 浜�
- </div>
- <!-- 宸查�夋嫨浜哄憳璇︽儏 -->
- <div v-if="meetingForm.participants.length > 0" style="margin-top: 10px;">
- <el-tag
- v-for="participantId in meetingForm.participants"
- :key="participantId"
- closable
- @close="removeParticipant(participantId)"
- style="margin-right: 8px; margin-bottom: 8px;"
- >
- {{ getEmployeeName(participantId) }}
- </el-tag>
- </div>
- </el-form-item>
- <el-form-item label="浼氳鎻忚堪" prop="description">
- <el-input
- v-model="meetingForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ヤ細璁弿杩�"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="meetingDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="createMeeting">鍒涘缓浼氳</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鏂囦欢鍏变韩寮圭獥 -->
- <el-dialog
- v-model="fileShareDialogVisible"
- title="鏂囦欢鍏变韩"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form ref="fileShareFormRef" :model="fileShareForm" :rules="fileShareRules" label-width="120px">
- <el-form-item label="鍏变韩鏍囬" prop="title">
- <el-input v-model="fileShareForm.title" placeholder="璇疯緭鍏ュ叡浜爣棰�" />
- </el-form-item>
- <el-form-item label="鍏变韩鎻忚堪" prop="description">
- <el-input
- v-model="fileShareForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ叡浜弿杩�"
- />
- </el-form-item>
- <el-form-item label="鎺ユ敹閮ㄩ棬" prop="departments">
- <el-select
- v-model="fileShareForm.departments"
- multiple
- placeholder="璇烽�夋嫨鎺ユ敹閮ㄩ棬"
- style="width: 100%"
- >
- <el-option
- v-for="dept in departments"
- :key="dept"
- :label="dept"
- :value="dept"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="涓婁紶鏂囦欢" prop="files">
- <el-upload
- ref="uploadRef"
- :auto-upload="false"
- :on-change="handleFileChange"
- :on-remove="removeFile"
- :file-list="fileList"
- multiple
- :limit="10"
- accept=".doc,.docx,.pdf,.xls,.xlsx,.ppt,.pptx,.txt,.jpg,.jpeg,.png,.gif"
- >
- <el-button type="primary">閫夋嫨鏂囦欢</el-button>
- <template #tip>
- <div class="el-upload__tip">
- 鏀寔涓婁紶鏂囨。銆佸浘鐗囩瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB锛屾渶澶�10涓枃浠�
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="fileShareDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="shareFiles">鍏变韩鏂囦欢</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs, computed } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import { staffOnJobListPage } from "@/api/personnelManagement/employeeRecord.js";
-import { listNotification, addNotification, updateNotification, delNotification,addOnlineMeeting,addFileSharing } from "@/api/collaborativeApproval/notificationManagement.js";
-import { id } from "element-plus/es/locales.mjs";
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- title: [
- { required: true, message: "璇疯緭鍏ラ�氱煡鏍囬", trigger: "blur" }
- ],
- type: [
- { required: true, message: "璇烽�夋嫨閫氱煡绫诲瀷", trigger: "change" }
- ],
- content: [
- { required: true, message: "璇疯緭鍏ラ�氱煡鍐呭", trigger: "blur" }
- ]
-};
-
-const meetingRules = {
- title: [
- { required: true, message: "璇疯緭鍏ヤ細璁爣棰�", trigger: "blur" }
- ],
- startTime: [
- { required: true, message: "璇烽�夋嫨浼氳寮�濮嬫椂闂�", trigger: "change" }
- ],
- participants: [
- { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" }
- ]
-};
-
-const fileShareRules = {
- title: [
- { required: true, message: "璇疯緭鍏ュ叡浜爣棰�", trigger: "blur" }
- ],
- description: [
- { required: true, message: "璇疯緭鍏ュ叡浜弿杩�", trigger: "blur" }
- ]
-};
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- title: "",
- type: "",
- status: "",
- },
- tableLoading: false,
- page: {
- current: 1,
- size: 20,
- total: 0,
- },
- tableData: [],
- selectedIds: [],
- // 鏂板閫氱煡鐩稿叧
- form: {
- title: "",
- type: "",
- priority: "",
- content: "",
- departments: [],
- expireDate: "",
- syncMethods: []
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- // 鍦ㄧ嚎浼氳鐩稿叧
- meetingDialogVisible: false,
- meetingForm: {
- title: "",
- startTime: "",
- duration: 60,
- participants: [],
- description: "",
- platform: "wechat"
- },
- // 鏂囦欢鍏变韩鐩稿叧
- fileShareDialogVisible: false,
- fileShareForm: {
- title: "",
- description: "",
- departments: [],
- files: []
- },
- fileList: []
-});
-
-const {
- searchForm,
- tableLoading,
- page,
- tableData,
- selectedIds,
- form,
- dialogVisible,
- dialogTitle,
- dialogType,
- meetingDialogVisible,
- meetingForm,
- fileShareDialogVisible,
- fileShareForm,
- fileList
-} = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-const meetingFormRef = ref();
-const fileShareFormRef = ref();
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "閫氱煡鏍囬",
- prop: "title",
- showOverflowTooltip: true,
- },
- {
- label: "閫氱煡绫诲瀷",
- prop: "type",
- dataType: "tag",
- formatData: (params) => {
- const typeMap = {
- holiday: "鏀惧亣閫氱煡",
- penalty: "澶勭綒閫氱煡",
- meeting: "寮�浼氶�氱煡",
- temporary: "涓存椂閫氱煡",
- formal: "姝e紡閫氱煡"
- };
- return typeMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- holiday: "success",
- penalty: "danger",
- meeting: "warning",
- temporary: "info",
- formal: "primary"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "浼樺厛绾�",
- prop: "priority",
- dataType: "tag",
- formatData: (params) => {
- const priorityMap = {
- low: "鏅��",
- medium: "閲嶈",
- high: "绱ф��"
- };
- return priorityMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- low: "info",
- medium: "warning",
- high: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- const statusMap = {
- draft: "鑽夌",
- published: "宸插彂甯�",
- expired: "宸茶繃鏈�"
- };
- return statusMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- draft: "info",
- published: "success",
- expired: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鎺ユ敹閮ㄩ棬",
- prop: "departments",
- width: 150,
- showOverflowTooltip: true,
- formatData: (params) => {
- if (!params || params.length === 0) return "鍏ㄩ儴閮ㄩ棬";
- return params.join(", ");
- }
- },
- {
- label: "鏈夋晥鏈熻嚦",
- prop: "expireDate",
- width: 150,
- formatData: (params) => {
- if (!params) return "姘镐箙鏈夋晥";
- return params;
- }
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- {
- name: "鍙戝竷",
- type: "text",
- clickFun: (row) => {
- publishNotification(row);
- },
- // disabled: (row) => row.status === "published"
- },
- {
- name: "鎾ゅ洖",
- type: "text",
- clickFun: (row) => {
- revokeNotification(row);
- },
- // disabled: (row) => row.status !== "published"
- }
- ]
- }
-]);
-// 閫氱煡鏍囬妯℃澘
-const titleTemplates = [
- "鍏充簬{year}骞磠holiday}鏀惧亣瀹夋帓鐨勯�氱煡",
- "{dept}閮ㄩ棬{meeting}浼氳閫氱煡",
- "鍛樺伐{behavior}琛屼负瑙勮寖鎻愰啋",
- "{company}閲嶈浜嬮」閫氱煡",
- "{dept}閮ㄩ棬宸ヤ綔瀹夋帓閫氱煡",
- "鍏充簬{project}椤圭洰杩涘害鐨勯�氱煡",
- "{dept}閮ㄩ棬浜哄憳璋冩暣閫氱煡",
- "鍏徃{policy}鏀跨瓥鏇存柊閫氱煡"
-];
-
-// 閫氱煡绫诲瀷閰嶇疆
-const notificationTypes = [
- { type: "holiday", label: "鏀惧亣閫氱煡", priority: "high" },
- { type: "meeting", label: "寮�浼氶�氱煡", priority: "medium" },
- { type: "penalty", label: "澶勭綒閫氱煡", priority: "high" },
- { type: "temporary", label: "涓存椂閫氱煡", priority: "low" },
- { type: "formal", label: "姝e紡閫氱煡", priority: "medium" }
-];
-
-// 閮ㄩ棬鍒楄〃
-const departments = ["鎶�鏈儴", "閿�鍞儴", "浜轰簨閮�", "璐㈠姟閮�", "杩愯惀閮�", "甯傚満閮�", "瀹㈡湇閮�"];
-
-// 浜哄憳鍒楄〃
-const employees = ref([]);
-const employeesLoading = ref(false);
-
-// 鑾峰彇鍦ㄨ亴鍛樺伐鍒楄〃
-const getEmployeesList = async () => {
- try {
- employeesLoading.value = true;
- // 浼樺厛浣跨敤绯荤粺鐢ㄦ埛鎺ュ彛锛堟寜绉熸埛鑾峰彇锛�
- const userResponse = await userListNoPageByTenantId();
-
- if (userResponse.data) {
- employees.value = userResponse.data.map(user => ({
- label: user.nickName || user.userName || '鏈煡濮撳悕',
- value: user.userId || user.id,
- dept: user.dept?.deptName || '鏈煡閮ㄩ棬',
- phone: user.phonenumber || '',
- email: user.email || '',
- status: user.status || '0'
- })).filter(user => user.status === '0'); // 鍙樉绀烘甯哥姸鎬佺殑鐢ㄦ埛
- } else {
- // 濡傛灉绯荤粺鐢ㄦ埛鎺ュ彛澶辫触锛屼娇鐢ㄥ憳宸ュ彴璐︽帴鍙�
- const response = await staffOnJobListPage({
- pageNum: 1,
- pageSize: 1000,
- staffState: 1 // 鍦ㄨ亴鐘舵��
- });
-
- if (response.data && response.data.records) {
- employees.value = response.data.records.map(employee => ({
- label: employee.staffName || employee.name || '鏈煡濮撳悕',
- value: employee.staffNo || employee.id || employee.staffId,
- dept: employee.deptName || employee.department || '鏈煡閮ㄩ棬',
- phone: employee.phone || employee.mobile || '',
- email: employee.email || '',
- status: '0'
- }));
- }
- }
- } catch (error) {
- console.error('鑾峰彇鍛樺伐鍒楄〃澶辫触:', error);
- // 濡傛灉鎺ュ彛閮藉け璐ワ紝浣跨敤榛樿鏁版嵁
- employees.value = [
- { label: "寮犱笁", value: "001", dept: "鎶�鏈儴", phone: "13800138001", email: "zhangsan@company.com", status: "0" },
- { label: "鏉庡洓", value: "002", dept: "閿�鍞儴", phone: "13800138002", email: "lisi@company.com", status: "0" },
- { label: "鐜嬩簲", value: "003", dept: "浜轰簨閮�", phone: "13800138003", email: "wangwu@company.com", status: "0" }
- ];
- } finally {
- employeesLoading.value = false;
- }
-};
-
-// 鍛樺伐鍒嗙粍
-const employeeGroups = computed(() => {
- const groups = {};
- employees.value.forEach(employee => {
- const dept = employee.dept || '鍏朵粬閮ㄩ棬';
- if (!groups[dept]) {
- groups[dept] = [];
- }
- groups[dept].push(employee);
- });
-
- // 鎸夐儴闂ㄥ悕绉版帓搴忥紝纭繚鏄剧ず椤哄簭涓�鑷�
- return Object.keys(groups)
- .sort()
- .map(dept => ({
- label: dept,
- options: groups[dept].sort((a, b) => a.label.localeCompare(b.label, 'zh-CN'))
- }));
-});
-
-// 杩囨护鍛樺伐锛堣繙绋嬫悳绱級
-const filterEmployees = (query) => {
- if (query !== '') {
- const lowerQuery = query.toLowerCase();
- return employees.value.filter(employee =>
- employee.label.toLowerCase().includes(lowerQuery) ||
- employee.dept.toLowerCase().includes(lowerQuery) ||
- (employee.phone && employee.phone.includes(query)) ||
- (employee.email && employee.email.toLowerCase().includes(lowerQuery))
- );
- } else {
- return employees.value;
- }
-};
-
-// 鍒锋柊鍛樺伐鍒楄〃
-const refreshEmployees = async () => {
- ElMessage.info("姝e湪鍒锋柊鍛樺伐鍒楄〃...");
- await getEmployeesList();
-
- // 缁熻鍚勯儴闂ㄤ汉鏁�
- const deptStats = {};
- employees.value.forEach(emp => {
- const dept = emp.dept || '鍏朵粬閮ㄩ棬';
- deptStats[dept] = (deptStats[dept] || 0) + 1;
- });
-
- const deptInfo = Object.entries(deptStats)
- .map(([dept, count]) => `${dept}: ${count}浜篳)
- .join(', ');
-
- ElMessage.success(`鍛樺伐鍒楄〃鍒锋柊瀹屾垚锛屽叡 ${employees.value.length} 浜� (${deptInfo})`);
-};
-
-// 鑾峰彇鍛樺伐濮撳悕
-const getEmployeeName = (employeeId) => {
- const employee = employees.value.find(emp => emp.value === employeeId);
- return employee ? employee.label : '鏈煡浜哄憳';
-};
-
-// 鑾峰彇鍛樺伐璇︾粏淇℃伅
-const getEmployeeInfo = (employeeId) => {
- const employee = employees.value.find(emp => emp.value === employeeId);
- if (!employee) return null;
-
- return {
- name: employee.label,
- dept: employee.dept,
- phone: employee.phone,
- email: employee.email
- };
-};
-
-// 绉婚櫎鍙備細浜哄憳
-const removeParticipant = (participantId) => {
- const index = meetingForm.value.participants.indexOf(participantId);
- if (index > -1) {
- meetingForm.value.participants.splice(index, 1);
- }
-};
-
-// 鍚屾鏂瑰紡閫夐」
-const syncMethods = [
- { label: "浼佷笟寰俊", value: "wechat" },
- { label: "閽夐拤", value: "dingtalk" },
- { label: "閭欢", value: "email" },
- { label: "鐭俊", value: "sms" }
-];
-
-// 浼氳骞冲彴閫夐」
-const meetingPlatforms = [
- { label: "浼佷笟寰俊浼氳", value: "wechat" },
- { label: "閽夐拤浼氳", value: "dingtalk" },
- { label: "鑵捐浼氳", value: "tencent" },
- { label: "Zoom", value: "zoom" }
-];
-
-// 鑷姩鐢熸垚鏂版暟鎹�
-const generateNewData = () => {
- const newId = (mockData.length + 1).toString();
- const now = new Date();
- const randomType = notificationTypes[Math.floor(Math.random() * notificationTypes.length)];
- const randomDept = departments[Math.floor(Math.random() * departments.length)];
-
- // 鐢熸垚闅忔満鏍囬
- let title = titleTemplates[Math.floor(Math.random() * titleTemplates.length)];
- title = title
- .replace('{year}', now.getFullYear())
- .replace('{holiday}', ['鏄ヨ妭', '鍥藉簡', '涓', '鍏冩棪'][Math.floor(Math.random() * 4)])
- .replace('{dept}', randomDept)
- .replace('{meeting}', ['鍛ㄤ緥浼�', '鏈堝害鎬荤粨', '椤圭洰璇勫', '鍩硅浼氳'][Math.floor(Math.random() * 4)])
- .replace('{behavior}', ['鑰冨嫟', '鐫�瑁�', '宸ヤ綔鎬佸害', '鍥㈤槦鍗忎綔'][Math.floor(Math.random() * 4)])
- .replace('{company}', ['鍏徃', '闆嗗洟', '鎬婚儴'][Math.floor(Math.random() * 4)])
- .replace('{project}', ['鏁板瓧鍖栬浆鍨�', '浜у搧鍗囩骇', '甯傚満鎷撳睍', '浜烘墠鍩瑰吇'][Math.floor(Math.random() * 4)])
- .replace('{policy}', ['鑰冨嫟', '钖叕', '绂忓埄', '鏅嬪崌'][Math.floor(Math.random() * 4)]);
-
- // 闅忔満鐘舵��
- const statuses = ['draft', 'published'];
- const randomStatus = statuses[Math.floor(Math.random() * statuses.length)];
-
- // 闅忔満浼樺厛绾�
- const priorities = ['low', 'medium', 'high'];
- const randomPriority = priorities[Math.floor(Math.random() * priorities.length)];
-
- const newNotification = {
- id: newId,
- title: title,
- type: randomType.type,
- priority: randomPriority,
- status: randomStatus,
- content: `杩欐槸${title}鐨勮缁嗗唴瀹癸紝璇风浉鍏充汉鍛樻敞鎰忔煡鐪�...`,
- departments: [randomDept],
- expireDate: new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0], // 30澶╁悗杩囨湡
- syncMethods: ["wechat", "dingtalk"],
- createTime: now.toLocaleString()
- };
-
- // 娣诲姞鍒版暟鎹紑澶�
- mockData.unshift(newNotification);
-
- // 淇濇寔鏁版嵁閲忓湪鍚堢悊鑼冨洿鍐咃紙鏈�澶氫繚鐣�20鏉★級
- if (mockData.length > 20) {
- mockData = mockData.slice(0, 20);
- }
-
- console.log(`[${new Date().toLocaleString()}] 鑷姩鐢熸垚鏂伴�氱煡: ${title}`);
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
- getEmployeesList(); // 鑾峰彇鍛樺伐鍒楄〃
- startAutoRefresh();
-});
-
-// 寮�濮嬭嚜鍔ㄥ埛鏂�
-const startAutoRefresh = () => {
- setInterval(() => {
- generateNewData();
- getList();
- }, 600000); // 10鍒嗛挓鍒锋柊涓�娆� (10 * 60 * 1000 = 600000ms)
-};
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- listNotification({...page.value, ...searchForm.value})
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.value.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row = null) => {
- dialogType.value = type;
- if (type === "add") {
- dialogTitle.value = "鏂板閫氱煡";
- // 閲嶇疆琛ㄥ崟
- Object.assign(form.value, {
- id: "",
- title: "",
- type: "",
- priority: "",
- content: "",
- departments: [],
- expireDate: "",
- status: "draft",
- syncMethods: []
- });
- } else if (type === "edit" && row) {
- dialogTitle.value = "缂栬緫閫氱煡";
- Object.assign(form.value, {
- id: row.id,
- title: row.title,
- type: row.type,
- priority: row.priority,
- content: row.content || "",
- departments: row.departments || [],
- expireDate: row.expireDate || "",
- status: row.status,
- syncMethods: row.syncMethods || []
- });
- }
- dialogVisible.value = true;
-};
-
-// 鎵撳紑鍦ㄧ嚎浼氳寮圭獥
-const openMeetingDialog = () => {
- // 閲嶇疆琛ㄥ崟
- Object.assign(meetingForm.value, {
- title: "",
- startTime: "",
- duration: 60,
- participants: [],
- description: "",
- platform: "wechat"
- });
- meetingDialogVisible.value = true;
-};
-
-// 鎵撳紑鏂囦欢鍏变韩寮圭獥
-const openFileShareDialog = () => {
- // 閲嶇疆琛ㄥ崟
- Object.assign(fileShareForm.value, {
- title: "",
- description: "",
- departments: [],
- files: []
- });
- fileList.value = [];
- fileShareDialogVisible.value = true;
-};
-
-// 鎵嬪姩鍒锋柊鏁版嵁
-const manualRefresh = () => {
- generateNewData();
- getList();
- ElMessage.success("鎵嬪姩鍒锋柊瀹屾垚锛屽凡鐢熸垚鏂伴�氱煡");
-};
-
-// 鎻愪氦閫氱煡琛ㄥ崟
-const submitForm = async () => {
- try {
- await formRef.value.validate();
-
- if (dialogType.value === "add") {
- // 鏂板閫氱煡
- addNotification({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else {
- // 缂栬緫閫氱煡
- updateNotification({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍒涘缓浼氳
-const createMeeting = async () => {
- try {
- await meetingFormRef.value.validate();
-
- // 妯℃嫙鍒涘缓浼氳
- const meetingInfo = {
- title: meetingForm.value.title,
- startTime: meetingForm.value.startTime,
- duration: meetingForm.value.duration,
- participants: meetingForm.value.participants,
- description: meetingForm.value.description,
- platform: meetingForm.value.platform
- };
- // 鏂板浼氳
- addOnlineMeeting({...meetingInfo}).then(res => {
- if(res.code == 200){
- ElMessage.success("浼氳娣诲姞鎴愬姛");
- meetingDialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // 妯℃嫙鍙戦�佸埌浼佷笟寰俊/閽夐拤
- // const platformName = meetingPlatforms.find(p => p.value === meetingForm.value.platform)?.label || "鏈煡骞冲彴";
- // ElMessage.success(`浼氳鍒涘缓鎴愬姛锛佷細璁甀D: ${meetingInfo.meetingId}锛屽皢閫氳繃${platformName}鍙戦�侀�氱煡`);
-
- // 鑾峰彇鍙備細浜哄憳淇℃伅
- const participantNames = meetingForm.value.participants.map(participantId => {
- const employee = employees.value.find(emp => emp.value === participantId);
- return employee ? employee.label : '鏈煡浜哄憳';
- }).join('銆�');
-
- // 鑾峰彇鍙備細浜哄憳璇︾粏淇℃伅
- const participantDetails = meetingForm.value.participants.map(participantId => {
- const employee = employees.value.find(emp => emp.value === participantId);
- return employee ? {
- name: employee.label,
- dept: employee.dept,
- phone: employee.phone,
- email: employee.email
- } : null;
- }).filter(Boolean);
-
- // 灏嗕細璁俊鎭坊鍔犲埌閫氱煡鍒楄〃
- const meetingNotification = {
- title: `[浼氳閫氱煡] ${meetingInfo.title}`,
- type: "meeting",
- priority: "high",
- status: "published",
- content: `浼氳鏃堕棿: ${meetingInfo.startTime}锛屾椂闀�: ${meetingInfo.duration}鍒嗛挓锛屽钩鍙�: ${meetingPlatforms.find(p => p.value === meetingForm.value.platform)?.label || "鏈煡骞冲彴"}锛屽弬浼氫汉鍛�: ${participantNames}锛屽叡${participantDetails.length}浜篳,
- departments: [],
- expireDate: "",
- syncMethods: [meetingForm.value.platform]
- };
- addNotification({...meetingNotification}).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- // dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // mockData.unshift(meetingNotification);
- // getList();
- } catch (error) {
- console.error("浼氳琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鏂囦欢涓婁紶澶勭悊
-const handleFileChange = (file) => {
- const isLt10M = file.size / 1024 / 1024 < 10;
- if (!isLt10M) {
- ElMessage.error("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
- return false;
- }
-
- const fileInfo = {
- name: file.name,
- size: file.size,
- type: file.type,
- uid: file.uid
- };
-
- fileList.value.push(fileInfo);
- fileShareForm.value.files.push(fileInfo.name);
- return false; // 闃绘鑷姩涓婁紶
-};
-
-// 绉婚櫎鏂囦欢
-const removeFile = (file) => {
- const index = fileList.value.findIndex(item => item.uid === file.uid);
- if (index !== -1) {
- const index2 = fileShareForm.value.files.findIndex(item => item.uid === file.uid);
- if (index2 !== -1) {
- fileShareForm.value.files.splice(index2, 1);
- }
- fileList.value.splice(index, 1);
- }
-};
-
-// 鍏变韩鏂囦欢
-const shareFiles = async () => {
- try {
- await fileShareFormRef.value.validate();
-
- if (fileShareForm.value.files.length === 0) {
- ElMessage.warning("璇疯嚦灏戦�夋嫨涓�涓枃浠�");
- return;
- }
-
- // 妯℃嫙鏂囦欢鍏变韩
- const shareInfo = {
- title: fileShareForm.value.title,
- description: fileShareForm.value.description,
- departments: fileShareForm.value.departments,
- files: fileShareForm.value.files,
- };
- addFileSharing({...shareInfo}).then(res => {
- if(res.code == 200){
- ElMessage.success("鏂囦欢鍏变韩鎴愬姛");
- fileShareDialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-
- // ElMessage.success(`鏂囦欢鍏变韩鎴愬姛锛佸叡浜獻D: ${shareInfo.shareId}锛屽凡閫氱煡鐩稿叧閮ㄩ棬`);
-
-
- // 灏嗘枃浠跺叡浜俊鎭坊鍔犲埌閫氱煡鍒楄〃
- const fileShareNotification = {
- title: `[鏂囦欢鍏变韩] ${shareInfo.title}`,
- type: "temporary",
- priority: "medium",
- status: "published",
- content: `鍏变韩鎻忚堪: ${shareInfo.description}锛屾枃浠舵暟閲�: ${shareInfo.files.length}涓猔,
- departments: shareInfo.departments,
- expireDate: "",
- syncMethods: ["wechat", "dingtalk"],
- };
- addNotification({...fileShareNotification}).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- // dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-
- // mockData.unshift(fileShareNotification);
- // getList();
- } catch (error) {
- console.error("鏂囦欢鍏变韩琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍙戝竷閫氱煡
-const publishNotification = (row) => {
- Object.assign(form.value, {
- id: row.id,
- title: row.title,
- type: row.type,
- priority: row.priority,
- content: row.content || "",
- departments: row.departments || [],
- expireDate: row.expireDate || "",
- status: row.status,
- syncMethods: row.syncMethods || []
- });
- form.value.status = "published";
- updateNotification({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("閫氱煡鍙戝竷鎴愬姛");
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-};
-
-// 鎾ゅ洖閫氱煡
-const revokeNotification = (row) => {
- Object.assign(form.value, {
- id: row.id,
- title: row.title,
- type: row.type,
- priority: row.priority,
- content: row.content || "",
- departments: row.departments || [],
- expireDate: row.expireDate || "",
- status: row.status,
- syncMethods: row.syncMethods || []
- });
- form.value.status = "draft";
- updateNotification({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("閫氱煡宸叉挙鍥�");
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-};
-
-// 鍒犻櫎閫氱煡
-const handleDelete = () => {
- let ids = [];
- if (selectedIds.value.length > 0) {
- ids = selectedIds.value;
- }else{
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑閫氱煡");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- delNotification(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- selectedIds.value = [];
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-</script>
-
-<style scoped>
-.auto-refresh-info {
- margin-bottom: 15px;
-}
-
-.auto-refresh-info .el-alert {
- border-radius: 8px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-.el-upload__tip {
- color: #909399;
- font-size: 12px;
- margin-top: 8px;
-}
-
-.el-checkbox-group {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-}
-
-.el-checkbox {
- margin-right: 0;
-}
-</style>
diff --git a/src/views/collaborativeApproval/officeSupplies/index.vue b/src/views/collaborativeApproval/officeSupplies/index.vue
deleted file mode 100644
index a2d1c6d..0000000
--- a/src/views/collaborativeApproval/officeSupplies/index.vue
+++ /dev/null
@@ -1,512 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <template #header>
- <div class="card-header">
- <span>鍔炲叕鐗╄祫鐢宠绠$悊</span>
- <el-button type="primary" @click="openShow()">
- <el-icon><Plus /></el-icon>
- 鏂板缓鐢宠
- </el-button>
- </div>
- </template>
-
- <!-- 鎼滅储鍖哄煙 -->
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="鐢宠缂栧彿" prop="code">
- <el-input
- v-model="queryParams.code"
- placeholder="璇疯緭鍏ョ敵璇风紪鍙�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐢宠浜�" prop="applicant">
- <el-input
- v-model="queryParams.applicant"
- placeholder="璇疯緭鍏ョ敵璇蜂汉"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐢宠鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
- <el-option label="寰呭鎵�" value="1" />
- <el-option label="宸查�氳繃" value="3" />
- <el-option label="宸叉嫆缁�" value="2" />
- <el-option label="宸插彂鏀�" value="4" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">
- <el-icon><Search /></el-icon>
- 鎼滅储
- </el-button>
- <el-button @click="resetQuery">
- <el-icon><Refresh /></el-icon>
- 閲嶇疆
- </el-button>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleExport">
- <el-icon><Download /></el-icon>
- 瀵煎嚭
- </el-button>
- </el-form-item>
- </el-form>
-
- <!-- 琛ㄦ牸鍖哄煙 -->
- <el-table
- v-loading="loading"
- :data="officeList"
- @selection-change="handleSelectionChange"
- style="width: 100%"
- >
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鐢宠缂栧彿" align="center" prop="code" width="180" />
- <el-table-column label="鐢宠浜�" align="center" prop="applicant" width="120" />
- <el-table-column label="閮ㄩ棬" align="center" prop="dept" width="120" />
- <el-table-column label="鐗╄祫绫诲瀷" align="center" prop="materialType" width="120">
- <template #default="scope">
- <el-tag v-if="scope.row.materialType === 1" type="info">鍏朵粬</el-tag>
- <el-tag v-if="scope.row.materialType === 2" type="success">娓呮磥鐢ㄥ搧</el-tag>
- <el-tag v-if="scope.row.materialType === 3" type="warning">鐢靛瓙璁惧</el-tag>
- <el-tag v-if="scope.row.materialType === 4" type="danger">鍔炲叕鐢ㄥ搧</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鐢宠鏁伴噺" align="center" prop="applyNum" width="100" />
- <el-table-column label="鐢宠鍘熷洜" align="center" prop="reason" min-width="200" show-overflow-tooltip />
- <el-table-column label="鐢宠鐘舵��" align="center" prop="status" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ getStatusText(scope.row.status) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鐢宠鏃堕棿" align="center" prop="applyTime" width="180" />
- <el-table-column label="瀹℃壒浜�" align="center" prop="approval" width="120" />
- <el-table-column label="瀹℃壒鏃堕棿" align="center" prop="approvalTime" width="180" />
- <el-table-column label="鍙戞斁鏃堕棿" align="center" prop="issueTime" width="180" />
- <el-table-column label="鎿嶄綔" align="center" fixed="right" class-name="small-padding fixed-width" width="200">
- <template #default="scope">
- <el-button
- v-if="scope.row.status === 1"
- type="primary"
- link
- @click="handleApprove(scope.row)"
- >
- 瀹℃壒
- </el-button>
- <el-button
- v-if="scope.row.status === 3"
- type="success"
- link
- @click="handleIssue(scope.row)"
- >
- 鍙戞斁
- </el-button>
- <el-button
- type="info"
- link
- @click="handleDetail(scope.row)"
- >
- 璇︽儏
- </el-button>
- <el-button
- v-if="scope.row.status === 2"
- type="danger"
- link
- @click="handleDelete(scope.row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.current"
- v-model:limit="queryParams.size"
- @pagination="getList"
- />
- </el-card>
-
- <!-- 鐢宠瀵硅瘽妗� -->
- <el-dialog
- v-model="showApplyDialog"
- title="鍔炲叕鐗╄祫鐢宠"
- width="600px"
- append-to-body
- >
- <el-form ref="applyFormRef" :model="applyForm" :rules="applyRules" label-width="100px">
- <el-form-item label="鐢宠浜�" prop="applicant">
- <el-input v-model="applyForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉鍚嶇О" />
- </el-form-item>
- <el-form-item label="閮ㄩ棬" prop="dept">
- <el-input v-model="applyForm.dept" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" />
- </el-form-item>
- <el-form-item label="鐗╄祫绫诲瀷" prop="materialType">
- <el-select v-model="applyForm.materialType" placeholder="璇烽�夋嫨鐗╄祫绫诲瀷" style="width: 100%">
- <el-option label="鍔炲叕鐢ㄥ搧" value="4" />
- <el-option label="鐢靛瓙璁惧" value="3" />
- <el-option label="娓呮磥鐢ㄥ搧" value="2" />
- <el-option label="鍏朵粬" value="1" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍏蜂綋鐗╁搧" prop="itemName">
- <el-input v-model="applyForm.itemName" placeholder="璇疯緭鍏ュ叿浣撶墿鍝佸悕绉�" />
- </el-form-item>
- <el-form-item label="鐢宠鏁伴噺" prop="applyNum">
- <el-input-number v-model="applyForm.applyNum" :min="1" :max="999" style="width: 100%" />
- </el-form-item>
- <el-form-item label="鐢宠鍘熷洜" prop="reason">
- <el-input
- v-model="applyForm.reason"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ョ敵璇峰師鍥�"
- />
- </el-form-item>
- <el-form-item label="绱ф�ョ▼搴�" prop="urgency">
- <el-radio-group v-model="applyForm.urgency">
- <el-radio label="1">鏅��</el-radio>
- <el-radio label="2">绱ф��</el-radio>
- <el-radio label="3">闈炲父绱ф��</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="showApplyDialog = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="submitApply">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 瀹℃壒瀵硅瘽妗� -->
- <el-dialog
- v-model="showApproveDialog"
- title="瀹℃壒鐢宠"
- width="500px"
- append-to-body
- >
- <el-form ref="approveFormRef" :model="approveForm" :rules="approveRules" label-width="100px">
- <el-form-item label="瀹℃壒缁撴灉" prop="approveResult">
- <el-radio-group v-model="approveForm.approveResult">
- <el-radio label="3">閫氳繃</el-radio>
- <el-radio label="2">鎷掔粷</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="瀹℃壒鎰忚" prop="approvalOpinions">
- <el-input
- v-model="approveForm.approvalOpinions"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ鎵规剰瑙�"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="showApproveDialog = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="submitApprove">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 璇︽儏瀵硅瘽妗� -->
- <el-dialog
- v-model="showDetailDialog"
- title="鐢宠璇︽儏"
- width="700px"
- append-to-body
- >
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鐢宠缂栧彿">{{ currentDetail.code }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜�">{{ currentDetail.applicant }}</el-descriptions-item>
- <el-descriptions-item label="閮ㄩ棬">{{ currentDetail.dept }}</el-descriptions-item>
- <el-descriptions-item label="鐗╄祫绫诲瀷">{{ currentDetail.materialType }}</el-descriptions-item>
- <el-descriptions-item label="鍏蜂綋鐗╁搧">{{ currentDetail.itemName }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鏁伴噺">{{ currentDetail.applyNum }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鍘熷洜" :span="2">{{ currentDetail.reason }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鐘舵��">
- <el-tag :type="getStatusType(currentDetail.status)">
- {{ getStatusText(currentDetail.status) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鐢宠鏃堕棿">{{ currentDetail.applyTime }}</el-descriptions-item>
- <el-descriptions-item label="瀹℃壒浜�">{{ currentDetail.approval || '-' }}</el-descriptions-item>
- <el-descriptions-item label="瀹℃壒鏃堕棿">{{ currentDetail.approvalTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="瀹℃壒鎰忚" :span="2">{{ currentDetail.approvalOpinions || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鍙戞斁鏃堕棿">{{ currentDetail.issueTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鍙戞斁浜�">{{ currentDetail.issueUser || '-' }}</el-descriptions-item>
- </el-descriptions>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {listPage,add,update,deleteOff} from "@/api/collaborativeApproval/officeSupplies.js"
-import {ref, reactive, onMounted, getCurrentInstance} from 'vue'
-import Cookies from 'js-cookie'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search, Refresh, Download, Check } from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const showSearch = ref(true)
-const showApplyDialog = ref(false)
-const showApproveDialog = ref(false)
-const showDetailDialog = ref(false)
-const multipleSelection = ref([])
-const officeList = ref([])
-const total = ref(0)
-const suppliesList = ref([])
-const currentDetail = ref({})
-
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
- current: 1,
- size: 10,
- code: '',
- applicant: '',
- status: ''
-})
-
-// 鐢宠琛ㄥ崟
-const applyForm = reactive({
- applicant: '',
- dept: '',
- materialType: '',
- itemName: '',
- applyNum: 1,
- reason: '',
- urgency: '1'
-})
-
-// 瀹℃壒琛ㄥ崟
-const approveForm = reactive({
- approveResult: '3',
- approvalOpinions: ''
-})
-
-// 琛ㄥ崟鏍¢獙瑙勫垯
-const applyRules = {
- applicant: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'blur' }],
- dept: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'blur' }],
- materialType: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'change' }],
- itemName: [{ required: true, message: '璇疯緭鍏ュ叿浣撶墿鍝佸悕绉�', trigger: 'blur' }],
- applyNum: [{ required: true, message: '璇疯緭鍏ョ敵璇锋暟閲�', trigger: 'blur' }],
- reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }]
-}
-
-const approveRules = {
- approveResult: [{ required: true, message: '璇烽�夋嫨瀹℃壒缁撴灉', trigger: 'change' }],
- approvalOpinions: [{ required: true, message: '璇疯緭鍏ュ鎵规剰瑙�', trigger: 'blur' }]
-}
-
-const openShow = () => {
- showApplyDialog.value = true
- resetApplyForm()
-}
-
-// 鑾峰彇鍒楄〃鏁版嵁
-const getList = () => {
- loading.value = true
- listPage(queryParams).then(res => {
- total.value = res.data.total
- loading.value = false
- officeList.value = res.data.records
- })
-}
-
-// 鏌ヨ
-const handleQuery = () => {
- queryParams.current = 1
- getList()
-}
-
-// 閲嶇疆鏌ヨ
-const resetQuery = () => {
- queryParams.code = ''
- queryParams.applicant = ''
- queryParams.status = ''
- handleQuery()
-}
-
-// 澶氶��
-const handleSelectionChange = (selection) => {
- multipleSelection.value = selection
-}
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- 1: 'warning',
- 3: 'success',
- 2: 'danger',
- 4: 'info'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- 1: '寰呭鎵�',
- 3: '宸查�氳繃',
- 2: '宸叉嫆缁�',
- 4: '宸插彂鏀�'
- }
- return statusMap[status] || status
-}
-
-// 鎻愪氦鐢宠
-const submitApply = () => {
- add(applyForm).then(() => {
- ElMessage.success('鐢宠鎴愬姛')
- getList()
- showApplyDialog.value = false
- resetApplyForm()
- })
-
-
-
-}
-
-//閲嶇疆琛ㄥ崟
-const resetApplyForm = () => {
- // 閲嶇疆琛ㄥ崟
- Object.assign(applyForm, {
- applicant: '',
- dept: '',
- materialType: '',
- itemName: '',
- applyNum: 1,
- reason: '',
- urgency: '1'
- })
-}
-
-// 瀹℃壒
-const handleApprove = (row) => {
- currentDetail.value = row
- showApproveDialog.value = true
-}
-
-const formatDate = (date) => {
- const year = date.getFullYear()
- const month = String(date.getMonth() + 1).padStart(2, '0')
- const day = String(date.getDate()).padStart(2, '0')
- const hours = String(date.getHours()).padStart(2, '0')
- const minutes = String(date.getMinutes()).padStart(2, '0')
- const sends = String(date.getSeconds()).padStart(2, '0')
- return `${year}-${month}-${day} ${hours}:${minutes}:${sends}`
-}
-
-// 鎻愪氦瀹℃壒
-const submitApprove = () => {
- currentDetail.value.status = approveForm.approveResult
- // 浠巆ookie涓幏鍙栧綋鍓嶇櫥褰曠敤鎴峰悕绉�
- currentDetail.value.approval = Cookies.get('username')
- currentDetail.value.approvalTime = formatDate(new Date())
- currentDetail.value.approvalOpinions = approveForm.approvalOpinions
- update(currentDetail.value).then((res) => {
- if(res.code === 200){
- showApproveDialog.value = false
- ElMessage.success('瀹℃壒瀹屾垚')
- getList()
-
- // 閲嶇疆琛ㄥ崟
- Object.assign(approveForm, {
- approveResult: '3',
- approvalOpinions: ''
- })
- }
- })
-
-}
-
-// 鍙戞斁
-const handleIssue = (row) => {
- row.status = 4
- row.issueTime = formatDate(new Date())
- row.issueUser = Cookies.get('username')
- update(row).then((res) =>{
- if(res.code === 200){
- ElMessage.success('鍙戞斁瀹屾垚')
- getList()
- }
- })
-}
-
-// 鏌ョ湅璇︽儏
-const handleDetail = (row) => {
- currentDetail.value = row
- showDetailDialog.value = true
-}
-
-// 鍒犻櫎
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ョ敵璇峰悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- let ids = [row.id]
- deleteOff(ids).then((res) =>{
- ElMessage.success('鍒犻櫎鎴愬姛')
- getList()
- })
- })
-}
-const { proxy } = getCurrentInstance();
-// 瀵煎嚭
-const handleExport = () => {
- ElMessageBox.confirm("鎵�鏈夌殑鍐呭灏嗚瀵煎嚭锛屾槸鍚︾‘璁ゅ鍑猴紵", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/officeSupplies/export", {}, "鍔炲叕鐗╄祫.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-}
-
-// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
-onMounted(() => {
- getList()
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.mb8 {
- margin-bottom: 8px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-descriptions__label) {
- width: 120px;
-}
-</style>
diff --git a/src/views/collaborativeApproval/planTemplate/index.vue b/src/views/collaborativeApproval/planTemplate/index.vue
deleted file mode 100644
index 0af6d8b..0000000
--- a/src/views/collaborativeApproval/planTemplate/index.vue
+++ /dev/null
@@ -1,867 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤堕儴鎿嶄綔鏍� -->
- <div class="header-actions">
- <div class="left-actions">
- <el-select v-model="currentLevel" placeholder="閫夋嫨璁″垝绾у埆" style="width: 150px" @change="handleLevelChange">
- <el-option label="涓汉璁″垝" value="personal" />
- <el-option label="灏忕粍璁″垝" value="group" />
- <el-option label="閮ㄩ棬璁″垝" value="department" />
- <el-option label="鍏徃璁″垝" value="company" />
- </el-select>
- <el-select v-model="currentPeriod" placeholder="閫夋嫨鏃堕棿鍛ㄦ湡" style="width: 120px; margin-left: 10px" @change="handlePeriodChange">
- <el-option label="鍛ㄨ鍒�" value="week" />
- <el-option label="鏈堣鍒�" value="month" />
- <el-option label="骞磋鍒�" value="year" />
- </el-select>
- <el-date-picker
- v-model="currentDate"
- :type="datePickerType"
- placeholder="閫夋嫨鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- style="width: 180px; margin-left: 10px"
- @change="handleDateChange"
- />
- </div>
- <div class="right-actions">
- <el-button type="primary" @click="handleAddPlan">鏂板璁″垝</el-button>
- <el-button @click="handleExport">瀵煎嚭璁″垝</el-button>
- <!-- <el-button @click="handleShare">鍏变韩璁″垝@</el-button> -->
- </div>
- </div>
-
- <!-- 璁″垝姒傝鍗$墖 -->
- <div class="overview-cards">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-card class="overview-card">
- <div class="card-content">
- <div class="card-icon personal">
- <el-icon><User /></el-icon>
- </div>
- <div class="card-info">
- <div class="card-title">涓汉璁″垝</div>
- <div class="card-number">{{ overviewData.personal.total }}</div>
- <div class="card-progress">
- <el-progress :percentage="overviewData.personal.completion" :stroke-width="6" />
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="overview-card">
- <div class="card-content">
- <div class="card-icon group">
- <el-icon><UserFilled /></el-icon>
- </div>
- <div class="card-info">
- <div class="card-title">灏忕粍璁″垝</div>
- <div class="card-number">{{ overviewData.group.total }}</div>
- <div class="card-progress">
- <el-progress :percentage="overviewData.group.completion" :stroke-width="6" />
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="overview-card">
- <div class="card-content">
- <div class="card-icon department">
- <el-icon><OfficeBuilding /></el-icon>
- </div>
- <div class="card-info">
- <div class="card-title">閮ㄩ棬璁″垝</div>
- <div class="card-number">{{ overviewData.department.total }}</div>
- <div class="card-progress">
- <el-progress :percentage="overviewData.department.completion" :stroke-width="6" />
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="overview-card">
- <div class="card-content">
- <div class="card-icon company">
- <el-icon><House /></el-icon>
- </div>
- <div class="card-info">
- <div class="card-title">鍏徃璁″垝</div>
- <div class="card-number">{{ overviewData.company.total }}</div>
- <div class="card-progress">
- <el-progress :percentage="overviewData.company.completion" :stroke-width="6" />
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璁″垝鍒楄〃 -->
- <div class="plan-content">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>{{ getCurrentLevelText() }} - {{ getCurrentPeriodText() }}</span>
- <div>
- <el-button size="small" @click="handleRefresh">鍒锋柊</el-button>
- <!-- <el-button size="small" @click="handleFilter">绛涢�堾</el-button> -->
- </div>
- </div>
- </template>
-
- <div class="plan-list">
- <div v-for="plan in planList" :key="plan.id" class="plan-item">
- <div class="plan-header">
- <div class="plan-title">
- <el-tag :type="getPriorityType(plan.priority)" size="small">{{ getPriorityText(plan.priority) }}</el-tag>
- <span class="title-text">{{ plan.title }}</span>
- </div>
- <div class="plan-actions">
- <el-button size="small" @click="handleEditPlan(plan)">缂栬緫</el-button>
- <el-button size="small" @click="handleViewDetail(plan)">璇︽儏</el-button>
- <el-dropdown @command="(command) => handleMoreAction(plan, command)">
- <el-button size="small">
- 鏇村<el-icon class="el-icon--right"><ArrowDown /></el-icon>
- </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <!-- <el-dropdown-item command="share">鍏变韩@</el-dropdown-item> -->
- <el-dropdown-item command="copy">澶嶅埗</el-dropdown-item>
- <el-dropdown-item command="delete" divided>鍒犻櫎</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
- </div>
-
- <div class="plan-content">
- <div class="plan-description">{{ plan.description }}</div>
- <div class="plan-meta">
- <div class="meta-item">
- <el-icon><Calendar /></el-icon>
- <span>{{ plan.startDate }} - {{ plan.endDate }}</span>
- </div>
- <div class="meta-item">
- <el-icon><User /></el-icon>
- <span>{{ plan.assignee }}</span>
- </div>
- <div class="meta-item">
- <el-icon><Clock /></el-icon>
- <span>杩涘害: {{ plan.progress }}%</span>
- </div>
- <div class="meta-item">
- <el-icon><Flag /></el-icon>
- <span>{{ getStatusText(plan.status) }}</span>
- </div>
- </div>
-
- <div class="plan-progress">
- <el-progress
- :percentage="plan.progress"
- :color="getProgressColor(plan.progress)"
- :stroke-width="8"
- />
- </div>
-
- <div class="plan-tags">
- <el-tag v-for="tag in plan.tags" :key="tag" size="small" style="margin-right: 5px">
- {{ tag }}
- </el-tag>
- </div>
- </div>
- </div>
- </div>
- </el-card>
- </div>
-
- <!-- 鏂板/缂栬緫璁″垝瀵硅瘽妗� -->
- <el-dialog
- v-model="planDialogVisible"
- :title="operationType === 'add' ? '鍙戝竷璁″垝' : '缂栬緫璁″垝'"
- width="600px"
- @close="handleDialogClose"
- >
- <el-form :model="planForm" :rules="planRules" ref="planFormRef" label-width="100px">
- <el-form-item label="璁″垝鏍囬" prop="title">
- <el-input v-model="planForm.title" placeholder="璇疯緭鍏ヨ鍒掓爣棰�" />
- </el-form-item>
- <el-form-item label="璁″垝鎻忚堪" prop="description">
- <el-input
- v-model="planForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ヨ鍒掓弿杩�"
- />
- </el-form-item>
- <el-form-item label="璁″垝绾у埆" prop="level">
- <el-select v-model="planForm.level" placeholder="閫夋嫨璁″垝绾у埆" style="width: 100%">
- <el-option label="涓汉璁″垝" value="personal" />
- <el-option label="灏忕粍璁″垝" value="group" />
- <el-option label="閮ㄩ棬璁″垝" value="department" />
- <el-option label="鍏徃璁″垝" value="company" />
- </el-select>
- </el-form-item>
- <el-form-item label="鏃堕棿鍛ㄦ湡" prop="period">
- <el-select v-model="planForm.period" placeholder="閫夋嫨鏃堕棿鍛ㄦ湡" style="width: 100%">
- <el-option label="鍛ㄨ鍒�" value="week" />
- <el-option label="鏈堣鍒�" value="month" />
- <el-option label="骞磋鍒�" value="year" />
- </el-select>
- </el-form-item>
- <el-form-item label="寮�濮嬫椂闂�" prop="startDate">
- <el-date-picker
- v-model="planForm.startDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- placeholder="閫夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- />
- </el-form-item>
- <el-form-item label="缁撴潫鏃堕棿" prop="endDate">
- <el-date-picker
- v-model="planForm.endDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- placeholder="閫夋嫨缁撴潫鏃堕棿"
- style="width: 100%"
- />
- </el-form-item>
- <el-form-item label="璐熻矗浜�" prop="assignee">
- <el-input v-model="planForm.assignee" placeholder="璇疯緭鍏ヨ礋璐d汉" />
- </el-form-item>
- <el-form-item label="浼樺厛绾�" prop="priority">
- <el-select v-model="planForm.priority" placeholder="閫夋嫨浼樺厛绾�" style="width: 100%">
- <el-option label="楂�" value="high" />
- <el-option label="涓�" value="medium" />
- <el-option label="浣�" value="low" />
- </el-select>
- </el-form-item>
- <!-- <el-form-item label="鏍囩">
- <el-input v-model="planForm.tags" placeholder="璇疯緭鍏ユ爣绛撅紝鐢ㄩ�楀彿鍒嗛殧" />
- </el-form-item> -->
- <el-form-item label="鏍囩" prop="tags">
- <!-- <el-checkbox-group v-model="planForm.tags">
- <el-checkbox label="all"></el-checkbox>
- <el-checkbox label="manager">绠$悊灞�</el-checkbox>
- <el-checkbox label="hr">浜轰簨閮ㄩ棬</el-checkbox>
- <el-checkbox label="finance">璐㈠姟閮ㄩ棬</el-checkbox>
- <el-checkbox label="tech">鎶�鏈儴闂�</el-checkbox>
- </el-checkbox-group> -->
- <el-select
- v-model="planForm.tags"
- multiple
- placeholder="璇烽�夋嫨鏍囩"
- style="width: 100%"
- >
- <el-option
- v-for="dept in departments"
- :key="dept"
- :label="dept"
- :value="dept"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="planForm.status" placeholder="閫夋嫨鐘舵��" style="width: 100%">
- <el-option label="鏈紑濮�" value="not_started" />
- <el-option label="杩涜涓�" value="in_progress" />
- <el-option label="宸插畬鎴�" value="completed" />
- <el-option label="宸叉殏鍋�" value="paused" />
- </el-select>
- </el-form-item>
- <el-form-item label="杩涘害" prop="progress">
- <el-input-number
- v-model="planForm.progress"
- min="0"
- max="100"
- step="1"
- placeholder="璇疯緭鍏ヨ繘搴�"
- style="width: 100%"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="planDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSavePlan">淇濆瓨</el-button>
- </span>
- </template>
- </el-dialog>
- <!-- 璁″垝璇︽儏瀵硅瘽妗� -->
- <el-dialog v-model="showPlanDetailDialog" title="璁″垝璇︽儏" width="700px">
- <div v-if="currentPlanDetail" class="mb10">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="璁″垝鏍囬">{{ currentPlanDetail.title }}</el-descriptions-item>
- <el-descriptions-item label="璁″垝鎻忚堪">{{ currentPlanDetail.description }}</el-descriptions-item>
- <el-descriptions-item label="璁″垝绾у埆">{{ getCurrentLevelText(currentPlanDetail.level) }}</el-descriptions-item>
- <el-descriptions-item label="鏃堕棿鍛ㄦ湡">{{ getCurrentPeriodText(currentPlanDetail.period) }}</el-descriptions-item>
- <el-descriptions-item label="寮�濮嬫椂闂�">{{ currentPlanDetail.startDate }}</el-descriptions-item>
- <el-descriptions-item label="缁撴潫鏃堕棿">{{ currentPlanDetail.endDate }}</el-descriptions-item>
- <el-descriptions-item label="璐熻矗浜�">{{ currentPlanDetail.assignee }}</el-descriptions-item>
- <el-descriptions-item label="浼樺厛绾�">{{ getPriorityText(currentPlanDetail.priority) }}</el-descriptions-item>
- <el-descriptions-item label="鏍囩">{{ currentPlanDetail.tags.join(', ') }}</el-descriptions-item>
- <el-descriptions-item label="鐘舵��">{{ getStatusText(currentPlanDetail.status) }}</el-descriptions-item>
- <el-descriptions-item label="杩涘害">{{ currentPlanDetail.progress }}%</el-descriptions-item>
- </el-descriptions>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-const { proxy } = getCurrentInstance();
-import {
- User,
- UserFilled,
- OfficeBuilding,
- House,
- Calendar,
- Clock,
- Flag,
- ArrowDown
-} from '@element-plus/icons-vue'
-import { listDutyPlan, addDutyPlan, updateDutyPlan, delDutyPlan,NumDutyPlan,exportDutyPlan } from '@/api/collaborativeApproval/planTemplate.js'
-
-// 鍝嶅簲寮忔暟鎹�
-const operationType = ref('add')
-const currentLevel = ref('personal')
-const currentPeriod = ref('week')
-const currentDate = ref(new Date())
-const planDialogVisible = ref(false)
-const dialogTitle = ref('鏂板璁″垝')
-const planFormRef = ref()
-const showPlanDetailDialog = ref(false)
-const currentPlanDetail = ref(null)
-
-// 琛ㄥ崟鏁版嵁
-const planForm = reactive({
- id: '',
- title: '',
- description: '',
- level: 'personal',
- period: 'week',
- startDate: '',
- endDate: '',
- assignee: '',
- priority: 'medium',
- tags: [],
- status: '',
- progress: 0
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const planRules = {
- title: [{ required: true, message: '璇疯緭鍏ヨ鍒掓爣棰�', trigger: 'blur' }],
- description: [{ required: true, message: '璇疯緭鍏ヨ鍒掓弿杩�', trigger: 'blur' }],
- level: [{ required: true, message: '璇烽�夋嫨璁″垝绾у埆', trigger: 'change' }],
- period: [{ required: true, message: '璇烽�夋嫨鏃堕棿鍛ㄦ湡', trigger: 'change' }],
- startDate: [{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }],
- endDate: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }],
- assignee: [{ required: true, message: '璇疯緭鍏ヨ礋璐d汉', trigger: 'blur' }],
- priority: [{ required: true, message: '璇烽�夋嫨浼樺厛绾�', trigger: 'change' }]
-}
-const departments = ["浜у搧", "鍒嗘瀽", "璋冪爺",'鎶�鏈�', '鏋舵瀯', '璁捐','甯傚満', '鎺ㄥ箍', '钀ラ攢'];
-// 姒傝鏁版嵁
-const overviewData = reactive({
- personal: { total: 0, completion: 0 },
- group: { total: 0, completion: 0 },
- department: { total: 0, completion: 0 },
- company: { total: 0, completion: 0 }
-})
-
-// 璁″垝鍒楄〃鏁版嵁
-const planList = ref([])
-
-// 璁$畻灞炴��
-const datePickerType = computed(() => {
- switch (currentPeriod.value) {
- case 'week':
- return 'week'
- case 'month':
- return 'month'
- case 'year':
- return 'year'
- default:
- return 'date'
- }
-})
-
-// 鏂规硶
-const handleLevelChange = (value) => {
- console.log('璁″垝绾у埆鍙樻洿:', value)
- getPlanList()
- // 杩欓噷鍙互鏍规嵁绾у埆绛涢�夋暟鎹�
-}
-
-const handlePeriodChange = (value) => {
- console.log('鏃堕棿鍛ㄦ湡鍙樻洿:', value)
- getPlanList()
- // 杩欓噷鍙互鏍规嵁鍛ㄦ湡绛涢�夋暟鎹�
-}
-
-const handleDateChange = (value) => {
- console.log('鏃ユ湡鍙樻洿:', value)
- getPlanList()
- // 杩欓噷鍙互鏍规嵁鏃ユ湡绛涢�夋暟鎹�
-}
-
-const handleAddPlan = () => {
- operationType.value = 'add'
- dialogTitle.value = '鏂板璁″垝'
- planDialogVisible.value = true
- // 閲嶇疆琛ㄥ崟
- Object.keys(planForm).forEach(key => {
- planForm[key] = ''
- })
- planForm.level = 'personal'
- planForm.period = 'week'
- planForm.priority = 'medium'
- planForm.status = 'not_started'
- planForm.progress = 0
-}
-
-const handleEditPlan = (plan) => {
- operationType.value = 'edit'
- dialogTitle.value = '缂栬緫璁″垝'
- planDialogVisible.value = true
- Object.assign(planForm, plan)
- // // 濉厖琛ㄥ崟鏁版嵁
- // Object.keys(planForm).forEach(key => {
- // if (key === 'tags') {
- // planForm[key] = plan[key].join(', ')
- // } else {
- // planForm[key] = plan[key]
- // }
- // })
-}
-
-const handleViewDetail = (plan) => {
- currentPlanDetail.value = plan
- showPlanDetailDialog.value = true
- // ElMessage.info(`鏌ョ湅璁″垝璇︽儏: ${plan.title}`)
-}
-
-const handleMoreAction = async(plan,command) => {
- let ids = [];
- ids.push(plan.id);
- console.log("ids",ids)
- switch (command) {
- case 'share':
- ElMessage.success('璁″垝宸插叡浜�')
- break
- case 'copy':
- const knowledgeText = `
- 璁″垝鏍囬锛�${plan.title}
- 璁″垝鎻忚堪锛�${plan.description}
- 璁″垝绾у埆锛�${getCurrentLevelText(plan.level)}
- 鏃堕棿鍛ㄦ湡锛�${getCurrentPeriodText(plan.period)}
- 寮�濮嬫椂闂达細${plan.startDate}
- 缁撴潫鏃堕棿锛�${plan.endDate}
- 璐熻矗浜猴細${plan.assignee}
- 浼樺厛绾э細${getPriorityText(plan.priority)}
- 鏍囩锛�${plan.tags.join(', ')}
- 鐘舵�侊細${getStatusText(plan.status)}
- 杩涘害锛�${plan.progress}%
- `.trim();
-
- // 澶嶅埗鍒板壀璐存澘
- navigator.clipboard.writeText(knowledgeText).then(() => {
- ElMessage.success("鐭ヨ瘑鍐呭宸插鍒跺埌鍓创鏉�");
- }).catch(() => {
- ElMessage.error("澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗");
- });
- // ElMessage.success('璁″垝宸插鍒�')
- break
- case 'delete':
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖涓鍒掑悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
-
- delDutyPlan(ids).then(res => {
- if (res.code === 200) {
- ElMessage.success('璁″垝宸插垹闄�')
- ids.value = [];
- getPlanList()
- }
- })
- })
- break
- }
-}
-//
-const handleSavePlan = async () => {
- try {
- await planFormRef.value.validate()
- if (operationType.value === 'add') {
- addDutyPlan(planForm).then(res => {
- if (res.code === 200) {
- ElMessage.success('璁″垝淇濆瓨鎴愬姛')
- planDialogVisible.value = false
- }
- getPlanList()
- })
- } else {
-
- updateDutyPlan(planForm).then(res => {
- if (res.code === 200) {
- ElMessage.success('璁″垝淇濆瓨鎴愬姛')
- planDialogVisible.value = false
- }
- getPlanList()
- })
- }
- } catch (error) {
- console.log('琛ㄥ崟楠岃瘉澶辫触:', error)
- }
-}
-
-const handleDialogClose = () => {
- planFormRef.value?.resetFields()
-}
-
-const handleRefresh = () => {
- getPlanList()
- // ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-const handleFilter = () => {
- ElMessage.info('鎵撳紑绛涢�夐潰鏉�')
-}
-
-const handleExport = () => {
- ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- // exportDutyPlan().then(res => {
-
- // })
- proxy.download("/dutyPlan/export", {}, "璁″垝绠$悊.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-const handleShare = () => {
- ElMessage.success('璁″垝宸插叡浜�')
-}
-
-const getCurrentLevelText = () => {
- const levelMap = {
- personal: '涓汉璁″垝',
- group: '灏忕粍璁″垝',
- department: '閮ㄩ棬璁″垝',
- company: '鍏徃璁″垝'
- }
- return levelMap[currentLevel.value] || '涓汉璁″垝'
-}
-
-const getCurrentPeriodText = () => {
- const periodMap = {
- week: '鍛ㄨ鍒�',
- month: '鏈堣鍒�',
- year: '骞磋鍒�'
- }
- return periodMap[currentPeriod.value] || '鍛ㄨ鍒�'
-}
-
-const getPriorityType = (priority) => {
- const typeMap = {
- high: 'danger',
- medium: 'warning',
- low: 'info'
- }
- return typeMap[priority] || 'info'
-}
-
-const getPriorityText = (priority) => {
- const textMap = {
- high: '楂�',
- medium: '涓�',
- low: '浣�'
- }
- return textMap[priority] || '涓�'
-}
-
-const getStatusText = (status) => {
- const statusMap = {
- not_started: '鏈紑濮�',
- in_progress: '杩涜涓�',
- completed: '宸插畬鎴�',
- paused: '宸叉殏鍋�'
- }
- return statusMap[status] || '鏈煡'
-}
-
-const getProgressColor = (progress) => {
- if (progress >= 80) return '#67C23A'
- if (progress >= 50) return '#E6A23C'
- return '#F56C6C'
-}
-//鑾峰彇鏁版嵁鍒楄〃
-const getPlanList = async () => {
- const params = {
- level: currentLevel.value,
- period: currentPeriod.value,
- queryDate:currentDate.value
- }
- listDutyPlan(params).then(res => {
- if (res.code === 200) {
- planList.value = res.data.records
- }
- }).catch(err => {
- console.log(err)
- })
-}
-//鑾峰彇鏁版嵁
-const getPlanNum = async () => {
- NumDutyPlan().then(res => {
- if (res.code === 200) {
- // console.log(res.data)
- //璁茬粨鏋滈噷闈㈢殑鏁版嵁鏍规嵁level 璧嬪�肩粰overviewData
- res.data.forEach(item => {
- overviewData[item.level].total = item.num
- overviewData[item.level].completion = item.completion
- })
-
- }
- }).catch(err => {
- console.log(err)
- })
-}
-
-onMounted(() => {
- getPlanList()
- getPlanNum()
- console.log('澶氱骇璁″垝妯℃澘椤甸潰宸插姞杞�')
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 100vh;
-}
-
-.header-actions {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- background: white;
- padding: 20px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.left-actions {
- display: flex;
- align-items: center;
-}
-
-.right-actions {
- display: flex;
- gap: 10px;
-}
-
-.overview-cards {
- margin-bottom: 20px;
-}
-
-.overview-card {
- height: 120px;
-}
-
-.card-content {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.card-icon {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 15px;
- font-size: 24px;
- color: white;
-}
-
-.card-icon.personal {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-}
-
-.card-icon.group {
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
-}
-
-.card-icon.department {
- background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
-}
-
-.card-icon.company {
- background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
-}
-
-.card-info {
- flex: 1;
-}
-
-.card-title {
- font-size: 14px;
- color: #666;
- margin-bottom: 5px;
-}
-
-.card-number {
- font-size: 24px;
- font-weight: bold;
- color: #333;
- margin-bottom: 10px;
-}
-
-.card-progress {
- width: 100%;
-}
-
-.plan-content {
- background: white;
- border-radius: 8px;
- overflow: hidden;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: bold;
- color: #333;
-}
-
-.header-actions {
- display: flex;
- gap: 10px;
-}
-
-.plan-list {
- padding: 20px 0;
-}
-
-.plan-item {
- border: 1px solid #e4e7ed;
- border-radius: 8px;
- margin-bottom: 15px;
- padding: 20px;
- transition: all 0.3s ease;
-}
-
-.plan-item:hover {
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- transform: translateY(-2px);
-}
-
-.plan-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 15px;
-}
-
-.plan-title {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.title-text {
- font-size: 16px;
- font-weight: bold;
- color: #333;
-}
-
-.plan-actions {
- display: flex;
- gap: 10px;
-}
-
-.plan-content {
- margin-bottom: 15px;
-}
-
-.plan-description {
- color: #666;
- margin-bottom: 15px;
- line-height: 1.6;
-}
-
-.plan-meta {
- display: flex;
- flex-wrap: wrap;
- gap: 20px;
- margin-bottom: 15px;
-}
-
-.meta-item {
- display: flex;
- align-items: center;
- gap: 5px;
- color: #666;
- font-size: 14px;
-}
-
-.plan-progress {
- margin-bottom: 15px;
-}
-
-.plan-tags {
- display: flex;
- flex-wrap: wrap;
- gap: 5px;
-}
-
-.dialog-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .header-actions {
- flex-direction: column;
- gap: 15px;
- }
-
- .left-actions {
- flex-wrap: wrap;
- gap: 10px;
- }
-
- .plan-meta {
- flex-direction: column;
- gap: 10px;
- }
-
- .plan-header {
- flex-direction: column;
- align-items: flex-start;
- gap: 10px;
- }
-}
-</style>
diff --git a/src/views/collaborativeApproval/rpaManagement/index.vue b/src/views/collaborativeApproval/rpaManagement/index.vue
deleted file mode 100644
index e08104b..0000000
--- a/src/views/collaborativeApproval/rpaManagement/index.vue
+++ /dev/null
@@ -1,359 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">绋嬪簭鍚嶏細</span>
- <el-input
- v-model="searchForm.programName"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ▼搴忓悕鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鎵ц鐘舵�侊細</span>
- <el-select v-model="searchForm.status" clearable @change="handleQuery" style="width: 240px">
- <el-option label="杩愯涓�" :value="'running'" />
- <el-option label="宸插仠姝�" :value="'stopped'" />
- <el-option label="寮傚父" :value="'error'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- RPA琛ㄥ崟寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="500px"
- :close-on-click-modal="false"
- >
- <el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="100px"
- >
- <el-form-item label="绋嬪簭鍚�" prop="programName">
- <el-input
- v-model="form.programName"
- placeholder="璇疯緭鍏ョ▼搴忓悕"
- clearable
- />
- </el-form-item>
- <el-form-item label="鎵ц鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鎵ц鐘舵��" style="width: 100%">
- <el-option label="杩愯涓�" value="running" />
- <el-option label="宸插仠姝�" value="stopped" />
- <el-option label="寮傚父" value="error" />
- </el-select>
- </el-form-item>
- <el-form-item label="鎻忚堪" prop="description">
- <el-input
- v-model="form.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏PA绋嬪簭鎻忚堪"
- clearable
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import {listRpa, addRpa, updateRpa, delRpa, delRpaBatch} from "@/api/collaborativeApproval/rpaManagement.js";
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- programName: "",
- status: "",
- },
- form: {
- programName: "",
- status: "",
- description: ""
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- tableLoading: false,
- page: {
- current: 1,
- size: 20,
- total: 0,
- },
- tableData: [],
-});
-
-const { searchForm, form, dialogVisible, dialogTitle, dialogType, selectedIds, tableLoading, page, tableData } = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-// 閫夋嫨鐨勮鏁版嵁
-const selectedRows = ref([]);
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- programName: [
- { required: true, message: "璇疯緭鍏ョ▼搴忓悕", trigger: "blur" }
- ],
- status: [
- { required: true, message: "璇烽�夋嫨鎵ц鐘舵��", trigger: "change" }
- ]
-};
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "绋嬪簭鍚�",
- prop: "programName",
- // width: 200,
- },
- {
- label: "鎵ц鐘舵��",
- prop: "status",
- dataType: "tag",
- // width: 120,
- formatData: (params) => {
- const statusMap = {
- running: "杩愯涓�",
- stopped: "宸插仠姝�",
- error: "寮傚父"
- };
- return statusMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- running: "success",
- stopped: "info",
- error: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鎻忚堪",
- prop: "description",
- // width: 300,
- showOverflowTooltip: true,
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- // width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 150,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- // {
- // name: "寮�濮�",
- // type: "text",
- // clickFun: (row) => {
- // handleStart(row);
- // },
- // disabled: (row) => row.status !== 'stopped'
- // },
- // {
- // name: "鍋滄",
- // type: "text",
- // clickFun: (row) => {
- // handleStop(row);
- // },
- // disabled: (row) => row.status === 'stopped'
- // }
- ]
- }
-]);
-
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
-});
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- // page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- listRpa({...page.value, ...searchForm.value})
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row) => {
- dialogType.value = type;
- dialogVisible.value = true;
-
- if (type === "add") {
- dialogTitle.value = "娣诲姞RPA";
- } else {
- dialogTitle.value = "缂栬緫RPA";
- form.value = { ...row };
- }
-};
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- if (!formRef.value) return;
-
- try {
- await formRef.value.validate();
-
- if (dialogType.value === "add") {
- // 娣诲姞鏂癛PA
- addRpa({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- form.value = {
- programName: "",
- status: "",
- description: ""
- },
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } else {
- // 缂栬緫RPA
- updateRpa({...form.value}).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- dialogVisible.value = false;
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- }
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 寮�濮婻PA
-const handleStart = (row) => {
- ElMessageBox.confirm(`纭畾瑕佸惎鍔≧PA绋嬪簭"${row.programName}"鍚楋紵`, "鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- row.status = "running";
- ElMessage.success("RPA鍚姩鎴愬姛");
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-
-// 鍋滄RPA
-const handleStop = (row) => {
- ElMessageBox.confirm(`纭畾瑕佸仠姝PA绋嬪簭"${row.programName}"鍚楋紵`, "鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- row.status = "stopped";
- ElMessage.success("RPA鍋滄鎴愬姛");
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-
-// 鍒犻櫎RPA
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delRpa(ids).then((res) => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-</script>
-
-<style scoped></style>
diff --git a/src/views/collaborativeApproval/sealManagement/index.vue b/src/views/collaborativeApproval/sealManagement/index.vue
deleted file mode 100644
index 4cf5a14..0000000
--- a/src/views/collaborativeApproval/sealManagement/index.vue
+++ /dev/null
@@ -1,811 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <template #header>
- <div class="card-header">
- <span>鐢ㄥ嵃绠$悊涓庤绔犲埗搴﹀彂甯�</span>
- <el-button type="primary" @click="showSealApplyDialog = true">
- <el-icon><Plus /></el-icon>
- 鐢宠鐢ㄥ嵃
- </el-button>
- </div>
- </template>
-
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
- <el-tab-pane label="鐢ㄥ嵃鐢宠绠$悊" name="seal">
- <div class="tab-content">
- <el-row :gutter="20" class="mb-20">
- <el-col :span="6">
- <el-input v-model="sealSearchForm.title" placeholder="璇疯緭鍏ョ敵璇锋爣棰�" clearable />
- </el-col>
- <el-col :span="4">
- <el-select v-model="sealSearchForm.status" placeholder="瀹℃壒鐘舵��" clearable>
- <el-option label="寰呭鎵�" value="pending" />
- <el-option label="宸查�氳繃" value="approved" />
- <el-option label="宸叉嫆缁�" value="rejected" />
- </el-select>
- </el-col>
- <el-col :span="4">
- <el-button type="primary" @click="searchSealApplications">鎼滅储</el-button>
- <el-button @click="resetSealSearch">閲嶇疆</el-button>
- </el-col>
- </el-row>
-
- <el-table :data="sealApplications" border v-loading="tableLoading" style="width: 100%">
- <el-table-column prop="applicationNum" label="鐢宠缂栧彿" width="120" />
- <el-table-column prop="title" label="鐢宠鏍囬" min-width="200" />
- <el-table-column prop="createUserName" label="鐢宠浜�" width="120" />
- <el-table-column prop="department" label="鎵�灞為儴闂�" width="150" />
- <el-table-column prop="sealType" label="鐢ㄥ嵃绫诲瀷" width="120">
- <template #default="scope">
- {{ getSealTypeText(scope.row.sealType) }}
- </template>
- </el-table-column>
- <el-table-column prop="createTime" label="鐢宠鏃堕棿" width="180" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ getStatusText(scope.row.status) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right">
- <template #default="scope">
- <el-button link @click="viewSealDetail(scope.row)">鏌ョ湅</el-button>
- <el-button
- v-if="scope.row.status === 'pending'"
- link
- type="primary"
- @click="approveSeal(scope.row)"
- >
- 瀹℃壒
- </el-button>
- <el-button
- v-if="scope.row.status === 'pending'"
- link
- type="danger"
- @click="rejectSeal(scope.row)"
- >
- 鎷掔粷
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 瑙勭珷鍒跺害绠$悊 -->
- <el-tab-pane label="瑙勭珷鍒跺害绠$悊" name="regulations">
- <div class="tab-content">
- <el-row :gutter="20" class="mb-20">
- <el-col :span="6">
- <el-input v-model="regulationSearchForm.title" placeholder="璇疯緭鍏ュ埗搴︽爣棰�" clearable />
- </el-col>
- <el-col :span="4">
- <el-select v-model="regulationSearchForm.category" placeholder="鍒跺害鍒嗙被" clearable>
- <el-option label="浜轰簨鍒跺害" value="hr" />
- <el-option label="璐㈠姟鍒跺害" value="finance" />
- <el-option label="瀹夊叏鍒跺害" value="safety" />
- <el-option label="鎶�鏈埗搴�" value="tech" />
- </el-select>
- </el-col>
- <el-col :span="8">
- <el-button type="primary" @click="searchRegulations">鎼滅储</el-button>
- <el-button @click="resetRegulationSearch">閲嶇疆</el-button>
- <el-button type="success" @click="handleAdd">
- 鍙戝竷鍒跺害
- </el-button>
- </el-col>
- </el-row>
-
- <el-table :data="regulations" border v-loading="tableLoading" style="width: 100%">
- <el-table-column prop="regulationNum" label="鍒跺害缂栧彿" width="120" />
- <el-table-column prop="title" label="鍒跺害鏍囬" min-width="200" />
- <el-table-column prop="category" label="鍒嗙被" width="120">
- <template #default="scope">
- <el-tag>{{ getCategoryText(scope.row.category) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="version" label="鐗堟湰" width="80" />
- <el-table-column prop="createUserName" label="鍙戝竷浜�" width="120" />
- <el-table-column prop="createTime" label="鍙戝竷鏃堕棿" width="180" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鐢熸晥涓�' : '宸插簾姝�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="readCount" label="宸茶浜烘暟" width="100" />
- <el-table-column label="鎿嶄綔" width="250" fixed="right">
- <template #default="scope">
- <el-button link @click="viewRegulation(scope.row)">鏌ョ湅</el-button>
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="danger" @click="repealEdit(scope.row)">搴熷純</el-button>
- <el-button link type="success" @click="viewVersionHistory(scope.row)">鐗堟湰鍘嗗彶</el-button>
- <el-button link type="warning" @click="viewReadStatus(scope.row)">闃呰鐘舵��</el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 鍒嗛〉
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- /> -->
- </div>
- </el-tab-pane>
- </el-tabs>
- </el-card>
-
- <!-- 鐢ㄥ嵃鐢宠瀵硅瘽妗� -->
- <el-dialog v-model="showSealApplyDialog" title="鐢宠鐢ㄥ嵃" width="600px">
- <el-form :model="sealForm" :rules="sealRules" ref="sealFormRef" label-width="100px">
- <el-form-item label="鐢宠缂栧彿" prop="applicationNum">
- <el-input v-model="sealForm.applicationNum" placeholder="璇疯緭鍏ョ敵璇风紪鍙�" />
- </el-form-item>
- <el-form-item label="鐢宠鏍囬" prop="title">
- <el-input v-model="sealForm.title" placeholder="璇疯緭鍏ョ敵璇锋爣棰�" />
- </el-form-item>
- <el-form-item label="鐢ㄥ嵃绫诲瀷" prop="sealType">
- <el-select v-model="sealForm.sealType" placeholder="璇烽�夋嫨鐢ㄥ嵃绫诲瀷" style="width: 100%">
- <el-option label="鍏珷" value="official" />
- <el-option label="鍚堝悓涓撶敤绔�" value="contract" />
- <el-option label="璐㈠姟涓撶敤绔�" value="finance" />
- <el-option label="娉曚汉绔�" value="legal" />
- </el-select>
- </el-form-item>
- <el-form-item label="鐢宠鍘熷洜" prop="reason">
- <el-input v-model="sealForm.reason" type="textarea" :rows="4" placeholder="璇疯缁嗚鏄庣敤鍗板師鍥�" />
- </el-form-item>
- <el-form-item label="绱ф�ョ▼搴�" prop="urgency">
- <el-radio-group v-model="sealForm.urgency">
- <el-radio label="normal">鏅��</el-radio>
- <el-radio label="urgent">绱ф��</el-radio>
- <el-radio label="very-urgent">鐗规��</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showSealApplyDialog = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitSealApplication">鎻愪氦鐢宠</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 瑙勭珷鍒跺害鍙戝竷瀵硅瘽妗� -->
- <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? '鍙戝竷鍒跺害' : '缂栬緫鍒跺害'" width="800px">
- <el-form :model="regulationForm" :rules="regulationRules" ref="regulationFormRef" label-width="100px">
- <el-form-item label="鍒跺害缂栧彿" prop="regulationNum">
- <el-input v-model="regulationForm.regulationNum" placeholder="璇疯緭鍏ュ埗搴︾紪鍙�" />
- </el-form-item>
- <el-form-item label="鍒跺害鏍囬" prop="title">
- <el-input v-model="regulationForm.title" placeholder="璇疯緭鍏ュ埗搴︽爣棰�" />
- </el-form-item>
- <el-form-item label="鍒跺害鍒嗙被" prop="category">
- <el-select v-model="regulationForm.category" placeholder="璇烽�夋嫨鍒跺害鍒嗙被" style="width: 100%">
- <el-option label="浜轰簨鍒跺害" value="hr" />
- <el-option label="璐㈠姟鍒跺害" value="finance" />
- <el-option label="瀹夊叏鍒跺害" value="safety" />
- <el-option label="鎶�鏈埗搴�" value="tech" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍒跺害鍐呭" prop="content">
- <el-input v-model="regulationForm.content" type="textarea" :rows="10" placeholder="璇疯緭鍏ュ埗搴﹁缁嗗唴瀹�" />
- </el-form-item>
- <el-form-item label="鍒跺害鐗堟湰" prop="version">
- <el-input v-model="regulationForm.version" placeholder="璇疯緭鍏ュ埗搴︾増鏈�" />
- </el-form-item>
- <el-form-item label="鐢熸晥鏃堕棿" prop="effectiveTime">
- <el-date-picker v-model="regulationForm.effectiveTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
- value-format="YYYY-MM-DD HH:mm:ss" placeholder="閫夋嫨鐢熸晥鏃堕棿" style="width: 100%" />
- </el-form-item>
- <el-form-item label="閫傜敤鑼冨洿" prop="scope">
- <el-checkbox-group v-model="regulationForm.scope">
- <el-checkbox label="all">鍏ㄤ綋鍛樺伐</el-checkbox>
- <el-checkbox label="manager">绠$悊灞�</el-checkbox>
- <el-checkbox label="hr">浜轰簨閮ㄩ棬</el-checkbox>
- <el-checkbox label="finance">璐㈠姟閮ㄩ棬</el-checkbox>
- <el-checkbox label="tech">鎶�鏈儴闂�</el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- <el-form-item label="鏄惁闇�瑕佺‘璁�" prop="requireConfirm">
- <el-switch v-model="regulationForm.requireConfirm" />
- <span class="ml-10">寮�鍚悗鍛樺伐闇�瑕侀槄璇荤‘璁�</span>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showRegulationDialog = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitRegulation">鍙戝竷鍒跺害</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鐢ㄥ嵃璇︽儏瀵硅瘽妗� -->
- <el-dialog v-model="showSealDetailDialog" title="鐢ㄥ嵃鐢宠璇︽儏" width="700px">
- <div v-if="currentSealDetail" class="mb10">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鐢宠缂栧彿">{{ currentSealDetail.id }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鏍囬">{{ currentSealDetail.title }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜�">{{ currentSealDetail.createUserName }}</el-descriptions-item>
- <el-descriptions-item label="鎵�灞為儴闂�">{{ currentSealDetail.department }}</el-descriptions-item>
- <el-descriptions-item label="鐢ㄥ嵃绫诲瀷">{{ getSealTypeText(currentSealDetail.sealType) }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鏃堕棿">{{ currentSealDetail.createTime }}</el-descriptions-item>
- <el-descriptions-item label="鐘舵��">
- <el-tag :type="getStatusType(currentSealDetail.status)">
- {{ getStatusText(currentSealDetail.status) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鐢宠鍘熷洜" :span="2">{{ currentSealDetail.reason }}</el-descriptions-item>
- </el-descriptions>
- </div>
- </el-dialog>
-
- <!-- 瑙勭珷鍒跺害璇︽儏瀵硅瘽妗� -->
- <el-dialog v-model="showRegulationDetailDialog" title="瑙勭珷鍒跺害璇︽儏" width="800px">
- <div v-if="currentRegulationDetail">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鍒跺害缂栧彿">{{ currentRegulationDetail.id }}</el-descriptions-item>
- <el-descriptions-item label="鍒跺害鏍囬">{{ currentRegulationDetail.title }}</el-descriptions-item>
- <el-descriptions-item label="鍒嗙被">{{ getCategoryText(currentRegulationDetail.category) }}</el-descriptions-item>
- <el-descriptions-item label="鐗堟湰">{{ currentRegulationDetail.version }}</el-descriptions-item>
- <el-descriptions-item label="鍙戝竷浜�">{{ currentRegulationDetail.createUserName }}</el-descriptions-item>
- <el-descriptions-item label="鍙戝竷鏃堕棿">{{ currentRegulationDetail.createTime }}</el-descriptions-item>
- </el-descriptions>
- <div class="mt-20">
- <h4>鍒跺害鍐呭</h4>
- <div class="regulation-content">{{ currentRegulationDetail.content }}</div>
- </div>
- <!-- 濡傛灉tableData>0 鏄剧ず -->
- <div style="margin: 10px 0;" v-if="tableData && tableData.length > 0" >
- <el-button type="success" @click="resetForm(currentRegulationDetail)">纭鏌ョ湅</el-button>
- </div>
- </div>
- </el-dialog>
-
- <!-- 鐗堟湰鍘嗗彶瀵硅瘽妗� -->
- <el-dialog v-model="showVersionHistoryDialog" title="鐗堟湰鍘嗗彶" width="800px">
- <el-table :data="versionHistory" style="width: 100%;margin-bottom: 10px">
- <el-table-column prop="version" label="鐗堟湰鍙�" width="100" />
- <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
- <el-table-column prop="createUserName" label="鏇存柊浜�" width="120" />
- <el-table-column prop="changeLog" label="鍙樻洿璇存槑">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鐢熸晥涓�' : '宸插簾姝�' }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
-
- <!-- 闃呰鐘舵�佸璇濇 -->
- <el-dialog v-model="showReadStatusDialog" title="闃呰鐘舵��" width="800px">
- <el-table :data="readStatusList" style="width: 100%;margin-bottom: 10px">
- <el-table-column prop="employee" label="鍛樺伐濮撳悕" width="120" />
- <el-table-column prop="department" label="鎵�灞為儴闂�" width="150" />
- <el-table-column prop="createTime" label="闃呰鏃堕棿" width="180" />
- <el-table-column prop="confirmTime" label="纭鏃堕棿" width="180" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'confirmed' ? 'success' : 'warning'">
- {{ scope.row.status === 'confirmed' ? '宸茬‘璁�' : '鏈‘璁�' }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus } from '@element-plus/icons-vue'
-import { listSealApplication, addSealApplication, updateSealApplication,listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,getReadingStatusList,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js'
-import { el } from 'element-plus/es/locales.mjs'
-import { getUserProfile } from '@/api/system/user.js'
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-
-// 鍝嶅簲寮忔暟鎹�
-const currentUser = ref(null)
-const activeTab = ref('seal')
-const operationType = ref('add')
-const tableData = ref([])
-// 鐢ㄥ嵃鐢宠鐩稿叧
-const showSealApplyDialog = ref(false)
-const tableLoading = ref(false)
-const showSealDetailDialog = ref(false)
-const currentSealDetail = ref(null)
-const sealFormRef = ref()
-const sealForm = reactive({
- applicationNum: '',
- title: '',
- sealType: '',
- reason: '',
- urgency: 'normal',
- status: 'pending'
-})
-
-const sealRules = {
- applicationNum: [{ required: true, message: '璇疯緭鍏ョ敵璇风紪鍙�', trigger: 'blur' }],
- title: [{ required: true, message: '璇疯緭鍏ョ敵璇锋爣棰�', trigger: 'blur' }],
- sealType: [{ required: true, message: '璇烽�夋嫨鐢ㄥ嵃绫诲瀷', trigger: 'change' }],
- reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }]
-}
-
-const sealSearchForm = reactive({
- title: '',
- status: ''
-})
-// 鍒嗛〉鍙傛暟
-const page = reactive({
- current: 1,
- size: 10,
- total: 0
-})
-// 瑙勭珷鍒跺害鐩稿叧
-const showRegulationDialog = ref(false)
-const showRegulationDetailDialog = ref(false)
-const showVersionHistoryDialog = ref(false)
-const showReadStatusDialog = ref(false)
-const currentRegulationDetail = ref(null)
-const regulationFormRef = ref()
-const regulationForm = reactive({
- id: '',
- regulationNum: '',
- title: '',
- category: '',
- content: '',
- version: '',
- status: 'active',
- readCount: 0,
- effectiveTime: '',
- scope: [],
- requireConfirm: false
-})
-
-const readStatus = ref({
- id: '',
- ruleId: '',
- employee: '',
- department: '',
- createTime: '',
- confirmTime: '',
- status: 'unconfirmed'
-})
-
-const regulationRules = {
- title: [{ required: true, message: '璇疯緭鍏ュ埗搴︽爣棰�', trigger: 'blur' }],
- category: [{ required: true, message: '璇烽�夋嫨鍒跺害鍒嗙被', trigger: 'change' }],
- content: [{ required: true, message: '璇疯緭鍏ュ埗搴﹀唴瀹�', trigger: 'blur' }],
- effectiveTime: [{ required: true, message: '璇烽�夋嫨鐢熸晥鏃堕棿', trigger: 'change' }],
- scope: [{ required: true, message: '璇烽�夋嫨閫傜敤鑼冨洿', trigger: 'change' }]
-}
-
-const regulationSearchForm = reactive({
- title: '',
- category: ''
-})
-
-// 鍋囨暟鎹�
-const sealApplications = ref([])
-
-const regulations = ref([])
-
-const versionHistory = ref([])
-
-const readStatusList = ref([])
- // { employee: '闄堝織寮�', department: '閿�鍞儴', readTime: '2025-01-11 10:30:00', confirmTime: '2025-01-11 10:35:00', status: 'confirmed' },
- // { employee: '鍒橀泤濠�', department: '鎶�鏈儴', readTime: '2025-01-11 14:20:00', confirmTime: '', status: 'unconfirmed' },
- // { employee: '鐜嬪缓鍥�', department: '璐㈠姟閮�', readTime: '2025-01-12 09:15:00', confirmTime: '2025-01-12 09:20:00', status: 'confirmed' }
-
-// 鐢ㄥ嵃鐢宠鐘舵��
-const getStatusType = (status) => {
- const statusMap = {
- pending: 'warning',
- approved: 'success',
- rejected: 'danger'
- }
- return statusMap[status] || 'info'
-}
-// 鍒跺害鐘舵��
-const getStatusText = (status) => {
- const statusMap = {
- pending: '寰呭鎵�',
- approved: '宸查�氳繃',
- rejected: '宸叉嫆缁�'
- }
- return statusMap[status] || '鏈煡'
-}
-// 鐢ㄥ嵃绫诲瀷
-const getSealTypeText = (sealType) => {
- const sealTypeMap = {
- official: '鍏珷',
- contract: '鍚堝悓涓撶敤绔�',
- finance: '璐㈠姟涓撶敤绔�',
- tegal: '鎶�鏈笓鐢ㄧ珷'
- }
- return sealTypeMap[sealType] || '鏈煡'
-}
-// 鍒跺害鍒嗙被
-const getCategoryText = (category) => {
- const categoryMap = {
- hr: '浜轰簨鍒跺害',
- finance: '璐㈠姟鍒跺害',
- safety: '瀹夊叏鍒跺害',
- tech: '鎶�鏈埗搴�'
- }
- return categoryMap[category] || '鏈煡'
-}
-// 鎼滅储鍗扮珷鐢宠
-const searchSealApplications = () => {
- page.current=1
- getSealApplicationList()
-
- // ElMessage.success('鎼滅储瀹屾垚')
-}
-// 閲嶇疆鍗扮珷鐢宠鎼滅储
-const resetSealSearch = () => {
- sealSearchForm.title = ''
- sealSearchForm.status = ''
- searchSealApplications()
-}
-// 鎼滅储鍒跺害
-const searchRegulations = () => {
- page.current=1
- getRegulationList()
-}
-// 閲嶇疆鍒跺害鎼滅储
-const resetRegulationSearch = () => {
- regulationSearchForm.title = ''
- regulationSearchForm.category = ''
- searchRegulations()
-}
-// 鎻愪氦鐢ㄥ嵃鐢宠
-const submitSealApplication = async () => {
- try {
- await sealFormRef.value.validate()
- addSealApplication(sealForm).then(res => {
- if(res.code == 200){
- ElMessage.success('鐢宠鎻愪氦鎴愬姛')
- showSealApplyDialog.value = false
- getSealApplicationList()
- Object.assign(sealForm, {
- applicationNum: '',
- title: '',
- sealType: '',
- reason: '',
- urgency: 'normal',
- status: 'pending'
- })
- }
- }).catch(err => {
- ElMessage.error(err.msg)
- })
-
- } catch (error) {
- ElMessage.error('璇峰畬鍠勭敵璇蜂俊鎭�')
- }
-}
-// 鏂板
-const handleAdd = () => {
- operationType.value = 'add'
- resetRegulationForm()
- showRegulationDialog.value = true
-}
-
-// 缂栬緫
-const handleEdit = (row) => {
- operationType.value = 'edit'
- Object.assign(regulationForm, row)
- showRegulationDialog.value = true
-}
-// 搴熷純
-const repealEdit = (row) => {
- operationType.value = 'edit'
- Object.assign(regulationForm, row)
- regulationForm.status = 'repealed'
- ElMessageBox.confirm('纭搴熷純璇ュ埗搴︼紵', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- updateRuleManagement(regulationForm).then(res => {
- if(res.code == 200){
- ElMessage.success('鍒跺害搴熷純鎴愬姛')
- // showRegulationDialog.value = false
- getRegulationList()
- resetRegulationForm()
- }
- })
- }).catch(() => {
- ElMessage({
- type: 'info',
- message: '宸插彇娑堝簾寮�'
- })
- })
-}
-// 鍙戝竷鍒跺害
-const submitRegulation = async () => {
- try {
- await regulationFormRef.value.validate()
- if(operationType.value == 'add'){
- addRuleManagement(regulationForm).then(res => {
- if(res.code == 200){
- ElMessage.success('鍒跺害鍙戝竷鎴愬姛')
- showRegulationDialog.value = false
- getRegulationList()
- resetRegulationForm()
- }
- })
- }else{
- updateRuleManagement(regulationForm).then(res => {
- if(res.code == 200){
- ElMessage.success('鍒跺害缂栬緫鎴愬姛')
- showRegulationDialog.value = false
- resetRegulationForm()
- getRegulationList()
- }})}
- }catch(err){
- ElMessage.error(err.msg)
- }
-}
-//閲嶇疆鍒跺害琛ㄥ崟
-const resetRegulationForm = () => {
- Object.assign(regulationForm, {
- id: '',
- regulationNum: '',
- title: '',
- category: '',
- content: '',
- version: '',
- status: 'active',
- readCount: 0,
- effectiveTime: '',
- scope: [],
- requireConfirm: false
-})
-}
-
-
-// 鏌ョ湅鐢ㄥ嵃鐢宠璇︽儏
-const viewSealDetail = (row) => {
- currentSealDetail.value = row
- showSealDetailDialog.value = true
-}
-// 瀹℃壒鐢ㄥ嵃鐢宠
-const approveSeal = (row) => {
- console.log(row)
- ElMessageBox.confirm('纭閫氳繃璇ョ敤鍗扮敵璇凤紵', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- row.status = 'approved'
- updateSealApplication(row).then(res => {
- if(res.code == 200){
- ElMessage.success('瀹℃壒閫氳繃')
- }
- })
- })
-}
-// 鎷掔粷鐢ㄥ嵃鐢宠
-const rejectSeal = (row) => {
- ElMessageBox.prompt('璇疯緭鍏ユ嫆缁濆師鍥�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- inputPattern: /\S+/,
- inputErrorMessage: '鎷掔粷鍘熷洜涓嶈兘涓虹┖'
- }).then(({ value }) => {
- row.status = 'rejected'
- updateSealApplication(row).then(res => {
- if(res.code == 200){
- ElMessage.success('瀹℃壒鎷掔粷')
- }
- })
- ElMessage.success('宸叉嫆缁濈敵璇�')
- })
-}
-// 鑾峰彇鍦ㄨ亴鍛樺伐鍒楄〃
-const getList = () => {
- tableLoading.value = true;
- //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
- getUserProfile().then(res => {
- if(res.code == 200){
- console.log(res.data.userName)
- currentUser.value = res.data.userName
- }
- })
- staffJoinListPage({staffState: 1}).then(res => {
- tableLoading.value = false;
- // tableData.value = res.data.records
- // //绛涢�夊嚭鍜宑urrentUser鍚屽悕鐨勪汉鍛�
- tableData.value = res.data.records.filter(item => item.staffName === currentUser.value)
- console.log("tableData",tableData.value)
- page.total = res.data.total;
-
- if(tableData.value.length == 0){
- ElMessage.error('褰撳墠鐢ㄦ埛鏈姞鍏ヤ换浣曢儴闂�')
- }
- }).catch(err => {
- tableLoading.value = false;
- })
-
-
-};
-
-// 鏌ョ湅鍒跺害鐗堟湰鍘嗗彶
-const viewVersionHistory = (row) => {
- showVersionHistoryDialog.value = true
- const params = {
-
- category: row.category
- }
- listRuleManagement(page,params).then(res => {
- if(res.code == 200){
- versionHistory.value = res.data.records
- }
- })
-}
-// 鏌ョ湅鍒跺害璇︽儏
-const viewRegulation = (row) => {
- getList()
- currentRegulationDetail.value = row
- showRegulationDetailDialog.value = true
- getReadingStatusByRuleId(row.id).then(res => {
- if(res.code == 200){
- readStatusList.value = res.data
- if(readStatusList.value.length==0 && tableData.value.length>0){
- const params = {
- ruleId: row.id,
- employee: tableData.value[0].staffName,
- department: tableData.value[0].postJob,
- status: 'unconfirmed'
- }
- addReadingStatus(params).then(res => {
- if(res.code == 200){
- ElMessage.success('鍒跺害闃呰鎴愬姛')
- }
- })
- }
- }
- })
-
-}
-// 鏌ョ湅鍒跺害闃呰鐘舵��
-const viewReadStatus = (row) => {
- showReadStatusDialog.value = true
- //鏌ョ湅闃呰鐘舵�佸垪琛�
- getReadingStatusByRuleId(row.id).then(res => {
- if(res.code == 200){
- readStatusList.value = res.data
- }
- })
-}
-
-//纭鏌ョ湅
-const resetForm = (row) => {
- console.log("row",row)
- row.readCount = row.readCount + 1
-
- updateRuleManagement(row).then(res => {
- if(res.code == 200){
- ElMessage.success('鏌ョ湅鏁伴噺淇敼鎴愬姛')
- //淇敼闃呰鐘舵��
- //鏍规嵁鍒跺害id鍜屽綋鍓嶇櫥褰曠殑鍛樺伐寰楀埌闃呰鐘舵��
- // let item = readStatusList.value.filter(item => item.employee == tableData.value[0].staffName )
- // if(item.length>0){
- // item[0].status = 'confirmed',
- // item[0].confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0];
- // }
- // 绛涢�夊綋鍓嶅憳宸ュ搴旇鍒跺害鐨勯槄璇荤姸鎬佽褰�
- let statusItem = readStatusList.value.find(item => item.employee === tableData.value[0].staffName && item.ruleId === row.id);
-
- if (statusItem) {
- // 濡傛灉鎵惧埌璁板綍锛屾洿鏂扮姸鎬佸拰纭鏃堕棿
- statusItem.status = 'confirmed';
- // 鏍煎紡鍖栨椂闂翠负"YYYY-MM-DD HH:mm:ss"鏍煎紡
- const now = new Date();
- statusItem.confirmTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
- // statusItem.confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0];
-
- updateReadingStatus(statusItem).then(res => {
- if(res.code == 200){
- ElMessage.success('鍒跺害闃呰鐘舵�佷慨鏀规垚鍔�')
- }
- })
- }
-
- }
- })
-}
-
-
-
-// 鑾峰彇鍗扮珷鐢宠鍒楄〃鏁版嵁
-const getSealApplicationList = async () => {
- tableLoading.value = true
- listSealApplication(page,sealSearchForm)
- .then(res => {
-
- sealApplications.value = res.data.records
- page.value.total = res.data.total;
- tableLoading.value = false;
-
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-// 鑾峰彇瑙勭珷鍒跺害鍒楄〃鏁版嵁
-const getRegulationList = async () => {
- tableLoading.value = true
- listRuleManagement(page,regulationSearchForm)
- .then(res => {
-
- regulations.value = res.data.records
- // 杩囨护鎺夊凡搴熷純鐨勫埗搴�
- // regulations.value = res.data.records.filter(item => item.status !== 'repealed')
- page.value.total = res.data.total;
- tableLoading.value = false;
-
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-
-onMounted(() => {
- // 鍒濆鍖�
- getSealApplicationList()
- getRegulationList()
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.tab-content {
- padding: 20px 0;
-}
-
-.mb-20 {
- margin-bottom: 20px;
-}
-
-.mt-20 {
- margin-top: 20px;
-}
-
-.ml-10 {
- margin-left: 10px;
-}
-
-.regulation-content {
- background-color: #f5f5f5;
- padding: 15px;
- border-radius: 4px;
- line-height: 1.6;
- white-space: pre-wrap;
- height: 200px;
-}
-
-.dialog-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
-}
-</style>
diff --git a/src/views/collaborativeApproval/warningSystem/index.vue b/src/views/collaborativeApproval/warningSystem/index.vue
deleted file mode 100644
index f6c7f6e..0000000
--- a/src/views/collaborativeApproval/warningSystem/index.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
- <div class="warning-system">
- <h2>棰勮鑱斿姩鏈哄埗</h2>
-
- <!-- 缁熻鍗$墖 -->
- <div class="stats">
- <div class="stat-card red">
- <span class="number">2</span>
- <span class="label">绾㈣壊棰勮</span>
- </div>
- <div class="stat-card orange">
- <span class="number">1</span>
- <span class="label">姗欒壊棰勮</span>
- </div>
- <div class="stat-card yellow">
- <span class="number">1</span>
- <span class="label">榛勮壊棰勮</span>
- </div>
- <div class="stat-card green">
- <span class="number">1</span>
- <span class="label">缁胯壊棰勮</span>
- </div>
- </div>
-
- <!-- 棰勮鍒楄〃 -->
- <div class="warning-list">
- <h3>棰勮鍒楄〃</h3>
- <table>
- <thead>
- <tr>
- <th>缂栧彿</th>
- <th>鏍囬</th>
- <th>绫诲瀷</th>
- <th>绛夌骇</th>
- <th>鐘舵��</th>
- <th>璐d换浜�</th>
- <th>鎿嶄綔</th>
- </tr>
- </thead>
- <tbody>
- <tr v-for="warning in warnings" :key="warning.id">
- <td>{{ warning.id }}</td>
- <td>{{ warning.title }}</td>
- <td>{{ warning.type }}</td>
- <td>
- <span :class="['level-tag', warning.level]">
- {{ warning.levelText }}
- </span>
- </td>
- <td>
- <span :class="['status-tag', warning.status]">
- {{ warning.statusText }}
- </span>
- </td>
- <td>{{ warning.responsible }}</td>
- <td>
- <button @click="viewDetail(warning)">鏌ョ湅璇︽儏</button>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
-
- <!-- 璇︽儏瀵硅瘽妗� -->
- <div v-if="showDetail" class="modal">
- <div class="modal-content">
- <h3>棰勮璇︽儏</h3>
- <div v-if="currentWarning">
- <p><strong>缂栧彿锛�</strong>{{ currentWarning.id }}</p>
- <p><strong>鏍囬锛�</strong>{{ currentWarning.title }}</p>
- <p><strong>绫诲瀷锛�</strong>{{ currentWarning.type }}</p>
- <p><strong>绛夌骇锛�</strong>{{ currentWarning.levelText }}</p>
- <p><strong>鎻忚堪锛�</strong>{{ currentWarning.description }}</p>
- <p><strong>褰卞搷锛�</strong>{{ currentWarning.impact }}</p>
- <p><strong>寤鸿锛�</strong>{{ currentWarning.suggestions }}</p>
- </div>
- <button @click="showDetail = false">鍏抽棴</button>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: 'WarningSystem',
- data() {
- return {
- showDetail: false,
- currentWarning: null,
- warnings: [
- {
- id: 'W001',
- title: '椤圭洰棰勭畻瓒呮敮棰勮',
- type: '璐㈠姟棰勮',
- level: 'red',
- levelText: '绾㈣壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '闄堝織寮�',
- description: 'A椤圭洰棰勭畻鎵ц鐜囧凡杈�95%锛岄璁″皢瓒呭嚭棰勭畻鑼冨洿銆�',
- impact: '褰卞搷椤圭洰鏁翠綋璐㈠姟鎸囨爣锛屽彲鑳藉鑷撮」鐩簭鎹�',
- suggestions: '鏆傚仠闈炲繀瑕佹敮鍑猴紝浼樺寲璧勬簮閰嶇疆锛岀敵璇烽绠楄皟鏁�'
- },
- {
- id: 'W002',
- title: '鍚堝悓鍒版湡棰勮',
- type: '鍚堣棰勮',
- level: 'orange',
- levelText: '姗欒壊棰勮',
- status: 'processing',
- statusText: '澶勭悊涓�',
- responsible: '鏉庝富绠�',
- description: '涓庝緵搴斿晢B鐨勫悎鍚屽皢浜�2024骞�1鏈�25鏃ュ埌鏈熴��',
- impact: '褰卞搷渚涘簲閾剧ǔ瀹氭�э紝鍙兘瀵艰嚧鏈嶅姟涓柇',
- suggestions: '璇勪及渚涘簲鍟嗚〃鐜帮紝鍑嗗缁鏉愭枡锛屽埗瀹氬閫夋柟妗�'
- },
- {
- id: 'W003',
- title: '璁惧缁存姢棰勮',
- type: '杩愯惀棰勮',
- level: 'yellow',
- levelText: '榛勮壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '鐜嬪伐绋嬪笀',
- description: '鐢熶骇绾胯澶嘋宸茶繍琛�8000灏忔椂锛屾帴杩戠淮鎶ゅ懆鏈熴��',
- impact: '鍙兘褰卞搷鐢熶骇鏁堢巼鍜屼骇鍝佽川閲�',
- suggestions: '瀹夋帓缁存姢鏃堕棿锛屽噯澶囧浠讹紝鍒跺畾缁存姢璁″垝'
- },
- {
- id: 'W004',
- title: '浜哄憳閰嶇疆棰勮',
- type: '杩愯惀棰勮',
- level: 'green',
- levelText: '缁胯壊棰勮',
- status: 'resolved',
- statusText: '宸茶В鍐�',
- responsible: '璧礖R',
- description: '鎶�鏈儴闂ㄤ汉鍛橀厤缃厖瓒筹紝椤圭洰杩涘害姝e父銆�',
- impact: '鏃犺礋闈㈠奖鍝�',
- suggestions: '缁х画鐩戞帶浜哄憳閰嶇疆鎯呭喌'
- },
- {
- id: 'W005',
- title: '璐ㄩ噺浜嬫晠棰勮',
- type: '杩愯惀棰勮',
- level: 'red',
- levelText: '绾㈣壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '闄堝織寮�',
- description: '浜у搧D鍦ㄥ鎴风幇鍦哄嚭鐜拌川閲忛棶棰樸��',
- impact: '褰卞搷瀹㈡埛婊℃剰搴︼紝鍙兘閫犳垚缁忔祹鎹熷け',
- suggestions: '绔嬪嵆鍙洖闂浜у搧锛屽垎鏋愬師鍥狅紝鍒跺畾鏀硅繘鎺柦'
- }
- ]
- }
- },
- methods: {
- viewDetail(warning) {
- this.currentWarning = warning
- this.showDetail = true
- }
- }
-}
-</script>
-
-<style scoped>
-.warning-system {
- padding: 20px;
- max-width: 1200px;
- margin: 0 auto;
-}
-
-h2 {
- color: #333;
- margin-bottom: 30px;
-}
-
-.stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.stat-card {
- padding: 20px;
- border-radius: 8px;
- color: white;
- text-align: center;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
-}
-
-.stat-card.red { background: linear-gradient(135deg, #ff6b6b, #ee5a52); }
-.stat-card.orange { background: linear-gradient(135deg, #ffa726, #ff9800); }
-.stat-card.yellow { background: linear-gradient(135deg, #ffd54f, #ffc107); }
-.stat-card.green { background: linear-gradient(135deg, #66bb6a, #4caf50); }
-
-.stat-card .number {
- display: block;
- font-size: 32px;
- font-weight: bold;
- margin-bottom: 8px;
-}
-
-.stat-card .label {
- font-size: 14px;
- opacity: 0.9;
-}
-
-.warning-list h3 {
- margin-bottom: 20px;
- color: #333;
-}
-
-table {
- width: 100%;
- border-collapse: collapse;
- background: white;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
-}
-
-th, td {
- padding: 12px;
- text-align: left;
- border-bottom: 1px solid #eee;
-}
-
-th {
- background: #f8f9fa;
- font-weight: 600;
- color: #333;
-}
-
-.level-tag, .status-tag {
- padding: 4px 8px;
- border-radius: 4px;
- font-size: 12px;
- color: white;
-}
-
-.level-tag.red { background: #f56c6c; }
-.level-tag.orange { background: #e6a23c; }
-.level-tag.yellow { background: #e6a23c; }
-.level-tag.green { background: #67c23a; }
-
-.status-tag.pending { background: #f56c6c; }
-.status-tag.processing { background: #e6a23c; }
-.status-tag.resolved { background: #67c23a; }
-
-button {
- padding: 6px 12px;
- margin: 0 4px;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 12px;
- background: #409eff;
- color: white;
-}
-
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0,0,0,0.5);
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.modal-content {
- background: white;
- padding: 30px;
- border-radius: 8px;
- max-width: 600px;
- width: 90%;
- max-height: 80vh;
- overflow-y: auto;
-}
-
-.modal-content h3 {
- margin-bottom: 20px;
- color: #333;
-}
-
-.modal-content p {
- margin-bottom: 15px;
- line-height: 1.6;
-}
-
-.modal-content strong {
- color: #333;
-}
-
-.modal-content button {
- background: #409eff;
- color: white;
- padding: 10px 20px;
- font-size: 14px;
-}
-</style>
diff --git a/src/views/customerService/afterSalesHandling/components/formDia.vue b/src/views/customerService/afterSalesHandling/components/formDia.vue
deleted file mode 100644
index cfdb01c..0000000
--- a/src/views/customerService/afterSalesHandling/components/formDia.vue
+++ /dev/null
@@ -1,212 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鍞悗澶勭悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙嶉鏃堕棿锛�" prop="feedbackDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="checkUserId">
- <el-select
- v-model="form.checkUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闂鎻忚堪锛�" prop="proDesc">
- <el-input
- v-model="form.proDesc"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="disRes">
- <el-input
- v-model="form.disRes"
- placeholder="璇疯緭鍏�"
- clearable
- :disabled="operationType === 'view'"
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="disposeUserId">
- <el-select
- v-model="form.disposeUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃堕棿锛�" prop="disDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.disDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceDispose, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- feedbackDate: "",
- checkUserId: "",
- customerName: "",
- proDesc: "",
- disposeUserId: "",
- disDate: "",
- disRes: "",
- },
- rules: {
- feedbackDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- checkUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- customerName: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- proDesc: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- disRes: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- disposeUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- disDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- form.value.disposeUserId = userStore.id;
- form.value.disDate = getCurrentDate();
-}
-// const setName = (code) => {
-// const index = userList.value.findIndex(item => item.deviceModel === code);
-// if (index > -1) {
-// console.log(userList)
-// form.value.name = userList.value[index].deviceName;
-// }
-// }
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- afterSalesServiceDispose(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/afterSalesHandling/index.vue b/src/views/customerService/afterSalesHandling/index.vue
deleted file mode 100644
index 818270d..0000000
--- a/src/views/customerService/afterSalesHandling/index.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙嶉鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span class="search_title ml10">澶勭悊鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.disDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span style = "margin-left: 10px;" class="search_title">澶勭悊鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呭鐞�" :value="1"></el-option>
- <el-option label="宸插鐞�" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/customerService/afterSalesHandling/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {afterSalesServiceDelete, afterSalesServiceListPage} from "@/api/customerService/index.js";
-import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- feedbackDate: "",
- disDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "澶勭悊鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "寰呭鐞�";
- } else if (params == 2) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "danger";
- } else if (params == 2) {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍙嶉鏃ユ湡",
- prop: "feedbackDate",
- width: 150,
- },
- {
- label: "鐧昏浜�",
- prop: "checkNickName",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "闂鎻忚堪",
- prop: "proDesc",
- width:300
- },
- {
- label: "鍏宠仈閮ㄩ棬",
- prop: "deptName",
- width: 200,
- },
- {
- label: "澶勭悊浜�",
- prop: "disposeNickName",
- },
- {
- label: "澶勭悊缁撴灉",
- prop: "disRes",
- width: 200,
- },
- {
- label: "澶勭悊鏃ユ湡",
- prop: "disDate",
- width: 150,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 120,
- operation: [
- {
- name: "澶勭悊",
- type: "text",
- clickFun: (row) => {
- openForm("approve", row);
- },
- disabled: (row) => {
- return row.status !== 1
- }
- },
- {
- name: "鏌ョ湅",
- type: "text",
- clickFun: (row) => {
- openForm("view", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- afterSalesServiceListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- afterSalesServiceDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
deleted file mode 100644
index a37002b..0000000
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鍞悗鐧昏"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙嶉鏃堕棿锛�" prop="feedbackDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="checkUserId">
- <el-select
- v-model="form.checkUserId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闂鎻忚堪锛�" prop="proDesc">
- <el-input
- v-model="form.proDesc"
- placeholder="璇疯緭鍏�"
- clearable
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- feedbackDate: "",
- checkUserId: "",
- customerName: "",
- proDesc: "",
- },
- rules: {
- feedbackDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- checkUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- customerName: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- proDesc: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- form.value.checkUserId = userStore.id;
- form.value.feedbackDate = getCurrentDate();
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-// const setName = (code) => {
-// const index = userList.value.findIndex(item => item.deviceModel === code);
-// if (index > -1) {
-// console.log(userList)
-// form.value.name = userList.value[index].deviceName;
-// }
-// }
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- afterSalesServiceAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- afterSalesServiceUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/feedbackRegistration/index.vue b/src/views/customerService/feedbackRegistration/index.vue
deleted file mode 100644
index 780de93..0000000
--- a/src/views/customerService/feedbackRegistration/index.vue
+++ /dev/null
@@ -1,212 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙嶉鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span style="margin-left: 10px;" class="search_title">澶勭悊鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呭鐞�" :value="1"></el-option>
- <el-option label="宸插鐞�" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/customerService/feedbackRegistration/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {afterSalesServiceDelete, afterSalesServiceListPage} from "@/api/customerService/index.js";
-import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- feedbackDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "澶勭悊鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "寰呭鐞�";
- } else if (params == 2) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "danger";
- } else if (params == 2) {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍙嶉鏃ユ湡",
- prop: "feedbackDate",
- width: 150,
- },
- {
- label: "鐧昏浜�",
- prop: "checkNickName",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "闂鎻忚堪",
- prop: "proDesc",
- width:300
- },
- {
- label: "鍏宠仈閮ㄩ棬",
- prop: "deptName",
- width: 200,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.checkUserId !== userStore.id || row.status !== 1
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- afterSalesServiceListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.checkUserId !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- afterSalesServiceDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/demo/fakePage/index.vue b/src/views/demo/fakePage/index.vue
deleted file mode 100644
index 42cef72..0000000
--- a/src/views/demo/fakePage/index.vue
+++ /dev/null
@@ -1,248 +0,0 @@
-<template>
- <div class="app-container">
- <el-card shadow="never">
- <div class="toolbar">
- <el-input
- v-model="query.keyword"
- placeholder="鎼滅储鍚嶇О/绫诲埆"
- clearable
- style="width: 240px"
- @keyup.enter="handleSearch"
- />
- <el-select
- v-model="query.status"
- placeholder="鐘舵��"
- clearable
- style="width: 140px; margin-left: 12px"
- >
- <el-option label="鍚敤" value="鍚敤" />
- <el-option label="鍋滅敤" value="鍋滅敤" />
- </el-select>
- <el-button type="primary" style="margin-left: 12px" @click="handleSearch">鏌ヨ</el-button>
- <el-button @click="resetQuery">閲嶇疆</el-button>
- <el-button type="success" plain style="float: right" @click="openCreate">鏂板</el-button>
- </div>
-
- <el-table :data="pagedList" border style="width: 100%" height="480">
- <el-table-column prop="id" label="缂栧彿" width="90" sortable />
- <el-table-column prop="name" label="鍚嶇О" min-width="140" />
- <el-table-column prop="category" label="绫诲埆" width="120" />
- <el-table-column prop="stock" label="搴撳瓨" width="100" sortable />
- <el-table-column prop="price" label="鍗曚环(楼)" width="120">
- <template #default="scope">{{ formatPrice(scope.row.price) }}</template>
- </el-table-column>
- <el-table-column label="鐘舵��" width="120">
- <template #default="scope">
- <el-tag :type="scope.row.status === '鍚敤' ? 'success' : 'info'">{{ scope.row.status }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="updatedAt" label="鏇存柊鏃堕棿" min-width="160" />
- <el-table-column label="鎿嶄綔" width="180" fixed="right">
- <template #default="scope">
- <el-button link type="primary" @click="openEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <div class="pagination">
- <el-pagination
- background
- layout="total, sizes, prev, pager, next, jumper"
- :total="filteredList.length"
- :page-sizes="[5, 10, 20, 50]"
- :page-size="pager.pageSize"
- :current-page="pager.pageNum"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="isEdit ? '缂栬緫' : '鏂板'" width="520px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="90px">
- <el-form-item label="鍚嶇О" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
- </el-form-item>
- <el-form-item label="绫诲埆" prop="category">
- <el-select v-model="form.category" placeholder="璇烽�夋嫨绫诲埆" style="width: 100%">
- <el-option label="鍘熸枡" value="鍘熸枡" />
- <el-option label="鍗婃垚鍝�" value="鍗婃垚鍝�" />
- <el-option label="鎴愬搧" value="鎴愬搧" />
- </el-select>
- </el-form-item>
- <el-form-item label="搴撳瓨" prop="stock">
- <el-input v-model.number="form.stock" type="number" min="0" />
- </el-form-item>
- <el-form-item label="鍗曚环(楼)" prop="price">
- <el-input v-model.number="form.price" type="number" min="0" step="0.01" />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio label="鍚敤">鍚敤</el-radio>
- <el-radio label="鍋滅敤">鍋滅敤</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- </template>
- </el-dialog>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, computed, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-defineOptions({ name: 'FakePage' })
-
-const query = reactive({
- keyword: '',
- status: ''
-})
-
-const pager = reactive({
- pageNum: 1,
- pageSize: 10
-})
-
-const allList = ref(generateMockData())
-
-const filteredList = computed(() => {
- const keyword = (query.keyword || '').trim()
- const status = query.status
- return allList.value.filter(item => {
- const hitKeyword = !keyword || item.name.includes(keyword) || item.category.includes(keyword)
- const hitStatus = !status || item.status === status
- return hitKeyword && hitStatus
- })
-})
-
-const pagedList = computed(() => {
- const start = (pager.pageNum - 1) * pager.pageSize
- const end = start + pager.pageSize
- return filteredList.value.slice(start, end)
-})
-
-function handleSearch() {
- pager.pageNum = 1
-}
-
-function resetQuery() {
- query.keyword = ''
- query.status = ''
- pager.pageNum = 1
-}
-
-function handleSizeChange(size) {
- pager.pageSize = size
- pager.pageNum = 1
-}
-
-function handleCurrentChange(page) {
- pager.pageNum = page
-}
-
-function formatPrice(val) {
- return Number(val || 0).toFixed(2)
-}
-
-// 鏂板/缂栬緫
-const dialogVisible = ref(false)
-const isEdit = ref(false)
-const formRef = ref()
-const form = reactive({ id: null, name: '', category: '', stock: 0, price: 0, status: '鍚敤' })
-
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
- category: [{ required: true, message: '璇烽�夋嫨绫诲埆', trigger: 'change' }],
- stock: [{ required: true, message: '璇疯緭鍏ュ簱瀛�', trigger: 'blur' }],
- price: [{ required: true, message: '璇疯緭鍏ュ崟浠�', trigger: 'blur' }]
-}
-
-function openCreate() {
- isEdit.value = false
- Object.assign(form, { id: null, name: '', category: '', stock: 0, price: 0, status: '鍚敤' })
- dialogVisible.value = true
- nextTick(() => formRef.value?.clearValidate?.())
-}
-
-function openEdit(row) {
- isEdit.value = true
- Object.assign(form, JSON.parse(JSON.stringify(row)))
- dialogVisible.value = true
- nextTick(() => formRef.value?.clearValidate?.())
-}
-
-function submitForm() {
- formRef.value?.validate?.((valid) => {
- if (!valid) return
- if (isEdit.value) {
- const index = allList.value.findIndex(x => x.id === form.id)
- if (index > -1) {
- allList.value[index] = { ...form, updatedAt: nowString() }
- ElMessage.success('宸蹭繚瀛�')
- }
- } else {
- const newId = Date.now()
- allList.value.unshift({ ...form, id: newId, updatedAt: nowString() })
- ElMessage.success('宸叉柊澧�')
- }
- dialogVisible.value = false
- })
-}
-
-function handleDelete(row) {
- ElMessageBox.confirm(`纭鍒犻櫎銆�${row.name}銆戝悧锛焋, '鎻愮ず', { type: 'warning' })
- .then(() => {
- allList.value = allList.value.filter(x => x.id !== row.id)
- ElMessage.success('宸插垹闄�')
- })
- .catch(() => {})
-}
-
-function generateMockData() {
- const categories = ['鍘熸枡', '鍗婃垚鍝�', '鎴愬搧']
- const statusOptions = ['鍚敤', '鍋滅敤']
- const list = []
- for (let i = 1; i <= 36; i++) {
- list.push({
- id: i,
- name: `鐗╂枡-${i.toString().padStart(3, '0')}`,
- category: categories[i % categories.length],
- stock: Math.floor(Math.random() * 1000),
- price: (Math.random() * 500 + 10).toFixed(2),
- status: statusOptions[i % 2],
- updatedAt: nowString()
- })
- }
- return list
-}
-
-function nowString() {
- const d = new Date()
- const yyyy = d.getFullYear()
- const MM = String(d.getMonth() + 1).padStart(2, '0')
- const dd = String(d.getDate()).padStart(2, '0')
- const hh = String(d.getHours()).padStart(2, '0')
- const mm = String(d.getMinutes()).padStart(2, '0')
- const ss = String(d.getSeconds()).padStart(2, '0')
- return `${yyyy}-${MM}-${dd} ${hh}:${mm}:${ss}`
-}
-</script>
-
-<style scoped>
-.toolbar {
- margin-bottom: 12px;
-}
-.pagination {
- margin-top: 12px;
- text-align: right;
-}
-</style>
-
-
-
diff --git a/src/views/energyManagement/dynamicEnergySaving/index.vue b/src/views/energyManagement/dynamicEnergySaving/index.vue
deleted file mode 100644
index b641276..0000000
--- a/src/views/energyManagement/dynamicEnergySaving/index.vue
+++ /dev/null
@@ -1,659 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 杈圭紭璁$畻鐘舵�佺洃鎺� -->
- <el-row :gutter="20" class="status-section">
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><Monitor /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">杈圭紭鏈嶅姟鍣ㄧ姸鎬�</div>
- <div class="status-value" :class="edgeServerStatus.status">
- {{ edgeServerStatus.status === 'online' ? '鍦ㄧ嚎' : '绂荤嚎' }}
- </div>
- <div class="status-detail">鏈�鍚庡績璺�: {{ formatTime(edgeServerStatus.lastHeartbeat) }}</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><Cpu /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">妯″瀷杩愯鐘舵��</div>
- <div class="status-value" :class="modelStatus.status">
- {{ modelStatus.status === 'running' ? '杩愯涓�' : '宸插仠姝�' }}
- </div>
- <div class="status-detail">杩愯妯″瀷: {{ modelStatus.modelCount }}涓�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><TrendCharts /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">鑺傝兘鏁堟灉</div>
- <div class="status-value success">{{ energySavingRate.toFixed(1) }}%</div>
- <div class="status-detail">绱鑺傝兘: {{ totalEnergySaved.toFixed(1) }}kWh</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 娉ㄦ按娉甸鐜囦紭鍖栨帶鍒� -->
- <el-card class="control-section">
- <template #header>
- <span>娉ㄦ按娉甸鐜囦紭鍖栨帶鍒�</span>
- </template>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <div class="pump-control">
- <h4>瀹炴椂鍙傛暟鐩戞帶</h4>
- <el-form label-width="120px">
- <el-form-item label="鍦板眰鍘嬪姏 (MPa)">
- <el-input v-model="pumpData.formationPressure" readonly>
- <template #append>MPa</template>
- </el-input>
- </el-form-item>
- <el-form-item label="褰撳墠娉甸�� (Hz)">
- <el-input v-model="pumpData.currentFrequency" readonly>
- <template #append>Hz</template>
- </el-input>
- </el-form-item>
- <el-form-item label="浼樺寲鍚庢车閫� (Hz)">
- <el-input v-model="pumpData.optimizedFrequency" readonly>
- <template #append>Hz</template>
- </el-input>
- </el-form-item>
- <el-form-item label="鑳借�楅檷浣�">
- <el-progress
- :percentage="pumpData.energyReduction"
- :color="getProgressColor"
- :format="format => `${format}%`"
- />
- </el-form-item>
- <el-form-item label="娴侀噺 (m鲁/h)">
- <el-input v-model="pumpData.flowRate" readonly>
- <template #append>m鲁/h</template>
- </el-input>
- </el-form-item>
- <el-form-item label="鍔熺巼 (kW)">
- <el-input v-model="pumpData.power" readonly>
- <template #append>kW</template>
- </el-input>
- </el-form-item>
- </el-form>
- </div>
- </el-col>
-
- <el-col :span="12">
- <div class="pump-chart">
- <h4>棰戠巼浼樺寲瓒嬪娍</h4>
- <div ref="frequencyChart" style="height: 300px;"></div>
- </div>
- </el-col>
- </el-row>
-
- <el-row :gutter="20" class="control-buttons">
- <el-col :span="24">
- <el-button
- type="primary"
- :disabled="!canControl"
- @click="applyOptimization"
- >
- 搴旂敤浼樺寲璁剧疆
- </el-button>
- <el-button
- type="warning"
- :disabled="!canControl"
- @click="emergencyStop"
- >
- 绱ф�ュ仠姝�
- </el-button>
- <el-button
- type="info"
- @click="showOptimizationHistory"
- >
- 浼樺寲鍘嗗彶
- </el-button>
- <el-button
- type="success"
- @click="toggleAutoRefresh"
- >
- {{ autoRefreshStatus ? '鍋滄鑷姩鍒锋柊' : '寮�鍚嚜鍔ㄥ埛鏂�' }}
- </el-button>
- </el-col>
- </el-row>
- </el-card>
-
- <!-- 杈圭紭璁$畻妯″瀷閰嶇疆 -->
- <el-card class="model-section">
- <template #header>
- <span>杈圭紭璁$畻妯″瀷閰嶇疆</span>
- </template>
-
- <el-table :data="modelConfigs" style="width: 100%">
- <el-table-column prop="modelName" label="妯″瀷鍚嶇О" />
- <el-table-column prop="version" label="鐗堟湰" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '婵�娲�' : '寰呮満' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="accuracy" label="鍑嗙‘鐜�" />
- <el-table-column prop="lastUpdate" label="鏈�鍚庢洿鏂�" />
- <el-table-column label="鎿嶄綔">
- <template #default="scope">
- <el-button
- size="small"
- @click="updateModel(scope.row)"
- >
- 鏇存柊妯″瀷
- </el-button>
- <el-button
- size="small"
- type="danger"
- @click="deleteModel(scope.row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 鑳借�楀垎鏋愬浘琛� -->
- <el-card class="analysis-section">
- <template #header>
- <span>鑳借�楀垎鏋�</span>
- </template>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <div ref="energyChart" style="height: 400px;"></div>
- </el-col>
- <el-col :span="12">
- <div ref="savingChart" style="height: 400px;"></div>
- </el-col>
- </el-row>
- </el-card>
-
- <!-- 浼樺寲鍘嗗彶瀵硅瘽妗� -->
- <el-dialog v-model="historyDialogVisible" title="浼樺寲鍘嗗彶璁板綍" width="80%">
- <el-table :data="optimizationHistory" style="width: 100%">
- <el-table-column prop="timestamp" label="鏃堕棿" />
- <el-table-column prop="formationPressure" label="鍦板眰鍘嬪姏 (MPa)" />
- <el-table-column prop="oldFrequency" label="鍘熼鐜� (Hz)" />
- <el-table-column prop="newFrequency" label="鏂伴鐜� (Hz)" />
- <el-table-column prop="energySaved" label="鑺傝兘 (kWh)" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'success' ? 'success' : 'warning'">
- {{ scope.row.status === 'success' ? '鎴愬姛' : '澶辫触' }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onUnmounted, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Monitor, Cpu, TrendCharts } from '@element-plus/icons-vue'
-import * as echarts from 'echarts'
-
-// 鍝嶅簲寮忔暟鎹�
-const edgeServerStatus = ref({ status: 'online', lastHeartbeat: Date.now() })
-const modelStatus = ref({ status: 'running', modelCount: 3 })
-const energySavingRate = ref(15.8)
-const totalEnergySaved = ref(1250.5)
-const pumpData = ref({
- formationPressure: 25.6,
- currentFrequency: 45.2,
- optimizedFrequency: 42.1,
- energyReduction: 23,
- flowRate: 180.5,
- power: 85.3
-})
-
-const modelConfigs = ref([
- {
- modelName: '娉ㄦ按娉甸鐜囦紭鍖栨ā鍨�',
- version: 'v2.1.0',
- status: 'active',
- accuracy: '94.2%',
- lastUpdate: '2025-01-15 14:30:00'
- },
- {
- modelName: '鍦板眰鍘嬪姏棰勬祴妯″瀷',
- version: 'v1.8.5',
- status: 'active',
- accuracy: '91.7%',
- lastUpdate: '2025-01-14 09:15:00'
- },
- {
- modelName: '鑳借�楀垎鏋愭ā鍨�',
- version: 'v2.0.3',
- status: 'standby',
- accuracy: '89.3%',
- lastUpdate: '2025-01-13 16:45:00'
- }
-])
-
-const historyDialogVisible = ref(false)
-const optimizationHistory = ref([])
-
-// 鍥捐〃寮曠敤
-const frequencyChart = ref(null)
-const energyChart = ref(null)
-const savingChart = ref(null)
-
-// 鑷姩鍒锋柊鐩稿叧
-const autoRefreshStatus = ref(true)
-const autoRefreshTimer = ref(null)
-const chartInstances = ref([])
-
-// 璁$畻灞炴��
-const canControl = computed(() => {
- return edgeServerStatus.value.status === 'online' && modelStatus.value.status === 'running'
-})
-
-const getProgressColor = computed(() => {
- return (percentage) => {
- if (percentage < 20) return '#909399'
- if (percentage < 40) return '#E6A23C'
- if (percentage < 60) return '#409EFF'
- return '#67C23A'
- }
-})
-
-// 鐢熸垚妯℃嫙鏁版嵁
-const generateMockData = () => {
- // 鐢熸垚闅忔満鍦板眰鍘嬪姏 (20-30 MPa)
- const formationPressure = 20 + Math.random() * 10
-
- // 鏍规嵁鍦板眰鍘嬪姏璁$畻浼樺寲棰戠巼
- const baseFrequency = 40 + (formationPressure - 25) * 2
- const currentFrequency = baseFrequency + (Math.random() - 0.5) * 4
- const optimizedFrequency = Math.max(35, baseFrequency - Math.random() * 3)
-
- // 璁$畻鑳借�楅檷浣�
- const energyReduction = Math.round((currentFrequency - optimizedFrequency) / currentFrequency * 100)
-
- // 璁$畻娴侀噺鍜屽姛鐜�
- const flowRate = 150 + Math.random() * 60
- const power = 70 + Math.random() * 30
-
- // 鏇存柊娉垫暟鎹�
- pumpData.value = {
- formationPressure: parseFloat(formationPressure.toFixed(1)),
- currentFrequency: parseFloat(currentFrequency.toFixed(1)),
- optimizedFrequency: parseFloat(optimizedFrequency.toFixed(1)),
- energyReduction: Math.min(energyReduction, 35),
- flowRate: parseFloat(flowRate.toFixed(1)),
- power: parseFloat(power.toFixed(1))
- }
-
- // 鏇存柊鑺傝兘鏁堟灉
- energySavingRate.value = 12 + Math.random() * 8
- totalEnergySaved.value += Math.random() * 2
-
- // 鏇存柊杈圭紭鏈嶅姟鍣ㄧ姸鎬�
- edgeServerStatus.value.lastHeartbeat = Date.now()
-
- // 闅忔満鏇存柊妯″瀷鐘舵��
- if (Math.random() > 0.95) {
- modelStatus.value.modelCount = Math.max(1, modelStatus.value.modelCount + (Math.random() > 0.5 ? 1 : -1))
- }
-
- // 娣诲姞浼樺寲鍘嗗彶璁板綍
- if (Math.random() > 0.7) {
- addOptimizationHistory()
- }
-
- // 鏇存柊鍥捐〃鏁版嵁
- updateCharts()
-}
-
-// 娣诲姞浼樺寲鍘嗗彶璁板綍
-const addOptimizationHistory = () => {
- const timestamp = new Date().toLocaleString()
- const record = {
- timestamp,
- formationPressure: pumpData.value.formationPressure,
- oldFrequency: pumpData.value.currentFrequency,
- newFrequency: pumpData.value.optimizedFrequency,
- energySaved: parseFloat((Math.random() * 5 + 1).toFixed(2)),
- status: Math.random() > 0.1 ? 'success' : 'failed'
- }
-
- optimizationHistory.value.unshift(record)
-
- // 淇濇寔鏈�澶�100鏉¤褰�
- if (optimizationHistory.value.length > 100) {
- optimizationHistory.value = optimizationHistory.value.slice(0, 100)
- }
-}
-
-// 鏇存柊鍥捐〃鏁版嵁
-const updateCharts = () => {
- chartInstances.value.forEach(instance => {
- if (instance && instance.setOption) {
- // 杩欓噷鍙互鏇存柊鍥捐〃鏁版嵁
- // 涓轰簡绠�鍖栵紝鎴戜滑鍙槸閲嶆柊鍒濆鍖栧浘琛�
- }
- })
-}
-
-// 鏂规硶
-const refreshData = () => {
- generateMockData()
- ElMessage.success('鏁版嵁鍒锋柊鎴愬姛')
-}
-
-const applyOptimization = async () => {
- try {
- await ElMessageBox.confirm('纭畾瑕佸簲鐢ㄥ綋鍓嶇殑浼樺寲璁剧疆鍚楋紵', '纭鎿嶄綔', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
-
- // 搴旂敤浼樺寲璁剧疆
- pumpData.value.currentFrequency = pumpData.value.optimizedFrequency
- ElMessage.success('浼樺寲璁剧疆搴旂敤鎴愬姛')
- refreshData()
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('搴旂敤浼樺寲璁剧疆澶辫触')
- }
- }
-}
-
-const emergencyStop = async () => {
- try {
- await ElMessageBox.confirm('纭畾瑕佺揣鎬ュ仠姝㈡墍鏈夋敞姘存车鍚楋紵', '绱ф�ユ搷浣�', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'error'
- })
-
- // 鎵ц绱ф�ュ仠姝㈤�昏緫
- pumpData.value.currentFrequency = 0
- pumpData.value.optimizedFrequency = 0
- ElMessage.success('绱ф�ュ仠姝㈡墽琛屾垚鍔�')
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('绱ф�ュ仠姝㈡墽琛屽け璐�')
- }
- }
-}
-
-const showOptimizationHistory = () => {
- historyDialogVisible.value = true
-}
-
-const updateModel = (model) => {
- ElMessage.info(`鏇存柊妯″瀷: ${model.modelName}`)
-}
-
-const deleteModel = async (model) => {
- try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆā鍨� ${model.modelName} 鍚楋紵`, '纭鍒犻櫎', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
-
- const index = modelConfigs.value.findIndex(m => m.modelName === model.modelName)
- if (index > -1) {
- modelConfigs.value.splice(index, 1)
- ElMessage.success('妯″瀷鍒犻櫎鎴愬姛')
- }
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('妯″瀷鍒犻櫎澶辫触')
- }
- }
-}
-
-const toggleAutoRefresh = () => {
- autoRefreshStatus.value = !autoRefreshStatus.value
- if (autoRefreshStatus.value) {
- startAutoRefresh()
- ElMessage.success('鑷姩鍒锋柊宸插紑鍚�')
- } else {
- stopAutoRefresh()
- ElMessage.info('鑷姩鍒锋柊宸插叧闂�')
- }
-}
-
-const startAutoRefresh = () => {
- stopAutoRefresh() // 鍏堝仠姝箣鍓嶇殑瀹氭椂鍣�
- autoRefreshTimer.value = setInterval(() => {
- generateMockData()
- }, 60000) // 1鍒嗛挓 = 60000姣
-}
-
-const stopAutoRefresh = () => {
- if (autoRefreshTimer.value) {
- clearInterval(autoRefreshTimer.value)
- autoRefreshTimer.value = null
- }
-}
-
-const formatTime = (timestamp) => {
- return new Date(timestamp).toLocaleTimeString()
-}
-
-// 鍒濆鍖栧浘琛�
-const initCharts = () => {
- // 棰戠巼浼樺寲瓒嬪娍鍥�
- const frequencyChartInstance = echarts.init(frequencyChart.value)
- const frequencyOption = {
- title: { text: '娉甸鐜囦紭鍖栬秼鍔�' },
- tooltip: { trigger: 'axis' },
- legend: { data: ['褰撳墠棰戠巼', '浼樺寲棰戠巼', '鍦板眰鍘嬪姏'] },
- xAxis: { type: 'category', data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'] },
- yAxis: [
- { type: 'value', name: '棰戠巼 (Hz)' },
- { type: 'value', name: '鍘嬪姏 (MPa)' }
- ],
- series: [
- {
- name: '褰撳墠棰戠巼',
- type: 'line',
- data: [45.2, 44.8, 45.5, 45.1, 44.9, 45.2]
- },
- {
- name: '浼樺寲棰戠巼',
- type: 'line',
- data: [42.1, 41.8, 42.3, 41.9, 41.7, 42.1]
- },
- {
- name: '鍦板眰鍘嬪姏',
- type: 'line',
- yAxisIndex: 1,
- data: [25.6, 25.8, 26.1, 25.9, 25.7, 25.6]
- }
- ]
- }
- frequencyChartInstance.setOption(frequencyOption)
- chartInstances.value.push(frequencyChartInstance)
-
- // 鑳借�楀垎鏋愬浘
- const energyChartInstance = echarts.init(energyChart.value)
- const energyOption = {
- title: { text: '鏃ヨ兘鑰楀姣�' },
- tooltip: { trigger: 'item' },
- legend: { orient: 'vertical', left: 'left',top: 'center' },
- series: [
- {
- name: '鑳借�楀垎甯�',
- type: 'pie',
- radius: '50%',
- data: [
- { value: 45, name: '娉ㄦ按娉�' },
- { value: 25, name: '鐓ф槑绯荤粺' },
- { value: 20, name: '閫氶绯荤粺' },
- { value: 10, name: '鍏朵粬璁惧' }
- ]
- }
- ]
- }
- energyChartInstance.setOption(energyOption)
- chartInstances.value.push(energyChartInstance)
-
- // 鑺傝兘鏁堟灉鍥�
- const savingChartInstance = echarts.init(savingChart.value)
- const savingOption = {
- title: { text: '鑺傝兘鏁堟灉瓒嬪娍' },
- tooltip: { trigger: 'axis' },
- xAxis: { type: 'category', data: ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩'] },
- yAxis: { type: 'value', name: '鑺傝兘鐜� (%)' },
- series: [
- {
- name: '鑺傝兘鐜�',
- type: 'bar',
- data: [12.5, 15.2, 18.7, 16.3, 19.1, 17.8, 15.8]
- }
- ]
- }
- savingChartInstance.setOption(savingOption)
- chartInstances.value.push(savingChartInstance)
-}
-
-// 鐢熸垚鍒濆鍘嗗彶鏁版嵁
-const generateInitialHistory = () => {
- for (let i = 0; i < 20; i++) {
- const timestamp = new Date(Date.now() - i * 3600000).toLocaleString()
- const record = {
- timestamp,
- formationPressure: parseFloat((20 + Math.random() * 10).toFixed(1)),
- oldFrequency: parseFloat((40 + Math.random() * 10).toFixed(1)),
- newFrequency: parseFloat((35 + Math.random() * 8).toFixed(1)),
- energySaved: parseFloat((Math.random() * 5 + 1).toFixed(2)),
- status: Math.random() > 0.1 ? 'success' : 'failed'
- }
- optimizationHistory.value.push(record)
- }
-}
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initCharts()
- generateInitialHistory()
- refreshData()
- if (autoRefreshStatus.value) {
- startAutoRefresh()
- }
-})
-
-onUnmounted(() => {
- stopAutoRefresh()
- chartInstances.value.forEach(instance => {
- if (instance && instance.dispose) {
- instance.dispose()
- }
- })
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-
-
-.status-section {
- margin-bottom: 20px;
-}
-
-.status-card {
- height: 140px;
-}
-
-.status-item {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.status-icon {
- font-size: 48px;
- margin-right: 20px;
- color: #409EFF;
-}
-
-.status-info {
- flex: 1;
-}
-
-.status-title {
- font-size: 14px;
- color: #909399;
- margin-bottom: 8px;
-}
-
-.status-value {
- font-size: 24px;
- font-weight: bold;
- margin-bottom: 8px;
-}
-
-.status-detail {
- font-size: 12px;
- color: #909399;
-}
-
-.status-value.online,
-.status-value.running {
- color: #67C23A;
-}
-
-.status-value.offline,
-.status-value.stopped {
- color: #F56C6C;
-}
-
-.status-value.success {
- color: #67C23A;
-}
-
-.control-section,
-.model-section,
-.analysis-section {
- margin-bottom: 20px;
-}
-
-.pump-control h4,
-.pump-chart h4 {
- margin-bottom: 20px;
- color: #303133;
-}
-
-.control-buttons {
- margin-top: 20px;
- text-align: center;
-}
-
-.control-buttons .el-button {
- margin: 0 10px;
-}
-</style>
diff --git a/src/views/energyManagement/energyArea/index.vue b/src/views/energyManagement/energyArea/index.vue
deleted file mode 100644
index 63feff8..0000000
--- a/src/views/energyManagement/energyArea/index.vue
+++ /dev/null
@@ -1,511 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="openProDia('addOne')"
- style="margin-left: 10px"
- >鏂板鐖跺尯鍩�</el-button
- >
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- margin-top: 10px;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- <div>
- <el-button
- type="primary"
- link
- @click="openProDia('edit', data)"
- >
- 缂栬緫
- </el-button>
- <el-button type="primary" link @click="openModelDia('add','', data.id)">
- 娣诲姞瀛愬尯鍩�
- </el-button>
- <el-button
- v-if="!node.childNodes.length"
- style="margin-left: 4px"
- type="danger"
- link
- @click="remove(node, data)"
- >
- 鍒犻櫎
- </el-button>
- </div>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px" v-if="isShowButton">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板瀛愬尯鍩�
- </el-button>
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog v-model="productDia" title="鍖哄煙" width="400px" @keydown.enter.prevent>
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="鍖哄煙鍚嶇О锛�" prop="areaName">
- <el-input
- v-model="form.areaName"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeProDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="modelDia"
- title="瀛愬尯鍩�"
- width="400px"
- @close="closeModelDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-form-item label="鐖跺尯鍩燂細" prop="fuId">
- <el-cascader v-model="modelForm.fuId" :options="list" :props="{
- value: 'id',
- label: 'label',
- children: 'children',
- checkStrictly: true,
- }" />
- </el-form-item>
- <el-form-item label="鍖哄煙绫诲瀷锛�" prop="areaType">
- <el-select v-model="modelForm.areaType" placeholder="璇烽�夋嫨">
- <el-option v-for="item in area_type" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍖哄煙鍚嶇О锛�" prop="areaName">
- <el-input
- v-model="modelForm.areaName"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import {
- areaAdd,
- areaDelete,
- areaListPage,
- areaListTree,
-} from "@/api/energyManagement/index.js";
-
-const { proxy } = getCurrentInstance();
-const tree = ref(null);
-const containerRef = ref(null);
-
-const productDia = ref(false);
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const search = ref("");
-const currentId = ref("");
-const currentParentId = ref("");
-const operationType = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const {area_type} = proxy.useDict("area_type")
-const tableColumn = ref([
- {
- label: "鍖哄煙鍚嶇О",
- prop: "areaName",
- },
- {
- label: "鍖哄煙绫诲瀷",
- prop: "areaType",
- dataType: "tag",
- formatData: (row) => {
- return area_type.value.find(item => item.value == row)?.label;
- }
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const isShowButton = ref(false);
-const selectedRows = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
- total: 0,
-});
-const data = reactive({
- form: {
- areaName: "",
- },
- rules: {
- areaName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
- modelForm: {
- areaName: "",
- fuId: "",
- },
- modelRules: {
- areaName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- fuId: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules, modelForm, modelRules } = toRefs(data);
-
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- areaListTree()
- .then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- })
- .catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 鎵撳紑浜у搧寮规
-const openProDia = (type, data) => {
- operationType.value = type;
- productDia.value = true;
- form.value.areaName = "";
- if (type === "edit") {
- form.value.areaName = data.areaName;
- }
-};
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
-const openModelDia = (type, data,fatherId) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.fuId = "";
- modelForm.value.areaType = "";
- modelForm.value.areaName = "";
- modelForm.value.id = "";
- modelForm.value.fuId = fatherId;
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 鎻愪氦浜у搧鍚嶇О淇敼
-const submitForm = () => {
- proxy.$refs.formRef.validate((valid) => {
- if (valid) {
- if (operationType.value === "add") {
- form.value.parentId = currentId.value;
- form.value.id = "";
- } else if (operationType.value === "addOne") {
- form.value.id = "";
- form.value.parentId = "";
- } else {
- form.value.id = currentId.value;
- form.value.parentId = "";
- }
- areaAdd(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProDia();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴浜у搧寮规
-const closeProDia = () => {
- proxy.$refs.formRef.resetFields();
- productDia.value = false;
-};
-
-// 鍒犻櫎浜у搧
-const remove = (node, data) => {
- let ids = [];
- ids.push(data.id);
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- areaDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
- isShowButton.value = !(val.children && val.children.length > 0);
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList(true);
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.fuId = currentId.value;
- areaAdd(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ瑙勬牸鍨嬪彿
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = (val = false) => {
- tableLoading.value = true;
- let obj = {
- id: currentId.value,
- fuId:currentId.value,
- current: page.current,
- size: page.size
- }
- if(val){
- delete obj.id;
- }else{
- delete obj.fuId
- }
- areaListPage(obj).then((res) => {
- console.log("res", res);
- tableData.value = res.data.records;
- page.total = res.data.total;
- tableLoading.value = false;
- });
-};
-// 鍒犻櫎瑙勬牸鍨嬪彿
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- areaDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
diff --git a/src/views/energyManagement/energyCockpit/index.vue b/src/views/energyManagement/energyCockpit/index.vue
deleted file mode 100644
index 9281e37..0000000
--- a/src/views/energyManagement/energyCockpit/index.vue
+++ /dev/null
@@ -1,1380 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>鑳芥簮椹鹃┒鑸�</h2>
- <div class="header-info">
- <span class="update-time">鏈�鍚庢洿鏂帮細{{ lastUpdateTime }}</span>
- <el-button type="primary" size="small" @click="refreshData">
- <el-icon><Refresh /></el-icon>
- 鍒锋柊鏁版嵁
- </el-button>
- </div>
- </div>
-
- <!-- 瀹炴椂鑳借�楃洃鎺� -->
- <div class="real-time-monitor">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>鐢靛姏娑堣��</span>
- <el-tag type="success" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ electricityConsumption }}</span>
- <span class="unit">kW路h</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(electricityTrend)" size="small">
- {{ electricityTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(electricityTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>姘存秷鑰�</span>
- <el-tag type="primary" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ waterConsumption }}</span>
- <span class="unit">m鲁</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(waterTrend)" size="small">
- {{ waterTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(waterTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>姘斾綋娑堣��</span>
- <el-tag type="warning" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ gasConsumption }}</span>
- <span class="unit">m鲁</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(gasTrend)" size="small">
- {{ gasTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(gasTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鑳借�楄秼鍔垮垎鏋� -->
- <div class="trend-analysis">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>鑳借�楄秼鍔垮垎鏋�</span>
- <div class="time-selector">
- <el-radio-group v-model="trendTimeUnit" @change="handleTrendTimeChange">
- <el-radio value="hour">灏忔椂</el-radio>
- <el-radio value="day">鏃�</el-radio>
- <el-radio value="week">鍛�</el-radio>
- <el-radio value="month">鏈�</el-radio>
- <el-radio value="year">骞�</el-radio>
- </el-radio-group>
- </div>
- </div>
- </template>
- <div class="chart-container">
- <div ref="trendChart" style="width: 100%; height: 400px;"></div>
- </div>
- </el-card>
- </div>
-
- <!-- 鑳借�楃粺璁′笌鎺掑悕 -->
- <div class="statistics-ranking">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="statistics-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鑳借�楃粺璁℃姤琛�</span>
- <div class="header-actions">
- <el-select v-model="statisticsPeriod" @change="handleStatisticsChange" size="small" style="width: 100px;">
- <el-option label="鏃ョ粺璁�" value="day" />
- <el-option label="鍛ㄧ粺璁�" value="week" />
- <el-option label="鏈堢粺璁�" value="month" />
- <el-option label="骞寸粺璁�" value="year" />
- </el-select>
- </div>
- </div>
- </template>
- <div class="statistics-content">
- <div class="statistics-item">
- <span class="label">鎬昏兘鑰楋細</span>
- <span class="value">{{ totalEnergyConsumption }} kW路h</span>
- </div>
- <div class="statistics-item">
- <span class="label">鍚屾瘮锛�</span>
- <span class="value" :class="getComparisonClass(yearOverYear)">
- {{ yearOverYear > 0 ? '+' : '' }}{{ yearOverYear }}%
- </span>
- </div>
- <div class="statistics-item">
- <span class="label">鐜瘮锛�</span>
- <span class="value" :class="getComparisonClass(monthOverMonth)">
- {{ monthOverMonth > 0 ? '+' : '' }}{{ monthOverMonth }}%
- </span>
- </div>
- <div class="statistics-item">
- <span class="label">鑺傝兘鐜囷細</span>
- <span class="value success">{{ energySavingRate }}%</span>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="ranking-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鑳借�楁帓鍚�</span>
- <el-select v-model="rankingType" @change="handleRankingChange" size="small" style="width: 120px;">
- <el-option label="閮ㄩ棬鎺掑悕" value="department" />
- <el-option label="杞﹂棿鎺掑悕" value="workshop" />
- <el-option label="璁惧鎺掑悕" value="equipment" />
- </el-select>
- </div>
- </template>
- <div class="ranking-list">
- <div v-for="(item, index) in rankingList" :key="index" class="ranking-item">
- <div class="ranking-number" :class="getRankingClass(index + 1)">{{ index + 1 }}</div>
- <div class="ranking-info">
- <div class="ranking-name">{{ item.name }}</div>
- <div class="ranking-value">{{ item.value }} kW路h</div>
- </div>
- <div class="ranking-trend">
- <el-tag :type="getTrendType(item.trend)" size="small">
- {{ item.trend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(item.trend) }}%
- </el-tag>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 寮傚父鍒嗘瀽涓庢櫤鑳芥帶鍒� -->
- <div class="analysis-control">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="abnormal-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">寮傚父鍒嗘瀽</span>
- <el-tag type="danger" size="small">{{ abnormalCount }}涓紓甯�</el-tag>
- </div>
- </template>
- <div class="abnormal-list">
- <div v-for="(item, index) in abnormalList" :key="index" class="abnormal-item">
- <div class="abnormal-icon">
- <el-icon :color="getAbnormalColor(item.level)">
- <Warning v-if="item.level === 'warning'" />
- <CircleClose v-else />
- </el-icon>
- </div>
- <div class="abnormal-content">
- <div class="abnormal-title">{{ item.title }}</div>
- <div class="abnormal-desc">{{ item.description }}</div>
- <div class="abnormal-time">{{ item.time }}</div>
- </div>
- <div class="abnormal-action">
- <el-button link size="small" @click="handleAbnormal(item)">澶勭悊</el-button>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="control-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鏅鸿兘鎺у埗绯荤粺</span>
- <el-switch v-model="autoControlEnabled" @change="handleAutoControlChange" />
- </div>
- </template>
- <div class="control-content">
- <div class="control-item">
- <span class="label">宄拌胺骞崇數浠风鐞嗭細</span>
- <el-tag :type="getPriceType(currentPriceType)" size="small">
- {{ getPriceTypeText(currentPriceType) }}
- </el-tag>
- </div>
- <div class="control-item">
- <span class="label">璐熻嵎棰勬祴锛�</span>
- <span class="value">{{ loadForecast }} kW</span>
- </div>
- <div class="control-item">
- <span class="label">鑷姩鍚仠锛�</span>
- <el-tag :type="autoStartStop ? 'success' : 'info'" size="small">
- {{ autoStartStop ? '宸插惎鐢�' : '宸茬鐢�' }}
- </el-tag>
- </div>
- <div class="control-item">
- <span class="label">鏅鸿兘璋冭妭锛�</span>
- <el-progress :percentage="intelligentAdjustment" :color="getProgressColor" />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鐜繚鎸囨爣 -->
- <div class="environmental-indicators">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>鐜繚鎸囨爣鐩戞帶</span>
- </div>
- </template>
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">纰虫帓鏀鹃噺</div>
- <div class="indicator-value">{{ carbonEmission }} kg</div>
- <div class="indicator-trend">
- <span>鍚屾瘮锛�</span>
- <span :class="getComparisonClass(carbonEmissionTrend)">
- {{ carbonEmissionTrend > 0 ? '+' : '' }}{{ carbonEmissionTrend }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">鐜繚杈炬爣鐜�</div>
- <div class="indicator-value">{{ environmentalCompliance }}%</div>
- <div class="indicator-trend">
- <span>鐩爣锛�</span>
- <span class="success">95%</span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">缁胯壊鑳芥簮鍗犳瘮</div>
- <div class="indicator-value">{{ greenEnergyRatio }}%</div>
- <div class="indicator-trend">
- <span>鐩爣锛�</span>
- <span class="success">30%</span>
- </div>
- </div>
- </el-col>
- </el-row>
- </el-card>
- </div>
-
- <!-- 澶氱淮搴︽姤琛� -->
- <div class="multi-dimensional-reports">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>澶氱淮搴︽姤琛�</span>
- </div>
- </template>
- <div class="report-filters">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item label="鏃堕棿缁村害">
- <el-select v-model="reportTimeDimension" placeholder="閫夋嫨鏃堕棿缁村害">
- <el-option label="灏忔椂" value="hour" />
- <el-option label="鏃�" value="day" />
- <el-option label="鍛�" value="week" />
- <el-option label="鏈�" value="month" />
- <el-option label="骞�" value="year" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="閮ㄩ棬缁村害">
- <el-select v-model="reportDepartmentDimension" placeholder="閫夋嫨閮ㄩ棬">
- <el-option label="鍏ㄩ儴閮ㄩ棬" value="all" />
- <el-option label="鐢熶骇閮�" value="production" />
- <el-option label="鎶�鏈儴" value="technology" />
- <el-option label="琛屾斂閮�" value="administration" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="璁惧缁村害">
- <el-select v-model="reportEquipmentDimension" placeholder="閫夋嫨璁惧绫诲瀷">
- <el-option label="鍏ㄩ儴璁惧" value="all" />
- <el-option label="鐢靛姏璁惧" value="electricity" />
- <el-option label="姘村鐞嗚澶�" value="water" />
- <el-option label="姘斾綋璁惧" value="gas" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item>
- <el-button type="primary" @click="generateReport">鐢熸垚鎶ヨ〃</el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </div>
- <div class="report-preview">
- <div class="report-data">
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">鐢靛姏娑堣��</div>
- <div class="data-value">{{ reportData.electricity }} kW路h</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.electricityTrend)">
- {{ reportData.electricityTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.electricityTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">姘存秷鑰�</div>
- <div class="data-value">{{ reportData.water }} m鲁</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.waterTrend)">
- {{ reportData.waterTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.waterTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">姘斾綋娑堣��</div>
- <div class="data-value">{{ reportData.gas }} m鲁</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.gasTrend)">
- {{ reportData.gasTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.gasTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- </el-row>
-
- <div class="report-chart">
- <div class="chart-title">鑳借�楄秼鍔垮浘</div>
- <div class="chart-bars">
- <div v-for="(item, index) in reportData.chartData" :key="index" class="chart-bar">
- <div class="bar-label">{{ item.label }}</div>
- <div class="bar-container">
- <div class="bar-fill" :style="{ height: item.percentage + '%', backgroundColor: item.color }"></div>
- </div>
- <div class="bar-value">{{ item.value }}</div>
- </div>
- </div>
- </div>
-
- <div class="report-summary">
- <div class="summary-item">
- <span class="summary-label">鎬昏兘鑰楋細</span>
- <span class="summary-value">{{ reportData.totalEnergy }} kW路h</span>
- </div>
- <div class="summary-item">
- <span class="summary-label">骞冲潎鑳借�楋細</span>
- <span class="summary-value">{{ reportData.averageEnergy }} kW路h</span>
- </div>
- <div class="summary-item">
- <span class="summary-label">鑳借�楁晥鐜囷細</span>
- <span class="summary-value">{{ reportData.efficiency }}%</span>
- </div>
- </div>
- </div>
- </div>
- </el-card>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import * as echarts from 'echarts'
-import {
- Refresh,
- Download,
- Warning,
- CircleClose,
- Document,
- Edit,
- Bell
-} from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const lastUpdateTime = ref('')
-const electricityConsumption = ref(0)
-const waterConsumption = ref(0)
-const gasConsumption = ref(0)
-const electricityTrend = ref(0)
-const waterTrend = ref(0)
-const gasTrend = ref(0)
-
-// 瓒嬪娍鍒嗘瀽
-const trendTimeUnit = ref('day')
-const trendChart = ref(null)
-let chartInstance = null
-
-// 缁熻鎶ヨ〃
-const statisticsPeriod = ref('month')
-const totalEnergyConsumption = ref(0)
-const yearOverYear = ref(0)
-const monthOverMonth = ref(0)
-const energySavingRate = ref(0)
-
-// 鑳借�楁帓鍚�
-const rankingType = ref('department')
-const rankingList = ref([])
-
-// 寮傚父鍒嗘瀽
-const abnormalCount = ref(0)
-const abnormalList = ref([])
-
-// 鏅鸿兘鎺у埗
-const autoControlEnabled = ref(true)
-const currentPriceType = ref('peak')
-const loadForecast = ref(0)
-const autoStartStop = ref(true)
-const intelligentAdjustment = ref(0)
-
-// 鐜繚鎸囨爣
-const carbonEmission = ref(0)
-const carbonEmissionTrend = ref(0)
-const environmentalCompliance = ref(0)
-const greenEnergyRatio = ref(0)
-
-// 澶氱淮搴︽姤琛�
-const reportTimeDimension = ref('month')
-const reportDepartmentDimension = ref('all')
-const reportEquipmentDimension = ref('all')
-const reportData = ref({
- electricity: 0,
- water: 0,
- gas: 0,
- electricityTrend: 0,
- waterTrend: 0,
- gasTrend: 0,
- totalEnergy: 0,
- averageEnergy: 0,
- efficiency: 0,
- chartData: []
-})
-
-// 瀹氭椂鍣�
-let updateTimer = null
-
-// 鑾峰彇瓒嬪娍绫诲瀷鏍峰紡
-const getTrendType = (trend) => {
- if (trend > 0) return 'danger'
- if (trend < 0) return 'success'
- return 'info'
-}
-
-// 鑾峰彇瀵规瘮绫诲瀷鏍峰紡
-const getComparisonClass = (value) => {
- if (value > 0) return 'danger'
- if (value < 0) return 'success'
- return 'info'
-}
-
-// 鑾峰彇鎺掑悕鏍峰紡
-const getRankingClass = (rank) => {
- if (rank === 1) return 'ranking-first'
- if (rank === 2) return 'ranking-second'
- if (rank === 3) return 'ranking-third'
- return 'ranking-normal'
-}
-
-// 鑾峰彇寮傚父棰滆壊
-const getAbnormalColor = (level) => {
- return level === 'warning' ? '#E6A23C' : '#F56C6C'
-}
-
-// 鑾峰彇鐢典环绫诲瀷鏍峰紡
-const getPriceType = (type) => {
- const typeMap = {
- peak: 'danger',
- normal: 'warning',
- valley: 'success'
- }
- return typeMap[type] || 'info'
-}
-
-// 鑾峰彇鐢典环绫诲瀷鏂囨湰
-const getPriceTypeText = (type) => {
- const typeMap = {
- peak: '宄版椂',
- normal: '骞虫椂',
- valley: '璋锋椂'
- }
- return typeMap[type] || '鏈煡'
-}
-
-// 鑾峰彇杩涘害鏉¢鑹�
-const getProgressColor = (percentage) => {
- if (percentage < 50) return '#67C23A'
- if (percentage < 80) return '#E6A23C'
- return '#F56C6C'
-}
-
-// 鑾峰彇瓒嬪娍鏍峰紡
-const getTrendClass = (trend) => {
- if (trend > 0) return 'trend-up'
- if (trend < 0) return 'trend-down'
- return 'trend-stable'
-}
-
-// 妯℃嫙鏁版嵁鐢熸垚
-const generateMockData = () => {
- // 瀹炴椂鑳借�楁暟鎹�
- electricityConsumption.value = Math.floor(Math.random() * 1000) + 2000
- waterConsumption.value = Math.floor(Math.random() * 100) + 150
- gasConsumption.value = Math.floor(Math.random() * 50) + 80
-
- // 瓒嬪娍鏁版嵁
- electricityTrend.value = (Math.random() * 20 - 10).toFixed(1)
- waterTrend.value = (Math.random() * 15 - 7.5).toFixed(1)
- gasTrend.value = (Math.random() * 12 - 6).toFixed(1)
-
- // 缁熻鏁版嵁
- totalEnergyConsumption.value = Math.floor(Math.random() * 50000) + 100000
- yearOverYear.value = (Math.random() * 20 - 10).toFixed(1)
- monthOverMonth.value = (Math.random() * 15 - 7.5).toFixed(1)
- energySavingRate.value = (Math.random() * 10 + 5).toFixed(1)
-
- // 鎺掑悕鏁版嵁
- rankingList.value = [
- { name: '鐢熶骇杞﹂棿A', value: Math.floor(Math.random() * 5000) + 10000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鐢熶骇杞﹂棿B', value: Math.floor(Math.random() * 4000) + 8000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鎶�鏈爺鍙戦儴', value: Math.floor(Math.random() * 3000) + 6000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '琛屾斂鍔炲叕鍖�', value: Math.floor(Math.random() * 2000) + 4000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鍚庡嫟淇濋殰鍖�', value: Math.floor(Math.random() * 1500) + 3000, trend: (Math.random() * 20 - 10).toFixed(1) }
- ].sort((a, b) => b.value - a.value)
-
- // 寮傚父鏁版嵁
- abnormalCount.value = Math.floor(Math.random() * 5) + 1
- abnormalList.value = [
- { level: 'warning', title: '鐢靛姏璐熻嵎杩囬珮', description: '鐢熶骇杞﹂棿A鐢靛姏璐熻嵎杈惧埌85%锛屽缓璁鏌ヨ澶囪繍琛岀姸鎬�', time: '2鍒嗛挓鍓�' },
- { level: 'error', title: '姘村帇寮傚父', description: '姘村鐞嗚澶囧帇鍔涘紓甯革紝褰撳墠鍘嬪姏0.3MPa锛屼綆浜庢甯歌寖鍥�', time: '5鍒嗛挓鍓�' }
- ]
-
- // 鏅鸿兘鎺у埗鏁版嵁
- loadForecast.value = Math.floor(Math.random() * 500) + 1500
- intelligentAdjustment.value = Math.floor(Math.random() * 30) + 60
-
- // 鐜繚鎸囨爣
- carbonEmission.value = Math.floor(Math.random() * 1000) + 5000
- carbonEmissionTrend.value = (Math.random() * 15 - 7.5).toFixed(1)
- environmentalCompliance.value = (Math.random() * 5 + 95).toFixed(1)
- greenEnergyRatio.value = (Math.random() * 10 + 25).toFixed(1)
-
- // 鏇存柊鏈�鍚庢洿鏂版椂闂�
- lastUpdateTime.value = new Date().toLocaleString()
-
- // 鍚屾椂鏇存柊鎶ヨ〃鏁版嵁
- generateReportData()
-}
-
-// 鍒濆鍖栬秼鍔垮浘琛�
-const initTrendChart = () => {
- if (chartInstance) {
- chartInstance.dispose()
- }
-
- chartInstance = echarts.init(trendChart.value)
-
- const option = {
- title: {
- text: '鑳借�楄秼鍔垮垎鏋�',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis'
- },
- legend: {
- data: ['鐢靛姏', '姘�', '姘斾綋'],
- bottom: 10
- },
- xAxis: {
- type: 'category',
- data: generateTimeData()
- },
- yAxis: {
- type: 'value',
- name: '娑堣�楅噺'
- },
- series: [
- {
- name: '鐢靛姏',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- },
- {
- name: '姘�',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- },
- {
- name: '姘斾綋',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- }
- ]
- }
-
- chartInstance.setOption(option)
-}
-
-// 鐢熸垚鏃堕棿鏁版嵁
-const generateTimeData = () => {
- const data = []
- const now = new Date()
-
- switch (trendTimeUnit.value) {
- case 'hour':
- for (let i = 23; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 60 * 60 * 1000)
- data.unshift(time.getHours() + ':00')
- }
- break
- case 'day':
- for (let i = 29; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 24 * 60 * 60 * 1000)
- data.unshift(time.getDate() + '鏃�')
- }
- break
- case 'week':
- for (let i = 11; i >= 0; i--) {
- data.unshift(`绗�${12 - i}鍛╜)
- }
- break
- case 'month':
- for (let i = 11; i >= 0; i--) {
- const month = (12 - i) % 12 || 12
- data.unshift(`${month}鏈坄)
- }
- break
- case 'year':
- for (let i = 4; i >= 0; i--) {
- const year = new Date().getFullYear() - i
- data.unshift(`${year}骞碻)
- }
- break
- }
-
- return data
-}
-
-// 鐢熸垚绯诲垪鏁版嵁
-const generateSeriesData = () => {
- const data = []
- const count = trendTimeUnit.value === 'hour' ? 24 :
- trendTimeUnit.value === 'day' ? 30 :
- trendTimeUnit.value === 'week' ? 12 :
- trendTimeUnit.value === 'month' ? 12 : 5
-
- for (let i = 0; i < count; i++) {
- data.push(Math.floor(Math.random() * 1000) + 500)
- }
-
- return data
-}
-
-// 澶勭悊瓒嬪娍鏃堕棿鍙樺寲
-const handleTrendTimeChange = () => {
- nextTick(() => {
- initTrendChart()
- })
-}
-
-// 澶勭悊缁熻鍛ㄦ湡鍙樺寲
-const handleStatisticsChange = () => {
- generateMockData()
-}
-
-// 澶勭悊鎺掑悕绫诲瀷鍙樺寲
-const handleRankingChange = () => {
- // 鏍规嵁绫诲瀷閲嶆柊鐢熸垚鎺掑悕鏁版嵁
- generateMockData()
-}
-
-// 澶勭悊鑷姩鎺у埗鍙樺寲
-const handleAutoControlChange = (value) => {
- ElMessage.success(`鏅鸿兘鎺у埗绯荤粺宸�${value ? '鍚敤' : '绂佺敤'}`)
-}
-
-// 澶勭悊寮傚父
-const handleAbnormal = (item) => {
- ElMessage.info(`姝e湪澶勭悊寮傚父锛�${item.title}`)
-}
-
-// 鍒锋柊鏁版嵁
-const refreshData = () => {
- generateMockData()
- if (chartInstance) {
- initTrendChart()
- }
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 瀵煎嚭缁熻
-const exportStatistics = () => {
- ElMessage.success('缁熻鏁版嵁瀵煎嚭鎴愬姛')
-}
-
-// 瀵煎嚭鐜繚鎶ュ憡
-const exportEnvironmentalReport = () => {
- ElMessage.success('鐜繚鎶ュ憡瀵煎嚭鎴愬姛')
-}
-
-// 鐢熸垚鑷畾涔夋姤琛�
-const generateCustomReport = () => {
- ElMessage.info('鑷畾涔夋姤琛ㄥ姛鑳藉紑鍙戜腑...')
-}
-
-// 璁㈤槄鎶ヨ〃
-const subscribeReport = () => {
- ElMessage.info('鎶ヨ〃璁㈤槄鍔熻兘寮�鍙戜腑...')
-}
-
-// 鐢熸垚鎶ヨ〃鏁版嵁
-const generateReportData = () => {
- // 鐢熸垚鍩虹鏁版嵁
- reportData.value.electricity = Math.floor(Math.random() * 5000) + 8000
- reportData.value.water = Math.floor(Math.random() * 200) + 300
- reportData.value.gas = Math.floor(Math.random() * 100) + 150
-
- // 鐢熸垚瓒嬪娍鏁版嵁
- reportData.value.electricityTrend = (Math.random() * 20 - 10).toFixed(1)
- reportData.value.waterTrend = (Math.random() * 15 - 7.5).toFixed(1)
- reportData.value.gasTrend = (Math.random() * 12 - 6).toFixed(1)
-
- // 璁$畻鎬昏兘鑰楀拰骞冲潎鑳借��
- reportData.value.totalEnergy = reportData.value.electricity + reportData.value.water * 0.1 + reportData.value.gas * 0.05
- reportData.value.averageEnergy = Math.floor(reportData.value.totalEnergy / 3)
- reportData.value.efficiency = (Math.random() * 20 + 80).toFixed(1)
-
- // 鐢熸垚鍥捐〃鏁版嵁
- const labels = ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']
- const colors = ['#409eff', '#67c23a', '#e6a23c', '#f56c6c', '#909399', '#9c27b0', '#ff9800']
-
- reportData.value.chartData = labels.map((label, index) => ({
- label,
- value: Math.floor(Math.random() * 1000) + 500,
- percentage: Math.floor(Math.random() * 40) + 30,
- color: colors[index]
- }))
-}
-
-// 鐢熸垚鎶ヨ〃
-const generateReport = () => {
- generateReportData()
- ElMessage.success('鎶ヨ〃鐢熸垚鎴愬姛')
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// 鍚姩瀹氭椂鏇存柊
-const startAutoUpdate = () => {
- updateTimer = setInterval(() => {
- generateMockData()
- if (chartInstance) {
- initTrendChart()
- }
- }, 60000) // 姣忓垎閽熸洿鏂颁竴娆�
-}
-
-// 鍋滄瀹氭椂鏇存柊
-const stopAutoUpdate = () => {
- if (updateTimer) {
- clearInterval(updateTimer)
- updateTimer = null
- }
-}
-
-// 缁勪欢鎸傝浇
-onMounted(() => {
- generateMockData()
- nextTick(() => {
- initTrendChart()
- })
- startAutoUpdate()
-})
-
-// 缁勪欢鍗歌浇
-onUnmounted(() => {
- stopAutoUpdate()
- if (chartInstance) {
- chartInstance.dispose()
- }
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 12px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 12px;
- padding: 16px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- font-size: 22px;
- }
-
- .header-info {
- display: flex;
- align-items: center;
- gap: 12px;
-
- .update-time {
- color: #909399;
- font-size: 14px;
- }
- }
-}
-
-.real-time-monitor {
- margin-bottom: 12px;
-
- .monitor-card {
- .monitor-content {
- text-align: center;
- padding: 16px 0;
-
- .monitor-value {
- margin-bottom: 12px;
-
- .value {
- font-size: 28px;
- font-weight: bold;
- color: #409eff;
- }
-
- .unit {
- font-size: 14px;
- color: #909399;
- margin-left: 4px;
- }
- }
-
- .monitor-trend {
- .trend-label {
- font-size: 14px;
- color: #606266;
- margin-right: 6px;
- }
- }
- }
- }
-}
-
-.trend-analysis {
- margin-bottom: 12px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .time-selector {
- .el-radio-group {
- .el-radio {
- margin-right: 4px;
- }
- }
- }
- }
-
- .chart-container {
- padding: 16px 0;
- }
-}
-
-.statistics-ranking {
- margin-bottom: 12px;
-
- .statistics-card, .ranking-card {
- height: 100%;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
- border-radius: 8px;
- transition: all 0.3s ease;
-
- &:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
- }
- }
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 12px 16px;
- border-bottom: 1px solid #f0f0f0;
- background: #fafafa;
-
- .card-title {
- font-size: 15px;
- font-weight: 600;
- color: #303133;
- }
-
- .header-actions {
- display: flex;
- gap: 8px;
- align-items: center;
- }
- }
-
- .statistics-content {
- padding: 16px;
-
- .statistics-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 12px;
- padding: 10px 12px;
- background: #f8f9fa;
- border-radius: 6px;
- transition: background-color 0.3s ease;
-
- &:hover {
- background: #e9ecef;
- }
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .label {
- color: #606266;
- font-size: 14px;
- font-weight: 500;
- }
-
- .value {
- font-weight: bold;
- font-size: 15px;
-
- &.success {
- color: #67c23a;
- }
- }
- }
- }
-
- .ranking-list {
- padding: 16px;
-
- .ranking-item {
- display: flex;
- align-items: center;
- padding: 12px;
- margin-bottom: 6px;
- background: #f8f9fa;
- border-radius: 6px;
- transition: all 0.3s ease;
-
- &:hover {
- background: #e9ecef;
- transform: translateX(4px);
- }
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .ranking-number {
- width: 32px;
- height: 32px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-weight: bold;
- font-size: 14px;
- margin-right: 12px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- &.ranking-first {
- background: linear-gradient(135deg, #ffd700 0%, #ffed4e 100%);
- color: #fff;
- }
-
- &.ranking-second {
- background: linear-gradient(135deg, #c0c0c0 0%, #d4d4d4 100%);
- color: #fff;
- }
-
- &.ranking-third {
- background: linear-gradient(135deg, #cd7f32 0%, #daa520 100%);
- color: #fff;
- }
-
- &.ranking-normal {
- background: linear-gradient(135deg, #f5f5f5 0%, #e9ecef 100%);
- color: #909399;
- }
- }
-
- .ranking-info {
- flex: 1;
-
- .ranking-name {
- font-weight: 600;
- color: #303133;
- margin-bottom: 4px;
- font-size: 14px;
- }
-
- .ranking-value {
- color: #606266;
- font-size: 13px;
- font-weight: 500;
- }
- }
-
- .ranking-trend {
- margin-left: 12px;
- }
- }
- }
-}
-
-.analysis-control {
- margin-bottom: 20px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .abnormal-list {
- .abnormal-item {
- display: flex;
- align-items: flex-start;
- padding: 15px 0;
- border-bottom: 1px solid #f0f0f0;
-
- &:last-child {
- border-bottom: none;
- }
-
- .abnormal-icon {
- margin-right: 15px;
- margin-top: 2px;
- }
-
- .abnormal-content {
- flex: 1;
-
- .abnormal-title {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .abnormal-desc {
- color: #606266;
- font-size: 14px;
- margin-bottom: 5px;
- }
-
- .abnormal-time {
- color: #909399;
- font-size: 12px;
- }
- }
-
- .abnormal-action {
- margin-left: 15px;
- }
- }
- }
-
- .control-content {
- .control-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .label {
- color: #606266;
- font-size: 14px;
- }
-
- .value {
- font-weight: bold;
- color: #303133;
- }
- }
- }
-}
-
-.environmental-indicators {
- margin-bottom: 20px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-
- .indicator-item {
- text-align: center;
- padding: 20px 0;
-
- .indicator-title {
- color: #606266;
- font-size: 14px;
- margin-bottom: 10px;
- }
-
- .indicator-value {
- font-size: 24px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 10px;
- }
-
- .indicator-trend {
- font-size: 12px;
- color: #909399;
-
- .success {
- color: #67c23a;
- }
- }
- }
-}
-
-.multi-dimensional-reports {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-
- .report-filters {
- padding: 20px 0;
- border-bottom: 1px solid #f0f0f0;
- margin-bottom: 20px;
- }
-
- .report-preview {
- .report-data {
- padding: 20px 0;
-
- .data-card {
- text-align: center;
- padding: 16px;
- background: #f8f9fa;
- border-radius: 8px;
- margin-bottom: 16px;
-
- .data-title {
- color: #606266;
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- .data-value {
- font-size: 20px;
- font-weight: bold;
- color: #303133;
- margin-bottom: 8px;
- }
-
- .data-trend {
- font-size: 12px;
-
- .trend-up {
- color: #f56c6c;
- }
-
- .trend-down {
- color: #67c23a;
- }
-
- .trend-stable {
- color: #909399;
- }
- }
- }
-
- .report-chart {
- margin: 20px 0;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-
- .chart-title {
- text-align: center;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- margin-bottom: 16px;
- }
-
- .chart-bars {
- display: flex;
- justify-content: space-around;
- align-items: flex-end;
- height: 120px;
-
- .chart-bar {
- text-align: center;
- flex: 1;
- margin: 0 8px;
-
- .bar-label {
- font-size: 12px;
- color: #606266;
- margin-bottom: 8px;
- }
-
- .bar-container {
- height: 80px;
- background: #e9ecef;
- border-radius: 4px;
- position: relative;
- margin-bottom: 8px;
- }
-
- .bar-fill {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- border-radius: 4px;
- transition: height 0.3s ease;
- }
-
- .bar-value {
- font-size: 12px;
- color: #303133;
- font-weight: 500;
- }
- }
- }
- }
-
- .report-summary {
- display: flex;
- justify-content: space-around;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-
- .summary-item {
- text-align: center;
-
- .summary-label {
- display: block;
- color: #606266;
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- .summary-value {
- font-size: 18px;
- font-weight: bold;
- color: #303133;
- }
- }
- }
- }
- }
-}
-
-// 閫氱敤鏍峰紡
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.success {
- color: #67c23a;
-}
-
-.danger {
- color: #f56c6c;
-}
-
-.warning {
- color: #e6a23c;
-}
-
-.info {
- color: #909399;
-}
-</style>
diff --git a/src/views/energyManagement/energyPeriodTime/index.vue b/src/views/energyManagement/energyPeriodTime/index.vue
deleted file mode 100644
index 0c94322..0000000
--- a/src/views/energyManagement/energyPeriodTime/index.vue
+++ /dev/null
@@ -1,444 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鏃ユ湡锛�</span>
- <!-- <el-time-picker
- style="width: 240px;margin-right: 10px"
- v-model="searchForm.startTime"
- value-format="HH:mm:ss"
- format="HH:mm:ss"
- type="time"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- clearable
- /> -->
- <el-date-picker
- v-model="searchForm.date"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- :size="size"
- />
- <!-- <el-time-picker
- v-model="searchForm.timeRange"
- is-range
- arrow-control
- range-separator="To"
- start-placeholder="閫夋嫨缁撴潫鏃堕棿"
- end-placeholder="閫夋嫨缁撴潫鏃堕棿"
- /> -->
- <span class="search_title">鐢典环锛堝厓/搴︼級锛�</span>
- <el-input
- v-model="searchForm.price"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ數浠�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢ㄧ數鏃舵绠$悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏃ユ湡锛�" prop="date">
- <el-date-picker
- style="width: 100%"
- v-model="form.date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢典环锛堝厓/搴︼級锛�" prop="price">
- <el-input
- v-model="form.price"
- placeholder="璇疯緭鍏ョ數浠�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宄版锛�" prop="peak">
- <el-input
- v-model="form.peak"
- placeholder="璇疯緭鍏ュ嘲娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璋锋锛�" prop="valley">
- <el-input
- v-model="form.valley"
- placeholder="璇疯緭鍏ヨ胺娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="骞虫锛�" prop="flat">
- <el-input
- v-model="form.flat"
- placeholder="璇疯緭鍏ュ钩娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="灏栨锛�" prop="sharp">
- <el-input
- v-model="form.sharp"
- placeholder="璇疯緭鍏ュ皷娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {periodListPage,periodDelete,periodAdd,periodUpdate} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- date: "",
- price: ""
- },
- form: {
- date: "",
- price: "",
- peak: "",
- valley: "",
- flat: "",
- sharp: ""
- }
-});
-const { searchForm,form } = toRefs(data);
-const page = ref({
- current: 1,
- size: 10,
- total: 0
-});
-const dialogFormVisible = ref(false);
-const selectedRows = ref([]);
-const operationType = ref('');
-const tableData = ref([]);
-const emit = defineEmits(['close'])
-const tableLoading = ref(false);
-const tableColumn = ref([
- // {
- // label: "鏃舵鍚嶇О",
- // prop: "timeName",
- // width: 200,
- // },
- {
- label: "鏃ユ湡",
- prop: "date",
- width: 200,
- },
- {
- label: "鐢典环锛堝厓/搴︼級",
- prop: "price",
- width: 200,
- },
- {
- label: "宄版",
- prop: "peak",
- },
- {
- label: "璋锋",
- prop: "valley",
- },
- {
- label: "骞虫",
- prop: "flat",
- },
- {
- label: "灏栨",
- prop: "sharp",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/equipmentEnergyConsumption/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- ElMessageBox.error(response.msg);
- }else{
- ElMessageBox.warning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- ElMessageBox.error("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-//閲嶇疆
-const resetFilters = () => {
- searchForm.value = {
- date: "",
- price: ""
- };
- getList();
-
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- periodListPage({ ...searchForm, ...page.value }).then((res) => {
- tableLoading.value = false;
- if (res && res.data) {
- tableData.value = res.data.records || [];
- page.total = res.data.total || 0;
- } else {
- tableData.value = [];
- page.total = 0;
- ElMessageBox.warning('鏈幏鍙栧埌鏁版嵁');
- }
- })
- .catch((err) => {
- tableLoading.value = false;
- console.error('鏁版嵁鍔犺浇澶辫触:', err);
- ElMessageBox.error('鏁版嵁鍔犺浇澶辫触锛岃閲嶈瘯');
- });
-};
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- // form.value.maintainer = userStore.nickName;
- // form.value.maintenanceTime = getCurrentDate();
- form.value = {}
- proxy.resetForm("formRef");
- periodListPage().then((res) => {
- codeList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- openDialog(type, row)
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- periodAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- getList()
- })
- } else {
- periodUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- getList()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "璁惧鑳借��";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/equipmentEnergyConsumption/export",
- {},
- '璁惧鑳借�楀鍏ユā鐗�.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- periodDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/energyPower/components/formDia.vue b/src/views/energyManagement/energyPower/components/formDia.vue
deleted file mode 100644
index 518a254..0000000
--- a/src/views/energyManagement/energyPower/components/formDia.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁惧鑳借��"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="code">
- <el-select
- v-model="form.code"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄧ數娑堣�楀尯鍩燂細" prop="electricityConsumptionAreaId">
- <el-cascader
- v-model="form.electricityConsumptionAreaId"
- :options="areaList"
- :props="{
- value: 'id',
- label: 'label',
- children: 'children',
- checkStrictly: true,
- }"
- placeholder="璇烽�夋嫨鍖哄煙"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姣忔棩闄愬埗鐢甸噺锛�" prop="everyNum">
- <el-input
- v-model="form.everyNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰濆畾鍔熺巼锛�" prop="powerRating">
- <el-input
- v-model="form.powerRating"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹為檯鍔熺巼锛�" prop="powerActual">
- <el-input
- v-model="form.powerActual"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="杩愯鏃堕棿锛�" prop="runDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.runDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰撴棩鐢ㄧ數閲忥細" prop="dayNum">
- <el-input
- v-model="form.dayNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {deviceList, equipmentEnergyAdd, equipmentEnergyUpdate, areaListTree} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- name: "",
- code: "",
- everyNum: "",
- powerRating: "",
- powerActual: "",
- runDate: "",
- dayNum: "",
- electricityConsumptionAreaId: "",
- },
- rules: {
- code: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- runDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- everyNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- powerRating: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- powerActual: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dayNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- electricityConsumptionAreaId: [{ required: true, message: "璇烽�夋嫨鍖哄煙", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-const areaList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- // form.value.maintainer = userStore.nickName;
- // form.value.maintenanceTime = getCurrentDate();
- form.value = {}
- proxy.resetForm("formRef");
-
- // 鑾峰彇璁惧鍒楄〃
- deviceList().then((res) => {
- codeList.value = res.data;
- });
-
- // 鑾峰彇鍖哄煙鍒楄〃
- areaListTree().then((res) => {
- areaList.value = res;
- console.log("areaList", res);
- });
-
- if (type === "edit") {
- form.value = {...row}
- // 缂栬緫鏃讹紝灏嗗崟涓狪D杞崲涓烘暟缁勬牸寮忕敤浜庡洖鏄�
- if (row.electricityConsumptionAreaId) {
- form.value.electricityConsumptionAreaId = [row.electricityConsumptionAreaId];
- }
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- // 鎻愪氦鍓嶅鐞� electricityConsumptionAreaId锛屽彇鏁扮粍鐨勬渶鍚庝竴涓��
- const submitData = { ...form.value };
- if (Array.isArray(submitData.electricityConsumptionAreaId) && submitData.electricityConsumptionAreaId.length > 0) {
- submitData.electricityConsumptionAreaId = submitData.electricityConsumptionAreaId[submitData.electricityConsumptionAreaId.length - 1];
- }
-
- if (operationType.value === "add") {
- equipmentEnergyAdd(submitData).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- equipmentEnergyUpdate(submitData).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/energyPower/index.vue b/src/views/energyManagement/energyPower/index.vue
deleted file mode 100644
index 6d7ba83..0000000
--- a/src/views/energyManagement/energyPower/index.vue
+++ /dev/null
@@ -1,305 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- @close="handleDialogClose"
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- >
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/energyManagement/energyPower/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {equipmentEnergyDelete, equipmentEnergyListPage} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 200,
- },
- {
- label: "棰濆畾鍔熺巼",
- prop: "powerRating",
- },
- {
- label: "瀹為檯鍔熺巼",
- prop: "powerActual",
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width:150
- },
- {
- label: "褰撴棩鐢ㄧ數閲�",
- prop: "dayNum",
- width: 150,
- },
- // {
- // label: "绱鐢ㄧ數閲�",
- // prop: "sumNum",
- // width: 150,
- // },
- {
- label: "姣忔棩闄愬埗鐢甸噺",
- prop: "everyNum",
- width:220
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/equipmentEnergyConsumption/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgWarning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- equipmentEnergyListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "璁惧鑳借��";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/equipmentEnergyConsumption/export",
- {},
- '璁惧鑳借�楀鍏ユā鐗�.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- equipmentEnergyDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/energyTrends/index.vue b/src/views/energyManagement/energyTrends/index.vue
deleted file mode 100644
index 0e7bcbf..0000000
--- a/src/views/energyManagement/energyTrends/index.vue
+++ /dev/null
@@ -1,116 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
-
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {listPageByTrend} from "@/api/energyManagement/index.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 220,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 220,
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width: 250,
- },
- {
- label: "鏄ㄦ棩鐢ㄧ數閲�",
- prop: "toDayNum",
- },
- {
- label: "鏈湀骞冲潎鐢甸噺",
- prop: "avgNum",
- width:150
- },
- {
- label: "瓒嬪娍",
- prop: "trend",
- width: 220,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- listPageByTrend({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/gasManagement/index.vue b/src/views/energyManagement/gasManagement/index.vue
deleted file mode 100644
index fbbd9f4..0000000
--- a/src/views/energyManagement/gasManagement/index.vue
+++ /dev/null
@@ -1,624 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>鐢ㄦ皵绠$悊绯荤粺</h2>
- <div class="header-info">
- <span class="update-time">鏈�鍚庢洿鏂帮細{{ lastUpdateTime }}</span>
- <el-button type="primary" size="small" @click="refreshData">
- <el-icon><Refresh /></el-icon>
- 鍒锋柊鏁版嵁
- </el-button>
- </div>
- </div>
-
- <!-- 缁熻鍗$墖鍖哄煙 -->
- <div class="stats-cards">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon gas-device">
- <el-icon size="32"><Box /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ totalDevices }}</div>
- <div class="stat-label">鍦ㄧ敤璁惧</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon daily-consumption">
- <el-icon size="32"><TrendCharts /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ dailyConsumption }} m鲁</div>
- <div class="stat-label">鏃ヨ�楅噺</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon monthly-consumption">
- <el-icon size="32"><DataLine /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ monthlyConsumption }} m鲁</div>
- <div class="stat-label">鏈堣�楅噺</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon gas-price">
- <el-icon size="32"><Money /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">楼{{ gasUnitPrice }}</div>
- <div class="stat-label">姘斾綋鍗曚环</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璐圭敤缁熻鍖哄煙 -->
- <div class="cost-stats">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="cost-card">
- <template #header>
- <div class="card-header">
- <span>鏃ヨ垂鐢ㄧ粺璁�</span>
- <el-tag type="success" size="small">浠婃棩</el-tag>
- </div>
- </template>
- <div class="cost-content">
- <div class="cost-main">
- <span class="cost-amount">楼{{ dailyTotalCost.toFixed(2) }}</span>
- <span class="cost-unit">鍏�</span>
- </div>
- <div class="cost-details">
- <div class="cost-item">
- <span>娑堣�楅噺锛�</span>
- <span>{{ dailyConsumption }} m鲁</span>
- </div>
- <div class="cost-item">
- <span>鍗曚环锛�</span>
- <span>楼{{ gasUnitPrice }}/m鲁</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="cost-card">
- <template #header>
- <div class="card-header">
- <span>鏈堣垂鐢ㄧ粺璁�</span>
- <el-tag type="primary" size="small">鏈湀</el-tag>
- </div>
- </template>
- <div class="cost-content">
- <div class="cost-main">
- <span class="cost-amount">楼{{ monthlyTotalCost.toFixed(2) }}</span>
- <span class="cost-unit">鍏�</span>
- </div>
- <div class="cost-details">
- <div class="cost-item">
- <span>娑堣�楅噺锛�</span>
- <span>{{ monthlyConsumption }} m鲁</span>
- </div>
- <div class="cost-item">
- <span>骞冲潎鍗曚环锛�</span>
- <span>楼{{ gasUnitPrice }}/m鲁</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璁惧鍒楄〃鍖哄煙 -->
- <div class="device-section">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>璁惧鐩戞帶</span>
- <div class="header-actions">
- <el-button type="primary" size="small" @click="addDevice">
- <el-icon><Plus /></el-icon>
- 娣诲姞璁惧
- </el-button>
- </div>
- </div>
- </template>
-
- <el-table :data="deviceList" border style="width: 100%" v-loading="tableLoading">
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="璁惧缂栧彿" prop="deviceCode" width="120" show-overflow-tooltip />
- <el-table-column label="璁惧鍚嶇О" prop="deviceName" width="150" show-overflow-tooltip />
- <el-table-column label="璁惧绫诲瀷" prop="deviceType" width="120" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" width="150" show-overflow-tooltip />
- <el-table-column label="褰撳墠鍘嬪姏(MPa)" prop="currentPressure" width="130" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getPressureClass(scope.row.currentPressure)">
- {{ scope.row.currentPressure }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="褰撳墠娓╁害(鈩�)" prop="currentTemperature" width="130" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getTemperatureClass(scope.row.currentTemperature)">
- {{ scope.row.currentTemperature }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="姘斾綋娴撳害(ppm)" prop="gasConcentration" width="140" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getConcentrationClass(scope.row.gasConcentration)">
- {{ scope.row.gasConcentration }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="杩愯鐘舵��" prop="status" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)" size="small">
- {{ getStatusText(scope.row.status) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鏈�鍚庢洿鏂�" prop="lastUpdate" width="160" show-overflow-tooltip />
- <el-table-column label="鎿嶄綔" align="center" width="100" fixed="right">
- <template #default="scope">
- <el-button link size="small" @click="editDevice(scope.row)">
- 缂栬緫
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </div>
-
- <!-- 娣诲姞/缂栬緫璁惧寮圭獥 -->
- <el-dialog v-model="deviceDialogVisible" :title="dialogTitle" width="600px">
- <el-form :model="deviceForm" :rules="deviceRules" ref="deviceFormRef" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧缂栧彿" prop="deviceCode">
- <el-input v-model="deviceForm.deviceCode" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О" prop="deviceName">
- <el-input v-model="deviceForm.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧绫诲瀷" prop="deviceType">
- <el-select v-model="deviceForm.deviceType" placeholder="璇烽�夋嫨璁惧绫诲瀷" style="width: 100%">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- <el-option label="鍏朵粬" value="鍏朵粬" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
- <el-input v-model="deviceForm.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁捐鍘嬪姏(MPa)" prop="designPressure">
- <el-input-number v-model="deviceForm.designPressure" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹圭Н(m鲁)" prop="volume">
- <el-input-number v-model="deviceForm.volume" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <el-button @click="deviceDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveDevice">淇濆瓨</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
- Refresh,
- Box,
- TrendCharts,
- DataLine,
- Money,
- Plus
-} from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const lastUpdateTime = ref('')
-const totalDevices = ref(0)
-const dailyConsumption = ref(0)
-const monthlyConsumption = ref(0)
-const gasUnitPrice = ref(0)
-const dailyTotalCost = ref(0)
-const monthlyTotalCost = ref(0)
-const deviceList = ref([])
-const tableLoading = ref(false)
-const deviceDialogVisible = ref(false)
-const dialogTitle = ref('')
-const deviceFormRef = ref()
-
-// 璁惧琛ㄥ崟鏁版嵁
-const deviceForm = reactive({
- deviceCode: '',
- deviceName: '',
- deviceType: '',
- specification: '',
- designPressure: 0,
- volume: 0
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const deviceRules = {
- deviceCode: [{ required: true, message: '璇疯緭鍏ヨ澶囩紪鍙�', trigger: 'blur' }],
- deviceName: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }],
- deviceType: [{ required: true, message: '璇烽�夋嫨璁惧绫诲瀷', trigger: 'change' }],
- specification: [{ required: true, message: '璇疯緭鍏ヨ鏍煎瀷鍙�', trigger: 'blur' }],
- designPressure: [{ required: true, message: '璇疯緭鍏ヨ璁″帇鍔�', trigger: 'blur' }],
- volume: [{ required: true, message: '璇疯緭鍏ュ绉�', trigger: 'blur' }]
-}
-
-// 瀹氭椂鍣�
-let updateTimer = null
-
-// 妯℃嫙鏁版嵁鐢熸垚
-const generateMockData = () => {
- // 鏇存柊缁熻鏁版嵁
- totalDevices.value = Math.floor(Math.random() * 10) + 15 // 15-25鍙拌澶�
- dailyConsumption.value = Math.floor(Math.random() * 100) + 200 // 200-300 m鲁
- monthlyConsumption.value = Math.floor(Math.random() * 2000) + 5000 // 5000-7000 m鲁
- gasUnitPrice.value = (Math.random() * 2 + 3).toFixed(2) // 3-5鍏�/m鲁
-
- // 璁$畻璐圭敤
- dailyTotalCost.value = dailyConsumption.value * gasUnitPrice.value
- monthlyTotalCost.value = monthlyConsumption.value * gasUnitPrice.value
-
- // 鏇存柊璁惧鍒楄〃鏁版嵁
- deviceList.value = Array.from({ length: totalDevices.value }, (_, index) => ({
- id: index + 1,
- deviceCode: `GT${String(index + 1).padStart(3, '0')}`,
- deviceName: `鍌ㄦ皵缃�${index + 1}`,
- deviceType: ['娑插寲姘斿偍缃�', '鍘嬬缉姘斿偍缃�', '澶╃劧姘斿偍缃�', '姘ф皵鍌ㄧ綈'][Math.floor(Math.random() * 4)],
- specification: `${Math.floor(Math.random() * 50) + 50}m鲁`,
- currentPressure: (Math.random() * 2 + 0.5).toFixed(2),
- currentTemperature: (Math.random() * 20 + 15).toFixed(1),
- gasConcentration: (Math.random() * 10).toFixed(2),
- status: ['running', 'stopped', 'warning', 'error'][Math.floor(Math.random() * 4)],
- lastUpdate: new Date().toLocaleString()
- }))
-
- // 鏇存柊鏈�鍚庢洿鏂版椂闂�
- lastUpdateTime.value = new Date().toLocaleString()
-}
-
-// 鑾峰彇鍘嬪姏鐘舵�佹牱寮�
-const getPressureClass = (pressure) => {
- const p = parseFloat(pressure)
- if (p < 0.8) return 'pressure-low'
- if (p > 1.5) return 'pressure-high'
- return 'pressure-normal'
-}
-
-// 鑾峰彇娓╁害鐘舵�佹牱寮�
-const getTemperatureClass = (temperature) => {
- const t = parseFloat(temperature)
- if (t < 10 || t > 35) return 'temperature-warning'
- return 'temperature-normal'
-}
-
-// 鑾峰彇娴撳害鐘舵�佹牱寮�
-const getConcentrationClass = (concentration) => {
- const c = parseFloat(concentration)
- if (c > 5) return 'concentration-warning'
- return 'concentration-normal'
-}
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- running: 'success',
- stopped: 'info',
- warning: 'warning',
- error: 'danger'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- running: '杩愯涓�',
- stopped: '宸插仠姝�',
- warning: '璀﹀憡',
- error: '鏁呴殰'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鍒锋柊鏁版嵁
-const refreshData = () => {
- generateMockData()
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 娣诲姞璁惧
-const addDevice = () => {
- dialogTitle.value = '娣诲姞璁惧'
- Object.keys(deviceForm).forEach(key => {
- deviceForm[key] = key === 'designPressure' || key === 'volume' ? 0 : ''
- })
- deviceDialogVisible.value = true
-}
-
-// 缂栬緫璁惧
-const editDevice = (row) => {
- dialogTitle.value = '缂栬緫璁惧'
- Object.keys(deviceForm).forEach(key => {
- if (row[key] !== undefined) {
- deviceForm[key] = row[key]
- }
- })
- deviceDialogVisible.value = true
-}
-
-
-
-// 淇濆瓨璁惧
-const saveDevice = () => {
- deviceFormRef.value.validate((valid) => {
- if (valid) {
- ElMessage.success('淇濆瓨鎴愬姛')
- deviceDialogVisible.value = false
- refreshData()
- }
- })
-}
-
-
-
-// 鍚姩瀹氭椂鏇存柊
-const startAutoUpdate = () => {
- updateTimer = setInterval(() => {
- generateMockData()
- }, 60000) // 姣忓垎閽熸洿鏂颁竴娆�
-}
-
-// 鍋滄瀹氭椂鏇存柊
-const stopAutoUpdate = () => {
- if (updateTimer) {
- clearInterval(updateTimer)
- updateTimer = null
- }
-}
-
-// 缁勪欢鎸傝浇
-onMounted(() => {
- generateMockData()
- startAutoUpdate()
-})
-
-// 缁勪欢鍗歌浇
-onUnmounted(() => {
- stopAutoUpdate()
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 20px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- padding: 20px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- font-size: 24px;
- }
-
- .header-info {
- display: flex;
- align-items: center;
- gap: 15px;
-
- .update-time {
- color: #909399;
- font-size: 14px;
- }
- }
-}
-
-.stats-cards {
- margin-bottom: 20px;
-
- .stat-card {
- .stat-content {
- display: flex;
- align-items: center;
- padding: 10px;
-
- .stat-icon {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 15px;
-
- &.gas-device {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- }
-
- &.daily-consumption {
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
- color: white;
- }
-
- &.monthly-consumption {
- background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
- color: white;
- }
-
- &.gas-price {
- background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
- color: white;
- }
- }
-
- .stat-info {
- .stat-value {
- font-size: 24px;
- font-weight: bold;
- color: #303133;
- line-height: 1;
- }
-
- .stat-label {
- font-size: 14px;
- color: #909399;
- margin-top: 5px;
- }
- }
- }
- }
-}
-
-.cost-stats {
- margin-bottom: 20px;
-
- .cost-card {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .cost-content {
- text-align: center;
- padding: 20px 0;
-
- .cost-main {
- margin-bottom: 15px;
-
- .cost-amount {
- font-size: 36px;
- font-weight: bold;
- color: #409eff;
- }
-
- .cost-unit {
- font-size: 16px;
- color: #909399;
- margin-left: 5px;
- }
- }
-
- .cost-details {
- .cost-item {
- display: flex;
- justify-content: space-between;
- margin-bottom: 8px;
- font-size: 14px;
- color: #606266;
-
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
- }
- }
-}
-
-.device-section {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-}
-
-// 鐘舵�佹牱寮�
-.pressure-low {
- color: #e6a23c;
- font-weight: bold;
-}
-
-.pressure-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.pressure-high {
- color: #f56c6c;
- font-weight: bold;
-}
-
-.temperature-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.temperature-warning {
- color: #e6a23c;
- font-weight: bold;
-}
-
-.concentration-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.concentration-warning {
- color: #f56c6c;
- font-weight: bold;
-}
-</style>
diff --git a/src/views/energyManagement/meterCollection/index.vue b/src/views/energyManagement/meterCollection/index.vue
deleted file mode 100644
index dfa5617..0000000
--- a/src/views/energyManagement/meterCollection/index.vue
+++ /dev/null
@@ -1,556 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <div slot="header" class="clearfix">
- <span>鐢佃〃閲囬泦绠$悊</span>
- <el-button style="float: right; padding: 3px 0" link @click="refreshData">
- <i class="el-icon-refresh"></i> 鍒锋柊
- </el-button>
- </div>
-
- <!-- 娴嬭瘯鎸夐挳 -->
- <el-row :gutter="20" style="margin-bottom: 15px;">
- <el-col :span="24">
- <el-button @click="addTestData" type="primary" size="small">娣诲姞娴嬭瘯鏁版嵁</el-button>
- <el-button @click="clearData" type="danger" size="small">娓呯┖鏁版嵁</el-button>
- <el-button @click="testChart" type="success" size="small">娴嬭瘯鍥捐〃</el-button>
- </el-col>
- </el-row>
-
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.meterNo"
- placeholder="璇疯緭鍏ョ數琛ㄧ紪鍙�"
- clearable
- @keyup.enter.native="handleSearch"
- >
- <i slot="prefix" class="el-input__icon el-icon-search"></i>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.location" placeholder="璇烽�夋嫨浣嶇疆" clearable>
- <el-option label="鐢熶骇杞﹂棿A" value="杞﹂棿A"></el-option>
- <el-option label="鐢熶骇杞﹂棿B" value="杞﹂棿B"></el-option>
- <el-option label="鍔炲叕鍖哄煙" value="鍔炲叕鍖�"></el-option>
- <el-option label="閰嶇數瀹�" value="閰嶇數瀹�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-date-picker
- v-model="searchForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="yyyy-MM-dd"
- value-format="yyyy-MM-dd"
- />
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-col>
- </el-row>
-
- <!-- 鐢佃〃鍒楄〃 -->
- <el-table
- :data="meterList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="meterNo" label="鐢佃〃缂栧彿" width="120" />
- <el-table-column prop="location" label="瀹夎浣嶇疆" width="120" />
- <el-table-column prop="meterType" label="鐢佃〃绫诲瀷" width="120" />
- <el-table-column prop="voltage" label="鐢靛帇绛夌骇" width="100" />
- <el-table-column prop="currentReading" label="褰撳墠璇绘暟(kWh)" width="140" />
- <el-table-column prop="lastReading" label="涓婃璇绘暟(kWh)" width="140" />
- <el-table-column prop="consumption" label="鐢ㄧ數閲�(kWh)" width="120" />
- <el-table-column prop="power" label="鍔熺巼(kW)" width="100" />
- <el-table-column prop="powerFactor" label="鍔熺巼鍥犳暟" width="100" />
- <el-table-column prop="status" label="鐘舵��" width="80">
- <template #default="scope">
- <el-tag :type="scope.row.status === '姝e父' ? 'success' : 'danger'">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="lastUpdateTime" label="鏈�鍚庢洿鏂版椂闂�" width="160" />
- <el-table-column label="鎿嶄綔" width="180" fixed="right" align="center">
- <template #default="scope">
- <el-button link @click="viewDetails(scope.row)">
- 鏌ョ湅璇︽儏
- </el-button>
- <el-button link @click="manualCollection(scope.row)">
- 鎵嬪姩閲囬泦
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 璇︽儏瀵硅瘽妗� -->
- <el-dialog
- title="鐢佃〃璇︽儏"
- v-model="detailDialogVisible"
- width="60%"
- @opened="onDialogOpened"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢佃〃缂栧彿:</label>
- <span>{{ currentMeter.meterNo }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>瀹夎浣嶇疆:</label>
- <span>{{ currentMeter.location }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢佃〃绫诲瀷:</label>
- <span>{{ currentMeter.meterType }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢靛帇绛夌骇:</label>
- <span>{{ currentMeter.voltage }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>褰撳墠璇绘暟:</label>
- <span>{{ currentMeter.currentReading }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>涓婃璇绘暟:</label>
- <span>{{ currentMeter.lastReading }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢ㄧ數閲�:</label>
- <span>{{ currentMeter.consumption }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鍔熺巼:</label>
- <span>{{ currentMeter.power }} kW</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鍔熺巼鍥犳暟:</label>
- <span>{{ currentMeter.powerFactor }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐘舵��:</label>
- <el-tag :type="currentMeter.status === '姝e父' ? 'success' : 'danger'">
- {{ currentMeter.status }}
- </el-tag>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鏈�鍚庢洿鏂版椂闂�:</label>
- <span>{{ currentMeter.lastUpdateTime }}</span>
- </div>
- </el-col>
- </el-row>
-
- <!-- 鐢ㄧ數瓒嬪娍鍥� -->
- <div style="margin-top: 20px;">
- <h4>24灏忔椂鐢ㄧ數瓒嬪娍</h4>
- <div ref="chartContainer" style="height: 300px;"></div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script>
-import * as echarts from 'echarts'
-
-export default {
- name: 'MeterCollection',
- data() {
- return {
- loading: false,
- searchForm: {
- meterNo: '',
- location: '',
- dateRange: []
- },
- meterList: [],
- pagination: {
- currentPage: 1,
- pageSize: 10,
- total: 0
- },
- detailDialogVisible: false,
- currentMeter: {},
- chart: null
- }
- },
- created() {
- // 绔嬪嵆鐢熸垚涓�浜涙祴璇曟暟鎹�
- this.meterList = [
- {
- id: 1,
- meterNo: 'M001',
- location: '杞﹂棿A',
- meterType: '鏅鸿兘鐢佃〃',
- voltage: '380V',
- currentReading: 8500,
- lastReading: 8400,
- consumption: 100,
- power: '75.5',
- powerFactor: '0.85',
- status: '姝e父',
- lastUpdateTime: '2025-01-15 10:30:00'
- },
- {
- id: 2,
- meterNo: 'M002',
- location: '杞﹂棿B',
- meterType: '澶氬姛鑳界數琛�',
- voltage: '220V',
- currentReading: 6200,
- lastReading: 6100,
- consumption: 100,
- power: '45.2',
- powerFactor: '0.92',
- status: '姝e父',
- lastUpdateTime: '2025-01-15 10:25:00'
- }
- ]
- this.pagination.total = this.meterList.length
- },
- mounted() {
- // 寤惰繜涓�鐐规椂闂村啀璋冪敤锛岀‘淇滵OM宸茬粡娓叉煋
- this.$nextTick(() => {
- this.getMeterList()
- })
- },
- watch: {
- meterList: {
- handler(newVal) {
- console.log('meterList鏁版嵁鍙樺寲:', newVal)
- },
- deep: true,
- immediate: true
- }
- },
- methods: {
- // 鑾峰彇鐢佃〃鍒楄〃
- getMeterList() {
- this.loading = true
- // 妯℃嫙API璋冪敤
- setTimeout(() => {
- const mockData = this.generateMockData()
- this.meterList = mockData
- this.pagination.total = this.meterList.length
- this.loading = false
- }, 500)
- },
-
- // 鐢熸垚妯℃嫙鏁版嵁
- generateMockData() {
- const locations = ['杞﹂棿A', '杞﹂棿B', '鍔炲叕鍖�', '閰嶇數瀹�']
- const meterTypes = ['鏅鸿兘鐢佃〃', '澶氬姛鑳界數琛�', '鏅�氱數琛�']
- const voltages = ['220V', '380V', '10kV']
- const statuses = ['姝e父', '寮傚父']
-
- const data = []
- for (let i = 1; i <= 25; i++) {
- const currentReading = Math.floor(Math.random() * 10000) + 5000
- const lastReading = currentReading - Math.floor(Math.random() * 100) - 10
- const consumption = currentReading - lastReading
- const power = Math.random() * 100 + 20
- const powerFactor = (Math.random() * 0.3 + 0.7).toFixed(2)
-
- data.push({
- id: i,
- meterNo: `M${String(i).padStart(3, '0')}`,
- location: locations[Math.floor(Math.random() * locations.length)],
- meterType: meterTypes[Math.floor(Math.random() * meterTypes.length)],
- voltage: voltages[Math.floor(Math.random() * voltages.length)],
- currentReading: currentReading,
- lastReading: lastReading,
- consumption: consumption,
- power: power.toFixed(2),
- powerFactor: powerFactor,
- status: statuses[Math.floor(Math.random() * statuses.length)],
- lastUpdateTime: this.formatDate(new Date(Date.now() - Math.random() * 86400000))
- })
- }
- return data
- },
-
- // 鏍煎紡鍖栨棩鏈�
- formatDate(date) {
- const year = date.getFullYear()
- const month = String(date.getMonth() + 1).padStart(2, '0')
- const day = String(date.getDate()).padStart(2, '0')
- const hours = String(date.getHours()).padStart(2, '0')
- const minutes = String(date.getMinutes()).padStart(2, '0')
- return `${year}-${month}-${day} ${hours}:${minutes}`
- },
-
- // 鎼滅储
- handleSearch() {
- this.pagination.currentPage = 1
- this.getMeterList()
- },
-
- // 閲嶇疆鎼滅储
- resetSearch() {
- this.searchForm = {
- meterNo: '',
- location: '',
- dateRange: []
- }
- this.handleSearch()
- },
-
- // 鏌ョ湅璇︽儏
- viewDetails(row) {
- this.currentMeter = row
- this.detailDialogVisible = true
- },
-
- // 瀵硅瘽妗嗘墦寮�鍚庡垵濮嬪寲鍥捐〃
- onDialogOpened() {
- this.$nextTick(() => {
- setTimeout(() => {
- this.initChart()
- }, 100)
- })
- },
-
- // 鎵嬪姩閲囬泦
- manualCollection(row) {
- this.$message.success(`姝e湪閲囬泦鐢佃〃 ${row.meterNo} 鐨勬暟鎹�...`)
- // 妯℃嫙閲囬泦杩囩▼
- setTimeout(() => {
- row.currentReading = Math.floor(Math.random() * 100) + row.currentReading
- row.lastUpdateTime = this.formatDate(new Date())
- this.$message.success('鏁版嵁閲囬泦瀹屾垚')
- }, 1000)
- },
-
- // 鍒锋柊鏁版嵁
- refreshData() {
- this.getMeterList()
- this.$message.success('鏁版嵁宸插埛鏂�')
- },
-
- // 娣诲姞娴嬭瘯鏁版嵁
- addTestData() {
- const testData = {
- id: Date.now(),
- meterNo: `M${String(this.meterList.length + 1).padStart(3, '0')}`,
- location: '娴嬭瘯浣嶇疆',
- meterType: '娴嬭瘯鐢佃〃',
- voltage: '220V',
- currentReading: Math.floor(Math.random() * 10000) + 1000,
- lastReading: Math.floor(Math.random() * 5000) + 500,
- consumption: Math.floor(Math.random() * 100) + 10,
- power: (Math.random() * 100 + 10).toFixed(2),
- powerFactor: (Math.random() * 0.3 + 0.7).toFixed(2),
- status: '姝e父',
- lastUpdateTime: this.formatDate(new Date())
- }
- this.meterList.push(testData)
- this.pagination.total = this.meterList.length
- this.$message.success('娴嬭瘯鏁版嵁宸叉坊鍔�')
- },
-
- // 娓呯┖鏁版嵁
- clearData() {
- this.meterList = []
- this.pagination.total = 0
- this.$message.success('鏁版嵁宸叉竻绌�')
- },
-
- // 娴嬭瘯鍥捐〃
- testChart() {
- this.$message.info('鍥捐〃娴嬭瘯鍔熻兘')
- // 鍒涘缓涓�涓祴璇曞璇濇鏉ユ祴璇曞浘琛�
- this.currentMeter = {
- meterNo: 'TEST001',
- location: '娴嬭瘯浣嶇疆',
- meterType: '娴嬭瘯鐢佃〃',
- voltage: '220V',
- currentReading: 1000,
- lastReading: 900,
- consumption: 100,
- power: '50.0',
- powerFactor: '0.85',
- status: '姝e父',
- lastUpdateTime: '2025-01-15 12:00:00'
- }
- this.detailDialogVisible = true
- },
-
- // 鍒嗛〉澶у皬鏀瑰彉
- handleSizeChange(val) {
- this.pagination.pageSize = val
- this.getMeterList()
- },
-
- // 褰撳墠椤垫敼鍙�
- handleCurrentChange(val) {
- this.pagination.pageSize = val.limit
- this.pagination.currentPage = val.page
- this.getMeterList()
- },
-
- // 鍒濆鍖栧浘琛�
- initChart() {
- try {
- if (this.chart) {
- this.chart.dispose()
- this.chart = null
- }
-
- // 纭繚DOM鍏冪礌瀛樺湪
- if (!this.$refs.chartContainer) {
- console.error('鍥捐〃瀹瑰櫒涓嶅瓨鍦紝绛夊緟DOM鏇存柊...')
- // 濡傛灉瀹瑰櫒涓嶅瓨鍦紝绛夊緟涓�涓嬪啀璇�
- setTimeout(() => {
- this.initChart()
- }, 100)
- return
- }
-
- // 妫�鏌ュ鍣ㄥ昂瀵�
- const container = this.$refs.chartContainer
- if (container.offsetWidth === 0 || container.offsetHeight === 0) {
- setTimeout(() => {
- this.initChart()
- }, 100)
- return
- }
- this.chart = echarts.init(container)
-
- // 鐢熸垚24灏忔椂妯℃嫙鏁版嵁
- const hours = []
- const consumption = []
- for (let i = 0; i < 24; i++) {
- hours.push(`${i}:00`)
- consumption.push(Math.floor(Math.random() * 50) + 20)
- }
-
- const option = {
- title: {
- text: '24灏忔椂鐢ㄧ數閲忚秼鍔�',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis',
- formatter: '{b}<br/>鐢ㄧ數閲�: {c} kWh'
- },
- xAxis: {
- type: 'category',
- data: hours,
- axisLabel: {
- rotate: 45
- }
- },
- yAxis: {
- type: 'value',
- name: '鐢ㄧ數閲� (kWh)'
- },
- series: [{
- data: consumption,
- type: 'line',
- smooth: true,
- areaStyle: {
- opacity: 0.3
- },
- itemStyle: {
- color: '#409EFF'
- }
- }]
- }
-
- this.chart.setOption(option)
- } catch (error) {
- console.error('鍥捐〃鍒濆鍖栧け璐�:', error)
- this.$message.error('鍥捐〃鍒濆鍖栧け璐�: ' + error.message)
- }
- }
- },
-
- beforeUnmount() {
- if (this.chart) {
- try {
- this.chart.dispose()
- this.chart = null
- } catch (error) {
- console.error('娓呯悊鍥捐〃澶辫触:', error)
- }
- }
- }
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-
-.pagination {
- margin-top: 20px;
- text-align: right;
-}
-
-.el-table {
- margin-top: 20px;
-}
-
-.detail-item {
- margin-bottom: 15px;
- padding: 10px;
- border: 1px solid #ebeef5;
- border-radius: 4px;
- background-color: #fafafa;
-}
-
-.detail-item label {
- font-weight: bold;
- color: #606266;
- margin-right: 10px;
- min-width: 100px;
- display: inline-block;
-}
-
-.detail-item span {
- color: #303133;
-}
-
-.detail-item .el-tag {
- margin-left: 0;
-}
-</style>
diff --git a/src/views/energyManagement/waterManagement/components/formDia.vue b/src/views/energyManagement/waterManagement/components/formDia.vue
deleted file mode 100644
index 2e58ea0..0000000
--- a/src/views/energyManagement/waterManagement/components/formDia.vue
+++ /dev/null
@@ -1,221 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢ㄦ按璁惧"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="deviceModel">
- <el-select
- v-model="form.deviceModel"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="姣忔棩闄愬埗姘撮噺锛�" prop="waterDayLimit">
- <el-input
- v-model="form.waterDayLimit"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="棰濆畾娴侀噺锛�" prop="ratedRate">
- <el-input
- v-model="form.ratedRate"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹為檯娴侀噺锛�" prop="actualTraffic">
- <el-input
- v-model="form.actualTraffic"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="杩愯鏃堕棿锛�" prop="runTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.runTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撴棩鐢ㄦ按閲忥細" prop="waterDay">
- <el-input
- v-model="form.waterDay"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姘磋垂鍗曚环锛�" prop="waterPrice">
- <el-input
- v-model="form.waterPrice"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按绫诲瀷锛�" prop="type">
- <el-select
- v-model="form.type"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="宸ヤ笟鐢ㄦ按" value="industrial" />
- <el-option label="鐢熸椿鐢ㄦ按" value="domestic" />
- <el-option label="娑堥槻鐢ㄦ按" value="fire" />
- <el-option label="缁垮寲鐢ㄦ按" value="greening" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, nextTick} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {waterDeviceList, waterEquipmentAdd, waterEquipmentUpdate} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- deviceName: "",
- deviceModel: "",
- waterDayLimit: "",
- ratedRate: "",
- actualTraffic: "",
- runTime: "",
- waterDay: "",
- waterPrice: "",
- type: "",
- },
- rules: {
- deviceModel: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- runTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterDayLimit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- ratedRate: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualTraffic: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterDay: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- type: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- waterDeviceList({size: -1}).then((res) => {
- codeList.value = res.data.records;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- waterEquipmentAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- waterEquipmentUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/components/waterBillForm.vue b/src/views/energyManagement/waterManagement/components/waterBillForm.vue
deleted file mode 100644
index a132041..0000000
--- a/src/views/energyManagement/waterManagement/components/waterBillForm.vue
+++ /dev/null
@@ -1,210 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="姘磋垂绠$悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="code">
- <el-select
- v-model="form.code"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按閲忥細" prop="waterConsumption">
- <el-input
- v-model="form.waterConsumption"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姘磋垂鍗曚环锛�" prop="waterPrice">
- <el-input
- v-model="form.waterPrice"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="姘磋垂閲戦锛�" prop="waterBill">
- <el-input
- v-model="form.waterBill"
- placeholder="鑷姩璁$畻"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¤垂鏃ユ湡锛�" prop="billDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.billDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按绫诲瀷锛�" prop="waterType">
- <el-select
- v-model="form.waterType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="宸ヤ笟鐢ㄦ按" value="industrial" />
- <el-option label="鐢熸椿鐢ㄦ按" value="domestic" />
- <el-option label="娑堥槻鐢ㄦ按" value="fire" />
- <el-option label="缁垮寲鐢ㄦ按" value="greening" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, nextTick, watch} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {waterDeviceList, waterBillAdd, waterBillUpdate} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- name: "",
- code: "",
- waterConsumption: "",
- waterPrice: "",
- waterBill: "",
- billDate: "",
- waterType: "",
- },
- rules: {
- code: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterConsumption: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- billDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- waterDeviceList().then((res) => {
- codeList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-
-// 璁$畻姘磋垂閲戦
-const calculateWaterBill = () => {
- if (form.value.waterConsumption && form.value.waterPrice) {
- form.value.waterBill = (parseFloat(form.value.waterConsumption) * parseFloat(form.value.waterPrice)).toFixed(2);
- }
-}
-
-// 鐩戝惉鐢ㄦ按閲忓拰姘磋垂鍗曚环鍙樺寲
-watch([() => form.value.waterConsumption, () => form.value.waterPrice], () => {
- calculateWaterBill();
-});
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- waterBillAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- waterBillUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/index.vue b/src/views/energyManagement/waterManagement/index.vue
deleted file mode 100644
index 181ae88..0000000
--- a/src/views/energyManagement/waterManagement/index.vue
+++ /dev/null
@@ -1,312 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- @close="handleDialogClose"
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- >
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, nextTick} from "vue";
-import FormDia from "@/views/energyManagement/waterManagement/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {waterEquipmentDelete, waterEquipmentListPage} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "deviceName",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "deviceModel",
- width: 200,
- },
- {
- label: "棰濆畾娴侀噺",
- prop: "ratedRate",
- },
- {
- label: "瀹為檯娴侀噺",
- prop: "actualTraffic",
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runTime",
- width:150
- },
- {
- label: "褰撴棩鐢ㄦ按閲�",
- prop: "waterDay",
- width: 150,
- },
- {
- label: "姣忔棩闄愬埗姘撮噺",
- prop: "waterDayLimit",
- width:220
- },
- {
- label: "姘磋垂鍗曚环",
- prop: "waterPrice",
- width: 120,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/waterRecord/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
- upload.open = false;
- getList();
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.log('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- upload.open = false;
- },
- // 鏂囦欢涓婁紶杩涘害鏀瑰彉鏃剁殑鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶杩涘害', event, file, fileList);
- upload.isUploading = true;
- },
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- waterEquipmentListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鐢ㄦ按璁惧";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/waterRecord/export",
- {},
- '鐢ㄦ按璁惧瀵煎叆妯$増.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- waterEquipmentDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/waterBill.vue b/src/views/energyManagement/waterManagement/waterBill.vue
deleted file mode 100644
index ea382f0..0000000
--- a/src/views/energyManagement/waterManagement/waterBill.vue
+++ /dev/null
@@ -1,181 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, nextTick} from "vue";
-import FormDia from "@/views/energyManagement/waterManagement/components/waterBillForm.vue";
-import {ElMessageBox} from "element-plus";
-import {waterBillDelete, waterBillListPage} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 200,
- },
- {
- label: "鐢ㄦ按閲�",
- prop: "waterConsumption",
- },
- {
- label: "姘磋垂鍗曚环",
- prop: "waterPrice",
- },
- {
- label: "姘磋垂閲戦",
- prop: "waterBill",
- width:150
- },
- {
- label: "璁¤垂鏃ユ湡",
- prop: "billDate",
- width: 150,
- },
- {
- label: "鐢ㄦ按绫诲瀷",
- prop: "waterType",
- width:120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- waterBillListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- waterBillDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/waterTrends.vue b/src/views/energyManagement/waterManagement/waterTrends.vue
deleted file mode 100644
index 12e45fc..0000000
--- a/src/views/energyManagement/waterManagement/waterTrends.vue
+++ /dev/null
@@ -1,118 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive} from "vue";
-import {listPageByWaterTrend} from "@/api/energyManagement/waterManagement.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 220,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 220,
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width: 250,
- },
- {
- label: "鏄ㄦ棩鐢ㄦ按閲�",
- prop: "toDayNum",
- },
- {
- label: "鏈湀骞冲潎姘撮噺",
- prop: "avgNum",
- width:150
- },
- {
- label: "瓒嬪娍",
- prop: "trend",
- width: 220,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- listPageByWaterTrend({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/equipmentManagement/brand/index.vue b/src/views/equipmentManagement/brand/index.vue
deleted file mode 100644
index 6607cc8..0000000
--- a/src/views/equipmentManagement/brand/index.vue
+++ /dev/null
@@ -1,217 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鍝佺墝鍚嶇О/鍥藉">
- <el-input
- v-model="filters.name"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ叧閿瘝"
- clearable
- prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="openAdd" icon="Plus"> 鏂板 </el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleSelection.length <= 0"
- @click="handleBatchDelete"
- >鎵归噺鍒犻櫎</el-button>
- </div>
- </div>
-
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- </PIMTable>
- </div>
-
- <el-dialog v-model="visible" :title="dialogTitle" width="520px" destroy-on-close>
- <el-form :model="form" ref="formRef" :rules="rules" label-width="90px">
- <el-form-item label="鍝佺墝鍚嶇О" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ搧鐗屽悕绉�" />
- </el-form-item>
- <el-form-item label="鎵�灞炲浗瀹�" prop="country">
- <el-input v-model="form.country" placeholder="璇疯緭鍏ュ浗瀹�/鍦板尯" />
- </el-form-item>
- <el-form-item label="鎻忚堪" prop="description">
- <el-input v-model="form.description" type="textarea" :rows="3" placeholder="鍙~鍐欏搧鐗岀畝浠�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="visible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-
-</template>
-
-<script setup>
-import { ref, getCurrentInstance, onMounted } from 'vue'
-import { ElMessageBox, ElMessage } from 'element-plus'
-import { usePaginationApi } from '@/hooks/usePaginationApi'
-import { getBrandPage, addBrand, editBrand, delBrand } from '@/api/equipmentManagement/brand'
-
-defineOptions({ name: '璁惧鍝佺墝绠$悊' })
-
-const { proxy } = getCurrentInstance()
-
-const multipleSelection = ref([])
-const formRef = ref()
-const visible = ref(false)
-const dialogTitle = ref('鏂板鍝佺墝')
-const form = ref({ id: undefined, name: '', country: '', description: '' })
-
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ搧鐗屽悕绉�', trigger: 'blur' }],
- country: [{ required: true, message: '璇疯緭鍏ユ墍灞炲浗瀹�', trigger: 'blur' }]
-}
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getBrandPage,
- { name: undefined },
- [
- { label: '鍝佺墝鍚嶇О', align: 'center', prop: 'name' },
- { label: '鎵�灞炲浗瀹�', align: 'center', prop: 'country' },
- { label: '鎻忚堪', align: 'center', prop: 'description' },
- { label: '鍒涘缓鏃堕棿', align: 'center', prop: 'createdAt' },
- {
- dataType: 'action',
- label: '鎿嶄綔',
- align: 'center',
- fixed: 'right',
- width: 140,
- operation: [
- {
- name: '缂栬緫',
- type: 'text',
- clickFun: (row) => openEdit(row),
- },
- {
- name: '鍒犻櫎',
- type: 'text',
- clickFun: (row) => handleDelete(row.id),
- }
- ]
- }
- ]
-)
-
-const handleSelectionChange = (list) => {
- multipleSelection.value = list
-}
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page
- pagination.pageSize = limit
- onCurrentChange(page)
-}
-
-function resetForm() {
- form.value = { id: undefined, name: '', country: '', description: '' }
-}
-
-function openAdd() {
- resetForm()
- dialogTitle.value = '鏂板鍝佺墝'
- visible.value = true
-}
-
-function openEdit(row) {
- form.value = { id: row.id, name: row.name, country: row.country, description: row.description }
- dialogTitle.value = '缂栬緫鍝佺墝'
- visible.value = true
-}
-
-function handleSubmit() {
- formRef.value.validate(async (valid) => {
- if (!valid) return
- const isEdit = Boolean(form.value.id)
- const api = isEdit ? editBrand : addBrand
- const { code, msg } = await api({ ...form.value })
- if (code === 200) {
- ElMessage.success(isEdit ? '淇敼鎴愬姛' : '鏂板鎴愬姛')
- visible.value = false
- getTableData()
- } else {
- ElMessage.error(msg || '鎿嶄綔澶辫触')
- }
- })
-}
-
-function handleDelete(id) {
- ElMessageBox.confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ュ搧鐗�, 鏄惁缁х画?', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }).then(async () => {
- const { code } = await delBrand(id)
- if (code === 200) {
- ElMessage.success('鍒犻櫎鎴愬姛')
- getTableData()
- }
- })
-}
-
-function handleBatchDelete() {
- if (multipleSelection.value.length === 0) return
- ElMessageBox.confirm('灏嗗垹闄ら�変腑鐨勫搧鐗岋紝鏄惁缁х画锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }).then(async () => {
- const ids = multipleSelection.value.map((i) => i.id)
- const { code } = await delBrand(ids)
- if (code === 200) {
- ElMessage.success('鍒犻櫎鎴愬姛')
- getTableData()
- }
- })
-}
-
-onMounted(() => {
- getTableData()
-})
-
-</script>
-
-<style scoped lang="scss">
-.table_list { margin-top: unset; }
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
-
-
diff --git a/src/views/equipmentManagement/calibration/index.vue b/src/views/equipmentManagement/calibration/index.vue
deleted file mode 100644
index 7dfd405..0000000
--- a/src/views/equipmentManagement/calibration/index.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">妫�瀹氭棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
- <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable style="width: 240px" @change="handleQuery"/>
-<!-- <span class="search_title ml10">鐘舵�侊細</span>-->
-<!-- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 160px" clearable>-->
-<!-- <el-option label="鏈夋晥" :value="1"></el-option>-->
-<!-- <el-option label="閫炬湡" :value="2"></el-option>-->
-<!-- </el-select>-->
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {ledgerRecordListPage} from "@/api/equipmentManagement/calibration.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- recordDate: "",
- code: "",
- entryDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- // {
- // label: "鐘舵��",
- // prop: "status",
- // dataType: "tag",
- // formatData: (params) => {
- // if (params == 1) {
- // return "鏈夋晥";
- // } else if (params == 2) {
- // return "閫炬湡";
- // } else {
- // return null;
- // }
- // },
- // formatType: (params) => {
- // if (params == 1) {
- // return "success";
- // } else if (params == 2) {
- // return "danger";
- // } else {
- // return null;
- // }
- // },
- // },
- {
- label: "妫�瀹氭棩鏈�",
- prop: "recordDate",
- width: 130,
- },
- {
- label: "璁¢噺鍣ㄥ叿缂栧彿",
- prop: "code",
- width: 150,
- },
- {
- label: "璁¢噺鍣ㄥ叿鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- width:200
- },
- {
- label: "鏈夋晥鏈�",
- prop: "valid",
- width: 100,
- },
- {
- label: "褰曞叆浜�",
- prop: "userName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 130,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openCalibrationDia("edit", row);
- },
- disabled: (row) => {
- return row.userId !== userStore.id
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const calibrationDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- ledgerRecordListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch((err) => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
-const openCalibrationDia = (type, row) => {
- nextTick(() => {
- calibrationDia.value?.openDialog(type, row)
- })
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/measuringInstrumentLedgerRecord/export", {}, "妫�瀹氭牎鍑嗚褰�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/deviceInfo/index.vue b/src/views/equipmentManagement/deviceInfo/index.vue
deleted file mode 100644
index de162cc..0000000
--- a/src/views/equipmentManagement/deviceInfo/index.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div class="device-info-container">
- <div class="page-header">
- <h1>璁惧淇℃伅</h1>
- <div class="device-status" :class="deviceStatusClass">
- {{ deviceStatusText }}
- </div>
- </div>
-
- <div class="info-card">
- <div class="card-header">鍩烘湰淇℃伅</div>
- <div class="card-content">
- <div class="info-row">
- <span class="label">璁惧鍚嶇О锛�</span>
- <span class="value">{{ deviceInfo.deviceName }}</span>
- </div>
- <div class="info-row">
- <span class="label">瑙勬牸鍨嬪彿锛�</span>
- <span class="value">{{ deviceInfo.deviceModel }}</span>
- </div>
- <div class="info-row">
- <span class="label">鐢熶骇鍘傚锛�</span>
- <span class="value">{{ deviceInfo.supplierName }}</span>
- </div>
- <div class="info-row">
- <span class="label">鍗曚綅锛�</span>
- <span class="value">{{ deviceInfo.unit }}</span>
- </div>
- </div>
- </div>
-
- <div class="info-card">
- <div class="card-header">缁存姢淇℃伅</div>
- <div class="card-content">
- <div class="maintenance-info">
- <div class="maintenance-item">
- <span class="label">鏈�鍚庣淮鎶わ細</span>
- <span class="value">{{ deviceInfo.updateTime }}</span>
- </div>
- <div class="maintenance-item">
- <span class="label">涓嬫缁存姢锛�</span>
- <span class="value">{{ deviceInfo.createTime }}</span>
- </div>
- <div class="maintenance-item">
- <span class="label">缁存姢鐘舵�侊細</span>
- <span class="value status-normal">{{ deviceInfo.statusText }}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, computed } from 'vue'
-import { useRoute } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import {
- getDeviceInfo,
-} from '@/api/equipmentManagement/deviceInfo'
-
-const route = useRoute()
-
-const deviceInfo = reactive({
- deviceName: '',
- deviceModel: '',
- supplierName: '',
- unit: '',
- statusText:'姝e父',
- updateTime:'',
- createTime:''
-})
-
-const deviceStatusClass = computed(() => {
- return 'status-normal'
-})
-
-const deviceStatusText = computed(() => {
- return '姝e父'
-})
-
-const fetchDeviceInfo = async (deviceId) => {
- try {
- // 鑾峰彇璁惧淇℃伅
- const deviceResponse = await getDeviceInfo({id:deviceId})
- if (deviceResponse.code === 200) {
- Object.assign(deviceInfo, deviceResponse.data)
- }
-
-
- } catch (error) {
-
- ElMessage.warning('浣跨敤妯℃嫙鏁版嵁锛屽疄闄匒PI璋冪敤澶辫触')
- }
-}
-
-onMounted(() => {
- const deviceId = route.query.deviceId || route.params.deviceId || ''
- fetchDeviceInfo(deviceId)
-})
-</script>
-
-<style scoped>
-.device-info-container {
- min-height: 100vh;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- padding: 20px;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
-}
-
-.page-header {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 16px;
- padding: 20px;
- margin-bottom: 20px;
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.page-header h1 {
- margin: 0;
- color: #2c3e50;
- font-size: 24px;
-}
-
-.device-status {
- padding: 8px 16px;
- border-radius: 20px;
- font-size: 14px;
- color: white;
- background: #52c41a;
-}
-
-.info-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 16px;
- margin-bottom: 20px;
- overflow: hidden;
-}
-
-.card-header {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- padding: 16px 20px;
- font-weight: 500;
-}
-
-.card-content {
- padding: 20px;
-}
-
-.info-row, .maintenance-item {
- display: flex;
- margin-bottom: 12px;
- align-items: center;
-}
-
-.label {
- width: 100px;
- color: #666;
- font-size: 14px;
-}
-
-.value {
- flex: 1;
- color: #2c3e50;
- font-weight: 500;
-}
-
-.status-normal {
- color: #52c41a;
-}
-
-
-
-@media (max-width: 768px) {
- .device-info-container {
- padding: 16px;
- }
-
- .page-header h1 {
- font-size: 20px;
- }
-
- .label {
- width: 80px;
- }
-}
-</style>
diff --git a/src/views/equipmentManagement/gasTank/simple.vue b/src/views/equipmentManagement/gasTank/simple.vue
deleted file mode 100644
index 4cb2d76..0000000
--- a/src/views/equipmentManagement/gasTank/simple.vue
+++ /dev/null
@@ -1,566 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>閲嶅瀷缃愬紡璐ц溅鐩戞帶</h2>
- <div class="header-actions">
-<!-- <el-button type="primary" @click="addTank">鏂板鍌ㄧ綈</el-button>-->
-<!-- <el-button @click="exportData">瀵煎嚭鏁版嵁</el-button>-->
- </div>
- </div>
-
- <!-- 鍥涗釜涓昏妯″潡 -->
- <div class="modules-container">
- <!-- 1. 鍩烘湰淇℃伅妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>1. 鍩烘湰淇℃伅</span>
- <el-button type="text" @click="handleEditBasicInfo">缂栬緫</el-button>
- </div>
- </template>
- <div class="info-grid">
- <div class="info-item">
- <label>鍌ㄧ綈缂栧彿锛�</label>
- <span>{{ basicInfo.tankCode }}</span>
- </div>
- <div class="info-item">
- <label>鍌ㄧ綈鍚嶇О锛�</label>
- <span>{{ basicInfo.tankName }}</span>
- </div>
- <div class="info-item">
- <label>鍌ㄧ綈绫诲瀷锛�</label>
- <span>{{ basicInfo.tankType }}</span>
- </div>
- <div class="info-item">
- <label>璁捐鍘嬪姏锛�</label>
- <span>{{ basicInfo.designPressure }} MPa</span>
- </div>
- <div class="info-item">
- <label>宸ヤ綔鍘嬪姏锛�</label>
- <span>{{ basicInfo.workingPressure }} MPa</span>
- </div>
- <div class="info-item">
- <label>瀹圭Н锛�</label>
- <span>{{ basicInfo.volume }} m鲁</span>
- </div>
- </div>
- </el-card>
-
- <!-- 2. 鐩戞祴鍙傛暟妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>2. 鐩戞祴鍙傛暟</span>
- <el-button type="text" @click="refreshMonitoring">鍒锋柊</el-button>
- </div>
- </template>
- <div class="monitoring-grid">
- <div class="monitor-item">
- <div class="monitor-label">鍘嬪姏</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.pressureStatus)">
- {{ monitoringData.pressure }} MPa
- </div>
- <div class="monitor-status">{{ monitoringData.pressureStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">娓╁害</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.temperatureStatus)">
- {{ monitoringData.temperature }} 鈩�
- </div>
- <div class="monitor-status">{{ monitoringData.temperatureStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">姘斾綋娴撳害</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.gasStatus)">
- {{ monitoringData.gasConcentration }} ppm
- </div>
- <div class="monitor-status">{{ monitoringData.gasStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">娴侀噺</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.flowStatus)">
- {{ monitoringData.flow }} m鲁/h
- </div>
- <div class="monitor-status">{{ monitoringData.flowStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- </div>
- </el-card>
-
- <!-- 3. 瀹夊叏瑁呯疆妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>3. 瀹夊叏瑁呯疆</span>
- <el-button type="text" @click="checkSafetyDevices">妫�鏌�</el-button>
- </div>
- </template>
- <div class="safety-grid">
- <div class="safety-item" v-for="device in safetyDevices" :key="device.name">
-
- <div class="device-info">
- <div class="device-name">{{ device.name }}</div>
- <div class="device-status" :class="device.status">
- {{ device.status === 'normal' ? '姝e父' : '寮傚父' }}
- </div>
- </div>
- </div>
- </div>
- </el-card>
-
- <!-- 4. 缁存姢璁板綍妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>4. 缁存姢璁板綍</span>
- <el-button type="text" @click="addMaintenanceRecord">娣诲姞璁板綍</el-button>
- </div>
- </template>
- <div class="maintenance-list">
- <div class="maintenance-item" v-for="record in maintenanceRecords" :key="record.id">
- <div class="record-header">
- <span class="record-date">{{ record.date }}</span>
- <el-tag :type="record.type === 'inspection' ? 'primary' : 'success'" size="small">
- {{ record.type === 'inspection' ? '妫�楠�' : '缁存姢' }}
- </el-tag>
- </div>
- <div class="record-content">
- <div class="record-title">{{ record.title }}</div>
- <div class="record-desc">{{ record.description }}</div>
- <div class="record-operator">鎿嶄綔浜猴細{{ record.operator }}</div>
- </div>
- </div>
- </div>
- </el-card>
- </div>
-
- <!-- 缂栬緫鍩烘湰淇℃伅寮圭獥 -->
- <el-dialog v-model="basicInfoDialogVisible" title="缂栬緫鍩烘湰淇℃伅" width="600px">
- <el-form :model="editBasicInfo" label-width="120px">
- <el-form-item label="鍌ㄧ綈缂栧彿">
- <el-input v-model="editBasicInfo.tankCode" />
- </el-form-item>
- <el-form-item label="鍌ㄧ綈鍚嶇О">
- <el-input v-model="editBasicInfo.tankName" />
- </el-form-item>
- <el-form-item label="鍌ㄧ綈绫诲瀷">
- <el-select v-model="editBasicInfo.tankType" style="width: 100%">
- <el-option label="娑插寲姘斾綋鍌ㄧ綈" value="娑插寲姘斾綋鍌ㄧ綈" />
- <el-option label="鍘嬪姏瀹瑰櫒" value="鍘嬪姏瀹瑰櫒" />
- <el-option label="甯稿帇鍌ㄧ綈" value="甯稿帇鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- <el-form-item label="璁捐鍘嬪姏">
- <el-input-number v-model="editBasicInfo.designPressure" :precision="2" style="width: 100%" />
- </el-form-item>
- <el-form-item label="宸ヤ綔鍘嬪姏">
- <el-input-number v-model="editBasicInfo.workingPressure" :precision="2" style="width: 100%" />
- </el-form-item>
- <el-form-item label="瀹圭Н">
- <el-input-number v-model="editBasicInfo.volume" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="basicInfoDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveBasicInfo">淇濆瓨</el-button>
- </template>
- </el-dialog>
-
- <!-- 娣诲姞缁存姢璁板綍寮圭獥 -->
- <el-dialog v-model="maintenanceDialogVisible" title="娣诲姞缁存姢璁板綍" width="600px">
- <el-form :model="newMaintenanceRecord" label-width="120px">
- <el-form-item label="璁板綍绫诲瀷">
- <el-select v-model="newMaintenanceRecord.type" style="width: 100%">
- <el-option label="妫�楠�" value="inspection" />
- <el-option label="缁存姢" value="maintenance" />
- </el-select>
- </el-form-item>
- <el-form-item label="鏍囬">
- <el-input v-model="newMaintenanceRecord.title" />
- </el-form-item>
- <el-form-item label="鎻忚堪">
- <el-input type="textarea" v-model="newMaintenanceRecord.description" :rows="3" />
- </el-form-item>
- <el-form-item label="鎿嶄綔浜�">
- <el-input v-model="newMaintenanceRecord.operator" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="maintenanceDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveMaintenanceRecord">淇濆瓨</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-
-// 鍩烘湰淇℃伅
-const basicInfo = reactive({
- tankCode: 'GT001',
- tankName: '娑插寲姘斿偍缃怉',
- tankType: '娑插寲姘斾綋鍌ㄧ綈',
- designPressure: 1.6,
- workingPressure: 0.8,
- volume: 100.5
-})
-
-// 鐩戞祴鍙傛暟
-const monitoringData = reactive({
- pressure: 0.8,
- pressureStatus: 'normal',
- temperature: 25.5,
- temperatureStatus: 'normal',
- gasConcentration: 0.1,
- gasStatus: 'normal',
- flow: 15.2,
- flowStatus: 'normal'
-})
-
-// 瀹夊叏瑁呯疆
-const safetyDevices = ref([
- { name: '瀹夊叏闃�', status: 'normal' },
- { name: '鍘嬪姏浼犳劅鍣�', status: 'normal' },
- { name: '娓╁害浼犳劅鍣�', status: 'normal' },
- { name: '姘斾綋妫�娴嬪櫒', status: 'normal' },
- { name: '鐖嗙牬鐗�', status: 'normal' },
- { name: '娉勫帇瑁呯疆', status: 'normal' }
-])
-
-// 缁存姢璁板綍
-const maintenanceRecords = ref([
- {
- id: 1,
- date: '2025-01-15',
- type: 'inspection',
- title: '骞村害妫�楠�',
- description: '鎸夌収TSG 21-2016鏍囧噯杩涜骞村害妫�楠岋紝璁惧鐘舵�佽壇濂�',
- operator: '寮犲伐绋嬪笀'
- },
- {
- id: 2,
- date: '2025-02-20',
- type: 'maintenance',
- title: '瀹夊叏闃�缁存姢',
- description: '鏇存崲瀹夊叏闃�瀵嗗皝鍦堬紝鏍″噯鍘嬪姏璁惧畾鍊�',
- operator: '鏉庢妧甯�'
- },
- {
- id: 3,
- date: '2025-03-10',
- type: 'inspection',
- title: '鍘嬪姏娴嬭瘯',
- description: '杩涜鍘嬪姏瀹瑰櫒姘村帇璇曢獙锛岀鍚堣璁¤姹�',
- operator: '鐜嬫楠屽憳'
- }
-])
-
-// 寮圭獥鎺у埗
-const basicInfoDialogVisible = ref(false)
-const maintenanceDialogVisible = ref(false)
-
-// 缂栬緫琛ㄥ崟鏁版嵁
-const editBasicInfo = reactive({ ...basicInfo })
-const newMaintenanceRecord = reactive({
- type: 'inspection',
- title: '',
- description: '',
- operator: ''
-})
-
-// 鑾峰彇鐘舵�佹牱寮忕被
-const getStatusClass = (status) => {
- return status === 'normal' ? 'status-normal' : 'status-warning'
-}
-
-// 鏂板鍌ㄧ綈
-const addTank = () => {
- ElMessage.success('鏂板鍌ㄧ綈鍔熻兘')
-}
-
-// 瀵煎嚭鏁版嵁
-const exportData = () => {
- ElMessage.success('瀵煎嚭鎴愬姛')
-}
-
-// 缂栬緫鍩烘湰淇℃伅
-const handleEditBasicInfo = () => {
- Object.assign(editBasicInfo, basicInfo)
- basicInfoDialogVisible.value = true
-}
-
-// 淇濆瓨鍩烘湰淇℃伅
-const saveBasicInfo = () => {
- Object.assign(basicInfo, editBasicInfo)
- basicInfoDialogVisible.value = false
- ElMessage.success('淇濆瓨鎴愬姛')
-}
-
-// 鍒锋柊鐩戞祴鏁版嵁
-const refreshMonitoring = () => {
- // 妯℃嫙鏁版嵁鏇存柊
- monitoringData.pressure = (Math.random() * 0.5 + 0.6).toFixed(2)
- monitoringData.temperature = (Math.random() * 10 + 20).toFixed(1)
- monitoringData.gasConcentration = (Math.random() * 0.2).toFixed(2)
- monitoringData.flow = (Math.random() * 10 + 10).toFixed(1)
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 妫�鏌ュ畨鍏ㄨ缃�
-const checkSafetyDevices = () => {
- // 妯℃嫙妫�鏌ヨ繃绋�
- safetyDevices.value.forEach(device => {
- device.status = Math.random() > 0.1 ? 'normal' : 'warning'
- })
- ElMessage.success('瀹夊叏瑁呯疆妫�鏌ュ畬鎴�')
-}
-
-// 娣诲姞缁存姢璁板綍
-const addMaintenanceRecord = () => {
- newMaintenanceRecord.type = 'inspection'
- newMaintenanceRecord.title = ''
- newMaintenanceRecord.description = ''
- newMaintenanceRecord.operator = ''
- maintenanceDialogVisible.value = true
-}
-
-// 淇濆瓨缁存姢璁板綍
-const saveMaintenanceRecord = () => {
- const record = {
- id: Date.now(),
- date: new Date().toISOString().split('T')[0],
- ...newMaintenanceRecord
- }
- maintenanceRecords.value.unshift(record)
- maintenanceDialogVisible.value = false
- ElMessage.success('璁板綍娣诲姞鎴愬姛')
-}
-
-// 妯℃嫙瀹炴椂鏁版嵁鏇存柊
-onMounted(() => {
- setInterval(() => {
- monitoringData.pressure = (Math.random() * 0.5 + 0.6).toFixed(2)
- monitoringData.temperature = (Math.random() * 10 + 20).toFixed(1)
- monitoringData.gasConcentration = (Math.random() * 0.2).toFixed(2)
- monitoringData.flow = (Math.random() * 10 + 10).toFixed(1)
- }, 5000)
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 20px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- padding: 20px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- }
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
-}
-
-.modules-container {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 20px;
-}
-
-.module-card {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: bold;
- color: #303133;
- }
-}
-
-.info-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .info-item {
- display: flex;
- justify-content: space-between;
- padding: 10px;
- background: #f8f9fa;
- border-radius: 4px;
-
- label {
- font-weight: bold;
- color: #606266;
- }
-
- span {
- color: #303133;
- }
- }
-}
-
-.monitoring-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .monitor-item {
- text-align: center;
- padding: 15px;
- background: #f8f9fa;
- border-radius: 8px;
- border: 2px solid transparent;
-
- .monitor-label {
- font-size: 14px;
- color: #606266;
- margin-bottom: 8px;
- }
-
- .monitor-value {
- font-size: 20px;
- font-weight: bold;
- margin-bottom: 5px;
-
- &.status-normal {
- color: #67c23a;
- }
-
- &.status-warning {
- color: #e6a23c;
- }
- }
-
- .monitor-status {
- font-size: 12px;
- color: #909399;
- }
- }
-}
-
-.safety-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .safety-item {
- display: flex;
- align-items: center;
- padding: 15px;
- background: #f8f9fa;
- border-radius: 8px;
- border: 2px solid transparent;
-
- .device-icon {
- margin-right: 15px;
- }
-
- .device-info {
- flex: 1;
-
- .device-name {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .device-status {
- font-size: 12px;
- padding: 2px 8px;
- border-radius: 10px;
- display: inline-block;
-
- &.normal {
- background: #f0f9ff;
- color: #409eff;
- }
-
- &.warning {
- background: #fef7e0;
- color: #e6a23c;
- }
- }
- }
- }
-}
-
-.maintenance-list {
- max-height: 300px;
- overflow-y: auto;
-
- .maintenance-item {
- padding: 15px;
- border-bottom: 1px solid #ebeef5;
- margin-bottom: 10px;
-
- &:last-child {
- border-bottom: none;
- margin-bottom: 0;
- }
-
- .record-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 8px;
-
- .record-date {
- font-size: 14px;
- color: #909399;
- }
- }
-
- .record-content {
- .record-title {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .record-desc {
- font-size: 14px;
- color: #606266;
- margin-bottom: 5px;
- line-height: 1.4;
- }
-
- .record-operator {
- font-size: 12px;
- color: #909399;
- }
- }
- }
-}
-
-// 鍝嶅簲寮忚璁�
-@media (max-width: 1200px) {
- .modules-container {
- grid-template-columns: 1fr;
- }
-}
-
-@media (max-width: 768px) {
- .info-grid,
- .monitoring-grid,
- .safety-grid {
- grid-template-columns: 1fr;
- }
-}
-</style>
diff --git a/src/views/equipmentManagement/iotMonitor/index.vue b/src/views/equipmentManagement/iotMonitor/index.vue
deleted file mode 100644
index b0cd818..0000000
--- a/src/views/equipmentManagement/iotMonitor/index.vue
+++ /dev/null
@@ -1,317 +0,0 @@
-<template>
- <div class="app-container iot-monitor">
- <div class="header">
- <div class="title">瀹炴椂宸ュ喌鐩戞帶锛圛oT锛�</div>
- <div class="actions">
- <el-button type="primary" @click="toggleCollecting">{{ collecting ? '鏆傚仠閲囬泦' : '鍚姩閲囬泦' }}</el-button>
- <el-button @click="resetAll">閲嶇疆</el-button>
- <span class="ts">涓婃鏇存柊鏃堕棿锛歿{ lastUpdatedDisplay }}</span>
- </div>
- </div>
-
-<!-- <el-alert-->
-<!-- title="杈圭紭棰勮瑙勫垯锛氳酱鎵跨(鎹�-鎸姩鍊煎亸绂诲熀绾柯�5%瑙﹀彂鍛婅锛涙俯搴�/鍘嬪姏瓒婄晫瑙﹀彂鎻愰啋"-->
-<!-- type="info"-->
-<!-- :closable="false"-->
-<!-- show-icon-->
-<!-- class="rule-alert"-->
-<!-- />-->
-
- <el-row :gutter="16">
- <el-col v-for="dev in devices" :key="dev.id" :span="12">
- <el-card :class="['device-card', dev.hasAlert ? 'is-alert' : '']">
- <template #header>
- <div class="card-header">
- <div class="card-title">
- <span class="device-name">{{ dev.name }}</span>
- <el-tag :type="dev.hasAlert ? 'danger' : 'success'" size="small">{{ dev.hasAlert ? '鍛婅' : '姝e父' }}</el-tag>
- </div>
- <div class="meta">绫诲瀷锛歿{ dev.type }}锝滃熀绾挎尟鍔細{{ dev.baseline.vibration.toFixed(2) }} mm/s</div>
- </div>
- </template>
-
- <div class="metrics">
- <div class="metric" :class="{ 'metric-alert': dev.alerts.vibration }">
- <div class="metric-head">
- <span>鎸姩(mm/s)</span>
- <el-tag :type="dev.alerts.vibration ? 'danger' : 'info'" size="small">{{ dev.alerts.vibration ? '卤5%瓒婄晫' : '鍩虹嚎卤5%' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.vibration).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'mm/s' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.vibration }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#409EFF']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.temperature }">
- <div class="metric-head">
- <span>娓╁害(掳C)</span>
- <el-tag :type="dev.alerts.temperature ? 'warning' : 'info'" size="small">{{ dev.alerts.temperature ? '瓒婄晫' : '20~80' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.temperature).toFixed(1) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: '掳C' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.temperature }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#E6A23C']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.pressure }">
- <div class="metric-head">
- <span>鍘嬪姏(MPa)</span>
- <el-tag :type="dev.alerts.pressure ? 'warning' : 'info'" size="small">{{ dev.alerts.pressure ? '瓒婄晫' : '0.2~1.5' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.pressure).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'MPa' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.pressure }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#67C23A']"
- />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onBeforeUnmount, computed } from 'vue'
-import { ElNotification } from 'element-plus'
-import Echarts from '@/components/Echarts/echarts.vue'
-
-defineOptions({ name: 'IoTMonitor' })
-
-const windowSize = 30
-const collecting = ref(true)
-const lastUpdated = ref(Date.now())
-const lastUpdatedDisplay = computed(() => new Date(lastUpdated.value).toLocaleTimeString())
-
-const xAxisLabels = ref(Array.from({ length: windowSize }, (_, i) => i - (windowSize - 1)).map(n => `${n}s`))
-
-function makeSeries(fill, decimals = 2) {
- return Array.from({ length: windowSize }, () => Number(fill.toFixed(decimals)))
-}
-
-const devices = reactive([
- {
- id: 'water-pump',
- name: '娉ㄦ按娉�1',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 9 },
- initial: { temperature: 40, pressure: 0.70 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(9),
- temperature: makeSeries(40, 1),
- pressure: makeSeries(0.7, 2),
- },
- },
- {
- id: 'fluid-supply-truck',
- name: '娉ㄦ按娉�2',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 7 },
- initial: { temperature: 30, pressure: 0.60 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(7),
- temperature: makeSeries(30, 1),
- pressure: makeSeries(0.6, 2),
- },
- },
- {
- id: 'fracturing-truck',
- name: '娉ㄦ按娉�3',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 12 },
- initial: { temperature: 65, pressure: 1.40 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(12),
- temperature: makeSeries(65, 1),
- pressure: makeSeries(1.4, 2),
- },
- },
- {
- id: 'oil-tank-truck',
- name: '娉ㄦ按娉�4',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 6 },
- initial: { temperature: 28, pressure: 0.50 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(6),
- temperature: makeSeries(28, 1),
- pressure: makeSeries(0.5, 2),
- },
- },
-])
-
-function currentValue(arr) {
- return arr[arr.length - 1] ?? 0
-}
-
-function pushWindow(arr, val) {
- if (arr.length >= windowSize) arr.shift()
- arr.push(val)
-}
-
-function clamp(val, min, max) { return Math.max(min, Math.min(max, val)) }
-
-function tickDevice(dev) {
- const vibBase = dev.baseline.vibration
- // 鎸姩锛氬熀绾柯�2%闅忔満娉㈠姩锛�5%姒傜巼瑙﹀彂8%~12%灏栧嘲妯℃嫙鍛婅
- const spike = Math.random() < 0.05
- const vibNoise = vibBase * (spike ? (1 + (Math.random() * 0.08 + 0.04) * (Math.random() < 0.5 ? -1 : 1)) : (1 + (Math.random() - 0.5) * 0.04))
- const vibVal = Number(vibNoise.toFixed(2))
- pushWindow(dev.series.vibration, vibVal)
-
- // 娓╁害锛氱紦鎱㈤殢鏈烘父璧帮紝骞舵坊鍔犲伓鍙戦珮娓╁亸绉�
- const tPrev = currentValue(dev.series.temperature)
- const tDrift = tPrev + (Math.random() - 0.5) * 0.8 + (Math.random() < 0.02 ? 6 : 0)
- const tVal = Number(clamp(tDrift, 15, 95).toFixed(1))
- pushWindow(dev.series.temperature, tVal)
-
- // 鍘嬪姏锛氬皬骞呮尝鍔紝鍋跺彂浣庡帇/楂樺帇
- const pPrev = currentValue(dev.series.pressure)
- const pDrift = pPrev + (Math.random() - 0.5) * 0.05 + (Math.random() < 0.02 ? (Math.random() < 0.5 ? -0.3 : 0.3) : 0)
- const pVal = Number(clamp(pDrift, 0.05, 2.0).toFixed(2))
- pushWindow(dev.series.pressure, pVal)
-
- // 杈圭紭璁$畻闃堝�煎垽鏂�
- const vibDelta = Math.abs(vibVal - vibBase) / vibBase
- const vibAlert = vibDelta > 0.05
- const tAlert = tVal < 20 || tVal > 80
- const pAlert = pVal < 0.2 || pVal > 1.5
-
- const prevHasAlert = dev.hasAlert
- dev.alerts.vibration = vibAlert
- dev.alerts.temperature = tAlert
- dev.alerts.pressure = pAlert
- dev.hasAlert = vibAlert || tAlert || pAlert
-
- if (dev.hasAlert && !prevHasAlert) {
- const reasons = []
- if (vibAlert) reasons.push(`鎸姩鍋忕卤5% (褰撳墠 ${vibVal} / 鍩虹嚎 ${vibBase})`)
- if (tAlert) reasons.push(`娓╁害瓒婄晫 (褰撳墠 ${tVal}掳C, 鏈熸湜 20~80掳C) `)
- if (pAlert) reasons.push(`鍘嬪姏瓒婄晫 (褰撳墠 ${pVal}MPa, 鏈熸湜 0.2~1.5MPa) `)
- ElNotification({
- title: `${dev.name} 鍛婅`,
- message: reasons.join('锛�'),
- type: vibAlert ? 'error' : 'warning',
- duration: 5000,
- })
- }
-}
-
-let timer = null
-function start() {
- if (timer) return
- timer = setInterval(() => {
- if (!collecting.value) return
- devices.forEach(tickDevice)
- lastUpdated.value = Date.now()
- }, 10000)
-}
-
-function stop() {
- if (timer) {
- clearInterval(timer)
- timer = null
- }
-}
-
-function toggleCollecting() { collecting.value = !collecting.value }
-
-function resetAll() {
- devices.forEach(dev => {
- dev.series.vibration = makeSeries(dev.baseline.vibration)
- const t0 = dev.initial?.temperature ?? 45
- const p0 = dev.initial?.pressure ?? 0.8
- dev.series.temperature = makeSeries(t0, 1)
- dev.series.pressure = makeSeries(p0, 2)
- dev.alerts.vibration = false
- dev.alerts.temperature = false
- dev.alerts.pressure = false
- dev.hasAlert = false
- })
- lastUpdated.value = Date.now()
-}
-
-onMounted(() => {
- start()
-})
-
-onBeforeUnmount(() => {
- stop()
-})
-</script>
-
-<style lang="scss" scoped>
-.iot-monitor {
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 12px;
- .title { font-size: 18px; font-weight: 600; }
- .actions { display: flex; align-items: center; gap: 8px; }
- .ts { color: #909399; font-size: 12px; }
- }
- .rule-alert { margin-bottom: 12px; }
-}
-
-.device-card {
- margin-bottom: 16px;
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
- &.is-alert { border-color: #F56C6C; box-shadow: 0 0 0 2px rgba(245,108,108,0.2) inset; }
- .card-header {
- display: flex; flex-direction: column; gap: 4px;
- .card-title { display: flex; align-items: center; gap: 8px; font-weight: 600; }
- .meta { color: #909399; font-size: 12px; }
- }
- .metrics {
- display: grid;
- grid-template-columns: 1fr;
- gap: 12px;
- }
-}
-
-.metric {
- border: 1px solid #ebeef5;
- border-radius: 6px;
- padding: 8px 8px 0 8px;
- &-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; font-size: 13px; color: #606266; }
- &-value { font-size: 20px; font-weight: 600; margin: 2px 0 6px 0; }
-}
-
-.metric-alert {
- border-color: #F56C6C;
- background: #FFF6F6;
-}
-
-@media (min-width: 1200px) {
- .device-card .metrics { grid-template-columns: 1fr 1fr 1fr; }
-}
-</style>
-
-
diff --git a/src/views/equipmentManagement/iotMonitor/indexWD.vue b/src/views/equipmentManagement/iotMonitor/indexWD.vue
deleted file mode 100644
index 40a2eb0..0000000
--- a/src/views/equipmentManagement/iotMonitor/indexWD.vue
+++ /dev/null
@@ -1,317 +0,0 @@
-<template>
- <div class="app-container iot-monitor">
- <div class="header">
- <div class="title">瀹炴椂宸ュ喌鐩戞帶锛圛oT锛�</div>
- <div class="actions">
- <el-button type="primary" @click="toggleCollecting">{{ collecting ? '鏆傚仠閲囬泦' : '鍚姩閲囬泦' }}</el-button>
- <el-button @click="resetAll">閲嶇疆</el-button>
- <span class="ts">涓婃鏇存柊鏃堕棿锛歿{ lastUpdatedDisplay }}</span>
- </div>
- </div>
-
-<!-- <el-alert-->
-<!-- title="杈圭紭棰勮瑙勫垯锛氳酱鎵跨(鎹�-鎸姩鍊煎亸绂诲熀绾柯�5%瑙﹀彂鍛婅锛涙俯搴�/鍘嬪姏瓒婄晫瑙﹀彂鎻愰啋"-->
-<!-- type="info"-->
-<!-- :closable="false"-->
-<!-- show-icon-->
-<!-- class="rule-alert"-->
-<!-- />-->
-
- <el-row :gutter="16">
- <el-col v-for="dev in devices" :key="dev.id" :span="12">
- <el-card :class="['device-card', dev.hasAlert ? 'is-alert' : '']">
- <template #header>
- <div class="card-header">
- <div class="card-title">
- <span class="device-name">{{ dev.name }}</span>
- <el-tag :type="dev.hasAlert ? 'danger' : 'success'" size="small">{{ dev.hasAlert ? '鍛婅' : '姝e父' }}</el-tag>
- </div>
- <div class="meta">绫诲瀷锛歿{ dev.type }}锝滃熀绾挎尟鍔細{{ dev.baseline.vibration.toFixed(2) }} mm/s</div>
- </div>
- </template>
-
- <div class="metrics">
- <div class="metric" :class="{ 'metric-alert': dev.alerts.vibration }">
- <div class="metric-head">
- <span>鎸姩(mm/s)</span>
- <el-tag :type="dev.alerts.vibration ? 'danger' : 'info'" size="small">{{ dev.alerts.vibration ? '卤5%瓒婄晫' : '鍩虹嚎卤5%' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.vibration).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'mm/s' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.vibration }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#409EFF']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.temperature }">
- <div class="metric-head">
- <span>娓╁害(掳C)</span>
- <el-tag :type="dev.alerts.temperature ? 'warning' : 'info'" size="small">{{ dev.alerts.temperature ? '瓒婄晫' : '20~80' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.temperature).toFixed(1) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: '掳C' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.temperature }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#E6A23C']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.pressure }">
- <div class="metric-head">
- <span>鍘嬪姏(MPa)</span>
- <el-tag :type="dev.alerts.pressure ? 'warning' : 'info'" size="small">{{ dev.alerts.pressure ? '瓒婄晫' : '0.2~1.5' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.pressure).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'MPa' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.pressure }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#67C23A']"
- />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onBeforeUnmount, computed } from 'vue'
-import { ElNotification } from 'element-plus'
-import Echarts from '@/components/Echarts/echarts.vue'
-
-defineOptions({ name: 'IoTMonitor' })
-
-const windowSize = 30
-const collecting = ref(true)
-const lastUpdated = ref(Date.now())
-const lastUpdatedDisplay = computed(() => new Date(lastUpdated.value).toLocaleTimeString())
-
-const xAxisLabels = ref(Array.from({ length: windowSize }, (_, i) => i - (windowSize - 1)).map(n => `${n}s`))
-
-function makeSeries(fill, decimals = 2) {
- return Array.from({ length: windowSize }, () => Number(fill.toFixed(decimals)))
-}
-
-const devices = reactive([
- {
- id: 'hydrocyclone-desander',
- name: '鏃嬫祦闄ょ爞鍣�',
- type: '鍒嗙璁惧',
- baseline: { vibration: 8 },
- initial: { temperature: 35, pressure: 0.85 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(8),
- temperature: makeSeries(35, 1),
- pressure: makeSeries(0.85, 2),
- },
- },
- {
- id: 'high-pressure-separator',
- name: '楂樺帇鍒嗙鍣ㄦ挰',
- type: '鍒嗙璁惧',
- baseline: { vibration: 6 },
- initial: { temperature: 45, pressure: 1.20 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(6),
- temperature: makeSeries(45, 1),
- pressure: makeSeries(1.2, 2),
- },
- },
- {
- id: 'heating-throttle-pressure',
- name: '缁勫悎寮忓姞鐑妭娴佽皟鍘�',
- type: '璋冨帇璁惧',
- baseline: { vibration: 10 },
- initial: { temperature: 75, pressure: 1.80 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(10),
- temperature: makeSeries(75, 1),
- pressure: makeSeries(1.8, 2),
- },
- },
- {
- id: 'three-phase-separator',
- name: '涓夌浉鍒嗙鍣�',
- type: '鍒嗙璁惧',
- baseline: { vibration: 7 },
- initial: { temperature: 38, pressure: 0.95 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(7),
- temperature: makeSeries(38, 1),
- pressure: makeSeries(0.95, 2),
- },
- },
-])
-
-function currentValue(arr) {
- return arr[arr.length - 1] ?? 0
-}
-
-function pushWindow(arr, val) {
- if (arr.length >= windowSize) arr.shift()
- arr.push(val)
-}
-
-function clamp(val, min, max) { return Math.max(min, Math.min(max, val)) }
-
-function tickDevice(dev) {
- const vibBase = dev.baseline.vibration
- // 鎸姩锛氬熀绾柯�2%闅忔満娉㈠姩锛�5%姒傜巼瑙﹀彂8%~12%灏栧嘲妯℃嫙鍛婅
- const spike = Math.random() < 0.05
- const vibNoise = vibBase * (spike ? (1 + (Math.random() * 0.08 + 0.04) * (Math.random() < 0.5 ? -1 : 1)) : (1 + (Math.random() - 0.5) * 0.04))
- const vibVal = Number(vibNoise.toFixed(2))
- pushWindow(dev.series.vibration, vibVal)
-
- // 娓╁害锛氱紦鎱㈤殢鏈烘父璧帮紝骞舵坊鍔犲伓鍙戦珮娓╁亸绉�
- const tPrev = currentValue(dev.series.temperature)
- const tDrift = tPrev + (Math.random() - 0.5) * 0.8 + (Math.random() < 0.02 ? 6 : 0)
- const tVal = Number(clamp(tDrift, 15, 95).toFixed(1))
- pushWindow(dev.series.temperature, tVal)
-
- // 鍘嬪姏锛氬皬骞呮尝鍔紝鍋跺彂浣庡帇/楂樺帇
- const pPrev = currentValue(dev.series.pressure)
- const pDrift = pPrev + (Math.random() - 0.5) * 0.05 + (Math.random() < 0.02 ? (Math.random() < 0.5 ? -0.3 : 0.3) : 0)
- const pVal = Number(clamp(pDrift, 0.05, 2.0).toFixed(2))
- pushWindow(dev.series.pressure, pVal)
-
- // 杈圭紭璁$畻闃堝�煎垽鏂�
- const vibDelta = Math.abs(vibVal - vibBase) / vibBase
- const vibAlert = vibDelta > 0.05
- const tAlert = tVal < 20 || tVal > 80
- const pAlert = pVal < 0.2 || pVal > 1.5
-
- const prevHasAlert = dev.hasAlert
- dev.alerts.vibration = vibAlert
- dev.alerts.temperature = tAlert
- dev.alerts.pressure = pAlert
- dev.hasAlert = vibAlert || tAlert || pAlert
-
- if (dev.hasAlert && !prevHasAlert) {
- const reasons = []
- if (vibAlert) reasons.push(`鎸姩鍋忕卤5% (褰撳墠 ${vibVal} / 鍩虹嚎 ${vibBase})`)
- if (tAlert) reasons.push(`娓╁害瓒婄晫 (褰撳墠 ${tVal}掳C, 鏈熸湜 20~80掳C) `)
- if (pAlert) reasons.push(`鍘嬪姏瓒婄晫 (褰撳墠 ${pVal}MPa, 鏈熸湜 0.2~1.5MPa) `)
- ElNotification({
- title: `${dev.name} 鍛婅`,
- message: reasons.join('锛�'),
- type: vibAlert ? 'error' : 'warning',
- duration: 5000,
- })
- }
-}
-
-let timer = null
-function start() {
- if (timer) return
- timer = setInterval(() => {
- if (!collecting.value) return
- devices.forEach(tickDevice)
- lastUpdated.value = Date.now()
- }, 10000)
-}
-
-function stop() {
- if (timer) {
- clearInterval(timer)
- timer = null
- }
-}
-
-function toggleCollecting() { collecting.value = !collecting.value }
-
-function resetAll() {
- devices.forEach(dev => {
- dev.series.vibration = makeSeries(dev.baseline.vibration)
- const t0 = dev.initial?.temperature ?? 45
- const p0 = dev.initial?.pressure ?? 0.8
- dev.series.temperature = makeSeries(t0, 1)
- dev.series.pressure = makeSeries(p0, 2)
- dev.alerts.vibration = false
- dev.alerts.temperature = false
- dev.alerts.pressure = false
- dev.hasAlert = false
- })
- lastUpdated.value = Date.now()
-}
-
-onMounted(() => {
- start()
-})
-
-onBeforeUnmount(() => {
- stop()
-})
-</script>
-
-<style lang="scss" scoped>
-.iot-monitor {
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 12px;
- .title { font-size: 18px; font-weight: 600; }
- .actions { display: flex; align-items: center; gap: 8px; }
- .ts { color: #909399; font-size: 12px; }
- }
- .rule-alert { margin-bottom: 12px; }
-}
-
-.device-card {
- margin-bottom: 16px;
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
- &.is-alert { border-color: #F56C6C; box-shadow: 0 0 0 2px rgba(245,108,108,0.2) inset; }
- .card-header {
- display: flex; flex-direction: column; gap: 4px;
- .card-title { display: flex; align-items: center; gap: 8px; font-weight: 600; }
- .meta { color: #909399; font-size: 12px; }
- }
- .metrics {
- display: grid;
- grid-template-columns: 1fr;
- gap: 12px;
- }
-}
-
-.metric {
- border: 1px solid #ebeef5;
- border-radius: 6px;
- padding: 8px 8px 0 8px;
- &-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; font-size: 13px; color: #606266; }
- &-value { font-size: 20px; font-weight: 600; margin: 2px 0 6px 0; }
-}
-
-.metric-alert {
- border-color: #F56C6C;
- background: #FFF6F6;
-}
-
-@media (min-width: 1200px) {
- .device-card .metrics { grid-template-columns: 1fr 1fr 1fr; }
-}
-</style>
-
-
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
deleted file mode 100644
index 108dbe4..0000000
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ /dev/null
@@ -1,227 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О" prop="deviceName">
- <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿" prop="deviceModel">
- <el-input v-model="form.deviceModel" :disabled="(form.deviceModel != null && operationType === 'edit')" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁惧鍝佺墝" prop="deviceBrand">
- <el-input v-model="form.deviceBrand" placeholder="璇疯緭鍏ヨ澶囧搧鐗�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀛樻斁浣嶇疆" prop="storageLocation">
- <el-input v-model="form.storageLocation" placeholder="璇疯緭鍏ュ瓨鏀句綅缃�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍗曚綅" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚敤鎶樻棫" prop="enableDepreciation">
- <el-switch v-model="form.enableDepreciation" :active-value="true" :inactive-value="false" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺" prop="number">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.number"
- placeholder="璇疯緭鍏ユ暟閲�"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环" prop="taxIncludingPriceUnit">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.taxIncludingPriceUnit"
- placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
- maxlength="10"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环" prop="taxIncludingPriceTotal">
- <el-input
- v-model="form.taxIncludingPriceTotal"
- placeholder="鑷姩鐢熸垚"
- type="number"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)" prop="taxRate">
- <!-- <el-input
- v-model="form.taxRate"
- placeholder="璇疯緭鍏ョ◣鐜�"
- type="number"
- >
- <template #append> % </template>
- </el-input> -->
- <el-select
- v-model="form.taxRate"
- placeholder="璇烽�夋嫨"
- clearable
- @change="mathNum"
- >
- <el-option label="1" :value="1" />
- <el-option label="6" :value="6" />
- <el-option label="13" :value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环" prop="unTaxIncludingPriceTotal">
- <el-input
- v-model="form.unTaxIncludingPriceTotal"
- placeholder="鑷姩鐢熸垚"
- type="number"
- disabled
- />
- </el-form-item>
- </el-col>
- <!-- <el-col :span="12">
- <el-form-item label="褰曞叆浜�" prop="createUser">
- <el-input v-model="form.createUser" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
- </el-form-item>
- </el-col> -->
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="date"
- placeholder="璇烽�夋嫨褰曞叆鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-// import useUserStore from "@/store/modules/user";
-import { getLedgerById } from "@/api/equipmentManagement/ledger";
-import dayjs from "dayjs";
-import {
- calculateTaxIncludeTotalPrice,
- calculateTaxExclusiveTotalPrice,
-} from "@/utils/summarizeTable";
-import { ElMessage } from "element-plus";
-import {ref} from "vue";
-
-defineOptions({
- name: "璁惧鍙拌处琛ㄥ崟",
-});
-const formRef = ref(null);
-const operationType = ref('');
-const formRules = {
- deviceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- deviceModel: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- unit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- number: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- taxIncludingPriceUnit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- taxRate: [{ required: true, trigger: "change", message: "璇疯緭鍏�" }],
-}
-
-const { form, resetForm } = useFormData({
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- deviceBrand: undefined, // 璁惧鍝佺墝
- supplierName: undefined, // 渚涘簲鍟�
- storageLocation: undefined, // 瀛樻斁浣嶇疆
- enableDepreciation: false, // 鏄惁鍚敤鎶樻棫
- unit: undefined, // 鍗曚綅
- number: undefined, // 鏁伴噺
- taxIncludingPriceUnit: undefined, // 鍚◣鍗曚环
- taxIncludingPriceTotal: undefined, // 鍚◣鎬讳环
- taxRate: undefined, // 绋庣巼
- unTaxIncludingPriceTotal: undefined, // 涓嶅惈绋庢�讳环
- // createUser: useUserStore().nickName, // 褰曞叆浜�
- createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
-});
-
-const loadForm = async (id) => {
- if (id) {
- operationType.value = 'edit'
- }
- const { code, data } = await getLedgerById(id);
- if (code == 200) {
- form.deviceName = data.deviceName;
- form.deviceModel = data.deviceModel;
- form.deviceBrand = data.deviceBrand;
- form.supplierName = data.supplierName;
- form.storageLocation = data.storageLocation;
- form.enableDepreciation = data.enableDepreciation;
- form.unit = data.unit;
- form.number = data.number;
- form.taxIncludingPriceUnit = data.taxIncludingPriceUnit;
- form.taxIncludingPriceTotal = data.taxIncludingPriceTotal;
- form.taxRate = data.taxRate;
- form.unTaxIncludingPriceTotal = data.unTaxIncludingPriceTotal;
- form.createTime = data.createTime;
- }
-};
-
-const mathNum = () => {
- if (!form.taxIncludingPriceUnit) {
- ElMessage.error("璇疯緭鍏ュ崟浠�");
- return;
- }
- if (!form.number) {
- ElMessage.error("璇疯緭鍏ユ暟閲�");
- return;
- }
- form.taxIncludingPriceTotal = calculateTaxIncludeTotalPrice(
- form.taxIncludingPriceUnit,
- form.number
- );
- if (form.taxRate) {
- form.unTaxIncludingPriceTotal = calculateTaxExclusiveTotalPrice(
- form.taxIncludingPriceTotal,
- form.taxRate
- );
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/equipmentManagement/ledger/Modal.vue b/src/views/equipmentManagement/ledger/Modal.vue
deleted file mode 100644
index 0cea56c..0000000
--- a/src/views/equipmentManagement/ledger/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { addLedger, editLedger } from "@/api/equipmentManagement/ledger";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "璁惧鍙拌处鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧鍙拌处" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await editLedger({id: id.value, ...formRef.value.form})
- : await addLedger(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
deleted file mode 100644
index 7356ada..0000000
--- a/src/views/equipmentManagement/ledger/index.vue
+++ /dev/null
@@ -1,328 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="filters.deviceModel"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="渚涘簲鍟�">
- <el-input
- v-model="filters.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ緵搴斿晢"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鍗曚綅">
- <el-input
- v-model="filters.unit"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <el-dialog v-model="qrDialogVisible" title="浜岀淮鐮�" width="300px">
- <div style="text-align:center;">
- <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
- <div style="margin:10px 0;">
- <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
- </div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-// import { Search } from "@element-plus/icons-vue";
-import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import QRCode from "qrcode";
-import { ref } from "vue";
-
-defineOptions({
- name: "璁惧鍙拌处",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const qrDialogVisible = ref(false);
-const qrCodeUrl = ref("");
-const qrRowData = ref(null);
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getLedgerPage,
- {
- deviceName: undefined,
- deviceModel: undefined,
- supplierName: undefined,
- unit: undefined,
- entryDateStart: undefined,
- entryDateEnd: undefined,
- },
- [
- {
- label: "璁惧鍚嶇О",
- align: "center",
- prop: "deviceName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- align: "center",
- prop: "deviceModel",
- },
- {
- label: "璁惧鍝佺墝",
- align: "center",
- prop: "deviceBrand",
- },
- {
- label: "渚涘簲鍟�",
- align: "center",
- prop: "supplierName",
- },
- {
- label: "鍗曚綅",
- align: "center",
- prop: "unit",
- },
- {
- label: "瀛樻斁浣嶇疆",
- align: "center",
- prop: "storageLocation",
- },
- {
- label: "鏁伴噺",
- align: "center",
- prop: "number",
- },
- {
- label: "鍚◣鍗曚环",
- align: "center",
- prop: "taxIncludingPriceUnit",
- },
- {
- label: "鍚◣鎬讳环",
- align: "center",
- prop: "taxIncludingPriceTotal",
- },
- {
- label: "绋庣巼",
- align: "center",
- prop: "taxRate",
- },
- {
- label: "涓嶅惈绋庢�讳环",
- align: "center",
- prop: "unTaxIncludingPriceTotal",
- },
- {
- label: "鍚敤鎶樻棫",
- align: "center",
- prop: "enableDepreciation",
- formatData: (v) => (v ? "鏄�" : "鍚�"),
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "createUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "createTime",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 140,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- edit(row.id)
- },
- },
- {
- name: "鐢熸垚浜岀淮鐮�",
- type: "text",
- clickFun: (row) => {
- showQRCode(row)
- },
- },
- ],
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delLedger(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/device/ledger/export`, {}, "璁惧鍙拌处妗f.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const showQRCode = async (row) => {
- // 鐩存帴浣跨敤URL锛屼笉瑕佺敤JSON.stringify鍖呰
- const qrContent = proxy.javaApi + '/device-info?deviceId=' + row.id;
- qrCodeUrl.value = await QRCode.toDataURL(qrContent);
- qrRowData.value = row;
- qrDialogVisible.value = true;
-};
-
-const downloadQRCode = () => {
- const a = document.createElement("a");
- a.href = qrCodeUrl.value;
- a.download = `${qrRowData.value.deviceName || "浜岀淮鐮�"}.png`;
- a.click();
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue b/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
deleted file mode 100644
index f9679a0..0000000
--- a/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
+++ /dev/null
@@ -1,267 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁¢噺鍣ㄥ叿"
- width="50%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿缂栧彿锛�" prop="customerName">
- <el-input
- v-model="form.code"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿鍚嶇О锛�" prop="proDesc">
- <el-input
- v-model="form.name"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�瀹氭棩鏈燂細" prop="recordDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈夋晥鏈燂細" prop="valid">
- <el-input
- v-model="form.valid"
- placeholder="璇疯緭鍏�"
- clearable
- >
- <template #append>鏃�</template>
- </el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="userId">
- <el-select
- v-model="form.userId"
- placeholder="璇烽�夋嫨"
- disabled
- clearable
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- disabled
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="24">-->
-<!-- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">-->
-<!-- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload-->
-<!-- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"-->
-<!-- :on-success="handleUploadSuccess" :on-remove="handleRemove">-->
-<!-- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>-->
-<!-- <template #tip v-if="operationType !== 'view'">-->
-<!-- <div class="el-upload__tip">-->
-<!-- 鏂囦欢鏍煎紡鏀寔-->
-<!-- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-<!-- </div>-->
-<!-- </template>-->
-<!-- </el-upload>-->
-<!-- </el-form-item>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-import {getToken} from "@/utils/auth.js";
-import {ledgerRecordUpdate, ledgerRecordVerifying} from "@/api/equipmentManagement/calibration.js";
-import {delLedgerFile} from "@/api/salesManagement/salesLedger.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- code: "",
- name: "",
- valid: "",
- recordDate: "",
- userId: "",
- entryDate: "",
- tempFileIds: []
- },
- rules: {
- code: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- name: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- valid: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- recordDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- userId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- entryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- console.log(row)
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- fileList.value = []
- if(type !== "add"){
- form.value.tempFileIds = [];
- }
- if (type === "edit") {
- form.value.valid = row.valid;
- form.value.recordDate = row.recordDate;
- fileList.value = row.commonFiles;
- }
- if(type === "add"){
- fileList.value = row.commonFiles;
- }
-
- form.value.id = row.id;
- form.value.code = row.code;
- form.value.name = row.name;
- form.value.userId = userStore.id;
- form.value.entryDate = getCurrentDate();
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- form.value.tempFileIds.push(file.tempId);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "verifying") {
- ledgerRecordVerifying(form.value).then(response => {
- proxy.$modal.msgSuccess("妫�瀹氭牎鍑嗘垚鍔�")
- closeDia()
- })
- } else {
- ledgerRecordUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
deleted file mode 100644
index a9e08d1..0000000
--- a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
+++ /dev/null
@@ -1,253 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁¢噺鍣ㄥ叿"
- width="50%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿缂栧彿锛�" prop="code">
- <el-input
- v-model="form.code"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿鍚嶇О锛�" prop="name">
- <el-input
- v-model="form.name"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input
- v-model="form.model"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮涓嬫妫�瀹氭棩鏈燂細" prop="nextDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.nextDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="userId">
- <el-select
- v-model="form.userId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="recordDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- disabled
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="24">-->
-<!-- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">-->
-<!-- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload-->
-<!-- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"-->
-<!-- :on-success="handleUploadSuccess" :on-remove="handleRemove">-->
-<!-- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>-->
-<!-- <template #tip v-if="operationType !== 'view'">-->
-<!-- <div class="el-upload__tip">-->
-<!-- 鏂囦欢鏍煎紡鏀寔-->
-<!-- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-<!-- </div>-->
-<!-- </template>-->
-<!-- </el-upload>-->
-<!-- </el-form-item>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-import {getToken} from "@/utils/auth.js";
-import {measuringInstrumentAdd, measuringInstrumentUpdate} from "@/api/equipmentManagement/measurementEquipment.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- code: "",
- name: "",
- model: "",
- validDate: "",
- nextDate: "",
- userId: "",
- recordDate: "",
- tempFileIds: []
- },
- rules: {
- code: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- name: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- model: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- validDate: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- nextDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- userId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- recordDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- fileList.value = []
- form.value.userId = userStore.id;
- form.value.recordDate = getCurrentDate();
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- form.value.tempFileIds.push(res.data.tempId)
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- measuringInstrumentAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- form.value.tempFileIds = []
- closeDia()
- })
- } else {
- measuringInstrumentUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- form.value.tempFileIds = []
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/filesDia.vue b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/equipmentManagement/measurementEquipment/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/index.vue b/src/views/equipmentManagement/measurementEquipment/index.vue
deleted file mode 100644
index e983a99..0000000
--- a/src/views/equipmentManagement/measurementEquipment/index.vue
+++ /dev/null
@@ -1,276 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
- <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable style="width: 240px" @change="handleQuery"/>
- <span class="search_title ml10">鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 160px" clearable>
- <el-option label="鏈夋晥" :value="1"></el-option>
- <el-option label="閫炬湡" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板璁¢噺鍣ㄥ叿</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/equipmentManagement/measurementEquipment/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {
- measuringInstrumentDelete,
- measuringInstrumentListPage
-} from "@/api/equipmentManagement/measurementEquipment.js";
-import FilesDia from "./filesDia.vue";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- recordDate: "",
- code: "",
- status: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "鏈夋晥";
- } else if (params == 2) {
- return "閫炬湡";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "success";
- } else if (params == 2) {
- return "danger";
- } else {
- return null;
- }
- },
- },
- {
- label: "鏈�杩戜竴娆℃瀹氭棩鏈�",
- prop: "mostDate",
- width: 130,
- },
- {
- label: "璁¢噺鍣ㄥ叿缂栧彿",
- prop: "code",
- width: 150,
- },
- {
- label: "璁¢噺鍣ㄥ叿鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- width:200
- },
- {
- label: "鏈夋晥鏈�",
- prop: "valid",
- width: 130,
- },
- {
- label: "棰勮涓嬫妫�瀹氭棩鏈�",
- prop: "nextDate",
- width: 130,
- },
- {
- label: "褰曞叆浜�",
- prop: "userName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "recordDate",
- width: 130,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- width: '130',
- fixed: 'right',
- operation: [
- {
- name: "妫�瀹氭牎鍑�",
- type: "text",
- clickFun: (row) => {
- openCalibrationDia("verifying", row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const filesDia = ref()
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- console.log(row)
- nextTick(() => {
- filesDia.value?.openDialog( row,'璁¢噺鍣ㄥ叿鍙拌处')
- })
-};
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const calibrationDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- measuringInstrumentListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch((err) => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
-const openCalibrationDia = (type, row) => {
- nextTick(() => {
- calibrationDia.value?.openDialog(type, row)
- })
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.userId !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- measuringInstrumentDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/measuringInstrumentLedger/export", {}, "璁¢噺鍣ㄥ叿鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/repair/Form/MaintainForm.vue b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
deleted file mode 100644
index bbb25c1..0000000
--- a/src/views/equipmentManagement/repair/Form/MaintainForm.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<template>
- <el-form :model="form" label-width="80px">
- <el-form-item label="缁翠慨浜�">
- <el-input v-model="form.maintenanceName" placeholder="璇疯緭鍏ョ淮淇汉" />
- </el-form-item>
- <el-form-item label="缁翠慨缁撴灉">
- <el-input v-model="form.maintenanceResult" placeholder="璇疯緭鍏ョ淮淇粨鏋�" />
- </el-form-item>
- <el-form-item label="缁翠慨鏃ユ湡">
- <el-date-picker
- v-model="form.maintenanceTime"
- placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
- format="YYYY-MM-DD HH:mm:ss"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="datetime"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-defineOptions({
- name: "璁惧缁翠慨琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-const { form, resetForm } = useFormData({
- maintenanceName: undefined, // 缁翠慨鍚嶇О
- maintenanceResult: undefined, // 缁翠慨缁撴灉
- maintenanceTime: undefined, // 缁翠慨鏃ユ湡
-});
-
-const setForm = (data) => {
- form.maintenanceName = data.maintenanceName ?? userStore.nickName;
- form.maintenanceResult = data.maintenanceResult;
- form.maintenanceTime =
- dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss") ??
- dayjs().format("YYYY-MM-DD HH:mm:ss");
-};
-
-const getForm = () => {
- return form;
-};
-
-defineExpose({
- getForm,
- setForm,
- resetForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Form/RepairForm.vue b/src/views/equipmentManagement/repair/Form/RepairForm.vue
deleted file mode 100644
index 1fadde4..0000000
--- a/src/views/equipmentManagement/repair/Form/RepairForm.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О">
- <el-select v-model="form.deviceLedgerId" @change="setDeviceModel">
- <el-option
- v-for="(item, index) in deviceOptions"
- :key="index"
- :label="item.deviceName"
- :value="item.id"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="form.deviceModel"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎶ヤ慨鏃ユ湡">
- <el-date-picker
- v-model="form.repairTime"
- placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎶ヤ慨浜�">
- <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鏁呴殰鐜拌薄">
- <el-input
- v-model="form.remark"
- :rows="2"
- type="textarea"
- placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import useUserStore from "@/store/modules/user";
-
-defineOptions({
- name: "璁惧鎶ヤ慨琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-const deviceOptions = ref([]);
-
-const loadDeviceName = async () => {
- const { data } = await getDeviceLedger();
- deviceOptions.value = data;
-};
-
-const { form, resetForm } = useFormData({
- deviceLedgerId: undefined, // 璁惧Id
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- repairTime: undefined, // 鎶ヤ慨鏃ユ湡
- repairName: userStore.nickName, // 鎶ヤ慨浜�
- remark: undefined, // 鏁呴殰鐜拌薄
-});
-
-const setDeviceModel = (id) => {
- const option = deviceOptions.value.find((item) => item.id === id);
- form.deviceModel = option.deviceModel;
-};
-
-const getForm = () => {
- return form;
-};
-
-const setForm = (data) => {
- form.deviceLedgerId = data.deviceLedgerId;
- form.deviceName = data.deviceName;
- form.deviceModel = data.deviceModel;
- form.repairTime = data.repairTime;
- form.repairName = data.repairName;
- form.remark = data.remark;
-};
-
-// onMounted(() => {
-// loadDeviceName();
-// });
-
-defineExpose({
- loadDeviceName,
- resetForm,
- getForm,
- setForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
deleted file mode 100644
index 309be0e..0000000
--- a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
- <MaintainForm ref="maintainFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import MaintainForm from "../Form/MaintainForm.vue";
-import { addMaintain } from "@/api/equipmentManagement/repair";
-
-defineOptions({
- name: "缁翠慨妯℃�佹",
-});
-
-const maintainFormRef = ref();
-const emits = defineEmits(["ok"]);
-
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧缁翠慨" });
-
-const sendForm = async () => {
- loading.value = true;
- const form = await maintainFormRef.value.getForm();
- const { code } = await addMaintain({ id: id.value, ...form });
- if (code == 200) {
- emits("ok");
- maintainFormRef.value.resetForm();
- closeModal();
- }
- loading.value = false;
-};
-
-const open = async (id, row) => {
- openModal(id);
- await nextTick();
- maintainFormRef.value.setForm(row);
-};
-
-defineExpose({
- open,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
deleted file mode 100644
index 8441da2..0000000
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" @close="close">
- <RepairForm ref="repairFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import RepairForm from "../Form/RepairForm.vue";
-import {
- addRepair,
- editRepair,
- getRepairById,
-} from "@/api/equipmentManagement/repair";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "璁惧鎶ヤ慨寮圭獥",
-});
-
-const emits = defineEmits(["ok"]);
-
-const repairFormRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧鎶ヤ慨" });
-
-const sendForm = async () => {
- loading.value = true;
- const form = await repairFormRef.value.getForm();
- const { code } = id.value
- ? await editRepair({ id: unref(id), ...form })
- : await addRepair(form);
- if (code == 200) {
- ElMessage.success(`${id ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
- closeModal();
- emits("ok");
- }
- loading.value = false;
-};
-
-const openAdd = async () => {
- openModal();
- await nextTick();
- await repairFormRef.value.loadDeviceName();
-};
-
-const openEdit = async (id) => {
- const { data } = await getRepairById(id);
- openModal(id);
- await nextTick();
- await repairFormRef.value.loadDeviceName();
- await repairFormRef.value.setForm(data);
-};
-
-const close = () => {
- repairFormRef.value.resetForm();
- closeModal();
-};
-
-defineExpose({
- openAdd,
- openEdit,
-});
-</script>
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
deleted file mode 100644
index fb6c8b0..0000000
--- a/src/views/equipmentManagement/repair/index.vue
+++ /dev/null
@@ -1,306 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="filters.deviceModel"
- style="width: 240px"
- placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鏁呴殰鐜拌薄">
- <el-input
- v-model="filters.remark"
- style="width: 240px"
- placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="缁翠慨浜�">
- <el-input
- v-model="filters.maintenanceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ淮淇汉"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鎶ヤ慨鏃ユ湡">
- <el-date-picker
- v-model="filters.repairTimeStr"
- type="date"
- placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- </el-form-item>
- <el-form-item label="缁翠慨鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenanceTimeStr"
- type="date"
- placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <el-text class="mx-1" size="large">璁惧鎶ヤ慨</el-text>
- <div>
- <el-button
- type="primary"
- icon="Plus"
- :disabled="multipleList.length !== 1"
- @click="addMaintain"
- >
- 鏂板缁翠慨
- </el-button>
- <el-button type="success" icon="Van" @click="addRepair">
- 鏂板鎶ヤ慨
- </el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="delRepairByIds(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #statusRef="{ row }">
- <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
- <el-tag v-if="row.status === 0" type="danger">寰呯淮淇�</el-tag>
- </template>
- <template #operation="{ row }">
- <el-button
- type="primary"
- text
- icon="editPen"
- @click="editRepair(row.id)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- text
- icon="delete"
- @click="delRepairByIds(row.id)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </PIMTable>
- </div>
- <RepairModal ref="repairModalRef" @ok="getTableData" />
- <MaintainModal ref="maintainModalRef" @ok="getTableData" />
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getRepairPage, delRepair } from "@/api/equipmentManagement/repair";
-import { onMounted } from "vue";
-import RepairModal from "./Modal/RepairModal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import MaintainModal from "./Modal/MaintainModal.vue";
-
-defineOptions({
- name: "璁惧鎶ヤ慨",
-});
-
-// 妯℃�佹瀹炰緥
-const repairModalRef = ref();
-const maintainModalRef = ref();
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-
-// 琛ㄦ牸閽╁瓙
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getRepairPage,
- {
- deviceName: undefined,
- deviceModel: undefined,
- remark: undefined,
- maintenanceName: undefined,
- repairTimeStr: undefined,
- maintenanceTimeStr: undefined,
- },
- [
- {
- label: "璁惧鍚嶇О",
- align: "center",
- prop: "deviceName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- align: "center",
- prop: "deviceModel",
- },
- {
- label: "鎶ヤ慨鏃ユ湡",
- align: "center",
- prop: "repairTime",
- formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
- },
- {
- label: "鎶ヤ慨浜�",
- align: "center",
- prop: "repairName",
- },
- {
- label: "鏁呴殰鐜拌薄",
- align: "center",
- prop: "remark",
- },
- {
- label: "缁翠慨浜�",
- align: "center",
- prop: "maintenanceName",
- },
- {
- label: "缁翠慨缁撴灉",
- align: "center",
- prop: "maintenanceResult",
- },
- {
- label: "缁翠慨鏃ユ湡",
- align: "center",
- prop: "maintenanceTime",
- formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
- },
- {
- label: "鐘舵��",
- align: "center",
- prop: "status",
- dataType: "slot",
- slot: "statusRef",
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-// type === 1 缁翠慨 2鎶ヤ慨闂�
-const handleDateChange = (value,type) => {
- filters.maintenanceTimeStr = null
- filters.c = null
- if(type === 1){
- if (value) {
- filters.maintenanceTimeStr = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- filters.repairTimeStr = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getTableData();
-};
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-// 鏂板鎶ヤ慨
-const addRepair = () => {
- repairModalRef.value.openAdd();
-};
-
-// 缂栬緫鎶ヤ慨
-const editRepair = (id) => {
- repairModalRef.value.openEdit(id);
-};
-
-// 鏂板缁翠慨
-const addMaintain = () => {
- const row = multipleList.value[0];
- maintainModalRef.value.open(row.id, row);
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-const delRepairByIds = async (ids) => {
- ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delRepair(ids);
- if (code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- getTableData();
- }
- });
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
deleted file mode 100644
index bc3db70..0000000
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px">
- <el-form-item label="瀹為檯淇濆吇浜�">
- <el-input
- v-model="form.maintenanceActuallyName"
- placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
- ></el-input>
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="form.maintenanceActuallyTime"
- placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
- format="YYYY-MM-DD HH:mm:ss"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="datetime"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- <el-form-item label="淇濆吇缁撴灉">
- <el-select v-model="form.maintenanceResult" placeholder="璇烽�夋嫨淇濆吇缁撴灉">
- <el-option label="瀹屽ソ" :value="1"></el-option>
- <el-option label="缁翠慨" :value="0"></el-option>
- </el-select>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-import useUserStore from "@/store/modules/user";
-
-defineOptions({
- name: "淇濆吇琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-const { form, resetForm } = useFormData({
- maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
- maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
- maintenanceResult: undefined, // 淇濆吇缁撴灉
-});
-
-const setForm = (data) => {
- form.maintenanceActuallyName =
- data.maintenanceActuallyName ?? userStore.nickName;
- form.maintenanceActuallyTime =
- dayjs(data.maintenanceActuallyTime).format("YYYY-MM-DD HH:mm:ss") ??
- dayjs().format("YYYY-MM-DD HH:mm:ss");
- form.maintenanceResult = data.maintenanceResult;
-};
-
-const getForm = () => {
- return form;
-};
-
-defineExpose({
- getForm,
- setForm,
- resetForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
deleted file mode 100644
index 1d94b68..0000000
--- a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px">
- <el-form-item label="璁惧鍚嶇О">
- <el-select
- v-model="form.deviceLedgerId"
- @change="setDeviceModel"
- placeholder="璇烽�夋嫨璁惧"
- >
- <el-option
- v-for="(item, index) in deviceOptions"
- :key="index"
- :label="item.deviceName"
- :value="item.id"
- ></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="form.deviceModel"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- disabled
- />
- </el-form-item>
- <el-form-item label="璁″垝淇濆吇鏃ユ湡">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintenancePlanTime"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="date"
- placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import { onMounted } from "vue";
-import dayjs from "dayjs";
-
-defineOptions({
- name: "璁″垝琛ㄥ崟",
-});
-
-const deviceOptions = ref([]);
-const loadDeviceName = async () => {
- const { data } = await getDeviceLedger();
- deviceOptions.value = data;
-};
-
-const { form, resetForm } = useFormData({
- deviceLedgerId: undefined, // 璁惧Id
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- maintenancePlanTime: undefined, // 璁″垝淇濆吇鏃ユ湡
-});
-
-const setDeviceModel = (id) => {
- const option = deviceOptions.value.find((item) => item.id === id);
- form.deviceModel = option.deviceModel;
-};
-
-const getForm = () => {
- return form;
-};
-
-/**
- * @desc 璁剧疆琛ㄥ崟鍐呭
- * @param data 璁惧淇℃伅
- */
-const setForm = (data) => {
- form.deviceLedgerId = data.deviceLedgerId;
- form.deviceName = data.deviceName;
- form.deviceModel = data.deviceModel;
- form.maintenancePlanTime = dayjs(data.maintenancePlanTime).format(
- "YYYY-MM-DD HH:mm:ss"
- );
-};
-
-const loadForm = () => {};
-
-onMounted(() => {
- loadDeviceName();
-});
-
-defineExpose({
- loadForm,
- resetForm,
- getForm,
- setForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
deleted file mode 100644
index 0afd512..0000000
--- a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
- <MaintenanceForm ref="maintenanceFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import MaintenanceForm from "../Form/MaintenanceForm.vue";
-import { useModal } from "@/hooks/useModal";
-import { addMaintenance } from "@/api/equipmentManagement/upkeep";
-
-defineOptions({
- name: "淇濆吇妯℃�佹",
-});
-
-const maintenanceFormRef = ref();
-const emits = defineEmits(["ok"]);
-
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧淇濆吇" });
-
-/**
- * @desc 淇濆瓨淇濆吇
- */
-const sendForm = async () => {
- loading.value = true;
- const form = await maintenanceFormRef.value.getForm();
- const { code } = await addMaintenance({ id: id.value, ...form });
- if (code == 200) {
- emits("ok");
- maintenanceFormRef.value.resetForm();
- closeModal();
- }
- loading.value = false;
-};
-
-const open = async (id, row) => {
- openModal(id);
- await nextTick();
- maintenanceFormRef.value.setForm(row);
-};
-defineExpose({
- open,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue b/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
deleted file mode 100644
index d9cf246..0000000
--- a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-<template>
- <el-dialog
- v-model="visible"
- :title="modalOptions.title"
- width="30%"
- @close="close"
- >
- <PlanForm ref="planFormRef"></PlanForm>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import PlanForm from "../Form/PlanForm";
-import {
- addUpkeep,
- editUpkeep,
- getUpkeepById,
-} from "@/api/equipmentManagement/upkeep";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "璁惧淇濆吇鏂板璁″垝",
-});
-
-const emits = defineEmits(["ok"]);
-const planFormRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧淇濆吇璁″垝" });
-
-const openEdit = async (id) => {
- const { data } = await getUpkeepById(id);
- openModal(id);
- await nextTick();
- await planFormRef.value.setForm(data);
-};
-
-const sendForm = async () => {
- loading.value = true;
- const form = await planFormRef.value.getForm();
- const { code } = id.value
- ? await editUpkeep({ id: unref(id), ...form })
- : await addUpkeep(form);
- if (code == 200) {
- ElMessage.success(`${id ? "缂栬緫" : "鏂板"}璁″垝鎴愬姛`);
- closeModal();
- emits("ok");
- }
- loading.value = false;
-};
-
-const close = () => {
- planFormRef.value.resetForm();
- closeModal();
-};
-
-defineExpose({
- openModal,
- openEdit,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
deleted file mode 100644
index 72da8bc..0000000
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ /dev/null
@@ -1,293 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="璁″垝淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenancePlanTime"
- type="date"
- placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenanceActuallyTime"
- type="date"
- placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇浜�">
- <el-input
- v-model="filters.maintenanceActuallyName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <el-text class="mx-1" size="large">璁惧淇濆吇</el-text>
- <div>
- <el-button
- type="primary"
- icon="Plus"
- :disabled="multipleList.length !== 1"
- @click="addMaintain"
- >
- 鏂板淇濆吇
- </el-button>
- <el-button type="success" icon="Van" @click="addPlan">
- 鏂板璁″垝
- </el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="delRepairByIds(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #maintenanceResultRef="{ row }">
- <el-tag v-if="row.maintenanceResult === 1" type="success">
- 瀹屽ソ
- </el-tag>
- <el-tag v-if="row.maintenanceResult === 0" type="danger">
- 缁翠慨
- </el-tag>
- </template>
- <template #statusRef="{ row }">
- <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
- <el-tag v-if="row.status === 0" type="danger">寰呬繚鍏�</el-tag>
- </template>
- <template #operation="{ row }">
- <el-button
- type="primary"
- text
- icon="editPen"
- @click="editPlan(row.id)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- text
- icon="delete"
- @click="delRepairByIds(row.id)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </PIMTable>
- </div>
- <PlanModal ref="planModalRef" @ok="getTableData" />
- <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getUpkeepPage, delUpkeep } from "@/api/equipmentManagement/upkeep";
-import { onMounted } from "vue";
-import PlanModal from "./Modal/PlanModal.vue";
-import MaintenanceModal from "./Modal/MaintenanceModal.vue";
-import dayjs from "dayjs";
-import { ElMessageBox, ElMessage } from "element-plus";
-
-defineOptions({
- name: "璁惧淇濆吇",
-});
-
-// 璁″垝寮圭獥鎺у埗鍣�
-const planModalRef = ref();
-// 淇濆吇寮圭獥鎺у埗鍣�
-const maintainModalRef = ref();
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-// 琛ㄦ牸閽╁瓙
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(getUpkeepPage, {
- deviceName: undefined,
- maintenancePlanTime: undefined,
- maintenanceActuallyTime: undefined,
- maintenanceActuallyName: undefined,
-}, [
- {
- label: "璁惧鍚嶇О",
- align: "center",
- prop: "deviceName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- align: "center",
- prop: "deviceModel",
- },
- {
- label: "璁″垝淇濆吇鏃ユ湡",
- align: "center",
- prop: "maintenancePlanTime",
- formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "createUserName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "createTime",
- formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
- width: 200,
- },
- {
- label: "瀹為檯淇濆吇浜�",
- align: "center",
- prop: "maintenanceActuallyName",
- },
- {
- label: "瀹為檯淇濆吇鏃ユ湡",
- align: "center",
- prop: "maintenanceActuallyTime",
- formatData: (cell) =>
- cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
- },
- {
- label: "淇濆吇缁撴灉",
- align: "center",
- prop: "maintenanceResult",
- dataType: "slot",
- slot: "maintenanceResultRef",
- },
- {
- label: "鐘舵��",
- align: "center",
- prop: "status",
- dataType: "slot",
- slot: "statusRef",
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
-]);
-// type == 1瀹為檯淇濆吇鏃堕棿 2璁″垝淇濆吇鏃堕棿
-const handleDateChange = (value,type) => {
- filters.maintenanceActuallyTimeReq = null
- filters.maintenancePlanTimeReq = null
- if(type === 1){
- if (value) {
- filters.maintenanceActuallyTimeReq = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- filters.maintenancePlanTimeReq = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getTableData();
-};
-
-// 鏂板淇濆吇
-const addMaintain = () => {
- const row = multipleList.value[0];
- maintainModalRef.value.open(row.id, row);
-};
-
-// 鏂板璁″垝
-const addPlan = () => {
- planModalRef.value.openModal();
-};
-
-// 缂栬緫璁″垝
-const editPlan = (id) => {
- planModalRef.value.openEdit(id);
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-const delRepairByIds = async (ids) => {
- ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delUpkeep(ids);
- if (code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- getTableData();
- }
- });
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/error/401.vue b/src/views/error/401.vue
deleted file mode 100644
index 2bc8922..0000000
--- a/src/views/error/401.vue
+++ /dev/null
@@ -1,82 +0,0 @@
-<template>
- <div class="errPage-container">
- <el-button icon="arrow-left" class="pan-back-btn" @click="back">
- 杩斿洖
- </el-button>
- <el-row>
- <el-col :span="12">
- <h1 class="text-jumbo text-ginormous">
- 401閿欒!
- </h1>
- <h2>鎮ㄦ病鏈夎闂潈闄愶紒</h2>
- <h6>瀵逛笉璧凤紝鎮ㄦ病鏈夎闂潈闄愶紝璇蜂笉瑕佽繘琛岄潪娉曟搷浣滐紒鎮ㄥ彲浠ヨ繑鍥炰富椤甸潰</h6>
- <ul class="list-unstyled">
- <li class="link-type">
- <router-link to="/">
- 鍥為椤�
- </router-link>
- </li>
- </ul>
- </el-col>
- <el-col :span="12">
- <img :src="errGif" width="313" height="428" alt="Girl has dropped her ice cream.">
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import errImage from "@/assets/401_images/401.gif"
-
-let { proxy } = getCurrentInstance()
-
-const errGif = ref(errImage + "?" + +new Date())
-
-function back() {
- if (proxy.$route.query.noGoBack) {
- proxy.$router.push({ path: "/" })
- } else {
- proxy.$router.go(-1)
- }
-}
-</script>
-
-<style lang="scss" scoped>
-.errPage-container {
- width: 800px;
- max-width: 100%;
- margin: 100px auto;
- .pan-back-btn {
- background: #008489;
- color: #fff;
- border: none !important;
- }
- .pan-gif {
- margin: 0 auto;
- display: block;
- }
- .pan-img {
- display: block;
- margin: 0 auto;
- width: 100%;
- }
- .text-jumbo {
- font-size: 60px;
- font-weight: 700;
- color: #484848;
- }
- .list-unstyled {
- font-size: 14px;
- li {
- padding-bottom: 5px;
- }
- a {
- color: #008489;
- text-decoration: none;
- &:hover {
- text-decoration: underline;
- }
- }
- }
-}
-</style>
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
deleted file mode 100644
index 08a617a..0000000
--- a/src/views/error/404.vue
+++ /dev/null
@@ -1,227 +0,0 @@
-<template>
- <div class="wscn-http404-container">
- <div class="wscn-http404">
- <div class="pic-404">
- <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404">
- <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404">
- <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404">
- <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404">
- </div>
- <div class="bullshit">
- <div class="bullshit__oops">
- 404閿欒!
- </div>
- <div class="bullshit__headline">
- {{ message }}
- </div>
- <div class="bullshit__info">
- 瀵逛笉璧凤紝鎮ㄦ鍦ㄥ鎵剧殑椤甸潰涓嶅瓨鍦ㄣ�傚皾璇曟鏌RL鐨勯敊璇紝鐒跺悗鎸夋祻瑙堝櫒涓婄殑鍒锋柊鎸夐挳鎴栧皾璇曞湪鎴戜滑鐨勫簲鐢ㄧ▼搴忎腑鎵惧埌鍏朵粬鍐呭銆�
- </div>
- <router-link to="/index" class="bullshit__return-home">
- 杩斿洖棣栭〉
- </router-link>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-let message = computed(() => {
- return '鎵句笉鍒扮綉椤碉紒'
-})
-</script>
-
-<style lang="scss" scoped>
-.wscn-http404-container{
- transform: translate(-50%,-50%);
- position: absolute;
- top: 40%;
- left: 50%;
-}
-.wscn-http404 {
- position: relative;
- width: 1200px;
- padding: 0 50px;
- overflow: hidden;
- .pic-404 {
- position: relative;
- float: left;
- width: 600px;
- overflow: hidden;
- &__parent {
- width: 100%;
- }
- &__child {
- position: absolute;
- &.left {
- width: 80px;
- top: 17px;
- left: 220px;
- opacity: 0;
- animation-name: cloudLeft;
- animation-duration: 2s;
- animation-timing-function: linear;
- animation-fill-mode: forwards;
- animation-delay: 1s;
- }
- &.mid {
- width: 46px;
- top: 10px;
- left: 420px;
- opacity: 0;
- animation-name: cloudMid;
- animation-duration: 2s;
- animation-timing-function: linear;
- animation-fill-mode: forwards;
- animation-delay: 1.2s;
- }
- &.right {
- width: 62px;
- top: 100px;
- left: 500px;
- opacity: 0;
- animation-name: cloudRight;
- animation-duration: 2s;
- animation-timing-function: linear;
- animation-fill-mode: forwards;
- animation-delay: 1s;
- }
- @keyframes cloudLeft {
- 0% {
- top: 17px;
- left: 220px;
- opacity: 0;
- }
- 20% {
- top: 33px;
- left: 188px;
- opacity: 1;
- }
- 80% {
- top: 81px;
- left: 92px;
- opacity: 1;
- }
- 100% {
- top: 97px;
- left: 60px;
- opacity: 0;
- }
- }
- @keyframes cloudMid {
- 0% {
- top: 10px;
- left: 420px;
- opacity: 0;
- }
- 20% {
- top: 40px;
- left: 360px;
- opacity: 1;
- }
- 70% {
- top: 130px;
- left: 180px;
- opacity: 1;
- }
- 100% {
- top: 160px;
- left: 120px;
- opacity: 0;
- }
- }
- @keyframes cloudRight {
- 0% {
- top: 100px;
- left: 500px;
- opacity: 0;
- }
- 20% {
- top: 120px;
- left: 460px;
- opacity: 1;
- }
- 80% {
- top: 180px;
- left: 340px;
- opacity: 1;
- }
- 100% {
- top: 200px;
- left: 300px;
- opacity: 0;
- }
- }
- }
- }
- .bullshit {
- position: relative;
- float: left;
- width: 300px;
- padding: 30px 0;
- overflow: hidden;
- &__oops {
- font-size: 32px;
- font-weight: bold;
- line-height: 40px;
- color: #1482f0;
- opacity: 0;
- margin-bottom: 20px;
- animation-name: slideUp;
- animation-duration: 0.5s;
- animation-fill-mode: forwards;
- }
- &__headline {
- font-size: 20px;
- line-height: 24px;
- color: #222;
- font-weight: bold;
- opacity: 0;
- margin-bottom: 10px;
- animation-name: slideUp;
- animation-duration: 0.5s;
- animation-delay: 0.1s;
- animation-fill-mode: forwards;
- }
- &__info {
- font-size: 13px;
- line-height: 21px;
- color: grey;
- opacity: 0;
- margin-bottom: 30px;
- animation-name: slideUp;
- animation-duration: 0.5s;
- animation-delay: 0.2s;
- animation-fill-mode: forwards;
- }
- &__return-home {
- display: block;
- float: left;
- width: 110px;
- height: 36px;
- background: #1482f0;
- border-radius: 100px;
- text-align: center;
- color: #ffffff;
- opacity: 0;
- font-size: 14px;
- line-height: 36px;
- cursor: pointer;
- animation-name: slideUp;
- animation-duration: 0.5s;
- animation-delay: 0.3s;
- animation-fill-mode: forwards;
- }
- @keyframes slideUp {
- 0% {
- transform: translateY(60px);
- opacity: 0;
- }
- 100% {
- transform: translateY(0);
- opacity: 1;
- }
- }
- }
-}
-</style>
diff --git a/src/views/example/DynamicTableExample.vue b/src/views/example/DynamicTableExample.vue
deleted file mode 100644
index 038cd43..0000000
--- a/src/views/example/DynamicTableExample.vue
+++ /dev/null
@@ -1,354 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search-form">
- <el-form :inline="true" :model="searchForm">
- <el-form-item label="閮ㄩ棬">
- <el-input
- v-model="searchForm.department"
- placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
- clearable
- style="width: 200px"
- />
- </el-form-item>
- <el-form-item label="濮撳悕">
- <el-input
- v-model="searchForm.name"
- placeholder="璇疯緭鍏ュ鍚�"
- clearable
- style="width: 200px"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="handleReset">閲嶇疆</el-button>
- <el-button type="success" @click="handleAdd">鏂板</el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <div class="table-container">
- <DynamicTable
- ref="dynamicTableRef"
- :data="tableData"
- :dict-types="dictTypes"
- :loading="loading"
- :show-selection="true"
- :show-actions="true"
- :show-pagination="true"
- :pagination="pagination"
- height="calc(100vh - 280px)"
- @selection-change="handleSelectionChange"
- @edit="handleEdit"
- @delete="handleDelete"
- @select-change="handleSelectChange"
- @input-change="handleInputChange"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="600px"
- append-to-body
- >
- <el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="100px"
- >
- <el-form-item label="閮ㄩ棬" prop="department">
- <el-input v-model="form.department" placeholder="璇疯緭鍏ラ儴闂�" />
- </el-form-item>
- <el-form-item label="濮撳悕" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" />
- </el-form-item>
- <el-form-item label="宸ュ彿" prop="employeeId">
- <el-input v-model="form.employeeId" placeholder="璇疯緭鍏ュ伐鍙�" />
- </el-form-item>
-
- <!-- 鍔ㄦ�佽〃鍗曢」锛氭牴鎹瓧鍏哥敓鎴� -->
- <el-form-item
- v-for="dictItem in dynamicFormItems"
- :key="dictItem.value"
- :label="dictItem.label"
- :prop="dictItem.value"
- >
- <el-select
- v-model="form[dictItem.value]"
- placeholder="璇烽�夋嫨"
- style="width: 100%"
- >
- <el-option
- v-for="option in dictItem.options"
- :key="option.value"
- :label="option.label"
- :value="option.value"
- />
- </el-select>
- </el-form-item>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import DynamicTable from '@/components/DynamicTable/index.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogTitle = ref('')
-const editIndex = ref(-1)
-const selectedRows = ref([])
-
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
- department: '',
- name: ''
-})
-
-// 琛ㄦ牸鏁版嵁
-const tableData = ref([
- {
- id: 1,
- department: '鎶�鏈儴',
- name: '寮犱笁',
- employeeId: 'EMP001',
- status: '1',
- level: '2',
- position: '1'
- },
- {
- id: 2,
- department: '浜轰簨閮�',
- name: '鏉庡洓',
- employeeId: 'EMP002',
- status: '0',
- level: '1',
- position: '2'
- },
- {
- id: 3,
- department: '璐㈠姟閮�',
- name: '鐜嬩簲',
- employeeId: 'EMP003',
- status: '1',
- level: '3',
- position: '1'
- }
-])
-
-// 瀛楀吀绫诲瀷閰嶇疆
-const dictTypes = ref([
- 'sys_normal_disable', // 鐘舵�佸瓧鍏�
- 'sys_user_level', // 绾у埆瀛楀吀
- 'sys_user_position' // 鑱屼綅瀛楀吀
-])
-
-// 鍒嗛〉閰嶇疆
-const pagination = reactive({
- current: 1,
- size: 10,
- total: 0
-})
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- department: '',
- name: '',
- employeeId: '',
- status: '',
- level: '',
- position: ''
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- department: [
- { required: true, message: '璇疯緭鍏ラ儴闂�', trigger: 'blur' }
- ],
- name: [
- { required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }
- ],
- employeeId: [
- { required: true, message: '璇疯緭鍏ュ伐鍙�', trigger: 'blur' }
- ]
-}
-
-// 鍔ㄦ�佽〃鍗曢」
-const dynamicFormItems = computed(() => {
- // 杩欓噷鍙互鏍规嵁瀛楀吀鏁版嵁鍔ㄦ�佺敓鎴愯〃鍗曢」
- return [
- {
- label: '鐘舵��',
- value: 'status',
- options: [
- { label: '鍚敤', value: '1' },
- { label: '绂佺敤', value: '0' }
- ]
- },
- {
- label: '绾у埆',
- value: 'level',
- options: [
- { label: '鍒濈骇', value: '1' },
- { label: '涓骇', value: '2' },
- { label: '楂樼骇', value: '3' }
- ]
- },
- {
- label: '鑱屼綅',
- value: 'position',
- options: [
- { label: '鍛樺伐', value: '1' },
- { label: '涓荤', value: '2' },
- { label: '缁忕悊', value: '3' }
- ]
- }
- ]
-})
-
-// 缁勪欢寮曠敤
-const dynamicTableRef = ref(null)
-const formRef = ref(null)
-
-// 浜嬩欢澶勭悊鍑芥暟
-const handleSearch = () => {
- // 瀹炵幇鎼滅储閫昏緫
- console.log('鎼滅储鏉′欢:', searchForm)
- ElMessage.success('鎼滅储鍔熻兘寰呭疄鐜�')
-}
-
-const handleReset = () => {
- searchForm.department = ''
- searchForm.name = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板鍛樺伐'
- editIndex.value = -1
- resetForm()
- dialogVisible.value = true
-}
-
-const handleEdit = (row, index) => {
- dialogTitle.value = '缂栬緫鍛樺伐'
- editIndex.value = index
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleDelete = async (row, index) => {
- try {
- await ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- type: 'warning'
- })
-
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- } catch (error) {
- // 鐢ㄦ埛鍙栨秷鍒犻櫎
- }
-}
-
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection
-}
-
-const handleSelectChange = (row, prop, value) => {
- console.log('閫夋嫨鍙樺寲:', row, prop, value)
- // 鍙互鍦ㄨ繖閲屽鐞嗘暟鎹洿鏂伴�昏緫
-}
-
-const handleInputChange = (row, prop, value) => {
- console.log('杈撳叆鍙樺寲:', row, prop, value)
- // 鍙互鍦ㄨ繖閲屽鐞嗘暟鎹洿鏂伴�昏緫
-}
-
-const handleSizeChange = (size) => {
- pagination.size = size
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const handleCurrentChange = (current) => {
- pagination.current = current
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const handleSubmit = async () => {
- try {
- await formRef.value.validate()
-
- if (editIndex.value === -1) {
- // 鏂板
- const newRow = {
- id: Date.now(),
- ...form
- }
- tableData.value.push(newRow)
- ElMessage.success('鏂板鎴愬姛')
- } else {
- // 缂栬緫
- Object.assign(tableData.value[editIndex.value], form)
- ElMessage.success('缂栬緫鎴愬姛')
- }
-
- dialogVisible.value = false
- } catch (error) {
- console.error('琛ㄥ崟楠岃瘉澶辫触:', error)
- }
-}
-
-const resetForm = () => {
- Object.assign(form, {
- department: '',
- name: '',
- employeeId: '',
- status: '',
- level: '',
- position: ''
- })
- formRef.value?.resetFields()
-}
-
-// 缁勪欢鎸傝浇鏃跺垵濮嬪寲鏁版嵁
-onMounted(() => {
- pagination.total = tableData.value.length
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.search-form {
- margin-bottom: 20px;
- padding: 20px;
- background-color: #f5f5f5;
- border-radius: 4px;
-}
-
-.table-container {
- background-color: #fff;
- border-radius: 4px;
- padding: 20px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-</style>
diff --git a/src/views/example/SimpleExample.vue b/src/views/example/SimpleExample.vue
deleted file mode 100644
index fb528eb..0000000
--- a/src/views/example/SimpleExample.vue
+++ /dev/null
@@ -1,135 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 绠�鍗曠殑鎼滅储鍖哄煙 -->
- <el-card class="search-card">
- <el-form :inline="true">
- <el-form-item label="閮ㄩ棬">
- <el-input v-model="searchForm.department" placeholder="璇疯緭鍏ラ儴闂�" clearable />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="handleReset">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <!-- 鍔ㄦ�佽〃鏍� -->
- <el-card class="table-card">
- <template #header>
- <div class="card-header">
- <span>鍛樺伐淇℃伅琛�</span>
- <el-button type="primary" size="small" @click="handleAdd">鏂板鍛樺伐</el-button>
- </div>
- </template>
-
- <DynamicTable
- :data="tableData"
- :dict-types="dictTypes"
- :loading="loading"
- :show-selection="true"
- :show-actions="true"
- height="400px"
- @selection-change="handleSelectionChange"
- @edit="handleEdit"
- @delete="handleDelete"
- />
- </el-card>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import { ElMessage } from 'element-plus'
-import DynamicTable from '@/components/DynamicTable/index.vue'
-
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
- department: ''
-})
-
-// 琛ㄦ牸鏁版嵁
-const tableData = ref([
- {
- id: 1,
- department: '鎶�鏈儴',
- name: '寮犱笁',
- employeeId: 'EMP001',
- sys_normal_disable: '1', // 鐘舵��
- sys_user_level: '2', // 绾у埆
- sys_user_position: '1' // 鑱屼綅
- },
- {
- id: 2,
- department: '浜轰簨閮�',
- name: '鏉庡洓',
- employeeId: 'EMP002',
- sys_normal_disable: '0', // 鐘舵��
- sys_user_level: '1', // 绾у埆
- sys_user_position: '2' // 鑱屼綅
- }
-])
-
-// 瀛楀吀绫诲瀷
-const dictTypes = ref([
- 'sys_normal_disable', // 鐘舵�侊細鍚敤/绂佺敤
- 'sys_user_level', // 绾у埆锛氬垵绾�/涓骇/楂樼骇
- 'sys_user_position' // 鑱屼綅锛氬憳宸�/涓荤/缁忕悊
-])
-
-// 鍔犺浇鐘舵��
-const loading = ref(false)
-
-// 浜嬩欢澶勭悊
-const handleSearch = () => {
- loading.value = true
- // 妯℃嫙鎼滅储
- setTimeout(() => {
- loading.value = false
- ElMessage.success('鎼滅储瀹屾垚')
- }, 1000)
-}
-
-const handleReset = () => {
- searchForm.department = ''
-}
-
-const handleAdd = () => {
- ElMessage.info('鏂板鍔熻兘寰呭疄鐜�')
-}
-
-const handleSelectionChange = (selection) => {
- console.log('閫変腑鐨勮:', selection)
-}
-
-const handleEdit = (row, index) => {
- ElMessage.info(`缂栬緫绗�${index + 1}琛屾暟鎹甡)
-}
-
-const handleDelete = (row, index) => {
- ElMessage.warning(`鍒犻櫎绗�${index + 1}琛屾暟鎹甡)
-}
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.search-card {
- margin-bottom: 20px;
-}
-
-.table-card {
- margin-bottom: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-:deep(.el-form-item) {
- margin-bottom: 0;
-}
-</style>
diff --git a/src/views/fileManagement/bookshelf/detail.vue b/src/views/fileManagement/bookshelf/detail.vue
deleted file mode 100644
index 5d7d3ac..0000000
--- a/src/views/fileManagement/bookshelf/detail.vue
+++ /dev/null
@@ -1,110 +0,0 @@
-<template>
- <div class="detail-container">
- <div class="header">
- <el-button @click="handleBack" type="primary" size="small">杩斿洖</el-button>
- <h2>鍥句功璇︽儏</h2>
- </div>
-
- <div class="content" v-loading="loading">
- <el-card v-if="current">
- <template #header>
- <div class="card-header">
- <span>鍩烘湰淇℃伅</span>
- </div>
- </template>
-
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鍥句功缂栧彿">{{ current.docNumber }}</el-descriptions-item>
- <el-descriptions-item label="鍥句功鍚嶇О">{{ current.docName }}</el-descriptions-item>
- <el-descriptions-item label="鍏ュ簱鏃堕棿">{{ current.createTime }}</el-descriptions-item>
- <!-- <el-descriptions-item label="褰撳墠浣嶇疆">{{ current.currentLocation }}</el-descriptions-item> -->
- <el-descriptions-item label="鐘舵��">{{ current.docStatus }}</el-descriptions-item>
- </el-descriptions>
-
- <!-- <div class="additional-info" v-if="current.description">
- <h4>鍥句功绠�浠�</h4>
- <p>{{ current.description }}</p>
- </div> -->
- </el-card>
-
- <el-empty v-else description="鏆傛棤鏁版嵁" />
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-
-// 瀹氫箟props
-const props = defineProps({
- current: {
- type: Object,
- required: true
- }
-})
-
-// 瀹氫箟emits
-const emit = defineEmits(['hanldeBack'])
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-// const bookInfo = ref(null)
-
-// 鏂规硶
-const handleBack = () => {
- emit('hanldeBack')
-}
-
-</script>
-
-<style scoped>
-.detail-container {
- padding: 20px;
- height: 100%;
- background-color: #f5f5f5;
-}
-
-.header {
- display: flex;
- align-items: center;
- margin-bottom: 20px;
- background-color: #fff;
- padding: 15px 20px;
- border-radius: 4px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.header h2 {
- margin: 0 0 0 20px;
- color: #333;
-}
-
-.content {
- background-color: #fff;
- border-radius: 4px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.card-header {
- font-weight: bold;
- color: #333;
-}
-
-.additional-info {
- margin-top: 20px;
- padding-top: 20px;
- border-top: 1px solid #ebeef5;
-}
-
-.additional-info h4 {
- margin: 0 0 10px 0;
- color: #333;
- font-size: 16px;
-}
-
-.additional-info p {
- margin: 0;
- color: #666;
- line-height: 1.6;
-}
-</style>
diff --git a/src/views/fileManagement/bookshelf/index.vue b/src/views/fileManagement/bookshelf/index.vue
deleted file mode 100644
index 2689900..0000000
--- a/src/views/fileManagement/bookshelf/index.vue
+++ /dev/null
@@ -1,688 +0,0 @@
-<template>
- <div class="sample">
- <div class="main-content" v-if="!isDetail">
- <div class="search">
- <div class="search_thing">
- <div class="search_label">浠撳簱鍚嶇О锛�</div>
- <div class="search_input">
- <el-select v-model="entity.warehouseId" placeholder="閫夋嫨浠撳簱" size="small" @change="warehouseChange">
- <el-option v-for="item in warehouse" :key="item.id" :label="item.label" :value="item.id">
- </el-option>
- </el-select>
- </div>
- </div>
- <div class="search_thing">
- <div class="search_label">璐ф灦锛�</div>
- <div class="search_input">
- <el-select v-model="entity.shelfId" placeholder="閫夋嫨璐ф灦" size="small" @change="handleShelf">
- <el-option v-for="item in shelf" :key="item.id" :label="item.label" :value="item.id">
- </el-option>
- </el-select>
- </div>
- </div>
- <!-- <div class="search_thing">
- <el-button size="small" @click="handleShelf(entity.shelfId,'')">閲嶇疆</el-button>
- <el-button size="small" type="primary" @click="handleShelf(entity.shelfId)">鏌ヨ</el-button>
- </div> -->
- <div class="btns">
- <el-button size="small" style="color:#3A7BFA" @click="keepVisible=true">缁存姢</el-button>
- <el-button size="small" style="color:#3A7BFA" @click="warehouseVisible=true,isEdit=false">娣诲姞浠撳簱</el-button>
- <el-button size="small" style="color:#3A7BFA" @click="shelvesVisible=true,isEdit=false"
- :disabled="entity.warehouseId==null">娣诲姞璐ф灦</el-button>
- </div>
- </div>
- <div class="table" v-loading="tableLoading">
- <table class="tables" style="table-layout:fixed;" v-if="tableList.length>0">
- <tbody>
- <tr v-for="(item,index) in tableList" :key="index">
- <td v-for="(m,i) in item" :key="i" class="content">
- <h4 v-if="m.row!=undefined">{{ m.row }} - {{ m.col }}</h4>
- <ul>
- <el-tooltip
- effect="dark"
- placement="top"
- v-for="(n,j) in m.documentationDtoList"
- :key="j">
- <template #content><span>{{ n.docName }}</span>
- <span> [{{ n.docNumber }}]</span></template>
- <li class="green"
- @click="handelDetail(n)">
- <i></i>
- <span>{{ n.docName }}</span>
- <span> [{{ n.docNumber }}] <span :style="{ color: getStatusColor(n.docStatus) }">锛坽{ n.docStatus }}锛�</span></span>
- </li>
- </el-tooltip>
- </ul>
- </td>
- </tr>
- <tr>
- <td v-for="(item,index) in rowList" :key="index" style="background: ghostwhite;height: 20px;">{{ item }}
- </td>
- </tr>
- </tbody>
- </table>
- <span v-else style="color: rgb(144, 147, 153);display: inline-block;position: absolute;top: 60%;left: 50%;transform: translate(-50%,-50%);">鏆傛棤鏁版嵁</span>
- </div>
- </div>
- <Detail v-else @hanldeBack="isDetail=false" :current="current" />
-
- <!-- 搴撲綅缁存姢瀵硅瘽妗� -->
- <el-dialog v-model="keepVisible" title="搴撲綅缁存姢" width="350px" :append-to-body="true">
- <el-tree :data="warehouse" ref="tree" node-key="id"
- highlight-current v-if="keepVisible"
- empty-text="鏆傛棤鏁版嵁">
- <template #default="{ node, data }">
- <div class="custom-tree-node" style="width: 100%;">
- <el-row style="width: 100%;display: flex;align-items: center;">
- <el-col :span="14">
- <span>
- <el-icon v-if="node.level < 2" class="folder-icon">
- <FolderOpened />
- </el-icon>
- <el-icon v-else class="file-icon">
- <Document />
- </el-icon>
- {{ data.label }}
- </span>
- </el-col>
- <el-col :span="10" v-if="node.level<3">
- <el-button type="link" size="small" :icon="Edit" @click.stop="handleEdit(data,node.level)">
- </el-button>
- <el-button type="danger" size="small" :icon="Delete" @click.stop="handleDelete(data,node.level)">
- </el-button>
- </el-col>
- </el-row>
- </div>
- </template>
- </el-tree>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="keepVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="keepVisible = false" >纭� 瀹�</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 浠撳簱鏂板/淇敼瀵硅瘽妗� -->
- <el-dialog v-model="warehouseVisible" :title="isEdit?'浠撳簱淇敼':'浠撳簱鏂板'" width="350px">
- <el-row>
- <el-col class="search_thing" :span="24">
- <div class="search_label"><span class="required-span">* </span>浠撳簱鍚嶇О锛�</div>
- <div class="search_input">
- <el-input v-model="name" size="small" @keyup.enter="confirmWarehouse"></el-input>
- </div>
- </el-col>
- </el-row>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="warehouseVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="confirmWarehouse" :loading="upLoadWarehouse">纭� 瀹�</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 璐ф灦鏂板/淇敼瀵硅瘽妗� -->
- <el-dialog v-model="shelvesVisible" :title="isEdit?'璐ф灦淇敼':'璐ф灦鏂板'" width="350px">
- <el-row>
- <el-col class="search_thing" :span="24">
- <div class="search_label"><span class="required-span">* </span>璐ф灦鍚嶇О锛�</div>
- <div class="search_input">
- <el-input v-model="shelves.name" size="small"></el-input>
- </div>
- </el-col>
- </el-row>
- <el-row>
- <el-col class="search_thing" :span="24">
- <div class="search_label"><span class="required-span">* </span>璐ф灦灞傛暟锛�</div>
- <div class="search_input">
- <el-input v-model="shelves.row" size="small"></el-input>
- </div>
- </el-col>
- </el-row>
- <el-row>
- <el-col class="search_thing" :span="24">
- <div class="search_label"><span class="required-span">* </span>璐ф灦鍒楁暟锛�</div>
- <div class="search_input">
- <el-input v-model="shelves.col" size="small"></el-input>
- </div>
- </el-col>
- </el-row>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="shelvesVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="confirmShelves" :loading="upLoadShelves">纭� 瀹�</el-button>
- </span>
- </template>
- </el-dialog>
-
-
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, watch } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Edit, Delete, FolderOpened, Document } from '@element-plus/icons-vue'
-import { getWarehouseList, addWarehouse, updateWarehouse, deleteWarehouse, getWarehouseStructure, addShelf, updateShelf, deleteShelf } from '@/api/fileManagement/bookshelf'
-import Detail from './detail.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const entity = reactive({
- warehouseId: null,
- shelfId: null
-})
-
-const warehouse = ref([])
-const shelf = ref([])
-const keepVisible = ref(false)
-const warehouseVisible = ref(false)
-const shelvesVisible = ref(false)
-const upLoadWarehouse = ref(false)
-const upLoadShelves = ref(false)
-const tableList = ref([])
-const rowList = ref([])
-const value = ref('')
-const name = ref('')
-const shelves = reactive({})
-const isEdit = ref(false)
-const isDetail = ref(false)
-const currentEdit = ref(null)
-const tableLoading = ref(false)
-const current = ref({})
-
-// 妯℃澘寮曠敤
-const organization = ref(null)
-
-// 鐩戝惉鍣�
-watch(isEdit, (newVal) => {
- if (!newVal) {
- Object.keys(shelves).forEach(key => delete shelves[key])
- }
-})
-
-// 鏂规硶
-
-const selectList = async () => {
- // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
- const res = await getWarehouseList()
- warehouse.value = res.data
-
- if (warehouse.value.length == 0) {
- entity.warehouseId = ''
- entity.shelfId = ''
- tableList.value = []
- }
-
-
-
- if (!entity.warehouseId && warehouse.value.length > 0) {
- entity.warehouseId = warehouse.value[0].id
- warehouseChange(entity.warehouseId)
- if (shelf.value.length > 0) {
- entity.shelfId = shelf.value[0].id
- handleShelf(entity.shelfId)
- } else {
- tableList.value = []
- }
- } else if (warehouse.value.length > 0) {
- warehouseChange(entity.warehouseId)
- if (shelf.value.length > 0) {
- entity.shelfId = shelf.value[0].id
- handleShelf(entity.shelfId)
- } else {
- tableList.value = []
- }
- }
-}
-
-const confirmWarehouse = () => {
- if (!name.value) {
- ElMessage.error('璇峰~鍐欎粨搴撳悕绉�')
- return
- }
- upLoadWarehouse.value = true
-
- if (currentEdit.value && currentEdit.value.id) {
- // 淇敼浠撳簱
- // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
- updateWarehouse({
- id: currentEdit.value.id,
- warehouseName: name.value
- }).then(res => {
- upLoadWarehouse.value = false
- warehouseVisible.value = false
- currentEdit.value = null
- ElMessage.success('淇敼鎴愬姛')
- selectList()
- name.value = ''
- warehouseChange(entity.warehouseId)
- })
-
- } else {
- // 鏂板浠撳簱
- // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
- addWarehouse({
- warehouseName: name.value
- }).then(res => {
- upLoadWarehouse.value = false
- warehouseVisible.value = false
- ElMessage.success('娣诲姞鎴愬姛')
- selectList()
- name.value = ''
- warehouseChange(entity.warehouseId)
- })
- }
-}
-
-const confirmShelves = () => {
- if (!shelves.name) {
- ElMessage.error('璇峰~鍐欒揣鏋跺悕绉�')
- return
- }
- if (!shelves.row) {
- ElMessage.error('璇峰~鍐欒揣鏋跺眰鏁�')
- return
- }
- if (!shelves.col) {
- ElMessage.error('璇峰~鍐欒揣鏋跺垪鏁�')
- return
- }
- upLoadShelves.value = true
-
- if (currentEdit.value && currentEdit.value.id) {
- // 淇敼
- updateShelf({
- id: currentEdit.value.id,
- name: shelves.name,
- row: Number(shelves.row),
- col: Number(shelves.col),
- warehouseId: entity.warehouseId
- }).then(res => {
- upLoadShelves.value = false
- shelvesVisible.value = false
- ElMessage.success('淇敼鎴愬姛')
- selectList()
- currentEdit.value = {}
- }).catch(err => {
- upLoadShelves.value = false
- shelvesVisible.value = false
- ElMessage.error('淇敼澶辫触')
- })
-
- } else {
- // 鏂板
- // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
- addShelf({
- name: shelves.name,
- row: Number(shelves.row),
- col: Number(shelves.col),
- warehouseId: entity.warehouseId
- }).then(res => {
- upLoadShelves.value = false
- shelvesVisible.value = false
- ElMessage.success('娣诲姞鎴愬姛')
- selectList()
- Object.keys(shelves).forEach(key => delete shelves[key])
- }).catch(err => {
- upLoadShelves.value = false
- shelvesVisible.value = false
- ElMessage.error('娣诲姞澶辫触')
- })
- }
- warehouseChange(entity.warehouseId)
-}
-
-
-
-const handleDelete = (row, level) => {
- ElMessageBox.confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }).then(() => {
- if (level == 1) {
- // 鍒犻櫎浠撳簱
- deleteWarehouse([row.id]).then(res => {
- ElMessage.success('鍒犻櫎鎴愬姛')
- selectList()
- })
- } else {
- // 鍒犻櫎璐ф灦
- deleteShelf({
- id: row.id
- }).then(res => {
- ElMessage.success('鍒犻櫎鎴愬姛')
- selectList()
- })
- }
- warehouseChange(entity.warehouseId)
- }).catch(() => {})
-}
-
-const handleEdit = (data, level) => {
- isEdit.value = true
- if (level == 1) {
- warehouseVisible.value = true
- currentEdit.value = data
- name.value = data.label
- } else {
- shelvesVisible.value = true
- currentEdit.value = data
- Object.assign(shelves, {
- name: data.label,
- row: data.row,
- col: data.col,
- warehouseId: data.warehouseId
- })
- }
-}
-
-const handelDetail = (row) => {
- current.value = row
- isDetail.value = true
-}
-
-// 鏍规嵁鏂囨。鐘舵�佽繑鍥炲搴旂殑棰滆壊
-const getStatusColor = (status) => {
- if (status === '姝e父') {
- return '#34BD66' // 缁胯壊
- } else if (status === '鍊熷嚭') {
- return '#F56C6C' // 绾㈣壊
- }
- return '#606266' // 榛樿棰滆壊
-}
-
-const warehouseChange = (val) => {
-tableList.value = []
-let map = warehouse.value.find(a => {
- return a && a.id === val ? a : null
-})
-if (map && map.children) {
- shelf.value = map.children
- entity.shelfId = ''
-} else {
- shelf.value = []
-}
-currentEdit.value = null
-}
-
-const handleShelf = async(e) => {
- if (e) {
- tableLoading.value = true
- let data = []
- const res = await getWarehouseStructure({warehouseGoodsShelvesId:e})
- if(res.code == 200){
- data = res.data.map(m=>{
- m.books = m.documentationDtoList|[]
- return m
- })
- }else{
- ElMessage.error(res.message)
- }
- setTimeout(() => {
- tableLoading.value = false
- let set = new Set()
- tableList.value = []
- let arr = []
-
- if (data && data.length > 0) {
- data.forEach(m => {
- if (m && m.row && m.col) {
- set.add(m.col)
- if (arr.length > 0) {
- if (arr.find(n => n.row == m.row)) {
- arr.push(m)
- } else {
- tableList.value.push(arr)
- arr = []
- arr.push(m)
- }
- } else {
- arr.push(m)
- }
- }
- })
-
- if (arr.length > 0) {
- tableList.value.push(arr)
- }
- }
-
- rowList.value = []
- for (let i = 0; i < set.size; i++) {
- rowList.value.push(`${i + 1} 鍒梎)
- }
- console.log(6666, tableList.value,rowList.value,data)
- }, 1000)
- }
-}
-
-
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- selectList()
-})
-</script>
-
-<style scoped>
- .main-content {
- width: 100%;
- height: 100%;
- padding: 20px;
- box-sizing: border-box;
- }
-
- .title {
- height: 20px;
- line-height: 20px;
- margin-bottom: 20px;
- }
-
- .search {
- background-color: #fff;
- height: 80px;
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 20px;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- margin-bottom: 20px;
- }
-
- .search_thing {
- display: flex;
- align-items: center;
- height: 50px;
- margin-right: 20px;
- }
-
- .search_label {
- width: 90px;
- font-size: 14px;
- text-align: right;
- color: #606266;
- font-weight: 500;
- margin-right: 10px;
- }
-
- .search_input {
- width: 200px;
- }
-
- .table {
- background-color: #fff;
- width: 100%;
- height: calc(100% - 100px);
- padding: 20px;
- overflow-y: auto;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- }
-
- .el-form-item {
- margin-bottom: 16px;
- }
-
- .btns {
- display: flex;
- align-items: center;
- gap: 10px;
- }
-
- .tables {
- width: 100%;
- height: 100%;
- border-collapse: collapse;
- border: 1px solid #e4e7ed;
- }
-
- .tables th {
- font-size: 14px;
- border: 1px solid #e4e7ed;
- background-color: #fafafa;
- padding: 8px;
- font-weight: 500;
- }
-
- .tables td {
- font-size: 12px;
- text-align: center;
- vertical-align: top;
- border: 1px solid #e4e7ed;
- padding: 8px;
- box-sizing: border-box;
- height: 120px;
- background-color: #fff;
- }
-
- .tables ul {
- list-style-type: none;
- }
-
- .tables ul li {
- border-radius: 3px;
- padding: 4px 10px;
- box-sizing: border-box;
- margin-bottom: 5px;
- font-size: 12px;
- display: flex;
- align-items: center;
- justify-content: start;
- color: #333333;
- cursor: pointer;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
-
- .tables h4 {
- color: #999999;
- font-size: 14px;
- font-weight: 400;
- padding: 6px 0;
- }
-
- .tables i {
- display: inline-block;
- width: 6px;
- height: 6px;
- border-radius: 50%;
- margin-right: 6px;
- }
-
- li:hover {
- background: rgba(58, 123, 250, 0.18);
- }
-
- li:hover i {
- background: #3A7BFA;
- }
-
- li:hover .num {
- color: #3A7BFA;
- }
-
- .green {
- background: #E0F6EA;
- }
-
- .green i {
- background: #34BD66;
- }
-
- .green .num {
- color: #34BD66;
- }
-
- .el-dialog {
- position: relative;
- }
-
- .shaoma {
- display: flex;
- align-items: center;
- font-size: 14px;
- color: #3A7BFA;
- position: absolute;
- top: 23px;
- right: 54px;
- cursor: pointer;
- }
-
- .folder-icon {
- color: #409eff;
- font-size: 16px;
- margin-right: 6px;
- }
-
- .file-icon {
- color: #67c23a;
- font-size: 16px;
- margin-right: 6px;
- }
-
- .node_i {
- color: orange;
- font-size: 18px;
- }
-
- .custom-tree-node .el-button {
- opacity: 0;
- }
-
- .custom-tree-node:hover .el-button {
- opacity: 1;
- }
-
- :deep(.el-loading-mask) {
- z-index: 10;
- }
-
- .required-span {
- color: #f56c6c;
- }
-
- .table-row {
- border-bottom: 1px solid #e4e7ed;
- }
-
- .table-row:last-child {
- border-bottom: none;
- }
-
- .column-header {
- background-color: #fafafa !important;
- font-weight: 500;
- color: #606266;
- }
-
- .content {
- transition: background-color 0.2s ease;
- }
-
- .content:hover {
- background-color: #f5f7fa;
- }
-</style>
diff --git a/src/views/fileManagement/borrow/index.vue b/src/views/fileManagement/borrow/index.vue
deleted file mode 100644
index 6875571..0000000
--- a/src/views/fileManagement/borrow/index.vue
+++ /dev/null
@@ -1,582 +0,0 @@
-<template>
- <div class="app-container borrow-view">
- <!-- 鏌ヨ鍖哄煙 -->
- <div class="search-container">
- <el-form :model="searchForm" :inline="true" class="search-form">
- <el-form-item label="鍊熼槄鐘舵�侊細">
- <el-select v-model="searchForm.borrowStatus" placeholder="璇烽�夋嫨鍊熼槄鐘舵��" clearable style="width: 150px">
- <el-option label="鍊熼槄" value="鍊熼槄" />
- <el-option label="褰掕繕" value="褰掕繕" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍊熼槄浜猴細">
- <el-input
- v-model="searchForm.borrower"
- placeholder="璇疯緭鍏ュ�熼槄浜�"
- clearable
- style="width: 200px"
- />
- </el-form-item>
- <el-form-item label="鍊熼槄鏃ユ湡鑼冨洿锛�">
- <el-date-picker
- v-model="searchForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- style="width: 300px"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">
- <el-icon><Search /></el-icon>
- 鏌ヨ
- </el-button>
- <el-button @click="handleReset">
- <el-icon><Refresh /></el-icon>
- 閲嶇疆
- </el-button>
- </el-form-item>
- <el-form-item style="margin-left: auto;">
- <el-button type="primary" @click="openBorrowDia('add')">
- <el-icon><Plus /></el-icon>
- 鏂板鍊熼槄
- </el-button>
- <el-button
- type="danger"
- @click="handleBatchDelete"
- :disabled="selectedRows.length === 0"
- >
- <el-icon><Delete /></el-icon>
- 鎵归噺鍒犻櫎 ({{ selectedRows.length }})
- </el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <!-- 琛ㄦ牸鍖哄煙 -->
- <div class="table-container">
- <PIMTable
- :table-data="borrowList"
- :column="tableColumns"
- :is-selection="true"
- :border="true"
- :table-loading="tableLoading"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- layout: 'total, sizes, prev, pager, next, jumper'
- }"
- @selection-change="handleSelectionChange"
- @pagination="handlePagination"
- />
- </div>
-
- <!-- 鍊熼槄鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- v-model="borrowDia"
- :title="borrowOperationType === 'add' ? '鏂板鍊熼槄' : '缂栬緫鍊熼槄'"
- width="800px"
- @close="closeBorrowDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="borrowForm"
- label-width="140px"
- :rules="borrowRules"
- ref="borrowFormRef"
- >
- <el-row :gutter="20">
-
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍊熼槄浜猴細" prop="borrower">
- <el-input v-model="borrowForm.borrower" placeholder="璇疯緭鍏ュ�熼槄浜�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍊熼槄涔︾睄锛�" prop="documentationId">
- <el-select v-model="borrowForm.documentationId" placeholder="璇烽�夋嫨鍊熼槄涔︾睄" style="width: 100%">
- <el-option
- v-for="item in documentList"
- :key="item.id"
- :label="item.docName || item.name"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍊熼槄鏃ユ湡锛�" prop="borrowDate">
- <el-date-picker
- v-model="borrowForm.borrowDate"
- type="date"
- placeholder="閫夋嫨鍊熼槄鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="搴斿綊杩樻棩鏈燂細" prop="dueReturnDate">
- <el-date-picker
- v-model="borrowForm.dueReturnDate"
- type="date"
- placeholder="閫夋嫨搴斿綊杩樻棩鏈�"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鍊熼槄鐩殑锛�" prop="borrowPurpose">
- <el-input v-model="borrowForm.borrowPurpose" placeholder="璇疯緭鍏ュ�熼槄鐩殑" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞锛�" prop="remark">
- <el-input
- v-model="borrowForm.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitBorrowForm">纭</el-button>
- <el-button @click="closeBorrowDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, getCurrentInstance } from "vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import { Search, Refresh, Plus, Delete } from '@element-plus/icons-vue';
-import PIMTable from '@/components/PIMTable/PIMTable.vue';
-import { getBorrowList, addBorrow, updateBorrow, deleteBorrow, getDocumentList } from '@/api/fileManagement/borrow';
-
-const { proxy } = getCurrentInstance();
-
-// 鍝嶅簲寮忔暟鎹�
-const borrowDia = ref(false);
-const borrowOperationType = ref("");
-const tableLoading = ref(false);
-const borrowList = ref([]);
-const selectedRows = ref([]);
-const documentList = ref([]); // 鏂囨。鍒楄〃锛岀敤浜庡�熼槄涔︾睄閫夋嫨
-
-// 鍒嗛〉鐩稿叧
-const pagination = reactive({
- currentPage: 1,
- pageSize: 10,
- total: 0,
-});
-
-// 鏌ヨ琛ㄥ崟
-const searchForm = reactive({
- documentationId: "",
- borrowStatus: "",
- borrower: "",
- returnerId: "",
- dateRange: []
-});
-
-// 鍊熼槄琛ㄥ崟
-const borrowForm = reactive({
- id: "",
- documentationId: "",
- borrower: "",
- returnerId: "",
- borrowPurpose: "",
- borrowDate: "",
- dueReturnDate: "",
- returnDate: "",
- borrowStatus: "",
- remark: ""
-});
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const borrowRules = reactive({
- documentationId: [{ required: true, message: "璇烽�夋嫨鍊熼槄涔︾睄", trigger: "change" }],
- borrower: [{ required: true, message: "璇疯緭鍏ュ�熼槄浜�", trigger: "blur" }],
- borrowPurpose: [{ required: true, message: "璇疯緭鍏ュ�熼槄鐩殑", trigger: "blur" }],
- borrowDate: [{ required: true, message: "璇烽�夋嫨鍊熼槄鏃ユ湡", trigger: "change" }],
- dueReturnDate: [{ required: true, message: "璇烽�夋嫨搴斿綊杩樻棩鏈�", trigger: "change" }],
- borrowStatus: [{ required: true, message: "璇烽�夋嫨鍊熼槄鐘舵��", trigger: "change" }]
-});
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumns = ref([
- {
- label: '鏂囨。鍚嶇О',
- prop: 'docName',
- width: '200',
- },
- { label: '鍊熼槄浜�', prop: 'borrower' },
- { label: '鍊熼槄鐩殑', prop: 'borrowPurpose' },
- { label: '鍊熼槄鏃ユ湡', prop: 'borrowDate' },
- { label: '搴斿綊杩樻棩鏈�', prop: 'dueReturnDate' },
- {
- label: '鍊熼槄鐘舵��',
- prop: 'borrowStatus',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- return params;
- },
- formatType: (params) => {
- if (params === '褰掕繕') return 'success';
- if (params === '鍊熼槄') return 'warning';
- return 'info';
- }
- },
- { label: '澶囨敞', prop: 'remark', width: '150' },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: '150',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openBorrowDia('edit', row)
- },
- },
- {
- name: "鍒犻櫎",
- type: "text",
- clickFun: (row) => {
- handleDelete(row)
- },
- },
- ],
- }
-]);
-
-// 鍒濆鍖栨暟鎹�
-const initData = async () => {
- await Promise.all([
- loadDocumentList(),
- loadBorrowList()
- ]);
-};
-
-// 鍔犺浇鏂囨。鍒楄〃
-const loadDocumentList = async () => {
- try {
- const res = await getDocumentList();
- if (res.code === 200) {
- documentList.value = res.data || [];
- } else {
- ElMessage.error(res.msg || "鑾峰彇鏂囨。鍒楄〃澶辫触");
- documentList.value = [];
- }
- } catch (error) {
- ElMessage.error("鑾峰彇鏂囨。鍒楄〃澶辫触锛岃閲嶈瘯");
- documentList.value = [];
- }
-};
-
-// 鍔犺浇鍊熼槄鍒楄〃
-const loadBorrowList = async () => {
- try {
- tableLoading.value = true;
-
- // 鏋勫缓鏌ヨ鍙傛暟
- const query = {
- page: pagination.currentPage,
- size: pagination.pageSize,
- documentationId: searchForm.documentationId || undefined,
- borrowStatus: searchForm.borrowStatus || undefined,
- borrower: searchForm.borrower || undefined,
- returnerId: searchForm.returnerId || undefined,
- entryDateStart: searchForm.dateRange && searchForm.dateRange.length > 0 ? searchForm.dateRange[0] : undefined,
- entryDateEnd: searchForm.dateRange && searchForm.dateRange.length > 1 ? searchForm.dateRange[1] : undefined
- };
-
- // 绉婚櫎undefined鐨勫弬鏁�
- Object.keys(query).forEach(key => {
- if (query[key] === undefined) {
- delete query[key];
- }
- });
-
- const res = await getBorrowList(query);
- if (res.code === 200) {
- borrowList.value = res.data.records || [];
- pagination.total = res.data.total || 0;
- } else {
- ElMessage.error(res.msg || "鑾峰彇鍊熼槄鍒楄〃澶辫触");
- borrowList.value = [];
- pagination.total = 0;
- }
-
- // 閲嶇疆閫夋嫨鐘舵��
- selectedRows.value = [];
- } catch (error) {
- ElMessage.error("鑾峰彇鍊熼槄鍒楄〃澶辫触锛岃閲嶈瘯");
- borrowList.value = [];
- pagination.total = 0;
- } finally {
- tableLoading.value = false;
- }
-};
-
-// 鏌ヨ
-const handleSearch = () => {
- pagination.currentPage = 1;
- loadBorrowList();
-};
-
-// 閲嶇疆鏌ヨ
-const handleReset = () => {
- searchForm.documentationId = "";
- searchForm.borrowStatus = "";
- searchForm.borrower = "";
- searchForm.returnerId = "";
- searchForm.dateRange = [];
- pagination.currentPage = 1;
- loadBorrowList();
- ElMessage.success("鏌ヨ鏉′欢宸查噸缃�");
-};
-
-// 鎵撳紑鍊熼槄寮规
-const openBorrowDia = async (type, data) => {
- // 鍏堝埛鏂版枃妗e垪琛�
- await loadDocumentList();
-
- borrowOperationType.value = type;
- borrowDia.value = true;
-
- if (type === "edit") {
- // 缂栬緫妯″紡锛屽姞杞界幇鏈夋暟鎹�
- Object.assign(borrowForm, data);
- } else {
- // 鏂板妯″紡锛屾竻绌鸿〃鍗�
- Object.keys(borrowForm).forEach(key => {
- borrowForm[key] = "";
- });
- // 璁剧疆榛樿鐘舵��
- borrowForm.borrowStatus = "鍊熼槄";
- // 璁剧疆褰撳墠鏃ユ湡涓哄�熼槄鏃ユ湡
- borrowForm.borrowDate = new Date().toISOString().split('T')[0];
- }
-};
-
-// 鍏抽棴鍊熼槄寮规
-const closeBorrowDia = () => {
- proxy.$refs.borrowFormRef.resetFields();
- borrowDia.value = false;
-};
-
-// 鎻愪氦鍊熼槄琛ㄥ崟
-const submitBorrowForm = () => {
- proxy.$refs.borrowFormRef.validate(async (valid) => {
- if (valid) {
- try {
- if (borrowOperationType.value === "edit") {
- // 缂栬緫妯″紡锛屾洿鏂扮幇鏈夋暟鎹�
- const res = await updateBorrow({
- borrower:borrowForm.borrower,
- id: borrowForm.id,
- borrowPurpose: borrowForm.borrowPurpose,
- borrowDate: borrowForm.borrowDate,
- dueReturnDate: borrowForm.dueReturnDate,
- returnDate: borrowForm.returnDate,
- remark: borrowForm.remark
- });
-
- if (res.code === 200) {
- ElMessage.success("缂栬緫鎴愬姛");
- await loadBorrowList();
- closeBorrowDia();
- } else {
- ElMessage.error(res.msg || "缂栬緫澶辫触");
- }
- } else {
- // 鏂板妯″紡锛屾坊鍔犳柊鏁版嵁
- const res = await addBorrow({
- documentationId: borrowForm.documentationId,
- borrower: borrowForm.borrower,
- returnerId: borrowForm.returnerId,
- borrowPurpose: borrowForm.borrowPurpose,
- borrowDate: borrowForm.borrowDate,
- dueReturnDate: borrowForm.dueReturnDate,
- returnDate: borrowForm.returnDate,
- borrowStatus: borrowForm.borrowStatus,
- remark: borrowForm.remark
- });
-
- if (res.code === 200) {
- ElMessage.success("鏂板鎴愬姛");
- await loadBorrowList();
- closeBorrowDia();
- } else {
- ElMessage.error(res.msg || "鏂板澶辫触");
- }
- }
- } catch (error) {
- ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
- }
- }
- });
-};
-
-// 鍒犻櫎鍊熼槄璁板綍
-const handleDelete = (row) => {
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄よ繖鏉″�熼槄璁板綍鍚楋紵`,
- "鍒犻櫎鎻愮ず",
- {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }
- ).then(async () => {
- try {
- const res = await deleteBorrow([row.id]);
- if (res.code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- await loadBorrowList();
- } else {
- ElMessage.error(res.msg || "鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- }).catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑璁板綍");
- return;
- }
-
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉″�熼槄璁板綍鍚楋紵`,
- "鎵归噺鍒犻櫎鎻愮ず",
- {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }
- ).then(async () => {
- try {
- const selectedIds = selectedRows.value.map(row => row.id);
- const res = await deleteBorrow(selectedIds);
- if (res.code === 200) {
- ElMessage.success("鎵归噺鍒犻櫎鎴愬姛");
- await loadBorrowList();
- } else {
- ElMessage.error(res.msg || "鎵归噺鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鎵归噺鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- }).catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 閫夋嫨鍙樺寲浜嬩欢
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 澶勭悊鍒嗛〉鍙樺寲
-const handlePagination = (current, size) => {
- pagination.currentPage = current;
- pagination.pageSize = size;
- loadBorrowList();
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initData();
-});
-</script>
-
-<style scoped>
-.borrow-view {
- padding: 20px;
-}
-
-.search-container {
- background: #ffffff;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.search-form {
- margin: 0;
-}
-
-.table-container {
- background: #ffffff;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.empty-data {
- text-align: center;
- color: #909399;
- padding: 40px;
- font-size: 14px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-form-item__label) {
- font-weight: 500;
- color: #303133;
-}
-
-:deep(.el-input__wrapper) {
- box-shadow: 0 0 0 1px #dcdfe6 inset;
-}
-
-:deep(.el-input__wrapper:hover) {
- box-shadow: 0 0 0 1px #c0c4cc inset;
-}
-
-:deep(.el-input__wrapper.is-focus) {
- box-shadow: 0 0 0 1px #409eff inset;
-}
-</style>
diff --git a/src/views/fileManagement/document/attachmentManager.vue b/src/views/fileManagement/document/attachmentManager.vue
deleted file mode 100644
index a4e1d43..0000000
--- a/src/views/fileManagement/document/attachmentManager.vue
+++ /dev/null
@@ -1,426 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="闄勪欢绠$悊" width="60%" :before-close="handleClose">
- <div class="attachment-manager">
- <!-- 涓婁紶鍖哄煙 -->
- <div class="upload-section">
- <el-upload
- ref="uploadRef"
- :action="uploadUrl"
- :headers="uploadHeaders"
- :before-upload="handleBeforeUpload"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- :on-remove="handleRemove"
- :file-list="fileList"
- multiple
- :limit="10"
- :show-file-list="false"
- :data="{documentId: currentDocumentId}"
- accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.txt,.xml,.jpg,.jpeg,.png,.gif,.bmp,.rar,.zip,.7z"
- >
- <el-button type="primary" :icon="Plus">涓婁紶闄勪欢</el-button>
- <template #tip>
- <div class="el-upload__tip">
- 鏀寔鏍煎紡锛歞oc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- <br>鍗曚釜鏂囦欢澶у皬涓嶈秴杩�50MB
- </div>
- </template>
- </el-upload>
- </div>
-
- <!-- 闄勪欢鍒楄〃 -->
- <div class="attachment-list">
- <el-table :data="fileList" border height="400px" v-loading="loading">
- <el-table-column label="搴忓彿" type="index" width="60" align="center" />
- <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="200" show-overflow-tooltip />
- <el-table-column label="鏂囦欢澶у皬" prop="size" width="100" align="center">
- <template #default="scope">
- {{ formatFileSize(scope.row.size) }}
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" prop="uploadTime" width="160" align="center">
- <template #default="scope">
- {{ formatDate(scope.row.uploadTime) }}
- </template>
- </el-table-column>
- <el-table-column label="鐘舵��" prop="status" width="80" align="center">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'success' ? 'success' : 'danger'" size="small">
- {{ scope.row.status === 'success' ? '鎴愬姛' : '澶辫触' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column fixed="right" label="鎿嶄綔" width="200" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="previewFile(scope.row)">
- 棰勮
- </el-button>
- <el-button link type="primary" size="small" @click="downloadFile(scope.row)">
- 涓嬭浇
- </el-button>
- <el-button link type="danger" size="small" @click="removeFile(scope.row)">
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div>
-
- <!-- 鏂囦欢棰勮缁勪欢 -->
- <filePreview ref="filePreviewRef" />
- </el-dialog>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus } from '@element-plus/icons-vue'
-import { getToken } from "@/utils/auth"
-import { addDocumentationFile, getDocumentationFileList, deleteDocumentationFile } from '@/api/fileManagement/document'
-import filePreview from '@/components/filePreview/index.vue'
-
-const props = defineProps({
- // documentId 閫氳繃 open 浜嬩欢浼犲叆锛屼笉闇�瑕佷綔涓� props
-})
-
-const emit = defineEmits(['update:attachments'])
-
-const dialogVisible = ref(false)
-const loading = ref(false)
-const fileList = ref([])
-const uploadRef = ref()
-const filePreviewRef = ref()
-const currentDocumentId = ref('') // 鍐呴儴绠$悊褰撳墠鏂囨。ID
-
-// 涓婁紶閰嶇疆
-const uploadUrl = import.meta.env.VITE_APP_BASE_API + "/file/upload"
-const uploadHeaders = computed(() => ({
- Authorization: "Bearer " + getToken()
-}))
-
-// 鎵撳紑寮规
-const open = (attachments = [], documentId = '') => {
- dialogVisible.value = true
- currentDocumentId.value = documentId // 璁剧疆褰撳墠鏂囨。ID
- // 濡傛灉鏈夋枃妗D锛屽垯鍔犺浇闄勪欢鍒楄〃
- if (documentId) {
- loadAttachmentList(documentId)
- } else {
- fileList.value = attachments || []
- // total.value = fileList.value.length // Removed total.value
- }
- // currentPage.value = 1 // Removed currentPage.value
-}
-
-// 鍔犺浇闄勪欢鍒楄〃
-const loadAttachmentList = async (documentId) => {
- try {
- loading.value = true
- const params = {
- page: 1, // Always load from page 1
- size: 1000, // Load all for now
- documentationId: documentId
- }
-
- const res = await getDocumentationFileList(params)
- if (res.code === 200) {
- const records = res.data
-
- // 杞崲鏁版嵁鏍煎紡
- fileList.value = records.map(item => ({
- id: item.id,
- name: item.name,
- size: item.fileSize,
- url: item.url,
- uploadTime: item.createTime || item.uploadTime,
- status: 'success',
- uid: item.id
- }))
-
- // total.value = totalCount // Removed total.value
- } else {
- ElMessage.error(res.msg || '鑾峰彇闄勪欢鍒楄〃澶辫触')
- fileList.value = []
- // total.value = 0 // Removed total.value
- }
- } catch (error) {
- console.error('鑾峰彇闄勪欢鍒楄〃澶辫触:', error)
- ElMessage.error('鑾峰彇闄勪欢鍒楄〃澶辫触')
- fileList.value = []
- // total.value = 0 // Removed total.value
- } finally {
- loading.value = false
- }
-}
-
-// 鍏抽棴寮规
-const handleClose = () => {
- dialogVisible.value = false
- emit('update:attachments', fileList.value)
-}
-
-// 鏂囦欢涓婁紶鍓嶆牎楠�
-const handleBeforeUpload = (file) => {
- // 妫�鏌ユ枃浠跺ぇ灏忥紙50MB锛�
- const isLt50M = file.size / 1024 / 1024 < 50
- if (!isLt50M) {
- ElMessage.error('鏂囦欢澶у皬涓嶈兘瓒呰繃50MB!')
- return false
- }
-
- // 妫�鏌ユ枃浠剁被鍨�
- const allowedTypes = [
- 'application/msword',
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'application/vnd.ms-excel',
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'application/vnd.ms-powerpoint',
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
- 'application/pdf',
- 'text/plain',
- 'text/xml',
- 'image/jpeg',
- 'image/png',
- 'image/gif',
- 'image/bmp',
- 'application/x-rar-compressed',
- 'application/zip',
- 'application/x-7z-compressed'
- ]
-
- if (!allowedTypes.includes(file.type)) {
- ElMessage.error('涓嶆敮鎸佺殑鏂囦欢绫诲瀷!')
- return false
- }
-
- return true
-}
-
-// 鏂囦欢涓婁紶鎴愬姛
-const handleUploadSuccess = (response, file, fileList) => {
- console.log('鏂囦欢涓婁紶鎴愬姛鍝嶅簲:', response);
- console.log('鏂囦欢淇℃伅:', file);
-
- if (response.code === 200) {
- // 鏋勫缓闄勪欢鏁版嵁 - 纭繚姝g‘鑾峰彇URL
- const attachmentData = {
- name: file.name,
- url: response.data.url || response.data.path || response.data.tempPath || file.url,
- fileSize: file.size,
- documentationId: currentDocumentId.value
- };
-
- console.log('鏋勫缓鐨勯檮浠舵暟鎹�:', attachmentData);
-
- // 璋冪敤淇濆瓨闄勪欢鎺ュ彛
- saveAttachment(attachmentData, file, fileList);
- } else {
- ElMessage.error(response.msg || '鏂囦欢涓婁紶澶辫触')
- }
-}
-
-// 淇濆瓨闄勪欢淇℃伅
-const saveAttachment = async (attachmentData, file, fileList) => {
- try {
- console.log('寮�濮嬩繚瀛橀檮浠讹紝鏁版嵁:', attachmentData);
-
- // 纭繚URL瀛楁瀛樺湪涓旀湁鏁�
- if (!attachmentData.url) {
- console.error('闄勪欢URL涓虹┖锛屾棤娉曚繚瀛�');
- ElMessage.error('鏂囦欢URL鑾峰彇澶辫触锛屾棤娉曚繚瀛橀檮浠�');
- return;
- }
-
- const res = await addDocumentationFile(attachmentData);
- console.log('淇濆瓨闄勪欢鎺ュ彛鍝嶅簲:', res);
-
- if (res.code === 200) {
- const newFile = {
- id: res.data.id || Date.now(),
- name: attachmentData.name,
- size: attachmentData.fileSize,
- url: attachmentData.url,
- uploadTime: new Date().toISOString(),
- status: 'success',
- uid: file.uid
- }
-
- console.log('鍒涘缓鐨勬柊鏂囦欢瀵硅薄:', newFile);
- fileList.push(newFile)
- ElMessage.success('鏂囦欢涓婁紶骞朵繚瀛樻垚鍔�')
-
- // 淇濆瓨鎴愬姛鍚庡埛鏂伴檮浠跺垪琛�
- if (currentDocumentId.value) {
- await loadAttachmentList(currentDocumentId.value);
- }
- } else {
- ElMessage.error(res.msg || '淇濆瓨闄勪欢淇℃伅澶辫触')
- // 淇濆瓨澶辫触鏃剁Щ闄ゆ枃浠�
- const index = fileList.findIndex(item => item.uid === file.uid)
- if (index > -1) {
- fileList.splice(index, 1)
- }
- }
- } catch (error) {
- console.error('淇濆瓨闄勪欢澶辫触:', error)
- ElMessage.error('淇濆瓨闄勪欢淇℃伅澶辫触')
- // 淇濆瓨澶辫触鏃剁Щ闄ゆ枃浠�
- const index = fileList.findIndex(item => item.uid === file.uid)
- if (index > -1) {
- fileList.splice(index, 1)
- }
- }
-}
-
-// 鏂囦欢涓婁紶澶辫触
-const handleUploadError = (error, file, fileList) => {
- console.error('鏂囦欢涓婁紶澶辫触:', error);
- console.error('澶辫触鐨勬枃浠�:', file);
- console.error('褰撳墠鏂囦欢鍒楄〃:', fileList);
-
- ElMessage.error('鏂囦欢涓婁紶澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ユ垨鏂囦欢鏍煎紡')
-}
-
-// 绉婚櫎鏂囦欢
-const handleRemove = (file, fileList) => {
- const index = fileList.findIndex(item => item.uid === file.uid)
- if (index > -1) {
- fileList.splice(index, 1)
- // total.value = fileList.length // Removed total.value
- }
-}
-
-// 鍒犻櫎鏂囦欢
-const removeFile = (file) => {
- ElMessageBox.confirm(`纭畾瑕佸垹闄ゆ枃浠� "${file.name}" 鍚楋紵`, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(async () => {
- try {
- // 璋冪敤鍒犻櫎鎺ュ彛
- const res = await deleteDocumentationFile([file.id]);
- if (res.code === 200) {
- // 浠庢湰鍦板垪琛ㄤ腑绉婚櫎
- const index = fileList.value.findIndex(item => item.id === file.id);
- if (index > -1) {
- fileList.value.splice(index, 1);
- }
- ElMessage.success('鍒犻櫎鎴愬姛');
-
- // 濡傛灉鏈夋枃妗D锛屽埛鏂伴檮浠跺垪琛�
- if (currentDocumentId.value) {
- await loadAttachmentList(currentDocumentId.value);
- }
- } else {
- ElMessage.error(res.msg || '鍒犻櫎澶辫触');
- }
- } catch (error) {
- console.error('鍒犻櫎闄勪欢澶辫触:', error);
- ElMessage.error('鍒犻櫎闄勪欢澶辫触');
- }
- }).catch(() => {
- // 鍙栨秷鍒犻櫎
- })
-}
-
-// 棰勮鏂囦欢
-const previewFile = (file) => {
- if (file.url) {
- filePreviewRef.value.open(file.url)
- } else {
- ElMessage.warning('鏂囦欢鍦板潃鏃犳晥锛屾棤娉曢瑙�')
- }
-}
-
-// 涓嬭浇鏂囦欢
-const downloadFile = (file) => {
- if (file.url) {
- // 鍒涘缓涓嬭浇閾炬帴
- const link = document.createElement('a')
- link.href = file.url
- link.download = file.name
- document.body.appendChild(link)
- link.click()
- document.body.removeChild(link)
- ElMessage.success('寮�濮嬩笅杞芥枃浠�')
- } else {
- ElMessage.warning('鏂囦欢鍦板潃鏃犳晥锛屾棤娉曚笅杞�')
- }
-}
-
-// 鏍煎紡鍖栨枃浠跺ぇ灏�
-const formatFileSize = (bytes) => {
- if (bytes === 0) return '0 B'
- const k = 1024
- const sizes = ['B', 'KB', 'MB', 'GB']
- const i = Math.floor(Math.log(bytes) / Math.log(k))
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
-}
-
-// 鏍煎紡鍖栨棩鏈�
-const formatDate = (dateString) => {
- if (!dateString) return ''
- const date = new Date(dateString)
- return date.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit'
- })
-}
-
-// 娴嬭瘯鏂囦欢涓婁紶
-const testUpload = () => {
- console.log('褰撳墠鏂囨。ID:', currentDocumentId.value);
- console.log('涓婁紶URL:', uploadUrl);
- console.log('涓婁紶Headers:', uploadHeaders.value);
-}
-
-// 鏆撮湶鏂规硶
-defineExpose({
- open,
- loadAttachmentList,
- testUpload
-})
-</script>
-
-<style scoped>
-.attachment-manager {
- padding: 20px;
-}
-
-.upload-section {
- margin-bottom: 20px;
- padding: 20px;
- background-color: #f8f9fa;
- border-radius: 8px;
- border: 2px dashed #d9d9d9;
-}
-
-.upload-section:hover {
- border-color: #409eff;
-}
-
-.attachment-list {
- margin-bottom: 20px;
-}
-
-.el-upload__tip {
- margin-top: 10px;
- color: #666;
- font-size: 12px;
- line-height: 1.5;
-}
-
-:deep(.el-upload) {
- width: 100%;
-}
-
-:deep(.el-upload-dragger) {
- width: 100%;
- height: 120px;
-}
-</style>
diff --git a/src/views/fileManagement/document/index.vue b/src/views/fileManagement/document/index.vue
deleted file mode 100644
index 7cf352c..0000000
--- a/src/views/fileManagement/document/index.vue
+++ /dev/null
@@ -1,1262 +0,0 @@
-<template>
- <div class="app-container document-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="openCategoryDia('addOne')"
- style="margin-left: 10px"
- >鏂板鍒嗙被</el-button
- >
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="categoryList"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'category' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- margin-top: 10px;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.category }}
- </span>
- <div>
- <el-button
- type="primary"
- link
- @click="openCategoryDia('edit', data)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- link
- @click="openCategoryDia('addSub', data)"
- v-if="node.level < 2"
- >
- 娣诲姞瀛愬垎绫�
- </el-button>
- <el-button
- v-if="!node.childNodes.length"
- style="margin-left: 4px"
- type="danger"
- link
- @click="removeCategory(node, data)"
- >
- 鍒犻櫎
- </el-button>
- </div>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px" v-if="isShowButton">
- <el-button type="primary" @click="openDocumentDia('add')">
- 鏂板鏂囨。
- </el-button>
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- :disabled="selectedRows.length === 0"
- >
- 鍒犻櫎 ({{ selectedRows.length }})
- </el-button>
- </div>
- <div class="table-container">
-
- <!-- PIMTable 缁勪欢 -->
- <PIMTable
- :table-data="documentList"
- :column="tableColumns"
- :is-selection="true"
- :border="true"
- :table-loading="tableLoading"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- layout: 'total, sizes, prev, pager, next, jumper'
- }"
- @selection-change="handleSelectionChange"
- @pagination="handlePagination"
- />
- </div>
- </div>
-
- <!-- 鍒嗙被鏂板/淇敼瀵硅瘽妗� -->
- <el-dialog v-model="categoryDia" title="鍒嗙被" width="400px" @keydown.enter.prevent>
- <el-form
- :model="categoryForm"
- label-width="140px"
- label-position="top"
- :rules="categoryRules"
- ref="categoryFormRef"
- >
- <el-row :gutter="30">
- <el-col :span="24" v-if="categoryOperationType === 'addSub'">
- <el-form-item label="鐖跺垎绫伙細" prop="parentName">
- <el-input
- v-model="categoryForm.parentName"
- placeholder="鐖跺垎绫诲悕绉�"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鍒嗙被鍚嶇О锛�" prop="category">
- <el-input
- v-model="categoryForm.category"
- placeholder="璇疯緭鍏ュ垎绫诲悕绉�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitCategoryForm">纭</el-button>
- <el-button @click="closeCategoryDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鏂囨。鏂板/淇敼瀵硅瘽妗� -->
- <el-dialog
- v-model="documentDia"
- :title="documentOperationType === 'add' ? '鏂板鏂囨。' : '缂栬緫鏂囨。'"
- width="600px"
- @close="closeDocumentDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="documentForm"
- label-width="140px"
- label-position="top"
- :rules="documentRules"
- ref="documentFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。鍚嶇О锛�" prop="docName">
- <el-input v-model="documentForm.docName" placeholder="璇疯緭鍏�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="骞村害锛�" prop="year">
- <el-date-picker
- v-model="documentForm.year"
- type="year"
- value-format="YYYY"
- format="YYYY"
- placeholder="閫夋嫨骞村害"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。缂栧彿锛�" prop="docNumber">
- <el-input v-model="documentForm.docNumber" placeholder="璇疯緭鍏�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璐d换浜猴細" prop="responsiblePerson">
- <el-input v-model="documentForm.responsiblePerson" placeholder="璇疯緭鍏�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。鍒嗙被锛�" prop="documentClassificationId">
- <el-select v-model="documentForm.documentClassificationId" placeholder="璇烽�夋嫨鏂囨。鍒嗙被" style="width: 100%">
- <el-option
- v-for="item in categoryList"
- :key="item.id"
- :label="item.category"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏂囨。鏀剧疆浣嶇疆锛�" prop="warehouseGoodsShelvesRowcolId">
- <el-tree-select
- v-model="documentForm.warehouseGoodsShelvesRowcolId"
- :data="locationTree"
- placeholder="璇烽�夋嫨鏂囦欢鏀剧疆浣嶇疆"
- clearable
- check-strictly
- :render-after-expand="false"
- :props="{ children: 'children', label: 'label', value: 'value' }"
- style="width: 100%"
- @change="handleLocationChange"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。鏃ユ湡锛�" prop="docData">
- <el-date-picker
- v-model="documentForm.docData"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- placeholder="閫夋嫨鏃ユ湡"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="淇濈鏈熼檺锛�" prop="retentionPeriod">
- <el-select v-model="documentForm.retentionPeriod" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in retention_period"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="淇濆瘑绾у埆锛�" prop="securityLevel">
- <el-select v-model="documentForm.securityLevel" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in confidentiality_level"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒嗘暟锛�" prop="copyCount">
- <el-input v-model="documentForm.copyCount" placeholder="璇疯緭鍏�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="椤垫暟锛�" prop="pageCount">
- <el-input v-model="documentForm.pageCount" placeholder="璇疯緭鍏�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏂囨。绫诲埆锛�" prop="docCategory">
- <el-select v-model="documentForm.docCategory" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in document_type"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。绉嶇被锛�" prop="docType">
- <el-select v-model="documentForm.docType" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in document_categories"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绱ф�ョ▼搴︼細" prop="urgencyLevel">
- <el-select v-model="documentForm.urgencyLevel" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in document_urgency"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。鐘舵�侊細" prop="docStatus">
- <el-select v-model="documentForm.docStatus" placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in document_status"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞锛�" prop="remark">
- <el-input
- v-model="documentForm.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitDocumentForm">纭</el-button>
- <el-button @click="closeDocumentDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <AttachmentManager ref="attachmentManagerRef" />
- </div>
- </template>
-
-<script setup>
-import { ref, reactive, onMounted, getCurrentInstance, toRefs, watch } from "vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import { ArrowRight, Folder, FolderOpened, Tickets, Document } from '@element-plus/icons-vue';
-import PIMTable from '@/components/PIMTable/PIMTable.vue';
-import { getToken } from "@/utils/auth";
-import { getCategoryTree, addCategory, updateCategory, deleteCategory, getDocumentList, addDocument, updateDocument, deleteDocument, getDocumentDetail, searchDocument, getWarehouseStructure } from '@/api/fileManagement/document'
-import { getWarehouseList } from '@/api/fileManagement/bookshelf'
-import AttachmentManager from './attachmentManager.vue'
-import { useDict } from '@/utils/dict'
-
-const { proxy } = getCurrentInstance();
-const tree = ref(null);
-const containerRef = ref(null);
-
-// 浣跨敤瀛楀吀鏁版嵁
-const { confidentiality_level, document_urgency, document_status, document_type, document_categories, retention_period } = useDict('confidentiality_level', 'document_urgency', 'document_status', 'document_type', 'document_categories', 'retention_period')
-
-// 鐩戝惉瀛楀吀鏁版嵁鍙樺寲
-watch([confidentiality_level, document_urgency, document_status, document_type, document_categories, retention_period], () => {
- // 瀛楀吀鏁版嵁宸叉洿鏂�
-}, { immediate: true, deep: true });
-
-const categoryDia = ref(false);
-const documentDia = ref(false);
-const categoryOperationType = ref("");
-const documentOperationType = ref("");
-const search = ref("");
-const currentId = ref("");
-const currentParentId = ref("");
-const treeLoad = ref(false);
-const categoryList = ref([]);
-const expandedKeys = ref([]);
-const documentList = ref([]);
-const isShowButton = ref(false);
-const selectedRows = ref([]);
-const selectAll = ref(false);
-const isIndeterminate = ref(false);
-const tableLoading = ref(false);
-const attachmentManagerRef = ref(null);
-
-// 鏂囦欢涓婁紶閰嶇疆
-const upload = reactive({
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 浣嶇疆鏍戞暟鎹�
-const locationTree = ref([]);
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumns = ref([
- { label: '鏂囨。鍚嶇О', prop: 'docName', width: '200' },
- { label: '鏂囨。缂栧彿', prop: 'docNumber', width: '120' },
- { label: '骞村害', prop: 'year', width: '80' },
- { label: '璐d换浜�', prop: 'responsiblePerson', width: '100' },
- {
- label: '鏂囨。鏀剧疆浣嶇疆',
- prop: 'warehouseGoodsShelvesRowcolId',
- width: '150',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- return getLocationName(params);
- }
- },
- { label: '鏂囨。鏃ユ湡', prop: 'docData', width: '120' },
- {
- label: '淇濈鏈熼檺',
- prop: 'retentionPeriod',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!retention_period.value || retention_period.value.length === 0) {
- return params;
- }
- const item = retention_period.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!retention_period.value || retention_period.value.length === 0) {
- return 'info';
- }
- const item = retention_period.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- {
- label: '淇濆瘑绾у埆',
- prop: 'securityLevel',
- width: '80',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!confidentiality_level.value || confidentiality_level.value.length === 0) {
- return params;
- }
- const item = confidentiality_level.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!confidentiality_level.value || confidentiality_level.value.length === 0) {
- return 'info';
- }
- const item = confidentiality_level.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- { label: '鍒嗘暟', prop: 'copyCount', width: '80' },
- { label: '椤垫暟', prop: 'pageCount', width: '80' },
- {
- label: '鏂囨。绫诲埆',
- prop: 'docCategory',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!document_type.value || document_type.value.length === 0) {
- return params;
- }
- const item = document_type.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!document_type.value || document_type.value.length === 0) {
- return 'info';
- }
- const item = document_type.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- {
- label: '鏂囨。绉嶇被',
- prop: 'docType',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!document_categories.value || document_categories.value.length === 0) {
- return params;
- }
- const item = document_categories.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!document_categories.value || document_categories.value.length === 0) {
- return 'info';
- }
- const item = document_categories.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- {
- label: '绱ф�ョ▼搴�',
- prop: 'urgencyLevel',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!document_urgency.value || document_urgency.value.length === 0) {
- return params;
- }
- const item = document_urgency.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!document_urgency.value || document_urgency.value.length === 0) {
- return 'info';
- }
- const item = document_urgency.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- {
- label: '鏂囨。鐘舵��',
- prop: 'docStatus',
- width: '100',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- if (!document_status.value || document_status.value.length === 0) {
- return params;
- }
- const item = document_status.value.find(item => item.value == params);
- return item ? item.label : params;
- },
- formatType: (params) => {
- if (params === null || params === undefined || params === '') return 'info';
- if (!document_status.value || document_status.value.length === 0) {
- return 'info';
- }
- const item = document_status.value.find(item => item.value == params);
- const validTypes = ['success', 'warning', 'danger', 'info'];
- return item && validTypes.includes(item.elTagType) ? item.elTagType : 'info';
- }
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: '150',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openDocumentDia('edit', row)
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openAttachment(row)
- },
- },
- ],
- }
-]);
-
-// 鍒嗙被琛ㄥ崟
-const categoryForm = reactive({
- category: "",
- parentId: "",
- parentName: "",
-});
-
-const categoryRules = reactive({
- category: [{ required: true, message: "璇疯緭鍏ュ垎绫诲悕绉�", trigger: "blur" }],
-});
-
-// 鏂囨。琛ㄥ崟
-const documentForm = reactive({
- id: "",
- documentClassificationId: "",
- docName: "",
- docNumber: "",
- year: "",
- responsiblePerson: "",
- warehouseGoodsShelvesRowcolId: "",
- docData: "",
- retentionPeriod: "",
- securityLevel: "",
- copyCount: "",
- pageCount: "",
- docCategory: "",
- docType: "",
- urgencyLevel: "",
- docStatus: "",
- remark: "",
- attachments: [], // 鏂板闄勪欢鏁扮粍
-});
-
-const documentRules = reactive({
- docName: [{ required: true, message: "璇疯緭鍏ユ枃妗e悕绉�", trigger: "blur" }],
- docNumber: [{ required: true, message: "璇疯緭鍏ユ枃妗g紪鍙�", trigger: "blur" }],
- year: [{ required: true, message: "璇烽�夋嫨骞村害", trigger: "change" }],
- documentClassificationId: [{ required: true, message: "璇烽�夋嫨鏂囨。鍒嗙被", trigger: "change" }],
- warehouseGoodsShelvesRowcolId: [{ required: true, message: "璇烽�夋嫨鏂囨。鏀剧疆浣嶇疆", trigger: "change" }],
-});
-
-// 鍒嗛〉鐩稿叧
-const pagination = reactive({
- currentPage: 1,
- pageSize: 10,
- total: 0,
-});
-
-// 鍒濆鍖栧垎绫绘爲鏁版嵁
-const initCategoryTree = async() => {
- try {
- treeLoad.value = true;
- const res = await getCategoryTree();
- if (res.code === 200) {
- categoryList.value = res.data || [];
-
- // 璁剧疆灞曞紑鐨勮妭鐐�
- expandedKeys.value = [];
- categoryList.value.forEach((item) => {
- if (item.id) {
- expandedKeys.value.push(item.id);
- }
- });
- } else {
- ElMessage.error(res.msg || "鑾峰彇鍒嗙被鏍戝け璐�");
- }
- } catch (error) {
- ElMessage.error("鑾峰彇鍒嗙被鏍戝け璐ワ紝璇烽噸璇�");
- } finally {
- treeLoad.value = false;
- }
-};
-
-// 鍒濆鍖栦粨搴撲綅缃暟鎹�
-const initLocationTree = async() => {
- try {
- const res = await getWarehouseList();
- if (res.code === 200) {
- // 杞崲鏁版嵁鏍煎紡锛岄�傞厤el-tree-select缁勪欢
- locationTree.value = transformWarehouseData(res.data || []);
- } else {
- ElMessage.error(res.msg || "鑾峰彇浠撳簱浣嶇疆澶辫触");
- }
- } catch (error) {
- ElMessage.error("鑾峰彇浠撳簱浣嶇疆澶辫触锛岃閲嶈瘯");
- }
-};
-
-// 杞崲浠撳簱鏁版嵁鏍煎紡
-const transformWarehouseData = (data) => {
- return data.map(item => ({
- id: item.id,
- label: item.name || item.warehouseName || item.label,
- value: item.id,
- children: item.children ? transformWarehouseData(item.children) : []
- }));
-};
-
-// 鏍规嵁ID鑾峰彇浣嶇疆鍚嶇О
-const getLocationName = (locationId) => {
- if (!locationId || !locationTree.value || locationTree.value.length === 0) {
- return locationId || '-';
- }
-
- const findLocation = (tree, id) => {
- for (let item of tree) {
- if (item.value === locationId || item.id === locationId) {
- return item.label;
- }
- if (item.children && item.children.length > 0) {
- const result = findLocation(item.children, id);
- if (result) return result;
- }
- }
- return null;
- };
-
- const locationName = findLocation(locationTree.value, locationId);
- return locationName || locationId;
-};
-
-// 杩囨护鍒嗙被鏍�
-const searchFilter = () => {
- if (proxy.$refs.tree) {
- proxy.$refs.tree.filter(search.value);
- }
-};
-
-// 鎵撳紑鍒嗙被寮规
-const openCategoryDia = (type, data) => {
- categoryOperationType.value = type;
- categoryDia.value = true;
- categoryForm.category = "";
- categoryForm.parentId ="";
- categoryForm.parentName = "";
-
- if (type === "edit") {
- categoryForm.category = data.category;
- // 淇濆瓨褰撳墠缂栬緫鐨勫垎绫籌D
- currentId.value = data.id;
- } else if (type === "addSub") {
- categoryForm.parentId = data.id;
- categoryForm.parentName = data.category;
- }
-};
-
-// 鎵撳紑鏂囨。寮规
-const openDocumentDia = (type, data) => {
- documentOperationType.value = type;
- documentDia.value = true;
-
- if (type === "edit") {
- // 缂栬緫妯″紡锛屽姞杞界幇鏈夋暟鎹�
- Object.assign(documentForm, data);
- documentForm.retentionPeriod = String(documentForm.retentionPeriod)
- documentForm.securityLevel = String(documentForm.securityLevel)
- documentForm.docCategory = String(documentForm.docCategory)
- documentForm.docType = String(documentForm.docType)
- documentForm.urgencyLevel = String(documentForm.urgencyLevel)
- documentForm.docStatus = String(documentForm.docStatus)
-
- // 鍔犺浇闄勪欢淇℃伅
- if (data.attachments) {
- documentForm.attachments = [...data.attachments];
- } else {
- documentForm.attachments = [];
- }
- } else {
- // 鏂板妯″紡锛屾竻绌鸿〃鍗�
- Object.keys(documentForm).forEach(key => {
- documentForm[key] = "";
- });
- documentForm.attachments = []; // 鏂板妯″紡涓嬩篃娓呯┖闄勪欢
- // 璁剧疆榛樿鍊� - 浣跨敤瀛楀吀鏁版嵁鐨勭涓�涓�夐」浣滀负榛樿鍊�
- if (document_status.value && document_status.value.length > 0) {
- documentForm.docStatus = document_status.value[0].value;
- }
- if (document_urgency.value && document_urgency.value.length > 0) {
- documentForm.urgencyLevel = document_urgency.value[0].value;
- }
- }
-};
-
-// 鎻愪氦鍒嗙被琛ㄥ崟
-const submitCategoryForm = () => {
- proxy.$refs.categoryFormRef.validate(async (valid) => {
- if (valid) {
- try {
- if (categoryOperationType.value === "addSub") {
- // 娣诲姞瀛愬垎绫�
- const res = await addCategory({
- category: categoryForm.category,
- parentId: categoryForm.parentId
- });
- if (res.code === 200) {
- ElMessage.success("娣诲姞瀛愬垎绫绘垚鍔�");
- // 閲嶆柊鍔犺浇鍒嗙被鏍�
- await initCategoryTree();
- } else {
- ElMessage.error(res.msg || "娣诲姞瀛愬垎绫诲け璐�");
- }
- } else if (categoryOperationType.value === "edit") {
- // 缂栬緫鍒嗙被
- const res = await updateCategory({
- id: currentId.value,
- category: categoryForm.category
- });
- if (res.code === 200) {
- ElMessage.success("缂栬緫鍒嗙被鎴愬姛");
- // 閲嶆柊鍔犺浇鍒嗙被鏍�
- await initCategoryTree();
- } else {
- ElMessage.error(res.msg || "缂栬緫鍒嗙被澶辫触");
- }
- } else {
- // 鏂板椤剁骇鍒嗙被
- const res = await addCategory({
- category: categoryForm.category,
- parentId: null
- });
- if (res.code === 200) {
- ElMessage.success("鏂板鍒嗙被鎴愬姛");
- // 閲嶆柊鍔犺浇鍒嗙被鏍�
- await initCategoryTree();
- } else {
- ElMessage.error(res.msg || "鏂板鍒嗙被澶辫触");
- }
- }
-
- closeCategoryDia();
- } catch (error) {
- ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
- }
- }
- });
-};
-
-// 鍏抽棴鍒嗙被寮规
-const closeCategoryDia = () => {
- proxy.$refs.categoryFormRef.resetFields();
- categoryForm.parentId = "";
- categoryForm.parentName = "";
- categoryDia.value = false;
-};
-
-// 鍒犻櫎鍒嗙被
-const removeCategory = (node, data) => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(async () => {
- try {
- const res = await deleteCategory([data.id]);
- if (res.code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- // 閲嶆柊鍔犺浇鍒嗙被鏍�
- await initCategoryTree();
- } else {
- ElMessage.error(res.msg || "鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- })
- .catch(() => {
- ElMessage("宸插彇娑�");
- });
-};
-
-// 閫夋嫨鍒嗙被
-const handleNodeClick = (val, node, el) => {
- // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
- isShowButton.value = true;
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
-
- // 娓呯┖閫夋嫨鐘舵��
- selectedRows.value = [];
- selectAll.value = false;
- isIndeterminate.value = false;
-
- // 閲嶇疆鍒嗛〉
- pagination.currentPage = 1;
- pagination.total = 0;
-
- // 鍔犺浇鏂囨。鍒楄〃
- if (isShowButton.value) {
- loadDocumentList();
- } else {
- // 濡傛灉涓嶆槸鍙跺瓙鑺傜偣锛屾竻绌烘枃妗e垪琛�
- documentList.value = [];
- }
-};
-
-// 鎻愪氦鏂囨。琛ㄥ崟
-const submitDocumentForm = () => {
- proxy.$refs.documentFormRef.validate(async (valid) => {
- if (valid) {
- try {
- // 鏋勫缓鎻愪氦鏁版嵁
- const submitData = {
- ...documentForm,
- // 璁剧疆褰撳墠閫変腑鐨勫垎绫籌D
- documentClassificationId: currentId.value || documentForm.documentClassificationId,
- // 娣诲姞闄勪欢淇℃伅
- // attachments: documentForm.attachments
- };
-
- if (documentOperationType.value === "edit") {
- // 缂栬緫妯″紡锛屾洿鏂扮幇鏈夋暟鎹�
- const res = await updateDocument(submitData);
- if (res.code === 200) {
- ElMessage.success("缂栬緫鎴愬姛");
- // 閲嶆柊鍔犺浇鏂囨。鍒楄〃
- await loadDocumentList();
- // 鍒锋柊闄勪欢鍒楄〃
- if (attachmentManagerRef.value && documentForm.id) {
- attachmentManagerRef.value.loadAttachmentList(documentForm.id);
- }
- } else {
- ElMessage.error(res.msg || "缂栬緫澶辫触");
- }
- } else {
- // 鏂板妯″紡锛屾坊鍔犳柊鏁版嵁
- const res = await addDocument(submitData);
- if (res.code === 200) {
- ElMessage.success("鏂板鎴愬姛");
- // 閲嶆柊鍔犺浇鏂囨。鍒楄〃
- await loadDocumentList();
- // 鍒锋柊闄勪欢鍒楄〃
- if (attachmentManagerRef.value && res.data && res.data.id) {
- attachmentManagerRef.value.loadAttachmentList(res.data.id);
- }
- } else {
- ElMessage.error(res.msg || "鏂板澶辫触");
- }
- }
- closeDocumentDia();
- } catch (error) {
- ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
- }
- }
- });
-};
-
-// 鍏抽棴鏂囨。寮规
-const closeDocumentDia = () => {
- proxy.$refs.documentFormRef.resetFields();
- documentDia.value = false;
- // 娓呯┖琛ㄥ崟鏁版嵁
- Object.keys(documentForm).forEach(key => {
- documentForm[key] = "";
- });
- documentForm.attachments = []; // 鍏抽棴寮规鏃朵篃娓呯┖闄勪欢
-};
-
-// 澶勭悊浣嶇疆閫夋嫨鍙樺寲
-const handleLocationChange = (value) => {
- if (value) {
- // 妫�鏌ラ�夋嫨鐨勬槸鍚︿负鍙跺瓙鑺傜偣
- const isLeafNode = checkIfLeafNode(locationTree.value, value);
- if (!isLeafNode) {
- ElMessage.warning("璇烽�夋嫨鏈�搴曞眰鐨勪綅缃紙濡傦細鏌滃眰锛�");
- documentForm.warehouseGoodsShelvesRowcolId = "";
- return;
- }
- }
-};
-
-// 妫�鏌ユ槸鍚︿负鍙跺瓙鑺傜偣
-const checkIfLeafNode = (tree, value) => {
- for (let item of tree) {
- if (item.value === value || item.id === value) {
- // 濡傛灉娌℃湁瀛愯妭鐐癸紝鍒欎负鍙跺瓙鑺傜偣
- return !item.children || item.children.length === 0;
- }
- if (item.children && item.children.length > 0) {
- const result = checkIfLeafNode(item.children, value);
- if (result !== null) {
- return result;
- }
- }
- }
- return null;
-};
-
-// 鍒犻櫎鏂囨。
-const handleDelete = () => {
- if (selectedRows.value.length > 0) {
- ElMessageBox.confirm(`纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉¤褰曞悧锛焋, "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(async () => {
- try {
- const selectedIds = selectedRows.value.map(row => row.id);
- const res = await deleteDocument(selectedIds);
- if (res.code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- // 閲嶆柊鍔犺浇鏂囨。鍒楄〃
- await loadDocumentList();
- } else {
- ElMessage.error(res.msg || "鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- })
- .catch(() => {
- ElMessage("宸插彇娑�");
- });
- } else {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
- }
-};
-
-// PIMTable 閫夋嫨鍙樺寲浜嬩欢
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-
- // 鏇存柊鍏ㄩ�夌姸鎬�
- const selectedCount = selection.length;
- const totalCount = documentList.value.length;
-
- if (selectedCount === 0) {
- selectAll.value = false;
- isIndeterminate.value = false;
- } else if (selectedCount === totalCount) {
- selectAll.value = true;
- isIndeterminate.value = false;
- } else {
- selectAll.value = false;
- isIndeterminate.value = true;
- }
-};
-
-// 鍔犺浇鏂囨。鍒楄〃
-const loadDocumentList = async () => {
- try {
- tableLoading.value = true;
-
- // 鏋勫缓鏌ヨ鍙傛暟
- const query = {
- page: pagination.currentPage,
- size: pagination.pageSize,
- documentClassificationId:currentId.value
- };
-
- const res = await getDocumentList(query);
- if (res.code === 200) {
- documentList.value = res.data.records || [];
- pagination.total = res.data.total || 0;
- } else {
- ElMessage.error(res.msg || "鑾峰彇鏂囨。鍒楄〃澶辫触");
- documentList.value = [];
- pagination.total = 0;
- }
-
- // 閲嶇疆閫夋嫨鐘舵��
- selectedRows.value = [];
- selectAll.value = false;
- isIndeterminate.value = false;
- } catch (error) {
- ElMessage.error("鑾峰彇鏂囨。鍒楄〃澶辫触锛岃閲嶈瘯");
- documentList.value = [];
- pagination.total = 0;
- } finally {
- tableLoading.value = false;
- }
-};
-
-// 澶勭悊鍒嗛〉鍙樺寲
-const handlePagination = (current, size) => {
- pagination.currentPage = current;
- pagination.pageSize = size;
- loadDocumentList();
-};
-
-// 璋冪敤tree杩囨护鏂规硶
-const filterNode = (value, data, node) => {
- if (!value) {
- return true;
- }
- let val = value.toLowerCase();
- return chooseNode(val, data, node);
-};
-
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐�
-const chooseNode = (value, data, node) => {
- if (data.category && data.category.toLowerCase().indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- if (level === 1) {
- return false;
- }
- let parentData = node.parent;
- let index = 0;
- while (index < level - 1) {
- if (parentData.data.category && parentData.data.category.toLowerCase().indexOf(value) !== -1) {
- return true;
- }
- parentData = parentData.parent;
- index++;
- }
- return false;
-};
-
-// 鎵撳紑闄勪欢
-const openAttachment = (row) => {
- attachmentManagerRef.value.open([], row.id);
-};
-
-onMounted(() => {
- initCategoryTree();
- initLocationTree();
-
- // 涓嶅湪鍒濆鍖栨椂鍔犺浇鏂囨。鍒楄〃锛岀瓑寰呯敤鎴烽�夋嫨鍒嗙被鍚庡啀鍔犺浇
-});
-</script>
-
-<style scoped>
-.document-view {
- display: flex;
- height: 100%;
-}
-
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
- border-right: 1px solid #e4e7ed;
-}
-
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- background: #ffffff;
-}
-
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-
-.tree-node-content {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px;
-}
-
-.table-container {
- background: #ffffff;
- border-radius: 8px;
- overflow: hidden;
- position: relative;
-}
-
-.add-row {
- display: flex;
- align-items: center;
- gap: 8px;
- background-color: #f5f7fa;
- cursor: pointer;
- transition: background-color 0.2s ease;
- padding: 12px 16px;
- margin-bottom: 16px;
- border-radius: 6px;
- border: 1px dashed #d9d9d9;
-}
-
-.add-row:hover {
- background-color: #e4e7ed;
- border-color: #c0c4cc;
-}
-
-.add-icon {
- color: #909399;
- font-size: 16px;
-}
-
-.add-row span {
- color: #606266;
- font-size: 14px;
-}
-
-.empty-data {
- text-align: center;
- color: #909399;
- padding: 40px;
- font-size: 14px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-.operation-column {
- position: absolute;
- right: 0;
- top: 0;
- width: 120px;
- background: #ffffff;
- border-left: 1px solid #e4e7ed;
- z-index: 1;
- box-shadow: -2px 0 4px rgba(0, 0, 0, 0.1);
-}
-
-.operation-header {
- height: 40px;
- line-height: 40px;
- text-align: center;
- background: #fafafa;
- border-bottom: 1px solid #e4e7ed;
- font-weight: 500;
- color: #606266;
-}
-
-.operation-cell {
- height: 40px;
- display: flex;
- align-items: center;
- justify-content: center;
- border-bottom: 1px solid #e4e7ed;
-}
-
-.operation-cell:last-child {
- border-bottom: none;
-}
-
-.attachment-section {
- width: 100%;
-}
-
-.attachment-list {
- margin-bottom: 10px;
-}
-
-.attachment-item {
- display: flex;
- align-items: center;
- padding: 8px 12px;
- background-color: #f5f7fa;
- border-radius: 4px;
- margin-bottom: 8px;
-}
-
-.file-icon {
- margin-right: 8px;
- color: #409eff;
-}
-
-.file-name {
- flex: 1;
- color: #606266;
- font-size: 14px;
-}
-</style>
diff --git a/src/views/fileManagement/return/index.vue b/src/views/fileManagement/return/index.vue
deleted file mode 100644
index a95c8af..0000000
--- a/src/views/fileManagement/return/index.vue
+++ /dev/null
@@ -1,595 +0,0 @@
-<template>
- <div class="app-container return-view">
- <!-- 鏌ヨ鍖哄煙 -->
- <div class="search-container">
- <el-form :model="searchForm" :inline="true" class="search-form">
- <!-- <el-form-item label="鍊熼槄鐘舵�侊細">
- <el-select v-model="searchForm.borrowStatus" placeholder="璇烽�夋嫨鍊熼槄鐘舵��" clearable style="width: 150px">
- <el-option label="鍊熼槄" value="鍊熼槄" />
- <el-option label="褰掕繕" value="褰掕繕" />
- </el-select>
- </el-form-item> -->
- <el-form-item label="鍊熼槄浜猴細">
- <el-input
- v-model="searchForm.borrower"
- placeholder="璇疯緭鍏ュ�熼槄浜�"
- clearable
- style="width: 200px"
- />
- </el-form-item>
- <el-form-item label="褰掕繕浜猴細">
- <el-input
- v-model="searchForm.returner"
- placeholder="璇疯緭鍏ュ綊杩樹汉"
- clearable
- style="width: 200px"
- />
- </el-form-item>
- <el-form-item label="褰掕繕鏃ユ湡鑼冨洿锛�">
- <el-date-picker
- v-model="searchForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- style="width: 300px"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">
- <el-icon><Search /></el-icon>
- 鏌ヨ
- </el-button>
- <el-button @click="handleReset">
- <el-icon><Refresh /></el-icon>
- 閲嶇疆
- </el-button>
- </el-form-item>
- <el-form-item style="margin-left: auto;">
- <el-button type="primary" @click="openReturnDia('add')">
- <el-icon><Plus /></el-icon>
- 鏂板褰掕繕
- </el-button>
- <el-button
- type="danger"
- @click="handleBatchDelete"
- :disabled="selectedRows.length === 0"
- >
- <el-icon><Delete /></el-icon>
- 鎵归噺鍒犻櫎 ({{ selectedRows.length }})
- </el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <!-- 琛ㄦ牸鍖哄煙 -->
- <div class="table-container">
- <PIMTable
- :table-data="returnList"
- :column="tableColumns"
- :is-selection="true"
- :border="true"
- :table-loading="tableLoading"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- layout: 'total, sizes, prev, pager, next, jumper'
- }"
- @selection-change="handleSelectionChange"
- @pagination="handlePagination"
- />
- </div>
-
- <!-- 褰掕繕鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- v-model="returnDia"
- :title="returnOperationType === 'add' ? '鏂板褰掕繕' : '缂栬緫褰掕繕'"
- width="800px"
- @close="closeReturnDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="returnForm"
- label-width="140px"
- :rules="returnRules"
- ref="returnFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏂囨。锛�" prop="borrowId">
- <el-select v-model="returnForm.borrowId" placeholder="璇烽�夋嫨鏂囨。" style="width: 100%" @change="handleDocumentChange">
- <el-option
- v-for="item in documentList"
- :key="item.id"
- :label="item.docName || item.name"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍊熼槄浜猴細" prop="borrower">
- <el-input v-model="returnForm.borrower" placeholder="鍊熼槄浜哄皢鏍规嵁鏂囨。閫夋嫨鑷姩甯﹀嚭" disabled />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="褰掕繕浜猴細" prop="returner">
- <el-input v-model="returnForm.returner" placeholder="璇疯緭鍏ュ綊杩樹汉" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰掕繕鏃ユ湡锛�" prop="returnDate">
- <el-date-picker
- v-model="returnForm.returnDate"
- type="date"
- placeholder="閫夋嫨褰掕繕鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="搴斿綊杩樻棩鏈燂細" prop="dueReturnDate">
- <el-date-picker
- v-model="returnForm.dueReturnDate"
- type="date"
- placeholder="搴斿綊杩樻棩鏈熷皢鏍规嵁鏂囨。閫夋嫨鑷姩甯﹀嚭"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞璇存槑锛�" prop="remark">
- <el-input
- v-model="returnForm.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄨ鏄�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitReturnForm">纭</el-button>
- <el-button @click="closeReturnDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, getCurrentInstance } from "vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import { Search, Refresh, Plus, Delete } from '@element-plus/icons-vue';
-import PIMTable from '@/components/PIMTable/PIMTable.vue';
-import { getReturnListPage, returnDocument, deleteReturn, getDocumentList, updateBorrow, reventUpdate } from '@/api/fileManagement/return';
-
-const { proxy } = getCurrentInstance();
-
-// 鍝嶅簲寮忔暟鎹�
-const returnDia = ref(false);
-const returnOperationType = ref("");
-const tableLoading = ref(false);
-const returnList = ref([]);
-const selectedRows = ref([]);
-const documentList = ref([]); // 鏂囨。鍒楄〃
-
-// 鍒嗛〉鐩稿叧
-const pagination = reactive({
- currentPage: 1,
- pageSize: 10,
- total: 0,
-});
-
-// 鏌ヨ琛ㄥ崟
-const searchForm = reactive({
- borrowStatus: "",
- borrower: "",
- returner: "",
- dateRange: []
-});
-
-// 褰掕繕琛ㄥ崟
-const returnForm = reactive({
- id: "",
- borrowId: "",
- borrower: "",
- returner: "",
- borrowStatus: "",
- returnDate: "",
- dueReturnDate: "",
- remark: ""
-});
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const returnRules = reactive({
- borrowId: [{ required: true, message: "璇烽�夋嫨鏂囨。", trigger: "change" }],
- returner: [{ required: true, message: "璇疯緭鍏ュ綊杩樹汉", trigger: "blur" }],
- returnDate: [{ required: true, message: "璇烽�夋嫨褰掕繕鏃ユ湡", trigger: "change" }]
-});
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumns = ref([
- {
- label: '鏂囨。鍚嶇О',
- prop: 'docName',
- width: '200',
- },
- { label: '鍊熼槄浜�', prop: 'borrower' },
- { label: '褰掕繕浜�', prop: 'returner' },
- {
- label: '鍊熼槄鐘舵��',
- prop: 'borrowStatus',
- dataType: 'tag',
- formatData: (params) => {
- if (params === null || params === undefined || params === '') return '-';
- return params;
- },
- formatType: (params) => {
- if (params === '褰掕繕') return 'success';
- if (params === '鍊熼槄') return 'warning';
- return 'info';
- }
- },
- { label: '褰掕繕鏃ユ湡', prop: 'returnDate' },
- { label: '搴斿綊杩樻棩鏈�', prop: 'dueReturnDate' },
- { label: '澶囨敞', prop: 'remark', width: '150' },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: '150',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openReturnDia('edit', row)
- },
- },
- {
- name: "鍒犻櫎",
- type: "text",
- clickFun: (row) => {
- handleDelete(row)
- },
- },
- ],
- }
-]);
-
-// 鍒濆鍖栨暟鎹�
-const initData = async () => {
- await Promise.all([
- loadDocumentList(),
- loadReturnList()
- ]);
-};
-
-// 鍔犺浇鏂囨。鍒楄〃
-const loadDocumentList = async () => {
- try {
- const res = await getDocumentList();
- if (res.code === 200) {
- documentList.value = res.data || [];
- } else {
- ElMessage.error(res.msg || "鑾峰彇鏂囨。鍒楄〃澶辫触");
- documentList.value = [];
- }
- } catch (error) {
- ElMessage.error("鑾峰彇鏂囨。鍒楄〃澶辫触锛岃閲嶈瘯");
- documentList.value = [];
- }
-};
-
-// 鍔犺浇褰掕繕鍒楄〃
-const loadReturnList = async () => {
- try {
- tableLoading.value = true;
-
- // 鏋勫缓鏌ヨ鍙傛暟
- const query = {
- page: pagination.currentPage,
- size: pagination.pageSize,
- borrowStatus: searchForm.borrowStatus || undefined,
- borrower: searchForm.borrower || undefined,
- returner: searchForm.returner || undefined,
- entryDateStart: searchForm.dateRange && searchForm.dateRange.length > 0 ? searchForm.dateRange[0] : undefined,
- entryDateEnd: searchForm.dateRange && searchForm.dateRange.length > 1 ? searchForm.dateRange[1] : undefined
- };
-
- // 绉婚櫎undefined鐨勫弬鏁�
- Object.keys(query).forEach(key => {
- if (query[key] === undefined) {
- delete query[key];
- }
- });
-
- const res = await getReturnListPage(query);
- if (res.code === 200) {
- returnList.value = res.data.records || [];
- pagination.total = res.data.total || 0;
- } else {
- ElMessage.error(res.msg || "鑾峰彇褰掕繕鍒楄〃澶辫触");
- returnList.value = [];
- pagination.total = 0;
- }
-
- // 閲嶇疆閫夋嫨鐘舵��
- selectedRows.value = [];
- } catch (error) {
- ElMessage.error("鑾峰彇褰掕繕鍒楄〃澶辫触锛岃閲嶈瘯");
- returnList.value = [];
- pagination.total = 0;
- } finally {
- tableLoading.value = false;
- }
-};
-
-// 鏌ヨ
-const handleSearch = () => {
- pagination.currentPage = 1;
- loadReturnList();
-};
-
-// 閲嶇疆鏌ヨ
-const handleReset = () => {
- searchForm.borrowStatus = "";
- searchForm.borrower = "";
- searchForm.returner = "";
- searchForm.dateRange = [];
- pagination.currentPage = 1;
- loadReturnList();
- ElMessage.success("鏌ヨ鏉′欢宸查噸缃�");
-};
-
-// 鎵撳紑褰掕繕寮规
-const openReturnDia = (type, data) => {
- returnOperationType.value = type;
- returnDia.value = true;
-
- if (type === "edit") {
- // 缂栬緫妯″紡锛屽姞杞界幇鏈夋暟鎹�
- Object.assign(returnForm, data);
- // 缂栬緫妯″紡涓嬶紝鏂囨。閫夋嫨鍚庤嚜鍔ㄥ~鍏呭�熼槄浜哄拰搴斿綊杩樻棩鏈�
- if (returnForm.borrowId) {
- handleDocumentChange(returnForm.borrowId);
- }
- } else {
- // 鏂板妯″紡锛屾竻绌鸿〃鍗�
- Object.keys(returnForm).forEach(key => {
- returnForm[key] = "";
- });
- // 璁剧疆榛樿鐘舵��
- returnForm.borrowStatus = "褰掕繕";
- // 璁剧疆褰撳墠鏃ユ湡涓哄綊杩樻棩鏈�
- returnForm.returnDate = new Date().toISOString().split('T')[0];
- }
-};
-
-// 鍏抽棴褰掕繕寮规
-const closeReturnDia = () => {
- proxy.$refs.returnFormRef.resetFields();
- returnDia.value = false;
-};
-
-// 鎻愪氦褰掕繕琛ㄥ崟
-const submitReturnForm = () => {
- proxy.$refs.returnFormRef.validate(async (valid) => {
- if (valid) {
- try {
- if (returnOperationType.value === "edit") {
- // 缂栬緫妯″紡锛岃皟鐢ㄥ綊杩樻洿鏂版帴鍙�
- const res = await reventUpdate({
- id: returnForm.id,
- documentationId: returnForm.documentationId,
- borrower: returnForm.borrower,
- returner: returnForm.returner,
- borrowStatus: returnForm.borrowStatus,
- returnDate: returnForm.returnDate,
- dueReturnDate: returnForm.dueReturnDate,
- remark: returnForm.remark
- });
-
- if (res.code === 200) {
- ElMessage.success("缂栬緫鎴愬姛");
- await loadReturnList();
- closeReturnDia();
- } else {
- ElMessage.error(res.msg || "缂栬緫澶辫触");
- }
- } else {
- // 鏂板妯″紡锛岃皟鐢ㄥ綊杩樻帴鍙�
- const res = await returnDocument({
- borrowId: returnForm.borrowId,
- borrower: returnForm.borrower,
- returner: returnForm.returner,
- borrowStatus: returnForm.borrowStatus,
- returnDate: returnForm.returnDate,
- dueReturnDate: returnForm.dueReturnDate,
- remark: returnForm.remark
- });
-
- if (res.code === 200) {
- ElMessage.success("鏂板鎴愬姛");
- await loadReturnList();
- closeReturnDia();
- } else {
- ElMessage.error(res.msg || "鏂板澶辫触");
- }
- }
- } catch (error) {
- ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
- }
- }
- });
-};
-
-// 鍒犻櫎褰掕繕璁板綍
-const handleDelete = (row) => {
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄よ繖鏉″綊杩樿褰曞悧锛焋,
- "鍒犻櫎鎻愮ず",
- {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }
- ).then(async () => {
- try {
- const res = await deleteReturn([row.id]);
- if (res.code === 200) {
- ElMessage.success("鍒犻櫎鎴愬姛");
- await loadReturnList();
- } else {
- ElMessage.error(res.msg || "鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- }).catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑璁板綍");
- return;
- }
-
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉″綊杩樿褰曞悧锛焋,
- "鎵归噺鍒犻櫎鎻愮ず",
- {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }
- ).then(async () => {
- try {
- const selectedIds = selectedRows.value.map(row => row.id);
- const res = await deleteReturn(selectedIds);
- if (res.code === 200) {
- ElMessage.success("鎵归噺鍒犻櫎鎴愬姛");
- await loadReturnList();
- } else {
- ElMessage.error(res.msg || "鎵归噺鍒犻櫎澶辫触");
- }
- } catch (error) {
- ElMessage.error("鎵归噺鍒犻櫎澶辫触锛岃閲嶈瘯");
- }
- }).catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 閫夋嫨鍙樺寲浜嬩欢
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 澶勭悊鍒嗛〉鍙樺寲
-const handlePagination = (current, size) => {
- pagination.currentPage = current;
- pagination.pageSize = size;
- loadReturnList();
-};
-
-// 澶勭悊鏂囨。閫夋嫨鍙樺寲
-const handleDocumentChange = (documentId) => {
- if (documentId) {
- // 鏍规嵁閫夋嫨鐨勬枃妗D锛屼粠鏂囨。鍒楄〃涓煡鎵惧搴旂殑鏂囨。淇℃伅
- const selectedDoc = documentList.value.find(doc => doc.id === documentId);
- if (selectedDoc) {
- // 鑷姩濉厖鍊熼槄浜哄拰搴斿綊杩樻棩鏈�
- returnForm.borrower = selectedDoc.borrower || selectedDoc.borrowerName || '';
- returnForm.dueReturnDate = selectedDoc.dueReturnDate || selectedDoc.expectedReturnDate || '';
- }
- } else {
- // 娓呯┖鐩稿叧瀛楁
- returnForm.borrower = '';
- returnForm.dueReturnDate = '';
- }
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initData();
-});
-</script>
-
-<style scoped>
-.return-view {
- padding: 20px;
-}
-
-.search-container {
- background: #ffffff;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.search-form {
- margin: 0;
-}
-
-.table-container {
- background: #ffffff;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.empty-data {
- text-align: center;
- color: #909399;
- padding: 40px;
- font-size: 14px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-form-item__label) {
- font-weight: 500;
- color: #303133;
-}
-
-:deep(.el-input__wrapper) {
- box-shadow: 0 0 0 1px #dcdfe6 inset;
-}
-
-:deep(.el-input__wrapper:hover) {
- box-shadow: 0 0 0 1px #c0c4cc inset;
-}
-
-:deep(.el-input__wrapper.is-focus) {
- box-shadow: 0 0 0 1px #409eff inset;
-}
-</style>
diff --git a/src/views/fileManagement/statistics/index.vue b/src/views/fileManagement/statistics/index.vue
deleted file mode 100644
index 42b81e4..0000000
--- a/src/views/fileManagement/statistics/index.vue
+++ /dev/null
@@ -1,539 +0,0 @@
-<template>
- <div class="app-container statistics-container">
-
- <!-- 鎬讳綋缁熻鍗$墖 -->
- <el-row :gutter="20" class="statistics-cards">
- <el-col :span="6" v-for="(item, index) in overviewData" :key="index">
- <el-card class="statistics-card" :class="item.type">
- <div class="card-content">
- <div class="card-icon">
- <el-icon :size="32">
- <component :is="item.icon" />
- </el-icon>
- </div>
- <div class="card-info">
- <div class="card-number">
- <el-skeleton-item v-if="loading" variant="text" style="width: 60px; height: 32px;" />
- <span v-else>{{ item.value }}</span>
- </div>
- <div class="card-label">{{ item.label }}</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 鍥捐〃鍖哄煙 -->
- <el-row :gutter="20" class="charts-section">
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>妗f鍒嗙被缁熻</span>
- </div>
- </template>
- <div class="chart-container">
- <div ref="categoryChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>妗f鐘舵�佺粺璁�</span>
- </div>
- </template>
- <div class="chart-container">
- <div ref="statusChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, nextTick, onUnmounted } from "vue";
-import { ElMessage } from "element-plus";
-import { Refresh } from "@element-plus/icons-vue";
-import * as echarts from "echarts";
-import {
- getDocumentationOverview,
- getDocumentationCategoryStats,
- getDocumentationStatusStats
-} from "@/api/fileManagement/document";
-import {
- Document,
- Folder,
- Tickets,
- Calendar
-} from "@element-plus/icons-vue";
-
-// 鍝嶅簲寮忔暟鎹�
-const overviewData = ref([
- {
- label: "鎬绘。妗堟暟",
- value: 0,
- icon: "Document",
- type: "primary",
- },
- {
- label: "鍒嗙被鏁伴噺",
- value: 0,
- icon: "Folder",
- type: "success",
- },
- {
- label: "鍊熷嚭妗f",
- value: 0,
- icon: "Tickets",
- type: "warning",
- },
- {
- label: "鏈湀鏂板",
- value: 0,
- icon: "Calendar",
- type: "info",
- },
-]);
-
-const categoryChartRef = ref(null);
-const statusChartRef = ref(null);
-
-// 鍥捐〃瀹炰緥
-let categoryChart = null;
-let statusChart = null;
-
-// 鍔犺浇鐘舵��
-const loading = ref(false);
-const autoRefreshInterval = ref(null);
-
-// 鑷姩鍒锋柊寮�鍏�
-const autoRefreshEnabled = ref(true);
-
-// 鑷姩鍒锋柊闂撮殧锛�5鍒嗛挓锛�
-const AUTO_REFRESH_INTERVAL = 5 * 60 * 1000;
-
-// 鍚姩鑷姩鍒锋柊
-const startAutoRefresh = () => {
- if (autoRefreshInterval.value) {
- clearInterval(autoRefreshInterval.value);
- }
- if (autoRefreshEnabled.value) {
- autoRefreshInterval.value = setInterval(() => {
- refreshData();
- }, AUTO_REFRESH_INTERVAL);
- }
-};
-
-// 鍋滄鑷姩鍒锋柊
-const stopAutoRefresh = () => {
- if (autoRefreshInterval.value) {
- clearInterval(autoRefreshInterval.value);
- autoRefreshInterval.value = null;
- }
-};
-
-// 鍒囨崲鑷姩鍒锋柊鐘舵��
-const toggleAutoRefresh = (value) => {
- if (value) {
- startAutoRefresh();
- } else {
- stopAutoRefresh();
- }
-};
-
-// 鍔犺浇鎬讳綋缁熻鏁版嵁
-const loadOverviewData = async () => {
- try {
- const response = await getDocumentationOverview();
- if (response.code === 200) {
- const data = response.data;
- overviewData.value[0].value = data.totalDocsCount || 0;
- overviewData.value[1].value = data.categoryNumCount || 0;
- overviewData.value[2].value = data.borrowedDocsCount || 0;
- overviewData.value[3].value = data.monthlyAddedDocsCount || 0;
- }
- } catch (error) {
- console.error('鍔犺浇鎬讳綋缁熻鏁版嵁澶辫触:', error);
- ElMessage.error('鍔犺浇鎬讳綋缁熻鏁版嵁澶辫触');
- }
-};
-
-// 鍔犺浇鍒嗙被缁熻鏁版嵁
-const loadCategoryData = async () => {
- try {
- const response = await getDocumentationCategoryStats();
- if (response.code === 200) {
- renderCategoryChart(response.data);
- }
- } catch (error) {
- console.error('鍔犺浇鍒嗙被缁熻鏁版嵁澶辫触:', error);
- ElMessage.error('鍔犺浇鍒嗙被缁熻鏁版嵁澶辫触');
- }
-};
-
-// 鍔犺浇鐘舵�佺粺璁℃暟鎹�
-const loadStatusData = async () => {
- try {
- const response = await getDocumentationStatusStats();
- if (response.code === 200) {
- renderStatusChart(response.data);
- }
- } catch (error) {
- console.error('鍔犺浇鐘舵�佺粺璁℃暟鎹け璐�:', error);
- ElMessage.error('鍔犺浇鐘舵�佺粺璁℃暟鎹け璐�');
- }
-};
-
-// 鍒锋柊鏁版嵁
-const refreshData = async () => {
- loading.value = true;
- try {
- await Promise.all([
- loadOverviewData(),
- loadCategoryData(),
- loadStatusData()
- ]);
- ElMessage.success('鏁版嵁鍒锋柊鎴愬姛');
- } catch (error) {
- console.error('鍒锋柊鏁版嵁澶辫触:', error);
- ElMessage.error('鍒锋柊鏁版嵁澶辫触');
- } finally {
- loading.value = false;
- }
-};
-
-// 鍒濆鍖栧浘琛�
-const initCharts = () => {
- // 寤惰繜鍒濆鍖栵紝纭繚DOM鍏冪礌宸茬粡娓叉煋
- setTimeout(() => {
- if (categoryChartRef.value) {
- categoryChart = echarts.init(categoryChartRef.value);
- }
-
- if (statusChartRef.value) {
- statusChart = echarts.init(statusChartRef.value);
- }
-
- // 鍒濆鍖栧畬鎴愬悗鍔犺浇鏁版嵁
- loadCategoryData();
- loadStatusData();
- }, 300);
-};
-
-// 娓叉煋鍒嗙被缁熻鍥捐〃
-const renderCategoryChart = (data) => {
- if (!categoryChart) return;
- let newData = data.map(item => {
- return {
- name: item.category,
- value: item.count
- }
- })
-
- const option = {
- title: {
- text: "妗f鍒嗙被鍒嗗竷",
- left: "center",
- textStyle: {
- fontSize: 16,
- fontWeight: "normal",
- },
- },
- tooltip: {
- trigger: "item",
- formatter: "{a} <br/>{b}: {c} ({d}%)",
- },
- legend: {
- orient: "vertical",
- left: "left",
- top: "middle",
- },
- series: [
- {
- name: "妗f鏁伴噺",
- type: "pie",
- radius: ["40%", "70%"],
- center: ["60%", "50%"],
- data: newData || [
- { name: "鎶�鏈枃妗�", value: 450 },
- { name: "绠$悊鏂囨。", value: 320 },
- { name: "璐㈠姟鏂囨。", value: 280 },
- { name: "浜轰簨鏂囨。", value: 200 },
- ],
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: "rgba(0, 0, 0, 0.5)",
- },
- },
- },
- ],
- };
-
- try {
- categoryChart.setOption(option);
- } catch (error) {
- console.error('鍒嗙被鍥捐〃娓叉煋澶辫触:', error);
- }
-};
-
-// 娓叉煋鐘舵�佺粺璁″浘琛�
-const renderStatusChart = (data) => {
- if (!statusChart) return;
- let newData = data.map(item => {
- return {
- name: item.docStatus,
- value: item.count
- }
- })
- const option = {
- title: {
- text: "妗f鐘舵�佸垎甯�",
- left: "center",
- textStyle: {
- fontSize: 16,
- fontWeight: "normal",
- },
- },
- tooltip: {
- trigger: "item",
- formatter: "{a} <br/>{b}: {c} ({d}%)",
- },
- legend: {
- orient: "vertical",
- left: "left",
- top: "middle",
- },
- series: [
- {
- name: "妗f鏁伴噺",
- type: "pie",
- radius: ["40%", "70%"],
- center: ["60%", "50%"],
- roseType: false,
- data: newData || [
- { name: "姝e父", value: 1150, itemStyle: { color: "#67C23A" } },
- { name: "鍊熷嚭", value: 89, itemStyle: { color: "#E6A23C" } },
- { name: "涓㈠け", value: 8, itemStyle: { color: "#F56C6C" } },
- { name: "鎹熷潖", value: 4, itemStyle: { color: "#909399" } },
- ],
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: "rgba(0, 0, 0, 0.5)",
- },
- },
- },
- ],
- };
-
- try {
- statusChart.setOption(option);
- } catch (error) {
- console.error('鐘舵�佸浘琛ㄦ覆鏌撳け璐�:', error);
- }
-};
-
-onMounted(() => {
- loadOverviewData();
- initCharts();
- startAutoRefresh();
-});
-
-// 缁勪欢鍗歌浇鏃舵竻鐞嗗畾鏃跺櫒
-onUnmounted(() => {
- stopAutoRefresh();
-});
-</script>
-
-<style scoped>
-.statistics-container {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: 100vh;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- color: white;
-}
-
-.page-header h2 {
- color: white;
- margin-bottom: 10px;
- font-size: 28px;
- font-weight: 600;
-}
-
-.page-header p {
- color: rgba(255, 255, 255, 0.9);
- font-size: 14px;
- margin: 0 0 15px 0;
-}
-
-.header-controls {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-top: 10px;
- gap: 20px;
-}
-
-.refresh-btn {
- margin-left: 20px;
-}
-
-.statistics-cards {
- margin-bottom: 30px;
-}
-
-.statistics-card {
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- transition: all 0.3s ease;
- border: none;
- overflow: hidden;
-}
-
-.statistics-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-.statistics-card.primary {
- border-left: 4px solid #409EFF;
- background: linear-gradient(135deg, #409EFF 0%, #36a3f7 100%);
-}
-
-.statistics-card.success {
- border-left: 4px solid #67C23A;
- background: linear-gradient(135deg, #67C23A 0%, #85ce61 100%);
-}
-
-.statistics-card.warning {
- border-left: 4px solid #E6A23C;
- background: linear-gradient(135deg, #E6A23C 0%, #ebb563 100%);
-}
-
-.statistics-card.info {
- border-left: 4px solid #909399;
- background: linear-gradient(135deg, #909399 0%, #a6a9ad 100%);
-}
-
-.card-content {
- display: flex;
- align-items: center;
- padding: 20px;
-}
-
-.card-icon {
- margin-right: 20px;
- color: white;
-}
-
-.card-info {
- flex: 1;
-}
-
-.card-number {
- font-size: 32px;
- font-weight: 600;
- color: white;
- margin-bottom: 5px;
-}
-
-.card-label {
- font-size: 14px;
- color: rgba(255, 255, 255, 0.9);
-}
-
-.charts-section {
- margin-bottom: 30px;
-}
-
-.chart-card {
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- border: none;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: 600;
- color: #303133;
- padding: 15px 20px;
- border-bottom: 1px solid #ebeef5;
-}
-
-.chart-container {
- height: 400px;
- padding: 20px;
-}
-
-.chart {
- width: 100%;
- height: 100%;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .statistics-container {
- padding: 10px;
- }
-
- .page-header {
- padding: 15px;
- }
-
- .page-header h2 {
- font-size: 24px;
- }
-
- .header-controls {
- flex-direction: column;
- gap: 15px;
- }
-
- .refresh-btn {
- margin-left: 0;
- }
-
- .statistics-cards .el-col {
- margin-bottom: 15px;
- }
-
- .charts-section .el-col {
- margin-bottom: 20px;
- }
-
- .chart-container {
- height: 300px;
- }
-}
-
-@media (max-width: 480px) {
- .page-header h2 {
- font-size: 20px;
- }
-
- .card-number {
- font-size: 24px;
- }
-
- .chart-container {
- height: 250px;
- }
-}
-</style>
diff --git a/src/views/financialManagement/expenseManagement/Form.vue b/src/views/financialManagement/expenseManagement/Form.vue
deleted file mode 100644
index 9cfe5da..0000000
--- a/src/views/financialManagement/expenseManagement/Form.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-form-item label="鏀嚭鏃ユ湡" prop="expenseDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.expenseDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- <el-form-item label="鏀嚭绫诲瀷" prop="expenseType">
- <el-select
- v-model="form.expenseType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in expense_types" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀嚭閲戦" prop="expenseMoney">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.expenseMoney"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- <el-form-item label="鏀嚭鎻忚堪" prop="expenseDescribed">
- <el-input v-model="form.expenseDescribed" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="浠樻鏂瑰紡" prop="expenseMethod">
- <el-select
- v-model="form.expenseMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in checkout_payment" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
- <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="澶囨敞" prop="note">
- <el-input
- v-model="form.note"
- placeholder="澶囨敞"
- />
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getAccountExpense } from "@/api/financialManagement/expenseManagement";
-import {ref} from "vue";
-const { proxy } = getCurrentInstance();
-
-
-defineOptions({
- name: "鏂板鏀嚭",
-});
-const { expense_types } = proxy.useDict("expense_types");
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const formRef = ref(null);
-const formRules = {
- supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- expenseType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- expenseMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
- expenseDate: undefined, // 鏀嚭鏃ユ湡
- expenseType: undefined, // 鏀嚭绫诲瀷
- supplierName: undefined, // 瀹㈡埛鍚嶇О
- expenseMoney: undefined, // 鏀嚭閲戦
- expenseDescribed: undefined, // 鏀嚭鎻忚堪
- expenseMethod: undefined, // 鏀舵鏂瑰紡
- invoiceNumber: undefined, // 鍙戠エ鍙风爜
- note: undefined, // 澶囨敞
-});
-
-const loadForm = async (id) => {
- const { code, data } = await getAccountExpense(id);
- if (code == 200) {
- form.expenseDate = data.expenseDate;
- form.expenseType = data.expenseType;
- form.supplierName = data.supplierName;
- form.expenseMoney = data.expenseMoney;
- form.expenseDescribed = data.expenseDescribed;
- form.expenseMethod = data.expenseMethod;
- form.invoiceNumber = data.invoiceNumber;
- form.note = data.note;
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/financialManagement/expenseManagement/Modal.vue b/src/views/financialManagement/expenseManagement/Modal.vue
deleted file mode 100644
index 8e5b171..0000000
--- a/src/views/financialManagement/expenseManagement/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { add, update } from "@/api/financialManagement/expenseManagement";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏀嚭鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏀嚭" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await update({id: id.value, ...formRef.value.form})
- : await add(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/expenseManagement/index.vue b/src/views/financialManagement/expenseManagement/index.vue
deleted file mode 100644
index b1e9fb1..0000000
--- a/src/views/financialManagement/expenseManagement/index.vue
+++ /dev/null
@@ -1,279 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏀嚭鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="浠樻鏂瑰紡:">
- <el-select
- v-model="filters.expenseMethod"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px;"
- >
- <el-option
- v-for="item in checkout_payment"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #operation="{ row }">
- <el-button type="primary" text @click="edit(row.id)" icon="editPen">
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- @click="openFilesFormDia(row)"
- >
- 闄勪欢
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountExpense } from "@/api/financialManagement/expenseManagement";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import FilesDia from "../revenueManagement/filesDia.vue";
-
-defineOptions({
- name: "鏀嚭绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const { expense_types } = proxy.useDict("expense_types");
-const filesDia = ref()
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- listPage,
- {
- expenseMethod: undefined,
- },
- [
- {
- label: "鏀嚭鏃ユ湡",
- align: "center",
- prop: "expenseDate",
- },
- {
- label: "鏀嚭绫诲瀷",
- align: "center",
- prop: "expenseType",
- dataType: "tag",
- formatData: (params) => {
- if (expense_types.value.find((m) => m.value == params)) {
- return expense_types.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- align: "center",
- prop: "supplierName",
-
- },
- {
- label: "鏀嚭閲戦",
- align: "center",
- prop: "expenseMoney",
-
- },
- {
- label: "鏀嚭鎻忚堪",
- align: "center",
- prop: "expenseDescribed",
-
- },
- {
- label: "浠樻鏂瑰紡",
- align: "center",
- prop: "expenseMethod",
- dataType: "tag",
- formatData: (params) => {
- if (checkout_payment.value.find((m) => m.value == params)) {
- return checkout_payment.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "鍙戠エ鍙风爜",
- align: "center",
- prop: "invoiceNumber",
-
- },
- {
- label: "澶囨敞",
- align: "center",
- prop: "note",
-
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "inputUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "inputTime",
-
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delAccountExpense(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/account/accountExpense/export`, {}, "鏀嚭鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鏀嚭')
- })
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
-
diff --git a/src/views/financialManagement/financialStatements/index.vue b/src/views/financialManagement/financialStatements/index.vue
deleted file mode 100644
index 430fe6a..0000000
--- a/src/views/financialManagement/financialStatements/index.vue
+++ /dev/null
@@ -1,513 +0,0 @@
-<template>
- <div style="padding: 20px;">
- <!-- 椤甸潰鏍囬鍜屾棩鏈熺瓫閫� -->
- <div class="w-full md:w-auto flex items-center gap-3" style="margin-bottom: 20px;">
- <el-date-picker
- v-model="dateRange"
- type="daterange"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- :default-value="[new Date(firstDayOfMonth), new Date()]"
- @change="handleDateChange"
- class="w-full md:w-auto"
- style="margin-right: 30px;"
- />
-
- <el-button
- type="primary"
- icon="Refresh"
- @click="resetDateRange"
- size="default"
- >
- 閲嶇疆
- </el-button>
- </div>
-
- <main class="container mx-auto px-4 pb-10">
- <!-- 璐㈠姟鎸囨爣鍗$墖 -->
- <div class="grid-container">
- <!-- 鎬绘敹鍏� -->
- <el-card class="bg1">
- <p>鎬绘敹鍏�</p>
- <h3>
- 楼{{ pageInfo.totalIncome }}
- </h3>
- </el-card>
-
- <!-- 鏀跺叆绗旀暟 -->
- <el-card class="bg2">
- <p>鏀跺叆绗旀暟</p>
- <h3>
- {{ pageInfo.incomeNumber }}
- </h3>
- </el-card>
-
- <!-- 鎬绘敮鍑� -->
- <el-card class="bg3">
- <p>鎬绘敮鍑�</p>
- <h3>
- 楼{{ pageInfo.totalExpense }}
- </h3>
- </el-card>
-
- <!-- 鏀嚭绗旀暟 -->
- <el-card class="bg4">
- <p>鏀嚭绗旀暟</p>
- <h3>
- {{ pageInfo.expenseNumber }}
- </h3>
- </el-card>
-
- <!-- 鍑�鏀跺叆 -->
- <el-card class="bg5">
- <p>鍑�鏀跺叆</p>
- <h3>
- 楼{{ pageInfo.netRevenue }}
- </h3>
- </el-card>
- </div>
-
- <!-- 鏀跺叆缁熻鍥捐〃 -->
- <div class="grid-layout">
- <el-card style="margin-bottom: 20px;">
- <h2 class="section-title">鏀跺叆缁熻(鍏�)</h2>
- <div class="echarts">
- <Echarts :legend="pieLegend0" :chartStyle="chartStylePie"
- :series="materialPieSeries0"
- :tooltip="pieTooltip" style="height: 260px;width: 35%;">
- <div class="chart-num">
- <span style="font-size: 22px;">鏀跺叆</span>
- <span style="font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;">{{ pageInfo.totalIncome }}</span>
- </div>
- </Echarts>
- <Echarts ref="chart"
- :chartStyle="chartStyle"
- :grid="grid"
- :legend="lineLegend"
- :series="lineSeries0"
- :tooltip="tooltip"
- :xAxis="xAxis0"
- :yAxis="yAxis0"
- style="height: 260px;width: 64%;"></Echarts>
- </div>
- </el-card>
-
- <!-- 鏀嚭缁熻鍥捐〃 -->
- <el-card>
- <h2 class="section-title">鏀嚭缁熻(鍏�)</h2>
- <div class="echarts">
- <Echarts ref="chart"
- :legend="pieLegend1"
- :chartStyle="chartStylePie"
- :series="materialPieSeries1"
- :tooltip="pieTooltip"
- style="height: 260px;width: 35%;">
- <div class="chart-num">
- <span style="font-size: 22px;">鏀嚭</span>
- <span style="font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;">{{ pageInfo.totalExpense }}</span>
- </div></Echarts>
- <Echarts ref="chart"
- :chartStyle="chartStyle"
- :grid="grid"
- :legend="lineLegend"
- :series="lineSeries1"
- :tooltip="tooltip"
- :xAxis="xAxis1"
- :yAxis="yAxis1"
- style="height: 260px;width: 64%;"></Echarts>
- </div>
- </el-card>
- </div>
- </main>
- </div>
-</template>
-
-<script setup>
-import { ref, computed, onMounted, reactive } from 'vue';
-import 'element-plus/dist/index.css';
-import Echarts from "@/components/Echarts/echarts.vue";
-import { reportForms,reportIncome,reportExpense } from "@/api/financialManagement/financialStatements";
-import dayjs from "dayjs";
-
-// 鏃ユ湡鑼冨洿
-const dateRange = ref([]);
-const firstDayOfMonth = ref(null);
-const chartStyle = {
- width: '100%',
- height: '100%', // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
- position:'relative',
-}
-const grid = {
- left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
-}
-const lineLegend = {
- show: false,
-}
-// 鎶樼嚎鍥炬彁绀烘
-const tooltip = reactive({
- trigger: 'axis',
- axisPointer: {
- type: 'line',
- lineStyle: { color: '#aaa' }
- },
- // 鑷畾涔夊唴瀹�
- formatter: function (params) {
- if (!params || !params.length) return ''
- const axisLabel = params[0].axisValueLabel || params[0].axisValue || ''
- const rows = params
- .map(p => {
- const colorDot = `<span style="display:inline-block;margin-right:6px;width:8px;height:8px;border-radius:50%;background:${p.color}"></span>`
- return `${colorDot}${p.seriesName}: ${p.value}`
- })
- .join('<br/>')
- return `<div>${axisLabel}</div><div>${rows}</div>`
- }
-})
-const months = ['1鏈�','2鏈�','3鏈�','4鏈�','5鏈�','6鏈�','7鏈�','8鏈�','9鏈�','10鏈�','11鏈�','12鏈�'];
-const lineSeries0 = ref([])
-const lineSeries1 = ref([])
-
-const xAxis0 = ref([
- {
- type: 'category',
- axisTick: { show: true, alignWithLabel: true },
- data: months,
- },
-]);
-const xAxis1 = ref([
- {
- type: 'category',
- axisTick: { show: true, alignWithLabel: true },
- data: months,
- },
-]);
-const yAxis0 = [
-{
- type: 'value',
- name: '鏀跺叆缁熻', // 宸︿晶y杞�
- position: 'left',
- min: 0,
- // 鍧愭爣杞村悕绉版牱寮�
- nameTextStyle: {
- color: '#000',
- fontSize: 14,
- },
- }
-]
-
-const yAxis1 = [
-{
- type: 'value',
- name: '鏀嚭缁熻', // 宸︿晶y杞�
- position: 'left',
- min: 0,
- // 鍧愭爣杞村悕绉版牱寮�
- nameTextStyle: {
- color: '#000',
- fontSize: 14,
- },
- }
-]
-
-const chartStylePie = {
- width: '100%',
- height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const pieColors = ['#F04864','#FACC14', '#8543E0', '#1890FF', '#13C2C2','#2FC25B']; // 鍙牴鎹疄闄呰皟鏁�
-const pieData0 = ref([]);
-const pieData1 = ref([]);
-
-const pieLegend0 = computed(() => ({
- show: true,
- top: 'center',
- left: '60%',
- orient: 'vertical',
- icon: 'circle',
- data: pieData0.value.map(item => item.name),
- formatter: function(name) {
- const item = pieData0.value.find(i => i.name === name);
- if (!item) return name;
- return `${name} | ${item.percent} ${item.amount}`;
- },
- textStyle: {
- color: '#333',
- fontSize: 14,
- lineHeight: 26,
- }
-}));
-const pieLegend1 = computed(() => ({
- show: true,
- top: 'center',
- left: '60%',
- orient: 'vertical',
- icon: 'circle',
- data: pieData1.value.map(item => item.name),
- formatter: function(name) {
- const item = pieData1.value.find(i => i.name === name);
- if (!item) return name;
- return `${name} | ${item.percent} ${item.amount}`;
- },
- textStyle: {
- color: '#333',
- fontSize: 14,
- lineHeight: 26,
- }
-}));
-
-const materialPieSeries0 = computed(() => [
- {
- type: 'pie',
- radius: ['50%', '65%'],
- center: ['25%', '50%'],
- avoidLabelOverlap: false,
- itemStyle: {
- borderColor: '#fff',
- borderWidth: 2
- },
- label: {
- show: false
- },
- data: pieData0.value,
- color: pieColors
- }
-]);
-const materialPieSeries1 = computed(() => [
- {
- type: 'pie',
- radius: ['50%', '65%'],
- center: ['25%', '50%'],
- avoidLabelOverlap: false,
- itemStyle: {
- borderColor: '#fff',
- borderWidth: 2
- },
- label: {
- show: false
- },
- data: pieData1.value,
- color: pieColors
- }
-]);
-const pieTooltip = reactive({
- trigger: 'item',
- formatter: function(params) {
- // 妫�鏌ユ暟鎹槸鍚﹀瓨鍦�
- if (!params.data) return params.name;
- // 鎷兼帴瀹屾暣鍐呭
- return `
- <div>
- <div style="color:${params.color};font-size:16px;">鈼�</div>
- <div>${params.name}</div>
- <div>鍗犳瘮锛�${params.data.percent}</div>
- <div>閲戦锛�${params.data.amount}</div>
- </div>
- `;
- }
-})
-
-
-const pageInfo = ref({
-})
-
-const getData = async () => {
- try {
- const {code,data} = await reportForms({entryDateStart:dateRange.value[0], entryDateEnd:dateRange.value[1]});
- if(code === 200) {
- pageInfo.value = data
- pieData0.value = data.incomeType.map(item=>({
- name:item.typeName,
- value:item.account,
- percent:`${item.proportion*100}%`,
- amount:`楼${item.account}`
- }))
- pieData1.value = data.expenseType.map(item=>({
- name:item.typeName,
- value:item.account,
- percent:`${item.proportion*100}%`,
- amount:`楼${item.account}`
- }))
-
- }
- } catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
- try{
- const {code,data} = await reportIncome();
- if(code==200){
- lineSeries0.value = data.map(item=>({
- name:item.typeName,
- type: 'line',
- data:item.account.map(item=>Number(item))
- }))
-
- }
- }catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
- try{
- const {code,data} = await reportExpense();
- if(code==200){
- lineSeries1.value = data.map(item=>({
- name:item.typeName,
- type: 'line',
- data:item.account.map(item=>Number(item))
- }))
-
- }
- }catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
-};
-
-
-// 鍒濆鍖栨棩鏈熻寖鍥达紙榛樿褰撴湀锛�
-onMounted(() => {
- const today = new Date();
- const firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
- firstDayOfMonth.value = firstDay;
- dateRange.value = [dayjs(firstDay).format("YYYY-MM-DD"), dayjs(today).format("YYYY-MM-DD")];
- getData()
-
-});
-
-// 澶勭悊鏃ユ湡鑼冨洿鍙樺寲
-const handleDateChange = (newRange) => {
- if (newRange && newRange.length === 2) {
- dateRange.value = newRange;
- getData()
- }
-};
-
-// 閲嶇疆鏃ユ湡鑼冨洿
-const resetDateRange = () => {
- const today = new Date();
- const firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
- dateRange.value = [dayjs(firstDay).format("YYYY-MM-DD"), dayjs(today).format("YYYY-MM-DD")];
- getData()
-};
-
-</script>
-
-<style scoped lang="scss">
-/* 鍩虹鏍峰紡琛ュ厖 */
-:root {
- --el-color-primary: #4f46e5;
-}
-.el-card{
- position: relative;
- border-radius: 12px;
- padding: 14px 10px 10px 10px;
- box-shadow: 0 2px 8px #eee;
- :deep(.el-card__body){
- padding: 10px 20px !important;
- }
- &.bg1{
- background: url(@/assets/icons/png/1.png) no-repeat 100% 100% !important;
- }
- &.bg2{
- background: url(@/assets/icons/png/2.png) no-repeat 100% 100% !important;
- }
- &.bg3{
- background: url(@/assets/icons/png/3.png) no-repeat 100% 100% !important;
- }
- &.bg4{
- background: url(@/assets/icons/png/4.png) no-repeat 100% 100% !important;
- }
- &.bg5{
- background: url(@/assets/icons/png/5.png) no-repeat 100% 100% !important;
- }
-}
-
-.grid-container {
- /* grid 瀹瑰櫒鍩虹鏍峰紡 */
- display: grid;
- gap: 1rem; /* gap-4 瀵瑰簲 1rem (16px) */
- margin-bottom: 2rem; /* mb-8 瀵瑰簲 2rem (32px) */
-
- p{
- font-size: 22px;
- margin-top: 0px;
- color: #fff;
- }
- h3{
- font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;
- margin: 10px 0;
- color: #fff;
- }
-
-}
-
-/* 绉诲姩绔粯璁ゆ牱寮� (grid-cols-1) */
-.grid-container {
- grid-template-columns: repeat(1, minmax(0, 1fr));
-}
-
-/* 灏忓睆骞曞強浠ヤ笂 (sm:grid-cols-2) */
-@media (min-width: 640px) {
- .grid-container {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
-}
-
-/* 澶у睆骞曞強浠ヤ笂 (lg:grid-cols-5) */
-@media (min-width: 1024px) {
- .grid-container {
- grid-template-columns: repeat(5, minmax(0, 1fr));
- }
-}
-
-/* 鍗$墖鎮仠鏁堟灉澧炲己 */
-.el-card:hover {
- transform: translateY(-2px);
-}
-.echarts{
- display: flex;
- justify-content: space-between;
-}
-
-/* 鍥捐〃瀹瑰櫒鏍峰紡 */
-.el-chart {
- width: 100%;
- height: 100%;
-}
-.section-title {
- position: relative;
- font-size: 18px;
- color: #333;
- padding-left: 10px;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.section-title::before {
- position: absolute;
- left: 0;
- top: 0px;
- content: '';
- width: 4px;
- height: 18px;
- background-color: #002FA7;
- border-radius: 2px;
-}
-.chart-num{
- position: absolute;
- z-index: 3;
- top: 92px;
- left: 92px;
- display: flex;
- flex-direction: column;
- justify-content: center;
-}
-</style>
diff --git a/src/views/financialManagement/revenueManagement/Form.vue b/src/views/financialManagement/revenueManagement/Form.vue
deleted file mode 100644
index 67b175e..0000000
--- a/src/views/financialManagement/revenueManagement/Form.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-form-item label="鏀跺叆鏃ユ湡" prop="incomeDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.incomeDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- <el-form-item label="鏀跺叆绫诲瀷" prop="incomeType">
- <el-select
- v-model="form.incomeType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in income_types" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚嶇О" prop="customerName">
- <el-input v-model="form.customerName" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀跺叆閲戦" prop="incomeMoney">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.incomeMoney"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- <el-form-item label="鏀跺叆鎻忚堪" prop="incomeDescribed">
- <el-input v-model="form.incomeDescribed" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀舵鏂瑰紡" prop="incomeMethod">
- <el-select
- v-model="form.incomeMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in payment_methods" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
- <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="澶囨敞" prop="note">
- <el-input
- v-model="form.note"
- placeholder="澶囨敞"
- />
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getAccountIncome } from "@/api/financialManagement/revenueManagement";
-import {ref} from "vue";
-const { proxy } = getCurrentInstance();
-
-
-defineOptions({
- name: "鏂板鏀跺叆",
-});
-const { income_types } = proxy.useDict("income_types");
-const { payment_methods } = proxy.useDict("payment_methods");
-const formRef = ref(null);
-const formRules = {
- customerName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- incomeType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- incomeMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
- incomeDate: undefined, // 鏀跺叆鏃ユ湡
- incomeType: undefined, // 鏀跺叆绫诲瀷
- customerName: undefined, // 瀹㈡埛鍚嶇О
- incomeMoney: undefined, // 鏀跺叆閲戦
- incomeDescribed: undefined, // 鏀跺叆鎻忚堪
- incomeMethod: undefined, // 鏀舵鏂瑰紡
- invoiceNumber: undefined, // 鍙戠エ鍙风爜
- note: undefined, // 澶囨敞
-});
-
-const loadForm = async (id) => {
- const { code, data } = await getAccountIncome(id);
- if (code == 200) {
- form.incomeDate = data.incomeDate;
- form.incomeType = data.incomeType;
- form.customerName = data.customerName;
- form.incomeMoney = data.incomeMoney;
- form.incomeDescribed = data.incomeDescribed;
- form.incomeMethod = data.incomeMethod;
- form.invoiceNumber = data.invoiceNumber;
- form.note = data.note;
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/financialManagement/revenueManagement/Modal.vue b/src/views/financialManagement/revenueManagement/Modal.vue
deleted file mode 100644
index 480b4fd..0000000
--- a/src/views/financialManagement/revenueManagement/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { add, update } from "@/api/financialManagement/revenueManagement";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏀跺叆鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏀跺叆" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await update({id: id.value, ...formRef.value.form})
- : await add(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/revenueManagement/filesDia.vue b/src/views/financialManagement/revenueManagement/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/financialManagement/revenueManagement/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/financialManagement/revenueManagement/index.vue b/src/views/financialManagement/revenueManagement/index.vue
deleted file mode 100644
index 285b73f..0000000
--- a/src/views/financialManagement/revenueManagement/index.vue
+++ /dev/null
@@ -1,279 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏀跺叆鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鏀舵鏂瑰紡:">
- <el-select
- v-model="filters.incomeMethod"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px;"
- >
- <el-option
- v-for="item in payment_methods"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #operation="{ row }">
- <el-button type="primary" text @click="edit(row.id)" icon="editPen">
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- @click="openFilesFormDia(row)"
- >
- 闄勪欢
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountIncome } from "@/api/financialManagement/revenueManagement";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import FilesDia from "./filesDia.vue";
-
-defineOptions({
- name: "鏀跺叆绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { payment_methods } = proxy.useDict("payment_methods");
-const { income_types } = proxy.useDict("income_types");
-const filesDia = ref()
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- listPage,
- {
- incomeMethod: undefined,
- },
- [
- {
- label: "鏀跺叆鏃ユ湡",
- align: "center",
- prop: "incomeDate",
- },
- {
- label: "鏀跺叆绫诲瀷",
- align: "center",
- prop: "incomeType",
- dataType: "tag",
- formatData: (params) => {
- if (income_types.value.find((m) => m.value == params)) {
- return income_types.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "瀹㈡埛鍚嶇О",
- align: "center",
- prop: "customerName",
-
- },
- {
- label: "鏀跺叆閲戦",
- align: "center",
- prop: "incomeMoney",
-
- },
- {
- label: "鏀跺叆鎻忚堪",
- align: "center",
- prop: "incomeDescribed",
-
- },
- {
- label: "鏀舵鏂瑰紡",
- align: "center",
- prop: "incomeMethod",
- dataType: "tag",
- formatData: (params) => {
- if (payment_methods.value.find((m) => m.value == params)) {
- return payment_methods.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "鍙戠エ鍙风爜",
- align: "center",
- prop: "invoiceNumber",
-
- },
- {
- label: "澶囨敞",
- align: "center",
- prop: "note",
-
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "inputUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "inputTime",
-
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delAccountIncome(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/account/accountIncome/export`, {}, "鏀跺叆鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鏀跺叆')
- })
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
-
diff --git a/src/views/index.vue b/src/views/index.vue
deleted file mode 100644
index 0e7fdcf..0000000
--- a/src/views/index.vue
+++ /dev/null
@@ -1,805 +0,0 @@
-<template>
- <div class="dashboard">
- <!-- 椤堕儴妯悜涓ゆ爮 -->
- <div class="dashboard-top">
- <!-- 宸︼細浼佷笟淇℃伅+涓夊ぇ鏁版嵁鍗$墖锛堜笂涓嬫帓鍒楋級 -->
- <div class="top-left">
- <div class="company-info">
- <div class="section-title">鐧婚檰淇℃伅</div>
- <div style="display: flex;align-items: center;gap: 20px">
- <img :src="userStore.avatar" class="avatar" alt=""/>
- <div class="company-card">
- <div class="company-name">{{userStore.name}}</div>
- <div class="company-meta">{{userStore.roleName}}</div>
- </div>
- <div style="display: flex;align-items: center;gap: 8px">
- <el-icon color="#5053B5" size="22"><Clock /></el-icon>
- <span>鐧婚檰鏃ユ湡锛歿{userStore.currentLoginTime}}</span>
- </div>
- </div>
- </div>
- <div class="data-cards">
- <div class="data-card sales">
- <div class="data-title">閿�鍞暟鎹�</div>
- <div class="data-num">
- <div>
- <div class="data-desc">鏈湀閿�鍞/鍏�</div>
- <div class="data-value">{{businessInfo.monthSaleMoney}}</div>
- </div>
- <div>
- <div class="data-desc">鏈紑绁ㄩ噾棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthSaleHaveMoney}}</div>
- </div>
- </div>
-
- </div>
- <div class="data-card purchase">
- <div class="data-title">閲囪喘鏁版嵁</div>
- <div class="data-num">
- <div>
- <div class="data-desc">鏈湀閲囪喘棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthPurchaseMoney}}</div>
- </div>
- <div>
- <div class="data-desc">寰呬粯娆鹃噾棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthPurchaseHaveMoney}}</div>
- </div>
- </div>
- </div>
- <div class="data-card inventory">
- <div class="data-title">搴撳瓨鏁版嵁</div>
- <div class="data-num">
- <div>
- <div class="data-desc">褰撳墠搴撳瓨鎬婚噺/浠�</div>
- <div class="data-value">{{businessInfo.inventoryNum}}</div>
- </div>
- <div>
- <div class="data-desc">浠婃棩鍏ュ簱/浠�</div>
- <div class="data-value">{{businessInfo.todayInventoryNum}}</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 鍙筹細寰呭姙浜嬮」 -->
- <div class="todo-panel">
- <div class="section-title">寰呭姙浜嬮」</div>
- <ul class="todo-list" v-if="todoList.length > 0">
- <li v-for="item in todoList" :key="item.id">
- <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px">
- <div style="display: flex;justify-content: space-between;align-items: center;">
- <div class="todo-title">寰呭姙缂栧彿锛歿{item.approveId}}</div>
- <div class="todo-division">閮ㄩ棬锛歿{item.approveDeptName}}</div>
- <div class="todo-time">{{item.approveTime}}</div>
- </div>
- <div class="todo-division">寰呭姙浜嬬敱锛歿{item.approveReason}}</div>
- </div>
- </li>
- </ul>
- <div v-else style="text-align: center">
- 鏆傛棤鏁版嵁
- </div>
- </div>
- </div>
-
- <!-- 涓儴妯悜涓ゆ爮 -->
- <div class="dashboard-row">
- <div class="main-panel">
- <div class="section-title">瀹㈡埛鍚堝悓閲戦鍒嗘瀽</div>
- <div class="contract-summary">
- <div class="contract-info">
- <img src="../assets/images/khtitle.png" alt="" style="width: 42px"/>
- <div class="contract-card">
- <div class="contract-name">鎬诲悎鍚岄噾棰�(鍏�)</div>
- <div class="contract-meta">
- <div class="main-amount">{{sum}}</div>
- <div>鍛ㄥ悓姣�: <span class="up">{{yny}}% </span> 鏃ョ幆姣�: <span class="up">{{chain}}% </span></div>
- </div>
- </div>
- </div>
- </div>
- <div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 180px;margin-top: 20px">
- <div>
- <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie"
- :series="materialPieSeries"
- :tooltip="pieTooltip"></Echarts>
- </div>
- <ul class="contract-list">
- <li v-for="item in materialPieSeries[0].data" :key="item.name">
- <div style="display: flex;align-items: center;justify-content: space-between;width: 100%">
- <div class="line" :style="{color: item.itemStyle.color}">鈼弡{item.name}}</div>
- <div style="width: 70px">{{item.rate}}%</div>
- <div>锟{item.value}}</div>
- </div>
- </li>
- </ul>
- </div>
- </div>
- <div class="main-panel">
- <div style="display: flex;justify-content: space-between;">
- <div class="section-title">搴旀敹搴斾粯缁熻</div>
- <el-radio-group v-model="radio1" size="large" @change="statisticsReceivable">
- <el-radio-button label="鎸夊懆" :value="1" />
- <el-radio-button label="鎸夋湀" :value="2" />
- <el-radio-button label="鎸夊搴�" :value="3" />
- </el-radio-group>
- </div>
- <Echarts ref="chart"
- :color="barColors2"
- :chartStyle="chartStyle"
- :grid="grid"
- :series="barSeries"
- :tooltip="tooltip"
- :xAxis="xAxis"
- :yAxis="yAxis"
- style="height: 260px"></Echarts>
- </div>
- </div>
-
- <!-- 搴曢儴妯悜涓ゆ爮 -->
- <div class="dashboard-row">
-<!-- <div class="main-panel">-->
-<!-- <div class="section-title">璐ㄩ噺缁熻</div>-->
-<!-- <div class="quality-cards">-->
-<!-- <div class="quality-card one">鍘熸潗鏂欏凡妫�娴嬫暟 <span>{{qualityStatisticsObject.supplierNum}}浠�</span></div>-->
-<!-- <div class="quality-card two">杩囩▼妫�楠屾暟閲� <span>{{qualityStatisticsObject.processNum}}浠�</span></div>-->
-<!-- <div class="quality-card three">鍑哄巶宸叉鏁伴噺 <span>{{qualityStatisticsObject.factoryNum}}浠�</span></div>-->
-<!-- </div>-->
-<!-- <Echarts ref="chart"-->
-<!-- :chartStyle="chartStyle"-->
-<!-- :grid="grid"-->
-<!-- :legend="barLegend"-->
-<!-- :series="barSeries1"-->
-<!-- :tooltip="tooltip"-->
-<!-- :xAxis="xAxis1"-->
-<!-- :yAxis="yAxis1"-->
-<!-- style="height: 260px"></Echarts>-->
-<!-- </div>-->
- <div class="main-panel">
- <div class="section-title">鍥炴涓庡紑绁ㄥ垎鏋�</div>
- <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries"
- :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 270px;"></Echarts>
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from 'vue'
-import Echarts from "@/components/Echarts/echarts.vue";
-import * as echarts from 'echarts';
-import useUserStore from "@/store/modules/user.js";
-import {
- analysisCustomerContractAmounts, getAmountHalfYear,
- getBusiness,
- homeTodos,
- qualityStatistics,
- statisticsReceivablePayable
-} from "@/api/viewIndex.js";
-
-const userStore = useUserStore()
-
-const businessInfo = ref({
- inventoryNum: 0,
- monthPurchaseHaveMoney: 0,
- monthPurchaseMoney: 0,
- monthSaleHaveMoney: 0,
- monthSaleMoney: 0,
- todayInventoryNum: 0,
-})
-const qualityStatisticsObject = ref({
- supplierNum: 0,
- processNum: 0,
- factoryNum: 0,
-})
-const sum = ref(0)
-const yny = ref(0)
-const chain = ref(0)
-
-const pieLegend = reactive({
- show: false,
-})
-const barSeries = ref([
- {
- type: 'bar',
- data: [],
- label: {
- show: true,
- }
- },
-])
-const barSeries1 = ref([
- {
- name: '鍘熸潗鏂欎笉鍚堟牸鏁�',
- type: 'bar',
- barGap: 0,
- emphasis: {
- focus: 'series'
- },
- data: []
- },
- {
- name: '杩囩▼涓嶅悎鏍兼暟',
- type: 'bar',
- emphasis: {
- focus: 'series'
- },
- data: []
- },
- {
- name: '鍑哄巶涓嶅悎鏍兼暟',
- type: 'bar',
- emphasis: {
- focus: 'series'
- },
- data: []
- },
-])
-const chartStyle = {
- width: '100%',
- height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const chartStylePie = {
- width: '140%',
- height: '140%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const grid = {
- left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
-}
-const barLegend = {
- show: true,
- data: ['鍘熸潗鏂欎笉鍚堟牸鏁�', '杩囩▼涓嶅悎鏍兼暟', '鍑哄巶涓嶅悎鏍兼暟']
-}
-const barLegend1 = {
- show: true,
- data: ['棰勪粯璐︽', '搴斾粯璐︽', '棰勬敹璐︽', '搴旀敹璐︽']
-}
-const lineLegend = {
- show: true,
- data: ['寮�绁�', '鍥炴']
-}
-const tooltip = {
- trigger: 'axis',
- axisPointer: {
- type: 'shadow'
- }
-}
-const xAxis = [{
- type: 'value',
-}]
-const xAxis1 = ref([{
- type: 'category',
- axisTick: { show: false },
- data: []
-}])
-const yAxis = [{
- type: 'category',
- data: [ '搴斾粯璐︽', '搴旀敹璐︽',]
-}]
-const yAxis1 = [{
- type: 'value'
-}]
-const pieTooltip = reactive({
- trigger: 'item',
- formatter: function (params) {
- // 鍔ㄦ�佺敓鎴愭彁绀轰俊鎭紝鍩轰簬鏁版嵁椤圭殑 name 灞炴��
- const description = params.name === '鏈湀鍥炴閲戦' ? '鏈湀鍥炴閲戦' : '搴旀敹娆鹃噾棰�';
- return `${description} ${formatNumber(params.value)}鍏� ${params.percent}%`;
- },
- position: 'right'
-})
-const materialPieSeries = ref([
- {
- type: 'pie',
- radius: ['66%', '90%'],
- avoidLabelOverlap: false,
- itemStyle: {
- borderColor: '#fff',
- borderWidth: 2
- },
- label: {
- show: false
- },
- data: []
- }
-])
-const lineSeries = ref([
- {
- type: 'line',
- data: [],
- label: {
- show: true
- },
- showSymbol: true, // 鏄剧ず鍦嗙偣
- },
-])
-const tooltipLine = {
- trigger: 'axis',
-}
-const yAxis2 = ref([
- {
- type: 'value',
- }
-])
-const xAxis2 = ref([
- {
- type: 'category',
- data: [],
- axisLabel: {
- interval: 0,
- formatter: function(value) {
- return value.replace(/~/g, '\n');
- },
- }
- }
-])
-
-// 寰呭姙浜嬮」
-const todoList = ref([])
-const radio1 = ref(1)
-
-// 鍥捐〃寮曠敤
-const barChart = ref(null)
-const lineChart = ref(null)
-const barColors2 = ['#5181DB', '#D369E0', '#F2CA6D', '#60CCA8']
-
-// 闅忔満棰滆壊鐢熸垚鍑芥暟
-const getRandomColor = () => {
- return '#' + Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0');
-}
-
-onMounted(() => {
- getBusinessData()
- analysisCustomer()
- todoInfoS()
- statisticsReceivable()
- qualityStatisticsInfo()
- getAmountHalfYearNum()
-})
-// 鏁版嵁缁熻
-const getBusinessData = () => {
- getBusiness().then((res) => {
- businessInfo.value = {...res.data}
- })
-}
-// 鍚堝悓閲戦
-const analysisCustomer = () => {
- analysisCustomerContractAmounts().then((res) => {
- sum.value = res.data.sum
- yny.value = res.data.yny
- chain.value = res.data.chain
- // 涓烘瘡涓暟鎹」鍒嗛厤闅忔満棰滆壊
- materialPieSeries.value[0].data = res.data.item.map(item => ({
- ...item,
- itemStyle: { color: getRandomColor() }
- }))
- })
-}
-// 寰呭姙浜嬮」
-const todoInfoS = () => {
- homeTodos().then((res) => {
- todoList.value = res.data
- })
-}
-// 搴斾粯搴旀敹缁熻
-const statisticsReceivable = (type) => {
- console.log(type)
- statisticsReceivablePayable({type: radio1.value}).then((res) => {
- barSeries.value[0].data = [
- // { value: res.data.prepayMoney, itemStyle: { color: barColors2[0] } },
- { value: res.data.payableMoney, itemStyle: { color: barColors2[0] } },
- // { value: res.data.advanceMoney, itemStyle: { color: barColors2[2] } },
- { value: res.data.receivableMoney, itemStyle: { color: barColors2[1] } }
- ]
- })
-}
-// 璐ㄦ缁熻
-const qualityStatisticsInfo = () => {
- qualityStatistics().then((res) => {
- res.data.item.forEach(item => {
- xAxis1.value[0].data.push(item.date)
- barSeries1.value[0].data.push(item.supplierNum)
- barSeries1.value[1].data.push(item.processNum)
- barSeries1.value[2].data.push(item.factoryNum)
- })
- qualityStatisticsObject.value.supplierNum = res.data.supplierNum
- qualityStatisticsObject.value.processNum = res.data.processNum
- qualityStatisticsObject.value.factoryNum = res.data.factoryNum
- })
-}
-const getAmountHalfYearNum = async () => {
- const res = await getAmountHalfYear()
- console.log(res)
- const monthName = []
- const receiptAmount = []
- const invoiceAmount = []
- res.data.forEach(item => {
- monthName.push(item.month)
- receiptAmount.push(item.receiptAmount)
- invoiceAmount.push(item.invoiceAmount)
- })
- // 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
- xAxis2.value[0].data = monthName
- xAxis2.value[0].data = monthName.map(item => item.replace(/~/g, '\n~'));
- lineSeries.value = [
- {
- name: '寮�绁�',
- type: 'line',
- data: receiptAmount,
- stack: 'Total',
- areaStyle: {
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 0,
- color: 'rgba(131, 207, 255, 1)'
- },
- {
- offset: 1,
- color: 'rgba(186, 228, 255, 1)'
- }
- ])
- },
- itemStyle: {
- color: '#2D99FF',
- borderColor: '#2D99FF'
- },
- emphasis: {
- focus: 'series'
- },
- lineStyle: {
- width: 0
- },
- showSymbol: true,
- },
- {
- name: '鍥炴',
- type: 'line',
- data: invoiceAmount,
- stack: 'Total',
- lineStyle: {
- width: 0
- },
- itemStyle: {
- color: '#83CFFF',
- borderColor: '#83CFFF'
- },
- showSymbol: true,
- areaStyle: {
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 0,
- color: 'rgba(54, 153, 255, 1)'
- },
- {
- offset: 1,
- color: 'rgba(89, 169, 254, 1)'
- }
- ])
- },
- emphasis: {
- focus: 'series'
- },
- }
- ]
-}
-</script>
-
-<style scoped>
-.dashboard {
- background: #f5f7fa;
- min-height: 100vh;
- padding: 20px;
- box-sizing: border-box;
-}
-.dashboard-top {
- display: flex;
- gap: 20px;
- margin-bottom: 20px;
-}
-.company-info {
- display: flex;
- flex-direction: column;
- gap: 8px;
- padding: 20px;
- min-width: 0;
- background-color: #EFF2FB; /* 浣跨敤鎸囧畾鐨勮儗鏅鑹� */
- background-image: url("../assets/images/denglu.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
- border-radius: 12px;
- height: 138px;
-}
-.avatar {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- object-fit: contain;
- background: #fff;
- border: 1px solid #eee;
-}
-.company-card {
- display: flex;
- flex-direction: column;
- gap: 10px;
- position: relative;
- padding-right: 15px;
-}
-
-.company-card::after {
- content: '';
- position: absolute;
- right: 0;
- top: 0;
- bottom: 0;
- width: 1px;
- background-color: #C9C5C5;
- border-radius: 2px;
-}
-.company-name {
- font-weight: 400;
- font-size: 16px;
- color: #161A9A;
-}
-.company-meta {
- font-weight: 400;
- font-size: 12px;
- color: #818185;
-}
-.data-cards {
- display: flex;
- gap: 16px;
- justify-content: flex-start;
- background: #ffffff;
- border-radius: 12px;
- padding: 20px;
-}
-.data-title {
- font-weight: 700;
- font-size: 26px;
- color: #FFFFFF;
-}
-.data-num {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-top: 20px;
-}
-.data-card {
- background: #fff;
- border-radius: 12px;
- padding: 14px 10px 10px 10px;
- min-width: 160px;
- box-shadow: 0 2px 8px #eee;
- display: flex;
- flex-direction: column;
- width: 32%;
- height: 140px;
-}
-.data-card.sales {
- background-image: url("../assets/images/xioashoushuju.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
-}
-.data-card.purchase {
- background-image: url("../assets/images/caigou.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
-}
-.data-card.inventory {
- background-image: url("../assets/images/kucun.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
-}
-.data-desc {
- font-weight: 500;
- font-size: 13px;
- color: #FFFFFF;
-}
-.data-value {
- font-size: 18px;
- font-weight: 500;
- margin: 10px 0;
- color: #FFFFFF;
-}
-.top-left {
- display: flex;
- flex-direction: column;
- gap: 20px;
- width: 50%;
-}
-.todo-panel {
- background: #fff;
- border-radius: 12px;
- padding: 20px;
- width: 50%;
-}
-.todo-list {
- list-style: none;
- padding: 0;
- margin: 0;
- font-size: 15px;
- overflow-y: auto;
- height: 260px;
-}
-.todo-list li {
- border-radius: 8px;
- margin-bottom: 12px;
- padding: 8px 20px;
- height: 74px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: rgba(225,227,250,0.62);
-}
-.todo-title {
- font-weight: 400;
- font-size: 12px;
- color: #000000;
- position: relative;
-}
-.todo-title::before {
- content: ''; /* 蹇呴渶锛岃〃绀鸿繖閲屾湁涓�涓唴瀹� */
- position: absolute;
- left: -10px; /* 瀹氫綅鍒板乏渚� */
- top: 50%; /* 鍨傜洿灞呬腑 */
- transform: translateY(-50%); /* 寰皟鍨傜洿灞呬腑 */
- width: 6px; /* 鍦嗙殑鐩村緞 */
- height: 6px; /* 鍦嗙殑鐩村緞 */
- background: #498CEB;
- border-radius: 50%; /* 璁╁叾鍙樻垚鍦嗗舰 */
-}
-.todo-division {
- font-weight: 400;
- font-size: 12px;
- color: #000000;
-}
-.todo-time {
- font-weight: 400;
- font-size: 12px;
- color: #000000;
-}
-.todo-meta {
- color: #888;
- font-size: 13px;
-}
-.dashboard-row {
- display: flex;
- gap: 20px;
- margin-bottom: 20px;
-}
-.main-panel {
- background: #fff;
- border-radius: 12px;
- padding: 20px;
- flex: 1;
- min-width: 0;
- display: flex;
- flex-direction: column;
-}
-.section-title {
- position: relative;
- font-size: 18px;
- color: #333;
- padding-left: 10px;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.section-title::before {
- position: absolute;
- left: 0;
- top: 4px;
- content: '';
- width: 4px;
- height: 18px;
- background-color: #002FA7;
- border-radius: 2px;
-}
-.contract-info {
- display: flex;
- align-items: center;
- gap: 20px;
- height: 90px;
- background: rgba(245,245,245,0.59);
- width: 100%;
- border-radius: 10px;
- padding: 10px 30px;
-}
-.contract-summary {
- display: flex;
- align-items: center;
- gap: 30px;
-}
-.contract-card {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-.contract-name {
- font-weight: 400;
- font-size: 14px;
- color: #050505;
-}
-.contract-meta {
- display: flex;
- align-items: center;
- width: 100%;
- gap: 80px;
-}
-.main-amount {
- font-size: 24px;
- color: rgba(51,50,50,0.85);
-}
-.up { color: #e57373; }
-.contract-list {
- margin-top: 16px;
- font-size: 14px;
- color: #666;
- list-style: none;
- padding: 0;
- height: 190px;
- overflow-y: auto;
- width: 460px;
-}
-.line {
- position: relative;
- width: 230px;
-}
-.line::after {
- content: '';
- position: absolute;
- right: 2px;
- top: 0;
- bottom: 0;
- width: 1px;
- background-color: #C9C5C5;
- border-radius: 2px;
-}
-.contract-list li {
- margin-top: 10px;
-}
-.quality-cards {
- display: flex;
- gap: 12px;
- margin-bottom: 12px;
-}
-.quality-card {
- border-radius: 8px;
- padding: 15px 10px 10px 50px;
- font-weight: 400;
- font-size: 12px;
- color: rgba(0,0,0,0.67);
- width: 236px;
- height: 49px;
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
-}
-.quality-card.one {
- background-image: url("../assets/images/yuancailiao.png");
-}
-.quality-card.two {
- background-image: url("../assets/images/guocheng.png");
-}
-.quality-card.three {
- background-image: url("../assets/images/chuchang.png");
-
-}
-.quality-card span {
- color: #4fc3f7;
- font-weight: bold;
- margin-left: 6px;
-}
-.chart {
- width: 100%;
- height: 220px;
- margin-top: 10px;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/inventoryManagement/dispatchLog/index.vue b/src/views/inventoryManagement/dispatchLog/index.vue
deleted file mode 100644
index 177868d..0000000
--- a/src/views/inventoryManagement/dispatchLog/index.vue
+++ /dev/null
@@ -1,853 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- style="width: 100%"
- :summary-method="summarizeMainTable"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="鍑哄簱鏃ユ湡"
- prop="createTime"
- min-width="130"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- width="250"
- show-overflow-tooltip
- />
- <el-table-column
- label="浜у搧澶х被"
- prop="productCategory"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍗曚綅"
- prop="unit"
- width="80"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍑哄簱鏁伴噺"
- prop="inboundNum"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="绋庣巼(%)"
- prop="taxRate"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- width="180"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍑哄簱浜�"
- prop="createBy"
- width="80"
- show-overflow-tooltip
- />
- <!-- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- >缂栬緫</el-button
- >
- </template>
- </el-table-column> -->
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
-
- <!-- 鎵撳嵃棰勮寮圭獥 -->
- <el-dialog
- v-model="printPreviewVisible"
- title="鎵撳嵃棰勮"
- width="90%"
- :close-on-click-modal="false"
- class="print-preview-dialog"
- >
- <div class="print-preview-container">
- <div class="print-preview-header">
- <el-button type="primary" @click="executePrint">鎵ц鎵撳嵃</el-button>
- <el-button @click="printPreviewVisible = false">鍏抽棴棰勮</el-button>
- </div>
- <div class="print-preview-content">
- <div v-if="printData.length === 0" style="text-align: center; padding: 50px; color: #999;">
- 鏆傛棤鎵撳嵃鏁版嵁
- </div>
- <div v-else style="text-align: center; padding: 10px; color: #666; font-size: 14px; background: #e8f4fd; margin-bottom: 10px;">
- 鍏� {{ printData.length }} 鏉℃暟鎹緟鎵撳嵃
- </div>
- <div v-for="(item, index) in printData" :key="index" class="print-page">
- <div class="delivery-note">
- <div class="header">
- <div class="company-name">榧庤瘹鐟炲疄涓氭湁闄愯矗浠诲叕鍙�</div>
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
- </div>
-
- <div class="info-section">
- <div class="info-row">
- <div>
- <span class="label">鍙戣揣鏃ユ湡锛�</span>
- <span class="value">{{ formatDate(item.createTime) }}</span>
- </div>
- <div>
-
- <span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">{{ item.supplierName || '寮犵埍鏈�' }}</span>
- </div>
- </div>
- <div class="info-row">
- <span class="label">鍗曞彿锛�</span>
- <span class="value">{{ item.code }}</span>
- </div>
- </div>
-
- <div class="table-section">
- <table class="product-table">
- <thead>
- <tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
- <th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>{{ item.productCategory || '鐮傜伆鐮�' }}</td>
- <td>{{ item.specificationModel || '鏍囧噯' }}</td>
- <td>{{ item.unit || '鍧�' }}</td>
- <td>{{ item.taxInclusiveUnitPrice || '0' }}</td>
- <td>{{ item.inboundNum || '2000' }}</td>
- <td>{{ item.taxInclusiveTotalPrice || '0' }}</td>
- </tr>
- </tbody>
- <tfoot>
- <tr>
- <td class="label">鍚堣</td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value">{{ item.inboundNum || '2000' }}</td>
- <td class="total-value">{{ item.taxInclusiveTotalPrice || '0' }}</td>
- </tr>
- </tfoot>
- </table>
- </div>
-
- <div class="footer-section">
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鏀惰揣鐢佃瘽锛�</span>
- <span class="value"></span>
- </div>
- <div class="footer-item">
- <span class="label">鏀惰揣浜猴細</span>
- <span class="value"></span>
- </div>
- <div class="footer-item address-item">
- <span class="label">鏀惰揣鍦板潃锛�</span>
- <span class="value address-value"></span>
- </div>
- </div>
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">{{ userStore.nickname || '鎾曞紑鍓�' }}</span>
- </div>
- <div class="footer-item">
- <span class="label">鎵撳嵃鏃ユ湡锛�</span>
- <span class="value">{{ formatDateTime(new Date()) }}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </el-dialog>
-
-
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user";
-import {
- getStockOutPage,
- delStockOut,
-} from "@/api/inventoryManagement/stockOut.js";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-
-// 鎵撳嵃鐩稿叧
-const printPreviewVisible = ref(false);
-const printData = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const data = reactive({
- searchForm: {
- supplierName: "",
- },
- form: {
- supplierId: null,
- supplierName: '',
- productId: null,
- productName: '',
- userId: userStore.userId,
- nickname: '',
- model: '',
- productModelId: null,
- unit: '',
- productrecordId: null,
- taxInclusiveUnitPrice: '',
- taxInclusiveTotalPrice: '',
- taxRate: '',
- taxExclusiveTotalPrice: '',
- inboundTime: '',
- inboundBatch: '',
- inboundQuantity: ''
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- getStockOutPage({ ...searchForm.value, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.data.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter((item) => item.id);
- console.log("selection", selectedRows.value);
-};
-const expandedRowKeys = ref([]);
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/stockmanagement/export", {}, "鍑哄簱鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delStockOut({ids:ids}).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎵撳嵃鍔熻兘
-const handlePrint = () => {
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
- return;
- }
- printData.value = [...selectedRows.value];
- console.log('鎵撳嵃鏁版嵁:', printData.value);
- printPreviewVisible.value = true;
-};
-
-// 鎵ц鎵撳嵃
-const executePrint = () => {
- console.log('寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:', printData.value.length);
- console.log('鎵撳嵃鏁版嵁:', printData.value);
-
- // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
- const printWindow = window.open('', '_blank', 'width=800,height=600');
-
- // 鏋勫缓鎵撳嵃鍐呭
- let printContent = `
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>鎵撳嵃棰勮</title>
- <style>
- body {
- margin: 0;
- padding: 0;
- font-family: "SimSun", serif;
- background: white;
- }
- .print-page {
- width: 200mm;
- height: 75mm;
- padding: 10mm;
- padding-left: 20mm;
- background: white;
- box-sizing: border-box;
- page-break-after: always;
- page-break-inside: avoid;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- .delivery-note {
- width: 100%;
- height: 100%;
- font-size: 12px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
- color: #000;
- }
- .header {
- text-align: center;
- margin-bottom: 8px;
- }
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
- .document-title {
- font-size: 16px;
- font-weight: bold;
- }
- .info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .info-row {
- line-height: 20px;
- }
- .label {
- font-weight: bold;
- width: 60px;
- font-size: 12px;
- }
- .value {
- margin-right: 20px;
- min-width: 80px;
- font-size: 12px;
- }
- .table-section {
- margin-bottom: 40px;
- // flex: 0.6;
- }
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
- }
- .product-table th, .product-table td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 12px;
- line-height: 1.4;
- }
- .product-table th {
- font-weight: bold;
- }
- .total-value {
- font-weight: bold;
- }
- .footer-section {
- margin-top: auto;
- }
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 22px;
- justify-content: space-between;
- }
- .footer-item {
- display: flex;
- margin-right: 20px;
- }
- .footer-item .label {
- font-weight: bold;
- width: 80px;
- font-size: 12px;
- }
- .footer-item .value {
- min-width: 80px;
- font-size: 12px;
- }
- .address-item .address-value {
- min-width: 200px;
- }
- @media print {
- body {
- margin: 0;
- padding: 0;
- }
- .print-page {
- margin: 0;
- padding: 10mm;
- /* padding-left: 20mm; */
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- }
- </style>
- </head>
- <body>
- `;
-
- // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
- printData.value.forEach((item, index) => {
- printContent += `
- <div class="print-page">
- <div class="delivery-note">
- <div class="header">
- <div class="company-name">榧庤瘹鐟炲疄涓氭湁闄愯矗浠诲叕鍙�</div>
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
- </div>
-
- <div class="info-section">
- <div class="info-row">
- <div>
- <span class="label">鍙戣揣鏃ユ湡锛�</span>
- <span class="value">${formatDate(item.createTime)}</span>
- </div>
- <div>
- <span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">${item.supplierName || '寮犵埍鏈�'}</span>
- </div>
- </div>
- <div class="info-row">
- <span class="label">鍗曞彿锛�</span>
- <span class="value">${item.code || ''}</span>
- </div>
- </div>
-
- <div class="table-section">
- <table class="product-table">
- <thead>
- <tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
- <th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>${item.productCategory || '鐮傜伆鐮�'}</td>
- <td>${item.specificationModel || '鏍囧噯'}</td>
- <td>${item.unit || '鍧�'}</td>
- <td>${item.taxInclusiveUnitPrice || '0'}</td>
- <td>${item.inboundNum || '2000'}</td>
- <td>${item.taxInclusiveTotalPrice || '0'}</td>
- </tr>
- </tbody>
- <tfoot>
- <tr>
- <td class="label">鍚堣</td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value">${item.inboundNum || '2000'}</td>
- <td class="total-value">${item.taxInclusiveTotalPrice || '0'}</td>
- </tr>
- </tfoot>
- </table>
- </div>
-
- <div class="footer-section">
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鏀惰揣鐢佃瘽锛�</span>
- <span class="value"></span>
- </div>
- <div class="footer-item">
- <span class="label">鏀惰揣浜猴細</span>
- <span class="value"></span>
- </div>
- <div class="footer-item address-item">
- <span class="label">鏀惰揣鍦板潃锛�</span>
- <span class="value address-value"></span>
- </div>
- </div>
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">${userStore.nickname || '鎾曞紑鍓�'}</span>
- </div>
- <div class="footer-item">
- <span class="label">鎵撳嵃鏃ユ湡锛�</span>
- <span class="value">${formatDateTime(new Date())}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- });
-
- printContent += `
- </body>
- </html>
- `;
-
- // 鍐欏叆鍐呭鍒版柊绐楀彛
- printWindow.document.write(printContent);
- printWindow.document.close();
-
- // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
- printWindow.onload = () => {
- setTimeout(() => {
- printWindow.print();
- printWindow.close();
- printPreviewVisible.value = false;
- }, 500);
- };
-};
-
-
-
-// 鏍煎紡鍖栨棩鏈�
-const formatDate = (dateString) => {
- if (!dateString) return getCurrentDate();
- const date = new Date(dateString);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- return `${year}/${month}/${day}`;
-};
-
-// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = (date) => {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- const hours = String(date.getHours()).padStart(2, "0");
- const minutes = String(date.getMinutes()).padStart(2, "0");
- const seconds = String(date.getSeconds()).padStart(2, "0");
- return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.print-preview-dialog {
- .el-dialog__body {
- padding: 0;
- max-height: 80vh;
- overflow-y: auto;
- }
-}
-
-.print-preview-container {
- .print-preview-header {
- padding: 15px;
- border-bottom: 1px solid #e4e7ed;
- text-align: center;
-
- .el-button {
- margin: 0 10px;
- }
- }
-
- .print-preview-content {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 400px;
-}
-}
-
-.print-page {
- width: 220mm;
- height: 90mm;
- padding: 10mm;
- margin: 0 auto;
- background: white;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- margin-bottom: 10px;
- box-sizing: border-box;
-}
-
-.delivery-note {
- width: 100%;
- height: 100%;
- font-family: "SimSun", serif;
- font-size: 10px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
-}
-
-.header {
- text-align: center;
- margin-bottom: 8px;
-
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
-
- .document-title {
- font-size: 16px;
- font-weight: bold;
- }
-}
-
-.info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .info-row {
- line-height: 20px;
-
- .label {
- font-weight: bold;
- width: 60px;
- font-size: 14px;
- }
-
- .value {
- margin-right: 20px;
- min-width: 80px;
- font-size: 14px;
- }
- }
-}
-
-.table-section {
- margin-bottom: 4px;
- flex: 1;
-
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
-
- th, td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 14px;
- line-height: 1.4;
- }
-
- th {
- font-weight: bold;
- }
-
- .total-label {
- text-align: right;
- font-weight: bold;
- }
-
- .total-value {
- font-weight: bold;
- }
- }
-}
-
-.footer-section {
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 20px;
- justify-content: space-between;
-
- .footer-item {
- display: flex;
- margin-right: 20px;
-
- .label {
- font-weight: bold;
- width: 80px;
- font-size: 14px;
- }
-
- .value {
- min-width: 80px;
- font-size: 14px;
- }
-
- &.address-item {
- .address-value {
- min-width: 200px;
- }
- }
- }
- }
-}
-
-@media print {
- .app-container {
- display: none;
- }
-
- .print-page {
- box-shadow: none;
- margin: 0;
- padding: 10mm;
- padding-left: 20mm;
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
-}
-</style>
diff --git a/src/views/inventoryManagement/index.vue b/src/views/inventoryManagement/index.vue
deleted file mode 100644
index f371e26..0000000
--- a/src/views/inventoryManagement/index.vue
+++ /dev/null
@@ -1,309 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙戞斁瀛e害锛�</span>
- <el-select
- style="width: 200px;"
- @change="handleQuery"
- v-model="searchForm.season"
- placeholder="璇烽�夋嫨"
- :clearable="false"
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in jidu" :key="item.value" />
- </el-select>
- <span class="search_title ml10">鍛樺伐鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- ref="tableRef"
- v-loading="tableLoading"
- :data="tableData"
- border
- height="calc(100vh - 21em)"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- style="width: 100%"
- @selection-change="handleSelectionChange"
- >
- <!-- 閫夋嫨鍒� -->
- <el-table-column
- align="center"
- type="selection"
- width="55"
- fixed="left"
- />
-
- <!-- 搴忓彿鍒� -->
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- fixed="left"
- />
-
- <!-- 鍥哄畾鍒楋細濮撳悕 -->
- <el-table-column
- label="濮撳悕"
- prop="staffName"
- width="100"
- show-overflow-tooltip
- align="center"
- fixed="left"
- />
-
- <!-- 鍥哄畾鍒楋細宸ュ彿 -->
- <el-table-column
- label="宸ュ彿"
- prop="staffNo"
- width="100"
- show-overflow-tooltip
- align="center"
- fixed="left"
- />
-
- <!-- 鍔ㄦ�佸垪锛氭牴鎹瓧鍏告覆鏌� -->
- <el-table-column
- v-for="(dictItem, index) in sys_lavor_issue"
- :key="dictItem.value"
- :label="dictItem.label"
- :prop="dictItem.value"
- show-overflow-tooltip
- >
- </el-table-column>
-
- <!-- 鎿嶄綔鍒� -->
- <el-table-column
- label="鎿嶄綔"
- width="150"
- align="center"
- fixed="right"
- >
- <template #default="scope">
- <el-button
- type="primary"
- link
- size="small"
- @click="edit(scope.row)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- link
- size="small"
- :disabled="!!scope.row.adoptedDate"
- @click="adopted(scope.row)"
- >
- 棰嗙敤
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <!-- <Modal ref="modalRef" @success="handleQuery"></Modal> -->
- <!-- <files-dia ref="filesDia"></files-dia> -->
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, reactive, toRefs, nextTick, getCurrentInstance } from 'vue'
-import dayjs from "dayjs";
-// import Modal from "./Modal.vue";
-// import FilesDia from "./filesDia.vue";
-import Pagination from "@/components/Pagination/index.vue";
-import {listPage, deleteLedger, update} from "@/api/lavorissce/ledger.js";
-import {ElMessageBox, ElMessage} from "element-plus";
-const { proxy } = getCurrentInstance();
-import { getCurrentMonth } from "@/utils/util"
-
-const page = ref({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-// 鍝嶅簲寮忔暟鎹�
-const tableRef = ref(null)
-const tableData = ref([])
-const tableLoading = ref(false)
-const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue")
-const data = reactive({
- searchForm: {
- season: "",
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const modalRef = ref();
-// const filesDia = ref();
-const multipleList = ref([]);
-const jidu = ref([
- {
- value: '1',
- label: '绗竴瀛e害'
- },
- {
- value: '2',
- label: '绗簩瀛e害'
- },
- {
- value: '3',
- label: '绗笁瀛e害'
- },
- {
- value: '4',
- label: '绗洓瀛e害'
- }
-])
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-// 鑾峰彇瀛楀吀鏁版嵁
-const getList = async () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page.value };
- listPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (row) => {
- modalRef.value.loadForm(row);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await deleteLedger(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- await getList();
- }
- });
-};
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/lavorIssue/exportCopy`, {season: searchForm.value.season}, "鍔充繚鍙拌处.xlsx");
- })
- .catch(() => {
- ElMessage.info("宸插彇娑�");
- });
-};
-const adopted = (row) => {
- ElMessageBox.confirm("鏄惁纭棰嗙敤?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const params = {
- id: row.id,
- adoptedDate: dayjs().format("YYYY-MM-DD")
- }
- const { code } = await update(params);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "棰嗙敤鎴愬姛",
- });
- await getList();
- }
- })
-}
-// 鎵撳紑闄勪欢寮规
-// const openFilesFormDia = (row) => {
-// nextTick(() => {
-// filesDia.value?.openDialog( row,'鏀跺叆')
-// })
-// };
-// 浜嬩欢澶勭悊鍑芥暟
-const handleSelectionChange = (selection) => {
- multipleList.value = selection;
-}
-
-const paginationChange = (pagination) => {
- page.value.current = pagination.page;
- page.value.size = pagination.limit;
- getList();
-}
-
-// 缁勪欢鎸傝浇鏃跺姞杞藉瓧鍏告暟鎹�
-onMounted(() => {
- handleQuery()
-})
-</script>
-
-<style scoped>
-.dynamic-table-container {
- width: 100%;
-}
-
-.pagination-container {
- margin-top: 20px;
- display: flex;
- justify-content: flex-end;
-}
-
-:deep(.el-table .el-table__header-wrapper th) {
- background-color: #F0F1F5 !important;
- color: #333333;
- font-weight: 600;
-}
-
-:deep(.el-table .el-table__body-wrapper td) {
- padding: 8px 0;
-}
-
-:deep(.el-select) {
- width: 100%;
-}
-
-:deep(.el-input) {
- width: 100%;
-}
-</style>
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
deleted file mode 100644
index 7a1363c..0000000
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ /dev/null
@@ -1,282 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板鍑哄簱</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> -->
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="鍏ュ簱鏃堕棿" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鎵规" prop="inboundBatches" width="160" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
- <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="90" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm(scope.row);">棰嗙敤</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="40%" @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="鍑哄簱鏁伴噺锛�" prop="salesContractNo">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.inboundQuantity" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- <el-form-item label="鍑哄簱鏃ユ湡锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.inboundTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- <el-form-item label="鍑哄簱浜猴細" prop="entryPerson">
- <el-select v-model="form.nickName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import {
- getStockInPage
-} from "@/api/inventoryManagement/stockIn.js";
-import {
- getStockManagePage,
- delStockManage,
- stockOut,
-} from "@/api/inventoryManagement/stockManage.js";
-
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-const tableLoading = ref(false)
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false)
-const data = reactive({
- searchForm: {
- supplierName: '',
- inboundQuantity:'',
- inboundTime:'',
- nickName: '',
- userId: '',
- },
- form: {
- productrecordId: '',
- },
- rules: {
- inboundTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- inboundQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nickname: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockInPage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- total.value = res.data.total
- console.log('res', res.data.records)
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
-}
-const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
-};
-const currentRowId = ref(null) // 鏂板锛氬瓨鍌ㄥ綋鍓嶆搷浣滅殑琛孖D
-
-const currentRowNum = ref(0)
-const salesLedgerProductId = ref(null);
-
-// 鎵撳紑寮规
-const openForm = async (row) => {
- dialogFormVisible.value = true
- currentRowId.value = row.id
- currentRowNum.value = row.inboundNum0
- salesLedgerProductId.value = row.salesLedgerProductId
- form.value = {}
- // 鍒濆鍖栬〃鍗曟暟鎹�
- form.value = {
- productrecordId: '',
- inboundQuantity: '', // 鍑哄簱鏁伴噺娓呯┖
- inboundTime: getCurrentDate(), // 榛樿褰撳墠鏃ユ湡
- nickName: '', // 榛樿褰撳墠鐢ㄦ埛
- }
- console.log('form',form.value)
- // 鍔犺浇鐢ㄦ埛鍒楄〃
- try {
- const userLists = await userListNoPageByTenantId()
- userList.value = userLists.data
- } catch (error) {
- console.error('鍔犺浇鐢ㄦ埛鍒楄〃澶辫触:', error)
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- let num = Number(form.value.inboundQuantity)
- if(num <= 0 || num > currentRowNum.value){
- return proxy.$modal.msgWarning("璇峰~鍏ユ湁鏁堟暟瀛�")
- }
- proxy.$refs["formRef"].validate(valid => {
- if (valid && currentRowId.value) {
- const outData = {
- id: currentRowId.value, // 鍘熷璁板綍ID
- salesLedgerProductId: salesLedgerProductId.value,
- quantity: form.value.inboundQuantity, // 鍑哄簱鏁伴噺
- time: form.value.inboundTime, // 鍑哄簱鏃堕棿
- userId: form.value.nickName // 鎿嶄綔浜�
- }
- console.log(outData)
-
- stockOut(outData).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
- closeDia()
- getList()
- }).catch(err => {
- proxy.$modal.msgError("鍑哄簱澶辫触")
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef")
- dialogFormVisible.value = false
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/export", {}, '鍏ュ簱鍙拌处.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockManage(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList()
-})
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/receiptManagement/index.vue b/src/views/inventoryManagement/receiptManagement/index.vue
deleted file mode 100644
index acf0b68..0000000
--- a/src/views/inventoryManagement/receiptManagement/index.vue
+++ /dev/null
@@ -1,451 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏ュ簱</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="鍏ュ簱鏃堕棿" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鎵规" prop="inboundBatches" width="160" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
-
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板鍏ュ簱' : '缂栬緫鍏ュ簱'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="閲囪喘璁㈠崟鍙�" prop="salesContractNo">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="璇疯緭鍏ュ悎鍚屽彿"
- clearable
- @change="searchByContractNo"
- :disabled="operationType === 'edit'"
- >
- <template #append>
- <el-button
- icon="Search"
- @click="searchByContractNo"
- :loading="loadingProducts"
- />
- </template>
- </el-input>
- </el-form-item>
- <el-table
- :data="productList"
- border
- v-loading="loadingProducts"
- @selection-change="handleSelectionChange"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="渚涘簲鍟�" prop="supplierName" width="100" />
- <el-table-column label="閲囪喘鏁伴噺" prop="quantity" width="100" />
- <el-table-column label="寰呭叆搴撴暟閲�" prop="quantity0" width="100" />
- <el-table-column label="鏈鍏ュ簱鏁伴噺" prop="quantityStock" width="150">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" :max="scope.row.quantity0" />
- </template>
- </el-table-column>
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="120" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import {
- getStockInPage,
- updateStockIn,
- addSutockIn,
- delStockIn,
- selectProductRecordListByPuechaserId
-} from "@/api/inventoryManagement/stockIn.js";
-
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-
-const tableData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-
-
-const loading = ref(false);
-const tableLoading = ref(false)
-
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')// 鎿嶄綔绫诲瀷: 'add' 鎴� 'edit'
-const dialogFormVisible = ref(false)// 寮规鏄剧ず鐘舵��
-const productList = ref([]);// 浜у搧鍒楄〃鏁版嵁
-const loadingProducts = ref(false);// 浜у搧鍔犺浇鐘舵��
-const productSelectedRows = ref([]) // 浜у搧琛ㄦ牸閫変腑琛�
-const data = reactive({
- searchForm: {
- supplierName: '',
- },
- form: {
- id: null,
- purchaseContractNumber: '', // 閲囪喘璁㈠崟鍙�
- supplierId: null, // 渚涘簲鍟咺D
- supplierName: '', // 渚涘簲鍟嗗悕绉�
- inboundTime: '', // 鍏ュ簱鏃堕棿
- inboundBatch: '', // 鍏ュ簱鎵规
- recorderId: userStore.userId, // 褰曞叆浜篒D
- recorderName: userStore.name, // 褰曞叆浜哄鍚�
- entryDate: getCurrentDate(), // 褰曞叆鏃ユ湡
- remark: '', // 澶囨敞
- },
- rules: {
- purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
- supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }],
- inboundTime: [{ required: true, message: "璇烽�夋嫨鍏ュ簱鏃堕棿", trigger: "change" }],
- inboundBatch: [{ required: true, message: "璇疯緭鍏ュ叆搴撴壒娆�", trigger: "blur" }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockInPage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- total.value = res.data.total
- console.log('tableData:', tableData.value)
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-
-// 璋冪敤selectProductRecordListByPuechaserId杩欎釜鏂规硶鏍规嵁鍚堝悓鏌ヨ鍒癷d锛屽啀璋冪敤getProductRecordByhetong杩欎釜鏂规硶鏍规嵁id鏌ヨ鍒颁骇鍝佽鍗曡褰�
-// 鏂板鏍规嵁鍚堝悓鍙锋煡璇骇鍝佽褰曠殑鏂规硶
-const searchByContractNo = async () =>
-{
- if (!form.value.purchaseContractNumber) {
- proxy.$modal.msgWarning('璇疯緭鍏ュ悎鍚屽彿')
- return
- }
- try {
- loadingProducts.value = true
- // 鏍规嵁鍚堝悓鏌ヨ浜у搧璁板綍
- const productRes = await selectProductRecordListByPuechaserId({
- purchaseContractNumber: form.value.purchaseContractNumber
- });
- console.log('productRes:', productRes)
- if (!productRes.data || productRes.data.length === 0) {
- proxy.$modal.msgWarning('璇ュ悎鍚屼笅娌℃湁浜у搧璁板綍')
- productList.value = [];
- return
- }
- // 澶勭悊浜у搧鏁版嵁锛屾坊鍔犳湰娆″叆搴撴暟閲忓瓧娈�
- productList.value = productRes.data.map(item => ({
- ...item,
- quantityStock: 0 // 鍒濆鍖栨湰娆″叆搴撴暟閲忎负0
- }))
- } catch (error) {
- console.error('鏌ヨ浜у搧璁板綍澶辫触:', error)
- proxy.$modal.msgError('鏌ヨ浜у搧璁板綍澶辫触')
- productList.value = [];
- } finally {
- loadingProducts.value = false
- }
-}
-
-
-// 鎵撳紑寮规
- const openForm = async (type, row) => {
- operationType.value = type
- dialogFormVisible.value = true
- selectedRows.value = []
-
- if (type === 'add') {
- // 鏂板鏃跺垵濮嬪寲琛ㄥ崟
- form.value = {
- id: null,
- purchaseContractNumber: '',
- supplierId: null,
- supplierName: '',
- inboundTime: '',
- inboundBatch: '',
- recorderId: userStore.userId,
- recorderName: userStore.name,
- entryDate: getCurrentDate(),
- remark: ''
- }
- productList.value = [] // 娓呯┖浜у搧鍒楄〃
- } else {
- form.value = JSON.parse(JSON.stringify(row))
- try {
- loadingProducts.value = true
- // 鏍规嵁鍚堝悓鍙峰姞杞藉搴旂殑浜у搧鍒楄〃锛堝亣璁� getProductByContract 鏄彲鐢ㄦ帴鍙o級
- const res = await selectProductRecordListByPuechaserId({
- purchaseContractNumber: form.value.purchaseContractNumber,
- id: row.id
- });
- productList.value = res.data.map(item => ({
- ...item,
- quantityStock: row.inboundNum // 濡傛灉宸叉湁鍏ュ簱鏁伴噺鍒欎繚鐣�
- }))
- selectedRows.value = productList.value
- } catch (error) {
- console.error('鍔犺浇浜у搧澶辫触:', error)
- proxy.$modal.msgError('鍔犺浇浜у搧澶辫触')
- productList.value = []
- } finally {
- loadingProducts.value = false
- }
- }
- }
-
- const updatePro = async () => {
- // 鍑嗗鎻愪氦鏁版嵁
- // 鍑嗗鎻愪氦鏁版嵁 - 淇敼涓哄悗绔渶瑕佺殑鏍煎紡
- const stockInData = {
- id: selectedRows.value[0].recordId,
- quantityStock: Number(selectedRows.value[0].quantityStock),// 浣跨敤鏂版牸寮忓寲鍑芥暟
- };
- await updateStockIn(stockInData)
- proxy.$modal.msgSuccess('淇敼鍏ュ簱鎴愬姛')
- closeDia()
- getList() // 鍒锋柊鍒楄〃
- }
-
-// 鎻愪氦琛ㄥ崟
- const submitForm = async () => {
- // 楠岃瘉鑷冲皯閫夋嫨浜嗕竴涓骇鍝�
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgError('璇峰厛鏌ヨ骞堕�夋嫨浜у搧')
- return
- }
- if(operationType.value !== 'add'){
- await updatePro()
- return
- }
- try {
- await proxy.$refs.formRef.validate()
- // 楠岃瘉鍏ュ簱鏁伴噺
- const invalidProducts = selectedRows.value.filter(
- product => product.quantityStock <= 0 || product.quantityStock > product.quantity0
- )
-
- if (invalidProducts.length > 0) {
- proxy.$modal.msgError('璇蜂负鎵�鏈変骇鍝佽緭鍏ユ湁鏁堢殑鍏ュ簱鏁伴噺')
- return
- }
-
- // 鍑嗗鎻愪氦鏁版嵁
- // 鍑嗗鎻愪氦鏁版嵁 - 淇敼涓哄悗绔渶瑕佺殑鏍煎紡
- const stockInData = {
- // 鍏ュ簱鍗曞熀鏈俊鎭�
- ...form.value,
- inboundTime: formatDateTime(form.value.inboundTime),
- nickName: userStore.nickName,// 浣跨敤鏂版牸寮忓寲鍑芥暟
- details: selectedRows.value.map(product => ({
- id: product.id,
- inboundQuantity: Number(product.quantityStock)
- })),
- };
- console.log('鍑嗗鎻愪氦鐨勬暟鎹�:', JSON.parse(JSON.stringify(stockInData)));
- // 璋冪敤API
- loading.value = true
- await addSutockIn(stockInData)
-
- proxy.$modal.msgSuccess('鏂板鍏ュ簱鎴愬姛')
- closeDia()
- getList() // 鍒锋柊鍒楄〃
-
- } catch (error) {
- console.error('鎻愪氦澶辫触:', error)
- if (!error.errors) {
- proxy.$modal.msgError('鎿嶄綔澶辫触锛岃閲嶈瘯')
- }
- } finally {
- loading.value = false
- }
- }
-
-// 鍏抽棴寮规
- const closeDia = () => {
- proxy.$refs.formRef.resetFields()
- dialogFormVisible.value = false
-
- }
-// 琛ㄦ牸閫夋嫨鏁版嵁
- const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
- }
-
- const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
- const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
- };
-
-// 瀵煎嚭
- const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/export", {}, '鍏ュ簱鍙拌处.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
- }
-// 鍒犻櫎
- const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockIn({ids:ids}).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
- }
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-// 淇敼涓烘洿閫氱敤鐨勬棩鏈熸椂闂存牸寮忓寲鍑芥暟
-function formatDateTime(date = new Date(), includeTime = true) {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
-
- if (!includeTime) {
- return `${year}-${month}-${day}`; // 淇濇寔鍘熸湁 getCurrentDate 鍔熻兘
- }
-
- // 鏂板鏃堕棿閮ㄥ垎鏍煎紡鍖�
- const hours = String(d.getHours()).padStart(2, '0');
- const minutes = String(d.getMinutes()).padStart(2, '0');
- const seconds = String(d.getSeconds()).padStart(2, '0');
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-// 淇濇寔鍘熸湁 getCurrentDate 鐨勫吋瀹规��
-function getCurrentDate() {
- return formatDateTime(new Date(), false);
-}
-
-
-
-
- onMounted(() => {
- getList()
- })
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/stockManagement/index.vue b/src/views/inventoryManagement/stockManagement/index.vue
deleted file mode 100644
index b4a29eb..0000000
--- a/src/views/inventoryManagement/stockManagement/index.vue
+++ /dev/null
@@ -1,382 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="搴撳瓨鏃ユ湡" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏃ユ湡" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="80" show-overflow-tooltip />
- <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="100" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板搴撳瓨' : '缂栬緫搴撳瓨'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input disabled v-model="form.supplierName" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧澶х被锛�" prop="productId">
- <el-select disabled v-model="form.productCategory" placeholder="璇烽�夋嫨" clearable filterable @change="handleProductChange">
- <el-option v-for="item in productList" :key="item.id" :label="item.productName"
- :value="item.productName" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productManageId">
- <el-select disabled v-model="form.specificationModel" placeholder="璇峰厛閫夋嫨浜у搧澶х被" clearable filterable :disabled="!form.productCategory"
- @change="handleModelChange">
- <el-option v-for="item in productModelList" :key="item.id" :label="item.model"
- :value="item.id" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="customerId">
- <el-input disabled v-model="form.unit" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴撳瓨鏃堕棿锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.updateTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏ュ簱鏃堕棿锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.createTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环锛�" prop="customerId">
- <el-input disabled v-model="form.taxInclusiveUnitPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环锛�" prop="customerContractNo">
- <el-input disabled v-model="form.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="绋庣巼锛�" prop="customerId">
- <el-input disabled v-model="form.taxRate" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环锛�" prop="entryDate">
- <el-input disabled v-model="form.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="鍑哄簱浜猴細" prop="entryPerson">
- <el-select v-model="form.createUser" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import { productTreeList,modelList } from "@/api/basicData/product.js"
-import {
- getStockManagePage ,
- updateStockManage,
- delStockManage,
- exportStockManage
-} from "@/api/inventoryManagement/stockManage.js";
-import {
- updateManagement
-} from "@/api/inventoryManagement/stockIn.js";
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-const productList = ref([])
-const productModelList = ref([])
-// const customerOption = ref([])
-const tableLoading = ref(false)
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
-const data = reactive({
- searchForm: {
- supplierName: '',
- },
- form: {
- supplierId: null,
- supplierName: '',
- productId: null,
- productName: '',
- userId: userStore.userId,
- nickName: '',
- productModelId: null,
- model: '',
- unit: '',
- productrecordId: null,
- taxInclusiveUnitPrice: '',
- taxInclusiveTotalPrice: '',
- taxRate: '',
- taxExclusiveTotalPrice: '',
- inboundTime: '',
- inboundBatch: '',
- stockQuantity: '',
- boundTime: '',
- },
- rules: {
- supplierName: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢鍚嶇О', trigger: 'blur' }],
- productCategory: [{ required: true, message: '璇烽�夋嫨浜у搧澶х被', trigger: 'change' }],
- specificationModel: [{ required: true, message: '璇疯緭鍏ヨ鏍煎瀷鍙�', trigger: 'blur' }],
- unit: [{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: 'blur' }],
- stockQuantity: [{ required: true, message: '璇疯緭鍏ュ嚭搴撴暟閲�', trigger: 'blur' }],
- taxInclusiveUnitPrice: [{ required: true, message: '璇疯緭鍏ュ惈绋庡崟浠�', trigger: 'blur' }],
- taxInclusiveTotalPrice: [{ required: true, message: '璇疯緭鍏ュ惈绋庢�讳环', trigger: 'blur' }],
- taxRate: [{ required: true, message: '璇疯緭鍏ョ◣鐜�', trigger: 'blur' }],
- taxExclusiveTotalPrice: [{ required: true, message: '璇疯緭鍏ヤ笉鍚◣鎬讳环', trigger: 'blur' }],
- boundTime: [{ required: true, message: '璇烽�夋嫨搴撳瓨鏃堕棿', trigger: 'change' }],
- inboundTime: [{ required: true, message: '璇烽�夋嫨鍏ュ簱鏃堕棿', trigger: 'change' }],
- inboundPerson: [{ required: true, message: '璇烽�夋嫨鍑哄簱浜�', trigger: 'change' }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockManagePage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- console.log('res', res)
- // tableData.value.map(item => {
- // item.children = []
- // })
- total.value = res.data.total
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
-}
-const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
-};
-
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
- operationType.value = type
- form.value = {}
- productData.value = []
- let userLists = await userListNoPageByTenantId()
- userList.value = userLists.data
- // customerList().then(res => {
- // customerOption.value = res
- // })
- // console.log('userStore.id', userStore.id)
- // form.value.entryPerson = userStore.id
- if (type === 'edit') {
- form.value = { ...row }
- productTreeList().then(res =>{
- productList.value = res
- productList.value.forEach(i =>{
- if (i.label === row.productCategory) {
- modelList({ id: i.id }).then((res) => {
- productModelList.value = res;
- });
- }
- })
- })
-
-
- // getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
-
- // form.value.entryPerson = Number(res.entryPerson)
- // productData.value = form.value.productData
- // fileList.value = form.value.salesLedgerFiles
- // })
- }
- form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
- dialogFormVisible.value = true
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- console.log(form.value)
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- // if (productData.value.length > 0) {
- // form.value.productData = proxy.HaveJson(productData.value)
- // } else {
- // proxy.$modal.msgWarning('璇锋坊鍔犱骇鍝佷俊鎭�')
- // return
- // }
- // let tempFileIds = []
- // if (fileList.value.length > 0) {
- // tempFileIds = fileList.value.map(item => item.tempId)
- // }
- // form.value.tempFileIds = tempFileIds
- // form.value.type = 1
- updateManagement(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
- closeDia()
- getList()
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef")
- dialogFormVisible.value = false
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/exportCopy", {}, '搴撳瓨淇℃伅.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockManage({ids:ids}).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList()
-})
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/stockWarning/index.vue b/src/views/inventoryManagement/stockWarning/index.vue
deleted file mode 100644
index 89d396e..0000000
--- a/src/views/inventoryManagement/stockWarning/index.vue
+++ /dev/null
@@ -1,943 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 鎼滅储琛ㄥ崟 -->
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="鍌ㄦ皵缃愬悕绉帮細">
- <el-input v-model="searchForm.tankName" placeholder="璇疯緭鍏ュ偍姘旂綈鍚嶇О" clearable style="width: 200px" />
- </el-form-item>
- <el-form-item label="鍌ㄦ皵缃愮被鍨嬶細">
- <el-select v-model="searchForm.tankType" placeholder="璇烽�夋嫨鍌ㄦ皵缃愮被鍨�" clearable style="width: 200px">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- <el-form-item label="棰勮绫诲瀷锛�">
- <el-select v-model="searchForm.warningType" placeholder="璇烽�夋嫨棰勮绫诲瀷" clearable style="width: 200px">
- <el-option label="姘斾綋涓嶈冻" value="姘斾綋涓嶈冻" />
- <el-option label="鍘嬪姏寮傚父" value="鍘嬪姏寮傚父" />
- <el-option label="娓╁害寮傚父" value="娓╁害寮傚父" />
- <el-option label="娉勬紡棰勮" value="娉勬紡棰勮" />
- </el-select>
- </el-form-item>
- <el-form-item label="棰勮绾у埆锛�">
- <el-select v-model="searchForm.warningLevel" placeholder="璇烽�夋嫨棰勮绾у埆" clearable style="width: 200px">
- <el-option label="绱ф��" value="绱ф��" />
- <el-option label="閲嶈" value="閲嶈" />
- <el-option label="涓�鑸�" value="涓�鑸�" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- <el-button @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <!-- 鏁版嵁琛ㄦ牸 -->
- <div class="table_list">
- <!-- 鎿嶄綔鎸夐挳 -->
- <div class="table-operations">
- <el-button type="primary" @click="handleAdd">鏂板棰勮瑙勫垯</el-button>
- <!-- <el-button type="success" @click="handleBatchProcess">鎵归噺澶勭悊@</el-button> -->
- <el-button @click="handleExport">瀵煎嚭</el-button>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- style="width: 100%"
- height="calc(100vh - 280px)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-
- <!-- 鍩虹淇℃伅瀛楁 -->
- <el-table-column label="鍌ㄦ皵缃愮紪鐮�" prop="tankCode" width="120" show-overflow-tooltip />
- <el-table-column label="鍌ㄦ皵缃愬悕绉�" prop="tankName" width="200" show-overflow-tooltip />
- <el-table-column label="鍌ㄦ皵缃愮被鍨�" prop="tankType" width="120" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" show-overflow-tooltip />
- <el-table-column label="瀹圭Н(m鲁)" prop="volume" width="100" show-overflow-tooltip />
-
- <!-- 搴撳瓨鐩稿叧瀛楁 -->
- <el-table-column label="褰撳墠姘斾綋閲�" prop="currentGasLevel" width="120" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getGasLevelClass(scope.row)">{{ scope.row.currentGasLevel }}%</span>
- </template>
- </el-table-column>
- <el-table-column label="瀹夊叏姘斾綋閲�" prop="safetyGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�浣庢皵浣撻噺" prop="minGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�楂樻皵浣撻噺" prop="maxGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="褰撳墠鍘嬪姏(MPa)" prop="currentPressure" width="140" show-overflow-tooltip />
-
- <!-- 棰勮瑙勫垯瀛楁 -->
- <el-table-column label="棰勮绫诲瀷" prop="warningType" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getWarningTypeTag(scope.row.warningType)">
- {{ scope.row.warningType }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="棰勮绾у埆" prop="warningLevel" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getWarningLevelTag(scope.row.warningLevel)">
- {{ scope.row.warningLevel }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="棰勮闃堝��" prop="warningThreshold" width="100" show-overflow-tooltip />
- <el-table-column label="鏄惁鍚敤" prop="isEnabled" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-switch v-model="scope.row.isEnabled" @change="handleEnableChange(scope.row)" />
- </template>
- </el-table-column>
-
- <!-- 鏃堕棿鐩稿叧瀛楁 -->
- <el-table-column label="棰勮鏃堕棿" prop="warningTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮鎸佺画澶╂暟" prop="warningDuration" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�鍚庢洿鏂版椂闂�" prop="lastUpdateTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮鍏呰鏃堕棿" prop="expectedRefillTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮缂烘皵鏃堕棿" prop="expectedShortageTime" width="150" show-overflow-tooltip>
- <template #default="scope">
- <div v-if="scope.row.expectedShortageTime">
- <div v-if="getCountdown(scope.row.expectedShortageTime).isExpired" class="countdown-expired">
- <el-tag type="danger">宸茬己姘�</el-tag>
- </div>
- <div v-else class="countdown-timer">
- <span :class="getCountdownClass(scope.row.expectedShortageTime)">
- {{ getCountdown(scope.row.expectedShortageTime).text }}
- </span>
- </div>
- </div>
- <span v-else>-</span>
- </template>
- </el-table-column>
-
- <!-- 鎿嶄綔鍒� -->
- <el-table-column fixed="right" label="鎿嶄綔" width="200" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="success" size="small" @click="handleProcess(scope.row)">澶勭悊@</el-button>
- <el-button link type="danger" size="small" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
-
- <!-- 鏂板/缂栬緫棰勮瑙勫垯寮圭獥 -->
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板棰勮瑙勫垯' : '缂栬緫棰勮瑙勫垯'"
- width="50%"
- @close="closeDialog"
- >
- <el-form :model="form" :rules="rules" ref="formRef" label-width="140px">
- <el-row :gutter="20">
- <!-- 鍩虹淇℃伅 -->
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愮紪鐮侊細" prop="tankCode">
- <el-input v-model="form.tankCode" placeholder="璇疯緭鍏ュ偍姘旂綈缂栫爜" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愬悕绉帮細" prop="tankName">
- <el-input v-model="form.tankName" placeholder="璇疯緭鍏ュ偍姘旂綈鍚嶇О" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愮被鍨嬶細" prop="tankType">
- <el-select v-model="form.tankType" placeholder="璇烽�夋嫨鍌ㄦ皵缃愮被鍨�" style="width: 100%">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="specificationModel">
- <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹圭Н(m鲁)锛�" prop="volume">
- <el-input-number v-model="form.volume" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撳墠姘斾綋閲�(%)锛�" prop="currentGasLevel">
- <el-input-number v-model="form.currentGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 搴撳瓨鐩稿叧 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹夊叏姘斾綋閲�(%)锛�" prop="safetyGasLevel">
- <el-input-number v-model="form.safetyGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈�浣庢皵浣撻噺(%)锛�" prop="minGasLevel">
- <el-input-number v-model="form.minGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏈�楂樻皵浣撻噺(%)锛�" prop="maxGasLevel">
- <el-input-number v-model="form.maxGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撳墠鍘嬪姏(MPa)锛�" prop="currentPressure">
- <el-input-number v-model="form.currentPressure" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 棰勮瑙勫垯 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮绫诲瀷锛�" prop="warningType">
- <el-select v-model="form.warningType" placeholder="璇烽�夋嫨棰勮绫诲瀷" style="width: 100%">
- <el-option label="姘斾綋涓嶈冻" value="姘斾綋涓嶈冻" />
- <el-option label="鍘嬪姏寮傚父" value="鍘嬪姏寮傚父" />
- <el-option label="娓╁害寮傚父" value="娓╁害寮傚父" />
- <el-option label="娉勬紡棰勮" value="娉勬紡棰勮" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮绾у埆锛�" prop="warningLevel">
- <el-select v-model="form.warningLevel" placeholder="璇烽�夋嫨棰勮绾у埆" style="width: 100%">
- <el-option label="绱ф��" value="绱ф��" />
- <el-option label="閲嶈" value="閲嶈" />
- <el-option label="涓�鑸�" value="涓�鑸�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮闃堝�硷細" prop="warningThreshold">
- <el-input-number v-model="form.warningThreshold" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄惁鍚敤锛�" prop="isEnabled">
- <el-switch v-model="form.isEnabled" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 鏃堕棿鐩稿叧 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮鏃堕棿锛�" prop="warningTime">
- <el-date-picker
- v-model="form.warningTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮鍏呰鏃堕棿锛�" prop="expectedRefillTime">
- <el-date-picker
- v-model="form.expectedRefillTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮鍏呰鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮缂烘皵鏃堕棿锛�" prop="expectedShortageTime">
- <el-date-picker
- v-model="form.expectedShortageTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮缂烘皵鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮瑙勫垯鎻忚堪锛�" prop="warningRule">
- <el-input
- v-model="form.warningRule"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ラ璀﹁鍒欐弿杩�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDialog">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 缂烘皵棰勮寮规 -->
- <el-dialog
- v-model="shortageWarningVisible"
- title="鈿狅笍 缂烘皵棰勮"
- width="400px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- :show-close="false"
- >
- <div class="shortage-warning-content">
- <div class="warning-icon">
- <el-icon size="48" color="#f56c6c"><WarningFilled /></el-icon>
- </div>
- <div class="warning-message">
- <h3>{{ currentWarningTank.tankName }}</h3>
- <p>鍌ㄦ皵缃愬凡缂烘皵锛岃鍙婃椂澶勭悊锛�</p>
- <p class="warning-details">
- 鍌ㄦ皵缃愮紪鐮侊細{{ currentWarningTank.tankCode }}<br>
- 鍌ㄦ皵缃愮被鍨嬶細{{ currentWarningTank.tankType }}<br>
- 褰撳墠姘斾綋閲忥細{{ currentWarningTank.currentGasLevel }}%
- </p>
- </div>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleShortageWarning">绔嬪嵆澶勭悊</el-button>
- <el-button @click="closeShortageWarning">绋嶅悗澶勭悊</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 缂烘皵棰勮寮规 -->
- <el-dialog
- v-model="shortageWarningVisible"
- title="鈿狅笍 缂烘皵棰勮"
- width="400px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- :show-close="false"
- >
- <div class="shortage-warning-content">
- <div class="warning-icon">
- <el-icon size="48" color="#f56c6c"><WarningFilled /></el-icon>
- </div>
- <div class="warning-message">
- <h3>{{ currentWarningTank.tankName }}</h3>
- <p>鍌ㄦ皵缃愬凡缂烘皵锛岃鍙婃椂澶勭悊锛�</p>
- <p class="warning-details">
- 鍌ㄦ皵缃愮紪鐮侊細{{ currentWarningTank.tankCode }}<br>
- 鍌ㄦ皵缃愮被鍨嬶細{{ currentWarningTank.tankType }}<br>
- 褰撳墠姘斾綋閲忥細{{ currentWarningTank.currentGasLevel }}%
- </p>
- </div>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleShortageWarning">绔嬪嵆澶勭悊</el-button>
- <el-button @click="closeShortageWarning">绋嶅悗澶勭悊</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { WarningFilled } from '@element-plus/icons-vue'
-import pagination from '@/components/PIMTable/Pagination.vue'
-// 娉ㄩ噴鎺堿PI瀵煎叆锛屼娇鐢ㄥ亣鏁版嵁
-import {
- getStockWarningPage,
- addStockWarning,
- updateStockWarning,
- deleteStockWarning,
- batchProcessStockWarning,
- exportStockWarning,
- toggleStockWarningStatus
-} from '@/api/inventoryManagement/stockWarning.js'
-
-const { proxy } = getCurrentInstance()
-
-// 鍝嶅簲寮忔暟鎹�
-const tableData = ref([])
-const tableLoading = ref(false)
-const selectedRows = ref([])
-const dialogFormVisible = ref(false)
-const operationType = ref('add')
-const total = ref(0)
-
-// 缂烘皵棰勮鐩稿叧
-const shortageWarningVisible = ref(false)
-const currentWarningTank = ref({})
-const countdownTimer = ref(null)
-
-// 鍒嗛〉鍙傛暟
-const page = reactive({
- current: 1,
- size: 10,
- total: 0
-})
-
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
- tankName: '',
- tankType: '',
- warningType: '',
- warningLevel: ''
-})
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- id: null,
- tankCode: '',
- tankName: '',
- tankType: '',
- specificationModel: '',
- volume: 0,
- currentGasLevel: 0,
- safetyGasLevel: 0,
- minGasLevel: 0,
- maxGasLevel: 0,
- currentPressure: 0,
- warningType: '',
- warningLevel: '',
- warningThreshold: 0,
- isEnabled: true,
- warningTime: '',
- warningDuration: 0,
- lastUpdateTime: '',
- expectedRefillTime: '',
- expectedShortageTime: '',
- warningRule: ''
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- tankCode: [{ required: true, message: '璇疯緭鍏ュ偍姘旂綈缂栫爜', trigger: 'blur' }],
- tankName: [{ required: true, message: '璇疯緭鍏ュ偍姘旂綈鍚嶇О', trigger: 'blur' }],
- tankType: [{ required: true, message: '璇烽�夋嫨鍌ㄦ皵缃愮被鍨�', trigger: 'change' }],
- warningType: [{ required: true, message: '璇烽�夋嫨棰勮绫诲瀷', trigger: 'change' }],
- warningLevel: [{ required: true, message: '璇烽�夋嫨棰勮绾у埆', trigger: 'change' }],
- warningThreshold: [{ required: true, message: '璇疯緭鍏ラ璀﹂槇鍊�', trigger: 'blur' }]
-}
-
-// 鑾峰彇鍊掕鏃朵俊鎭�
-const getCountdown = (expectedTime) => {
- if (!expectedTime) return { text: '-', isExpired: false }
-
- const now = new Date().getTime()
- const expected = new Date(expectedTime).getTime()
- const diff = expected - now
-
- if (diff <= 0) {
- return { text: '宸茬己姘�', isExpired: true }
- }
-
- const days = Math.floor(diff / (1000 * 60 * 60 * 24))
- const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
- const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
-
- if (days > 0) {
- return { text: `${days}澶�${hours}灏忔椂`, isExpired: false }
- } else if (hours > 0) {
- return { text: `${hours}灏忔椂${minutes}鍒嗛挓`, isExpired: false }
- } else {
- return { text: `${minutes}鍒嗛挓`, isExpired: false }
- }
-}
-
-// 鑾峰彇鍊掕鏃舵牱寮忕被
-const getCountdownClass = (expectedTime) => {
- if (!expectedTime) return ''
-
- const now = new Date().getTime()
- const expected = new Date(expectedTime).getTime()
- const diff = expected - now
-
- if (diff <= 0) {
- return 'countdown-expired'
- } else if (diff <= 24 * 60 * 60 * 1000) { // 24灏忔椂鍐�
- return 'countdown-urgent'
- } else if (diff <= 7 * 24 * 60 * 60 * 1000) { // 7澶╁唴
- return 'countdown-warning'
- } else {
- return 'countdown-normal'
- }
-}
-
-// 妫�鏌ョ己姘旈璀�
-const checkShortageWarnings = () => {
- tableData.value.forEach(tank => {
- if (tank.expectedShortageTime) {
- const countdown = getCountdown(tank.expectedShortageTime)
- if (countdown.isExpired && !tank.warningShown) {
- // 鏍囪宸叉樉绀洪璀︼紝閬垮厤閲嶅寮规
- tank.warningShown = true
- showShortageWarning(tank)
- }
- }
- })
-}
-
-// 鏄剧ず缂烘皵棰勮寮规
-const showShortageWarning = (tank) => {
- currentWarningTank.value = tank
- shortageWarningVisible.value = true
-
- // 鎾斁鎻愮ず闊筹紙鍙�夛級
- // const audio = new Audio('/path/to/warning-sound.mp3')
- // audio.play()
-}
-
-// 澶勭悊缂烘皵棰勮
-const handleShortageWarning = () => {
- ElMessage.success(`姝e湪澶勭悊鍌ㄦ皵缃� ${currentWarningTank.value.tankName} 鐨勭己姘旈棶棰榒)
- shortageWarningVisible.value = false
- // 杩欓噷鍙互璋冪敤澶勭悊API
-}
-// 澶勭悊缂烘皵棰勮
-const closeShortageWarning = () => {
- // ElMessage.success(`姝e湪澶勭悊鍌ㄦ皵缃� ${currentWarningTank.value.tankName} 鐨勭己姘旈棶棰榒)
- shortageWarningVisible.value = false
- // 杩欓噷鍙互璋冪敤澶勭悊API
-}
-
-// 鑾峰彇鍒楄〃鏁版嵁
-const getList = async () => {
- tableLoading.value = true
- getStockWarningPage(page, searchForm)
- .then(res => {
-
- tableData.value = res.data.records
- page.value.total = res.data.total;
- tableLoading.value = false;
- // 妫�鏌ョ己姘旈璀�
- checkShortageWarnings()
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-
-// 鎼滅储
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-
-// 閲嶇疆鎼滅储
-const resetQuery = () => {
- Object.keys(searchForm).forEach(key => {
- searchForm[key] = ''
- })
- handleQuery()
-}
-
-// 鍒嗛〉鍙樺寲
-const paginationChange = (obj) => {
- page.current = obj.page
- page.size = obj.limit
- getList()
-}
-
-// 琛ㄦ牸閫夋嫨鍙樺寲
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection
-}
-
-// 鏂板
-const handleAdd = () => {
- operationType.value = 'add'
- // resetForm()
- dialogFormVisible.value = true
-}
-
-// 缂栬緫
-const handleEdit = (row) => {
- operationType.value = 'edit'
- Object.assign(form, row)
- dialogFormVisible.value = true
-}
-
-// 澶勭悊棰勮
-const handleProcess = async (row) => {
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 300))
- ElMessage.success(`姝e湪澶勭悊棰勮锛�${row.tankName}`)
- // getList()
- } catch (error) {
- ElMessage.error('澶勭悊棰勮澶辫触')
- }
-}
-
-// 鍒犻櫎
-const handleDelete = async (row) => {
- try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ら璀﹁鍒欙細${row.tankName}鍚楋紵`, '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
- let ids = [];
- ids.push(row.id);
- deleteStockWarning(ids).then(res => {
- if(res.code == 200){
- ElMessage.success("鍒犻櫎鎴愬姛");
- ids.value = [];
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // // 妯℃嫙API璋冪敤寤惰繜
- // await new Promise(resolve => setTimeout(resolve, 300))
- // ElMessage.success('鍒犻櫎鎴愬姛')
- // getList()
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('鍒犻櫎澶辫触')
- }
- }
-}
-
-// 鎵归噺澶勭悊
-const handleBatchProcess = async () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning('璇烽�夋嫨瑕佸鐞嗙殑棰勮')
- return
- }
-
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 500))
- ElMessage.success(`鎵归噺澶勭悊浜� ${selectedRows.value.length} 鏉¢璀)
- getList()
- } catch (error) {
- ElMessage.error('鎵归噺澶勭悊澶辫触')
- }
-}
-
-// 瀵煎嚭
-const handleExport = async () => {
- // if (selectedRows.value.length === 0) {
- // exportStockWarning().then(res => {
- // // // 鍒涘缓涓嬭浇閾炬帴
- // // const blob = new Blob([res.data], { type: 'text/csv;charset=utf-8;' })
- // // const url = window.URL.createObjectURL(blob)
- // // const link = document.createElement('a')
- // // link.href = url
- // // link.download = `鍌ㄦ皵缃愰璀︽暟鎹甠${new Date().getTime()}.csv`
- // // link.click()
- // // window.URL.revokeObjectURL(url)
- // }).catch(err => {
- // ElMessage.error(err.msg);
- // })
- // }else{
- // let ids = [];
- // selectedRows.value.forEach(item => {
- // ids.push(item.id);
- // })
- // exportStockWarning(ids).then(res => {
- // // // 鍒涘缓涓嬭浇閾炬帴
- // // const blob = new Blob([res.data], { type: 'text/csv;charset=utf-8;' })
- // // const url = window.URL.createObjectURL(blob)
- // // const link = document.createElement('a')
- // // link.href = url
- // // link.download = `鍌ㄦ皵缃愰璀︽暟鎹甠${new Date().getTime()}.csv`
- // // link.click()
- // // window.URL.revokeObjectURL(url)
- // }).catch(err => {
- // ElMessage.error(err.msg);
- // })
- // }
-
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/gasTankWarning/export", {ids: selectedRows.value.map(item => item.id)}, "鍌ㄦ皵缃愰璀�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-}
-
-
-
-// // 鍚敤鐘舵�佸彉鍖�
-const handleEnableChange = async (row) => {
-
- try {
- updateStockWarning(row).then(res => {
- if(res.code == 200){
- ElMessage.success(`${row.tankName} 鐨勫惎鐢ㄧ姸鎬佸凡鏇存柊`);
- getList();
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- } catch (error) {
- ElMessage.error('鐘舵�佹洿鏂板け璐�')
- // 鎭㈠鍘熺姸鎬�
- row.isEnabled = !row.isEnabled
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- try {
- await proxy.$refs.formRef.validate()
-
- // 妯℃嫙API璋冪敤寤惰繜
- // await new Promise(resolve => setTimeout(resolve, 500))
-
- if (operationType.value === 'add') {
- addStockWarning(form).then(res => {
- if(res.code == 200){
- ElMessage.success("娣诲姞鎴愬姛");
- dialogFormVisible.value = false
- getList()
- resetForm()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
-
- // ElMessage.success('鏂板鎴愬姛')
- } else {
- updateStockWarning(form).then(res => {
- if(res.code == 200){
- ElMessage.success("鏇存柊鎴愬姛");
- dialogFormVisible.value = false
- getList()
- resetForm()
- }
- }).catch(err => {
- ElMessage.error(err.msg);
- })
- // ElMessage.success('缂栬緫鎴愬姛')
- }
-
- // closeDialog()
- // getList()
- } catch (error) {
- if (!error.errors) {
- ElMessage.error(operationType.value === 'add' ? '鏂板澶辫触' : '缂栬緫澶辫触')
- }
- }
-}
-
-// 鍏抽棴寮圭獥
-const closeDialog = () => {
- dialogFormVisible.value = false
- // resetForm()
-}
-
-// 閲嶇疆琛ㄥ崟
-const resetForm = () => {
- Object.keys(form).forEach(key => {
- if (key === 'isEnabled') {
- form[key] = true
- } else if (typeof form[key] === 'number') {
- form[key] = 0
- } else {
- form[key] = ''
- }
- })
- proxy.$refs.formRef?.resetFields()
-}
-
-// 鑾峰彇姘斾綋閲忔牱寮忕被
-const getGasLevelClass = (row) => {
- if (row.currentGasLevel < row.minGasLevel) {
- return 'text-danger'
- } else if (row.currentGasLevel > row.maxGasLevel) {
- return 'text-warning'
- }
- return 'text-success'
-}
-
-// 鑾峰彇棰勮绫诲瀷鏍囩鏍峰紡
-const getWarningTypeTag = (type) => {
- const typeMap = {
- '姘斾綋涓嶈冻': 'danger',
- '鍘嬪姏寮傚父': 'warning',
- '娓╁害寮傚父': 'info',
- '娉勬紡棰勮': 'danger'
- }
- return typeMap[type] || 'info'
-}
-
-// 鑾峰彇棰勮绾у埆鏍囩鏍峰紡
-const getWarningLevelTag = (level) => {
- const levelMap = {
- '绱ф��': 'danger',
- '閲嶈': 'warning',
- '涓�鑸�': 'info'
- }
- return levelMap[level] || 'info'
-}
-
-// 鍚姩鍊掕鏃跺畾鏃跺櫒
-const startCountdownTimer = () => {
- countdownTimer.value = setInterval(() => {
- checkShortageWarnings()
- }, 60000) // 姣忓垎閽熸鏌ヤ竴娆�
-}
-
-// 鍋滄鍊掕鏃跺畾鏃跺櫒
-const stopCountdownTimer = () => {
- if (countdownTimer.value) {
- clearInterval(countdownTimer.value)
- countdownTimer.value = null
- }
-}
-
-// 椤甸潰鍔犺浇
-onMounted(() => {
- getList()
- startCountdownTimer()
-})
-
-// 椤甸潰鍗歌浇
-onUnmounted(() => {
- stopCountdownTimer()
-})
-</script>
-
-<style scoped lang="scss">
-.app-container {
- padding: 20px;
-
- .table-operations {
- text-align: right;
- margin-bottom: 20px;
-
- .el-button {
- margin-right: 10px;
- }
- }
-
- .table_list {
- background: #fff;
- border-radius: 4px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
- }
-
- .text-danger {
- color: #f56c6c;
- font-weight: bold;
- }
-
- .text-warning {
- color: #e6a23c;
- font-weight: bold;
- }
-
- .text-success {
- color: #67c23a;
- font-weight: bold;
- }
-
- .dialog-footer {
- text-align: right;
- }
-
- // 鍊掕鏃舵牱寮�
- .countdown-timer {
- font-weight: bold;
- }
-
- .countdown-normal {
- color: #67c23a;
- }
-
- .countdown-warning {
- color: #e6a23c;
- }
-
- .countdown-urgent {
- color: #f56c6c;
- animation: blink 1s infinite;
- }
-
- .countdown-expired {
- color: #f56c6c;
- font-weight: bold;
- }
-
- @keyframes blink {
- 0%, 50% { opacity: 1; }
- 51%, 100% { opacity: 0.5; }
- }
-
- // 缂烘皵棰勮寮规鏍峰紡
- .shortage-warning-content {
- text-align: center;
- padding: 20px 0;
-
- .warning-icon {
- margin-bottom: 20px;
- }
-
- .warning-message {
- h3 {
- color: #f56c6c;
- margin-bottom: 10px;
- }
-
- p {
- margin-bottom: 10px;
- color: #606266;
- }
-
- .warning-details {
- background: #f5f7fa;
- padding: 15px;
- border-radius: 4px;
- text-align: left;
- font-size: 14px;
- line-height: 1.6;
- }
- }
- }
-}
-</style>
diff --git a/src/views/lavorissue/ledger/Form.vue b/src/views/lavorissue/ledger/Form.vue
deleted file mode 100644
index 7031957..0000000
--- a/src/views/lavorissue/ledger/Form.vue
+++ /dev/null
@@ -1,154 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptId">
- <el-select
- v-model="form.deptId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option :label="item.deptName" :value="item.deptId" v-for="(item,index) in productOptions" :key="deptId" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍛樺伐鍚嶇О" prop="staffId">
- <el-select
- v-model="form.staffId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.staffName" :value="item.id" v-for="(item,index) in personList" :key="id" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍔充繚绫诲瀷" prop="dictType">
- <el-select
- v-model="form.dictType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue_type" :key="value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍔充繚闃插叿" prop="dictId">
- <el-select
- v-model="form.dictId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in sys_lavor_issue" :key="value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戞斁鏁伴噺" prop="num">
- <el-input-number :step="1" :min="0" style="width: 100%"
- v-model="form.num"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- <el-form-item label="杩涘巶鏃ユ湡" prop="factoryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.factoryDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- <el-form-item label="鍙戞斁鏃ユ湡" prop="issueDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.issueDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import {ref,onMounted} from "vue";
-import useUserStore from "@/store/modules/user";
-import {getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
-import {deepCopySameProperties} from '@/utils/util'
-const userStore = useUserStore();
-import {
- getDept
-} from "@/api/collaborativeApproval/approvalProcess.js";
-const { proxy } = getCurrentInstance();
-
-
-defineOptions({
- name: "鏂板鏀跺叆",
-});
-const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue")
-const { sys_lavor_issue_type } = proxy.useDict("sys_lavor_issue_type")
-const formRef = ref(null);
-const productOptions = ref([]);
-const personList = ref([]);
-const formRules = {
- deptId: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- dictType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- staffId: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- dictId: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- num: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- adoptedDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- factoryDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- issueDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
- deptId: undefined, //
- dictType: undefined,
- staffId: undefined, //
- dictId: undefined, //
- num: undefined, //
- adoptedDate: undefined,
- factoryDate: undefined,
- issueDate: undefined,
-});
-const getPersonList = () => {
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
-};
-const loadForm = (data) => {
- deepCopySameProperties(data, form)
-};
-
-const getProductOptions = () => {
- getDept().then((res) => {
- productOptions.value = res.data;
- });
-}
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
- form.deptId = userStore.currentDeptId
- getProductOptions();
- getPersonList();
-};
-onMounted(() => {
- form.deptId = userStore.currentDeptId
- getProductOptions();
- getPersonList();
-})
-defineExpose({
- form,
- resetForm,
- clearValidate,
- loadForm,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/lavorissue/ledger/Modal.vue b/src/views/lavorissue/ledger/Modal.vue
deleted file mode 100644
index 5d63236..0000000
--- a/src/views/lavorissue/ledger/Modal.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { add, update } from "@/api/lavorissce/ledger";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏀跺叆鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鍔充繚鍙拌处" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await update({id: id.value, ...formRef.value.form})
- : await add(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (row) => {
- openModal(row.id);
- await nextTick();
- formRef.value.loadForm(row);
-
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/lavorissue/ledger/filesDia.vue b/src/views/lavorissue/ledger/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/lavorissue/ledger/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/lavorissue/ledger/index.vue b/src/views/lavorissue/ledger/index.vue
deleted file mode 100644
index 6b7e5a8..0000000
--- a/src/views/lavorissue/ledger/index.vue
+++ /dev/null
@@ -1,300 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鍙戞斁瀛e害:" prop="season">
- <el-select
- style="width: 200px;"
- @change="handleQuery"
- v-model="filters.season"
- placeholder="璇烽�夋嫨"
- :clearable="false"
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in jidu" :key="value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍛樺伐鍚嶇О:">
- <el-input
- v-model="filters.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
-<!-- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>-->
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(multipleList.map((item) => item.id))"
- >
- 鎵归噺鍒犻櫎
- </el-button>
- </div>
- </div>
- <PIMTable
- rowKey="id"
- isSelection
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #operation="{ row }">
- <el-button type="primary" text @click="edit(row)" icon="editPen">
- 缂栬緫
- </el-button>
- <el-button type="primary" :disabled="row.adoptedDate ? true : false" text @click="adopted(row)">
- 棰嗙敤
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage,deleteLedger,update } from "@/api/lavorissce/ledger";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import FilesDia from "./filesDia.vue";
-import { getCurrentMonth } from "@/utils/util"
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { payment_methods } = proxy.useDict("payment_methods");
-const { income_types } = proxy.useDict("income_types");
-const filesDia = ref()
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- listPage,
- {
- staffName: '',
- season: getCurrentMonth(),
- },
- [
- {
- label: "鍔充繚鍗曞彿",
- align: "center",
- prop: "orderNo",
- },
- {
- label: "鍛樺伐鍚嶇О",
- align: "center",
- prop: "staffName",
- },
- {
- label: "鍛樺伐缂栧彿",
- align: "center",
- prop: "staffNo"
- },
-
- {
- label: "鍔充繚绫诲瀷",
- align: "center",
- prop: "dictTypeName",
-
- },
- {
- label: "鍔充繚闃插叿",
- align: "center",
- prop: "dictName",
-
- },
- {
- label: "鍙戞斁鏁伴噺",
- align: "center",
- prop: "num",
-
- },
- {
- label: "杩涘巶鏃ユ湡",
- align: "center",
- prop: "factoryDate",
-
- },
- {
- label: "鍙戞斁鏃ユ湡",
- align: "center",
- prop: "issueDate",
-
- },
- {
- label: "棰嗙敤鏃ユ湡",
- align: "center",
- prop: "adoptedDate",
-
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-const jidu = ref([
- {
- value: '1',
- label: '绗竴瀛e害'
- },
- {
- value: '2',
- label: '绗簩瀛e害'
- },
- {
- value: '3',
- label: '绗笁瀛e害'
- },
- {
- value: '4',
- label: '绗洓瀛e害'
- }
-])
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const adopted = (row) => {
- ElMessageBox.confirm("鏄惁纭棰嗙敤?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const params = {
- id: row.id,
- adoptedDate: dayjs().format("YYYY-MM-DD")
- }
- const { code } = await update(params);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "棰嗙敤鎴愬姛",
- });
- getTableData();
- }
- })
-}
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (row) => {
- modalRef.value.loadForm(row);
-};
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- getTableData();
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await deleteLedger(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/lavorIssue/exportCopy`, {season: filters.season}, "鍔充繚鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鏀跺叆')
- })
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
-
diff --git a/src/views/lavorissue/statistics/index.vue b/src/views/lavorissue/statistics/index.vue
deleted file mode 100644
index 2c34f67..0000000
--- a/src/views/lavorissue/statistics/index.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙戞斁瀛e害锛�</span>
- <el-select
- style="width: 200px;"
- @change="handleQuery"
- v-model="searchForm.season"
- placeholder="璇烽�夋嫨"
- @clear="clearSeason"
- clearable
- :disabled="searchForm.issueDate ? true : false"
-
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in jidu" :key="item.value" />
- </el-select>
- <span class="search_title ml10">鍙戞斁鏈堜唤锛�</span>
- <el-date-picker
- style="width: 200px;"
- :disabled="searchForm.season ? true : false"
- v-model="searchForm.issueDate"
- @change="handleQuery"
- @clear="clearIssueDaten"
- type="month"
- value-format="YYYY-MM-DD"
- format="YYYY-MM"
- placeholder="璇烽�夋嫨鏈堜唤"
- clearable
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- <el-button type="primary" @click="resetHandleQuery" style="margin-left: 10px"
- >閲嶇疆</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <div class="actions">
- <div class="head" @click="handleQuery(1)">宸查鍙栧姵淇濇暟閲�:{{statisticsObj.ylqNum}}</div>
- <div class="head" @click="handleQuery(2)">鏈鍙栧姵淇濇暟閲�: {{ statisticsObj.wlqNum }}</div>
- <div class="head" @click="handleQuery(3)">瓒呮椂宸查鍙栧姵淇濇暟閲�: {{statisticsObj.csylqNum}}</div>
- <div class="head" @click="handleQuery(4)">瓒呮椂鏈鍙栧姵淇濇暟閲�: {{statisticsObj.cswlqNum}}</div>
- </div>
- <el-table
- ref="tableRef"
- v-loading="tableLoading"
- :data="tableData"
- border
- height="calc(100vh - 21em)"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- style="width: 100%"
- @selection-change="handleSelectionChange"
- >
- <!-- 閫夋嫨鍒� -->
- <el-table-column
- align="center"
- type="selection"
- width="55"
- fixed="left"
- />
-
- <!-- 搴忓彿鍒� -->
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- fixed="left"
- />
-
- <!-- 鍥哄畾鍒楋細濮撳悕 -->
- <el-table-column
- label="濮撳悕"
- prop="staffName"
- width="100"
- show-overflow-tooltip
- align="center"
- fixed="left"
- />
-
- <!-- 鍥哄畾鍒楋細宸ュ彿 -->
- <el-table-column
- label="宸ュ彿"
- prop="staffNo"
- width="100"
- show-overflow-tooltip
- align="center"
- fixed="left"
- />
-
- <!-- 鍔ㄦ�佸垪锛氭牴鎹瓧鍏告覆鏌� -->
- <el-table-column
- v-for="(dictItem, index) in sys_lavor_issue"
- :key="dictItem.value"
- :label="dictItem.label"
- :prop="dictItem.value"
- show-overflow-tooltip
- >
- </el-table-column>
- </el-table>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, reactive, toRefs, nextTick, getCurrentInstance } from 'vue'
-import dayjs from "dayjs";
-import {statisticsList, statistics} from "@/api/lavorissce/ledger.js";
-import {ElMessageBox, ElMessage} from "element-plus";
-const { proxy } = getCurrentInstance();
-import { getCurrentMonth } from "@/utils/util"
-
-const page = ref({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-// 鍝嶅簲寮忔暟鎹�
-const tableRef = ref(null)
-const tableData = ref([])
-const tableLoading = ref(false)
-const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue")
-const data = reactive({
- searchForm: {
- season: getCurrentMonth(),
- issueDate: "",
- status: 0
- },
-});
-const { searchForm } = toRefs(data);
-
-const modalRef = ref();
-const filesDia = ref();
-const multipleList = ref([]);
-const jidu = ref([
- {
- value: '1',
- label: '绗竴瀛e害'
- },
- {
- value: '2',
- label: '绗簩瀛e害'
- },
- {
- value: '3',
- label: '绗笁瀛e害'
- },
- {
- value: '4',
- label: '绗洓瀛e害'
- }
-])
-const clearSeason = () => {
- console.log("req")
- searchForm.value.season = ""
- searchForm.value.issueDate = dayjs().format("YYYY-MM-DD");
-}
-
-const clearIssueDaten = () => {
- searchForm.value.issueDate = ""
- searchForm.value.season = getCurrentMonth()
-}
-const statisticsObj = ref({
- ylqNum: 0, // 宸查鍙栨暟閲�
- wlqNum: 0, // 鏈鍙栨暟閲�
- csylqNum: 0, // 瓒呮椂宸查鍙栨暟閲�
- cswlqNum: 0 // 瓒呮椂鏈鍙栨暟閲�
-})
-const resetHandleQuery = () => {
- searchForm.value.issueDate = "";
- searchForm.value.season = getCurrentMonth();
- handleQuery(0)
-};
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = (status) => {
- switch (status){
- case 1:
- searchForm.value.status = 1
- break;
- case 2:
- searchForm.value.status = 2
- break;
- case 3:
- searchForm.value.status = 3
- break;
- case 4:
- searchForm.value.status = 4
- break;
- default:
- searchForm.value.status = 0
- }
- getList();
- getStatistics();
-};
-
-const getStatistics = () => {
- statistics(searchForm.value).then(res => {
- statisticsObj.value.cswlqNum = res.data.cswlqNum
- statisticsObj.value.csylqNum = res.data.csylqNum
- statisticsObj.value.ylqNum = res.data.ylqNum
- statisticsObj.value.wlqNum = res.data.wlqNum
- })
-}
-// 鑾峰彇瀛楀吀鏁版嵁
-const getList = async () => {
- tableLoading.value = true;
- const params = { ...searchForm.value};
- statisticsList(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data;
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/lavorIssue/exportCopy`, {season: searchForm.value.season,issueDate: searchForm.value.issueDate}, "鍔充繚鍙拌处.xlsx");
- })
- .catch(() => {
- ElMessage.info("宸插彇娑�");
- });
-};
-
-// 浜嬩欢澶勭悊鍑芥暟
-const handleSelectionChange = (selection) => {
- multipleList.value = selection;
-}
-
-// 缁勪欢鎸傝浇鏃跺姞杞藉瓧鍏告暟鎹�
-onMounted(() => {
- handleQuery()
-})
-</script>
-
-<style scoped>
-.dynamic-table-container {
- width: 100%;
-}
-
-.pagination-container {
- margin-top: 20px;
- display: flex;
- justify-content: flex-end;
-}
-
-:deep(.el-table .el-table__header-wrapper th) {
- background-color: #F0F1F5 !important;
- color: #333333;
- font-weight: 600;
-}
-
-:deep(.el-table .el-table__body-wrapper td) {
- padding: 8px 0;
-}
-
-:deep(.el-select) {
- width: 100%;
-}
-
-:deep(.el-input) {
- width: 100%;
-}
-.actions {
- display: flex;
- justify-content: space-around;
- align-items: center;
- margin-bottom: 30px;
-}
-.head{
- cursor: pointer;
- font-size: 18px;
- font-weight: 600;
-}
-</style>
diff --git a/src/views/login.vue b/src/views/login.vue
deleted file mode 100644
index 968a932..0000000
--- a/src/views/login.vue
+++ /dev/null
@@ -1,255 +0,0 @@
-<template>
- <div class="login">
- <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
- <h3 class="title">{{ title }}</h3>
- <el-divider />
- <el-form-item prop="username">
- <el-input
- v-model="loginForm.username"
- type="text"
- size="large"
- auto-complete="off"
- placeholder="璐﹀彿"
- @input="getUserLoginFacotryList"
- >
- <template #prefix><el-icon><User /></el-icon></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input
- v-model="loginForm.password"
- type="password"
- size="large"
- auto-complete="off"
- placeholder="瀵嗙爜"
- show-password
- @keyup.enter="handleLogin"
- >
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="currentFatoryId">
- <el-select v-model="loginForm.currentFatoryId" placeholder="璇烽�夋嫨鍏徃" >
- <el-option v-for="item in factoryList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
- </el-select>
- </el-form-item>
-<!-- <el-form-item prop="code" v-if="captchaEnabled">-->
-<!-- <el-input-->
-<!-- v-model="loginForm.code"-->
-<!-- size="large"-->
-<!-- auto-complete="off"-->
-<!-- placeholder="楠岃瘉鐮�"-->
-<!-- style="width: 63%"-->
-<!-- @keyup.enter="handleLogin"-->
-<!-- >-->
-<!-- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>-->
-<!-- </el-input>-->
-<!-- <div class="login-code">-->
-<!-- <img :src="codeUrl" @click="getCode" class="login-code-img"/>-->
-<!-- </div>-->
-<!-- </el-form-item>-->
- <el-form-item style="width:100%;">
- <el-button
- :loading="loading"
- size="large"
- type="primary"
- style="width:100%;"
- @click.prevent="handleLogin"
- >
- <span v-if="!loading">鐧� 褰�</span>
- <span v-else>鐧� 褰� 涓�...</span>
- </el-button>
- <div style="float: right;" v-if="register">
- <router-link class="link-type" :to="'/register'">绔嬪嵆娉ㄥ唽</router-link>
- </div>
- </el-form-item>
- <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox>
- </el-form>
- <!-- 搴曢儴 -->
-<!-- <div class="el-login-footer">-->
-<!-- <span>Copyright 漏 2018-2025 ruoyi.vip All Rights Reserved.</span>-->
-<!-- </div>-->
- </div>
-</template>
-
-<script setup>
-import {getCodeImg} from "@/api/login"
-import Cookies from "js-cookie"
-import { encrypt, decrypt } from "@/utils/jsencrypt"
-import useUserStore from '@/store/modules/user'
-import {userLoginFacotryList} from "@/api/system/user.js"
-
-const title = import.meta.env.VITE_APP_TITLE
-const userStore = useUserStore()
-const route = useRoute()
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-
-const loginForm = ref({
- username: "",
- password: "",
- rememberMe: false,
- currentFatoryId:'',
-})
-
-const loginRules = {
- username: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }],
- password: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }],
- // code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }]
-}
-
-const codeUrl = ref("")
-const loading = ref(false)
-// 楠岃瘉鐮佸紑鍏�
-const captchaEnabled = ref(true)
-// 娉ㄥ唽寮�鍏�
-const register = ref(false)
-const redirect = ref(undefined)
-
-const factoryList = ref([])
-const currentFatoryId = ref('')
-
-watch(route, (newRoute) => {
- redirect.value = newRoute.query && newRoute.query.redirect
-}, { immediate: true })
-
-function handleLogin() {
- proxy.$refs.loginRef.validate(valid => {
- if (valid) {
- loading.value = true
- // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪 cookie 涓缃浣忕敤鎴峰悕鍜屽瘑鐮�
- Cookies.set("username", loginForm.value.username, { expires: 30 })
- Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
- Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
- userStore.loginCheckFactory(loginForm.value).then(res => {
- const query = route.query
- const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
- if (cur !== "redirect") {
- acc[cur] = query[cur]
- }
- return acc
- }, {})
- router.push({ path: redirect.value || "/", query: otherQueryParams })
- }).catch(() => {
- loading.value = false
- // 閲嶆柊鑾峰彇楠岃瘉鐮�
- if (captchaEnabled.value) {
- getCode()
- }
- })
- }
- })
-}
-
-function getCode() {
- getCodeImg().then(res => {
- captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
- if (captchaEnabled.value) {
- codeUrl.value = "data:image/gif;base64," + res.img
- loginForm.value.uuid = res.uuid
- }
- })
-}
-
-function getCookie() {
- const username = Cookies.get("username")
- const password = Cookies.get("password")
- const rememberMe = Cookies.get("rememberMe")
- loginForm.value = {
- username: username === undefined ? loginForm.value.username : username,
- password: password === undefined ? loginForm.value.password : decrypt(password),
- rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
- }
-}
-
-function getUserLoginFacotryList() {
- if(loginForm.value.username){
- userLoginFacotryList({userName:loginForm.value.username}).then(res => {
- console.log('res', res)
- factoryList.value = res.data
- })
- }else {
- factoryList.value = []
- }
-}
-
-getCode()
-getCookie()
-getUserLoginFacotryList()
-</script>
-
-<style lang='scss' scoped>
-.login {
- height: 100%;
- background-image: url("../assets/indexViews/DHDCView.png");
- background-size: 100% 100%;
- position: relative;
-}
-.title {
- margin: 20px auto 14px auto;
- text-align: center;
- color: #2C51D9;
- font-size: 28px;
- font-weight: 700;
-}
-
-.login-form {
- position: absolute;
- top: 50%;
- right: 15%;
- transform: translate(0, -50%);
- border-radius: 6px;
- background: #ffffff;
- width: 420px;
- height: 500px;
- padding: 40px;
- z-index: 1;
- box-shadow: 0 0 5px 1px #ccc;
- .el-input {
- height: 40px;
- input {
- height: 40px;
- }
- }
- .input-icon {
- height: 39px;
- width: 14px;
- margin-left: 0px;
- }
-}
-.login-tip {
- font-size: 13px;
- text-align: center;
- color: #bfbfbf;
-}
-.login-code {
- width: 33%;
- height: 40px;
- float: right;
- img {
- cursor: pointer;
- vertical-align: middle;
- }
-}
-.el-login-footer {
- height: 40px;
- line-height: 40px;
- position: fixed;
- bottom: 0;
- width: 100%;
- text-align: center;
- color: #fff;
- font-family: Arial;
- font-size: 12px;
- letter-spacing: 1px;
-}
-.login-code-img {
- height: 40px;
- padding-left: 12px;
-}
-:deep() {
- .el-form-item--default {
- margin-bottom: 36px;
- }
-}
-</style>
diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue
deleted file mode 100644
index b351fa9..0000000
--- a/src/views/monitor/cache/index.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-<template>
- <div class="app-container">
- <el-row :gutter="10">
- <el-col :span="24" class="card-box">
- <el-card>
- <template #header><Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍩烘湰淇℃伅</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%">
- <tbody>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">Redis鐗堟湰</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.redis_version }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">杩愯妯″紡</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.redis_mode == "standalone" ? "鍗曟満" : "闆嗙兢" }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">绔彛</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.tcp_port }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">瀹㈡埛绔暟</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.connected_clients }}</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">杩愯鏃堕棿(澶�)</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.uptime_in_days }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">浣跨敤鍐呭瓨</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.used_memory_human }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">浣跨敤CPU</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">鍐呭瓨閰嶇疆</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.maxmemory_human }}</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">AOF鏄惁寮�鍚�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.aof_enabled == "0" ? "鍚�" : "鏄�" }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">RDB鏄惁鎴愬姛</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">Key鏁伴噺</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.dbSize">{{ cache.dbSize }} </div></td>
- <td class="el-table__cell is-leaf"><div class="cell">缃戠粶鍏ュ彛/鍑哄彛</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.instantaneous_input_kbps }}kps/{{cache.info.instantaneous_output_kbps}}kps</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="12" class="card-box">
- <el-card>
- <template #header><PieChart style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍛戒护缁熻</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <div ref="commandstats" style="height: 420px" />
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="12" class="card-box">
- <el-card>
- <template #header><Odometer style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨淇℃伅</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <div ref="usedmemory" style="height: 420px" />
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup name="Cache">
-import { getCache } from '@/api/monitor/cache'
-import * as echarts from 'echarts'
-
-const cache = ref([])
-const commandstats = ref(null)
-const usedmemory = ref(null)
-const { proxy } = getCurrentInstance()
-
-function getList() {
- proxy.$modal.loading("姝e湪鍔犺浇缂撳瓨鐩戞帶鏁版嵁锛岃绋嶅�欙紒")
- getCache().then(response => {
- proxy.$modal.closeLoading()
- cache.value = response.data
-
- const commandstatsIntance = echarts.init(commandstats.value, "macarons")
- commandstatsIntance.setOption({
- tooltip: {
- trigger: "item",
- formatter: "{a} <br/>{b} : {c} ({d}%)"
- },
- series: [
- {
- name: "鍛戒护",
- type: "pie",
- roseType: "radius",
- radius: [15, 95],
- center: ["50%", "38%"],
- data: response.data.commandStats,
- animationEasing: "cubicInOut",
- animationDuration: 1000
- }
- ]
- })
- const usedmemoryInstance = echarts.init(usedmemory.value, "macarons")
- usedmemoryInstance.setOption({
- tooltip: {
- formatter: "{b} <br/>{a} : " + cache.value.info.used_memory_human
- },
- series: [
- {
- name: "宄板��",
- type: "gauge",
- min: 0,
- max: 1000,
- detail: {
- formatter: cache.value.info.used_memory_human
- },
- data: [
- {
- value: parseFloat(cache.value.info.used_memory_human),
- name: "鍐呭瓨娑堣��"
- }
- ]
- }
- ]
- })
- window.addEventListener("resize", () => {
- commandstatsIntance.resize()
- usedmemoryInstance.resize()
- })
- })
-}
-
-getList()
-</script>
diff --git a/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue
deleted file mode 100644
index 77baec4..0000000
--- a/src/views/monitor/cache/list.vue
+++ /dev/null
@@ -1,246 +0,0 @@
-<template>
- <div class="app-container">
- <el-row :gutter="10">
- <el-col :span="8">
- <el-card style="height: calc(100vh - 125px)">
- <template #header>
- <Collection style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">缂撳瓨鍒楄〃</span>
- <el-button
- style="float: right; padding: 3px 0"
- link
- type="primary"
- icon="Refresh"
- @click="refreshCacheNames()"
- ></el-button>
- </template>
- <el-table
- v-loading="loading"
- :data="cacheNames"
- :height="tableHeight"
- highlight-current-row
- @row-click="getCacheKeys"
- style="width: 100%"
- >
- <el-table-column
- label="搴忓彿"
- width="60"
- type="index"
- ></el-table-column>
-
- <el-table-column
- label="缂撳瓨鍚嶇О"
- align="center"
- prop="cacheName"
- :show-overflow-tooltip="true"
- :formatter="nameFormatter"
- ></el-table-column>
-
- <el-table-column
- label="澶囨敞"
- align="center"
- prop="remark"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鎿嶄綔"
- width="60"
- align="center"
- class-name="small-padding fixed-width"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- icon="Delete"
- @click="handleClearCacheName(scope.row)"
- ></el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card style="height: calc(100vh - 125px)">
- <template #header>
- <Key style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">閿悕鍒楄〃</span>
- <el-button
- style="float: right; padding: 3px 0"
- link
- type="primary"
- icon="Refresh"
- @click="refreshCacheKeys()"
- ></el-button>
- </template>
- <el-table
- v-loading="subLoading"
- :data="cacheKeys"
- :height="tableHeight"
- highlight-current-row
- @row-click="handleCacheValue"
- style="width: 100%"
- >
- <el-table-column
- label="搴忓彿"
- width="60"
- type="index"
- ></el-table-column>
- <el-table-column
- label="缂撳瓨閿悕"
- align="center"
- :show-overflow-tooltip="true"
- :formatter="keyFormatter"
- >
- </el-table-column>
- <el-table-column
- label="鎿嶄綔"
- width="60"
- align="center"
- class-name="small-padding fixed-width"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- icon="Delete"
- @click="handleClearCacheKey(scope.row)"
- ></el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card :bordered="false" style="height: calc(100vh - 125px)">
- <template #header>
- <Document style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">缂撳瓨鍐呭</span>
- <el-button
- style="float: right; padding: 3px 0"
- link
- type="primary"
- icon="Refresh"
- @click="handleClearCacheAll()"
- >娓呯悊鍏ㄩ儴</el-button
- >
- </template>
- <el-form :model="cacheForm">
- <el-row :gutter="32">
- <el-col :offset="1" :span="22">
- <el-form-item label="缂撳瓨鍚嶇О:" prop="cacheName">
- <el-input v-model="cacheForm.cacheName" :readOnly="true" />
- </el-form-item>
- </el-col>
- <el-col :offset="1" :span="22">
- <el-form-item label="缂撳瓨閿悕:" prop="cacheKey">
- <el-input v-model="cacheForm.cacheKey" :readOnly="true" />
- </el-form-item>
- </el-col>
- <el-col :offset="1" :span="22">
- <el-form-item label="缂撳瓨鍐呭:" prop="cacheValue">
- <el-input
- v-model="cacheForm.cacheValue"
- type="textarea"
- :rows="8"
- :readOnly="true"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup name="CacheList">
-import { listCacheName, listCacheKey, getCacheValue, clearCacheName, clearCacheKey, clearCacheAll } from "@/api/monitor/cache"
-
-const { proxy } = getCurrentInstance()
-
-const cacheNames = ref([])
-const cacheKeys = ref([])
-const cacheForm = ref({})
-const loading = ref(true)
-const subLoading = ref(false)
-const nowCacheName = ref("")
-const tableHeight = ref(window.innerHeight - 200)
-
-/** 鏌ヨ缂撳瓨鍚嶇О鍒楄〃 */
-function getCacheNames() {
- loading.value = true
- listCacheName().then(response => {
- cacheNames.value = response.data
- loading.value = false
- })
-}
-
-/** 鍒锋柊缂撳瓨鍚嶇О鍒楄〃 */
-function refreshCacheNames() {
- getCacheNames()
- proxy.$modal.msgSuccess("鍒锋柊缂撳瓨鍒楄〃鎴愬姛")
-}
-
-/** 娓呯悊鎸囧畾鍚嶇О缂撳瓨 */
-function handleClearCacheName(row) {
- clearCacheName(row.cacheName).then(response => {
- proxy.$modal.msgSuccess("娓呯悊缂撳瓨鍚嶇О[" + row.cacheName + "]鎴愬姛")
- getCacheKeys()
- })
-}
-
-/** 鏌ヨ缂撳瓨閿悕鍒楄〃 */
-function getCacheKeys(row) {
- const cacheName = row !== undefined ? row.cacheName : nowCacheName.value
- if (cacheName === "") {
- return
- }
- subLoading.value = true
- listCacheKey(cacheName).then(response => {
- cacheKeys.value = response.data
- subLoading.value = false
- nowCacheName.value = cacheName
- })
-}
-
-/** 鍒锋柊缂撳瓨閿悕鍒楄〃 */
-function refreshCacheKeys() {
- getCacheKeys()
- proxy.$modal.msgSuccess("鍒锋柊閿悕鍒楄〃鎴愬姛")
-}
-
-/** 娓呯悊鎸囧畾閿悕缂撳瓨 */
-function handleClearCacheKey(cacheKey) {
- clearCacheKey(cacheKey).then(response => {
- proxy.$modal.msgSuccess("娓呯悊缂撳瓨閿悕[" + cacheKey + "]鎴愬姛")
- getCacheKeys()
- })
-}
-
-/** 鍒楄〃鍓嶇紑鍘婚櫎 */
-function nameFormatter(row) {
- return row.cacheName.replace(":", "")
-}
-
-/** 閿悕鍓嶇紑鍘婚櫎 */
-function keyFormatter(cacheKey) {
- return cacheKey.replace(nowCacheName.value, "")
-}
-
-/** 鏌ヨ缂撳瓨鍐呭璇︾粏 */
-function handleCacheValue(cacheKey) {
- getCacheValue(nowCacheName.value, cacheKey).then(response => {
- cacheForm.value = response.data
- })
-}
-
-/** 娓呯悊鍏ㄩ儴缂撳瓨 */
-function handleClearCacheAll() {
- clearCacheAll().then(response => {
- proxy.$modal.msgSuccess("娓呯悊鍏ㄩ儴缂撳瓨鎴愬姛")
- })
-}
-
-getCacheNames()
-</script>
diff --git a/src/views/monitor/druid/index.vue b/src/views/monitor/druid/index.vue
deleted file mode 100644
index 1faaead..0000000
--- a/src/views/monitor/druid/index.vue
+++ /dev/null
@@ -1,13 +0,0 @@
-<template>
- <div>
- <i-frame v-model:src="url"></i-frame>
- </div>
-</template>
-
-<script setup>
-import iFrame from '@/components/iFrame'
-
-import { ref } from 'vue'
-
-const url = ref(import.meta.env.VITE_APP_BASE_API + '/druid/login.html')
-</script>
diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue
deleted file mode 100644
index ee291a4..0000000
--- a/src/views/monitor/job/index.vue
+++ /dev/null
@@ -1,501 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="浠诲姟鍚嶇О" prop="jobName">
- <el-input
- v-model="queryParams.jobName"
- placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="浠诲姟缁勫悕" prop="jobGroup">
- <el-select v-model="queryParams.jobGroup" placeholder="璇烽�夋嫨浠诲姟缁勫悕" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_job_group"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="浠诲姟鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨浠诲姟鐘舵��" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_job_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['monitor:job:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['monitor:job:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['monitor:job:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['monitor:job:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="info"
- plain
- icon="Operation"
- @click="handleJobLog"
- v-hasPermi="['monitor:job:query']"
- >鏃ュ織</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="浠诲姟缂栧彿" width="100" align="center" prop="jobId" />
- <el-table-column label="浠诲姟鍚嶇О" align="center" prop="jobName" :show-overflow-tooltip="true" />
- <el-table-column label="浠诲姟缁勫悕" align="center" prop="jobGroup">
- <template #default="scope">
- <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
- </template>
- </el-table-column>
- <el-table-column label="璋冪敤鐩爣瀛楃涓�" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
- <el-table-column label="cron鎵ц琛ㄨ揪寮�" align="center" prop="cronExpression" :show-overflow-tooltip="true" />
- <el-table-column label="鐘舵��" align="center">
- <template #default="scope">
- <el-switch
- v-model="scope.row.status"
- active-value="0"
- inactive-value="1"
- @change="handleStatusChange(scope.row)"
- ></el-switch>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="200" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-tooltip content="淇敼" placement="top">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']"></el-button>
- </el-tooltip>
- <el-tooltip content="鍒犻櫎" placement="top">
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']"></el-button>
- </el-tooltip>
- <el-tooltip content="鎵ц涓�娆�" placement="top">
- <el-button link type="primary" icon="CaretRight" @click="handleRun(scope.row)" v-hasPermi="['monitor:job:changeStatus']"></el-button>
- </el-tooltip>
- <el-tooltip content="浠诲姟璇︾粏" placement="top">
- <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:job:query']"></el-button>
- </el-tooltip>
- <el-tooltip content="璋冨害鏃ュ織" placement="top">
- <el-button link type="primary" icon="Operation" @click="handleJobLog(scope.row)" v-hasPermi="['monitor:job:query']"></el-button>
- </el-tooltip>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰畾鏃朵换鍔″璇濇 -->
- <el-dialog :title="title" v-model="open" width="820px" append-to-body>
- <el-form ref="jobRef" :model="form" :rules="rules" label-width="120px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="浠诲姟鍚嶇О" prop="jobName">
- <el-input v-model="form.jobName" placeholder="璇疯緭鍏ヤ换鍔″悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠诲姟鍒嗙粍" prop="jobGroup">
- <el-select v-model="form.jobGroup" placeholder="璇烽�夋嫨">
- <el-option
- v-for="dict in sys_job_group"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item prop="invokeTarget">
- <template #label>
- <span>
- 璋冪敤鏂规硶
- <el-tooltip placement="top">
- <template #content>
- <div>
- Bean璋冪敤绀轰緥锛歳yTask.ryParams('ry')
- <br />Class绫昏皟鐢ㄧず渚嬶細com.ruoyi.quartz.task.RyTask.ryParams('ry')
- <br />鍙傛暟璇存槑锛氭敮鎸佸瓧绗︿覆锛屽竷灏旂被鍨嬶紝闀挎暣鍨嬶紝娴偣鍨嬶紝鏁村瀷
- </div>
- </template>
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </span>
- </template>
- <el-input v-model="form.invokeTarget" placeholder="璇疯緭鍏ヨ皟鐢ㄧ洰鏍囧瓧绗︿覆" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="cron琛ㄨ揪寮�" prop="cronExpression">
- <el-input v-model="form.cronExpression" placeholder="璇疯緭鍏ron鎵ц琛ㄨ揪寮�">
- <template #append>
- <el-button type="primary" @click="handleShowCron">
- 鐢熸垚琛ㄨ揪寮�
- <i class="el-icon-time el-icon--right"></i>
- </el-button>
- </template>
- </el-input>
- </el-form-item>
- </el-col>
- <el-col :span="24" v-if="form.jobId !== undefined">
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_job_status"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵ц绛栫暐" prop="misfirePolicy">
- <el-radio-group v-model="form.misfirePolicy">
- <el-radio-button value="1">绔嬪嵆鎵ц</el-radio-button>
- <el-radio-button value="2">鎵ц涓�娆�</el-radio-button>
- <el-radio-button value="3">鏀惧純鎵ц</el-radio-button>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄惁骞跺彂" prop="concurrent">
- <el-radio-group v-model="form.concurrent">
- <el-radio-button value="0">鍏佽</el-radio-button>
- <el-radio-button value="1">绂佹</el-radio-button>
- </el-radio-group>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <el-dialog title="Cron琛ㄨ揪寮忕敓鎴愬櫒" v-model="openCron" append-to-body destroy-on-close>
- <crontab ref="crontabRef" @hide="openCron=false" @fill="crontabFill" :expression="expression"></crontab>
- </el-dialog>
-
- <!-- 浠诲姟鏃ュ織璇︾粏 -->
- <el-dialog title="浠诲姟璇︾粏" v-model="openView" width="700px" append-to-body>
- <el-form :model="form" label-width="120px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="浠诲姟缂栧彿锛�">{{ form.jobId }}</el-form-item>
- <el-form-item label="浠诲姟鍚嶇О锛�">{{ form.jobName }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠诲姟鍒嗙粍锛�">{{ jobGroupFormat(form) }}</el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿锛�">{{ form.createTime }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="cron琛ㄨ揪寮忥細">{{ form.cronExpression }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嬫鎵ц鏃堕棿锛�">{{ parseTime(form.nextValidTime) }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="璋冪敤鐩爣鏂规硶锛�">{{ form.invokeTarget }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠诲姟鐘舵�侊細">
- <div v-if="form.status == 0">姝e父</div>
- <div v-else-if="form.status == 1">鏆傚仠</div>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄惁骞跺彂锛�">
- <div v-if="form.concurrent == 0">鍏佽</div>
- <div v-else-if="form.concurrent == 1">绂佹</div>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵ц绛栫暐锛�">
- <div v-if="form.misfirePolicy == 0">榛樿绛栫暐</div>
- <div v-else-if="form.misfirePolicy == 1">绔嬪嵆鎵ц</div>
- <div v-else-if="form.misfirePolicy == 2">鎵ц涓�娆�</div>
- <div v-else-if="form.misfirePolicy == 3">鏀惧純鎵ц</div>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="openView = false">鍏� 闂�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Job">
-import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job"
-import Crontab from '@/components/Crontab'
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-const { sys_job_group, sys_job_status } = proxy.useDict("sys_job_group", "sys_job_status")
-
-const jobList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const openView = ref(false)
-const openCron = ref(false)
-const expression = ref("")
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- jobName: undefined,
- jobGroup: undefined,
- status: undefined
- },
- rules: {
- jobName: [{ required: true, message: "浠诲姟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- invokeTarget: [{ required: true, message: "璋冪敤鐩爣瀛楃涓蹭笉鑳戒负绌�", trigger: "blur" }],
- cronExpression: [{ required: true, message: "cron鎵ц琛ㄨ揪寮忎笉鑳戒负绌�", trigger: "change" }]
- }
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ瀹氭椂浠诲姟鍒楄〃 */
-function getList() {
- loading.value = true
- listJob(queryParams.value).then(response => {
- jobList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 浠诲姟缁勫悕瀛楀吀缈昏瘧 */
-function jobGroupFormat(row, column) {
- return proxy.selectDictLabel(sys_job_group.value, row.jobGroup)
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- jobId: undefined,
- jobName: undefined,
- jobGroup: undefined,
- invokeTarget: undefined,
- cronExpression: undefined,
- misfirePolicy: 1,
- concurrent: 1,
- status: "0"
- }
- proxy.resetForm("jobRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-// 澶氶�夋閫変腑鏁版嵁
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.jobId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-// 鏇村鎿嶄綔瑙﹀彂
-function handleCommand(command, row) {
- switch (command) {
- case "handleRun":
- handleRun(row)
- break
- case "handleView":
- handleView(row)
- break
- case "handleJobLog":
- handleJobLog(row)
- break
- default:
- break
- }
-}
-
-// 浠诲姟鐘舵�佷慨鏀�
-function handleStatusChange(row) {
- let text = row.status === "0" ? "鍚敤" : "鍋滅敤"
- proxy.$modal.confirm('纭瑕�"' + text + '""' + row.jobName + '"浠诲姟鍚�?').then(function () {
- return changeJobStatus(row.jobId, row.status)
- }).then(() => {
- proxy.$modal.msgSuccess(text + "鎴愬姛")
- }).catch(function () {
- row.status = row.status === "0" ? "1" : "0"
- })
-}
-
-/* 绔嬪嵆鎵ц涓�娆� */
-function handleRun(row) {
- proxy.$modal.confirm('纭瑕佺珛鍗虫墽琛屼竴娆�"' + row.jobName + '"浠诲姟鍚�?').then(function () {
- return runJob(row.jobId, row.jobGroup)
- }).then(() => {
- proxy.$modal.msgSuccess("鎵ц鎴愬姛")})
- .catch(() => {})
-}
-
-/** 浠诲姟璇︾粏淇℃伅 */
-function handleView(row) {
- getJob(row.jobId).then(response => {
- form.value = response.data
- openView.value = true
- })
-}
-
-/** cron琛ㄨ揪寮忔寜閽搷浣� */
-function handleShowCron() {
- expression.value = form.value.cronExpression
- openCron.value = true
-}
-
-/** 纭畾鍚庡洖浼犲�� */
-function crontabFill(value) {
- form.value.cronExpression = value
-}
-
-/** 浠诲姟鏃ュ織鍒楄〃鏌ヨ */
-function handleJobLog(row) {
- const jobId = row.jobId || 0
- router.push('/monitor/job-log/index/' + jobId)
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞浠诲姟"
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const jobId = row.jobId || ids.value
- getJob(jobId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼浠诲姟"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["jobRef"].validate(valid => {
- if (valid) {
- if (form.value.jobId != undefined) {
- updateJob(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addJob(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const jobIds = row.jobId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎瀹氭椂浠诲姟缂栧彿涓�"' + jobIds + '"鐨勬暟鎹」?').then(function () {
- return delJob(jobIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("monitor/job/export", {
- ...queryParams.value,
- }, `job_${new Date().getTime()}.xlsx`)
-}
-
-getList()
-</script>
diff --git a/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue
deleted file mode 100644
index b425e45..0000000
--- a/src/views/monitor/job/log.vue
+++ /dev/null
@@ -1,283 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="浠诲姟鍚嶇О" prop="jobName">
- <el-input
- v-model="queryParams.jobName"
- placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="浠诲姟缁勫悕" prop="jobGroup">
- <el-select
- v-model="queryParams.jobGroup"
- placeholder="璇烽�夋嫨浠诲姟缁勫悕"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_job_group"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鎵ц鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="璇烽�夋嫨鎵ц鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_common_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鎵ц鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['monitor:job:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- @click="handleClean"
- v-hasPermi="['monitor:job:remove']"
- >娓呯┖</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['monitor:job:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Close"
- @click="handleClose"
- >鍏抽棴</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="jobLogList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鏃ュ織缂栧彿" width="80" align="center" prop="jobLogId" />
- <el-table-column label="浠诲姟鍚嶇О" align="center" prop="jobName" :show-overflow-tooltip="true" />
- <el-table-column label="浠诲姟缁勫悕" align="center" prop="jobGroup" :show-overflow-tooltip="true">
- <template #default="scope">
- <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
- </template>
- </el-table-column>
- <el-table-column label="璋冪敤鐩爣瀛楃涓�" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
- <el-table-column label="鏃ュ織淇℃伅" align="center" prop="jobMessage" :show-overflow-tooltip="true" />
- <el-table-column label="鎵ц鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_common_status" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鎵ц鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:job:query']">璇︾粏</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 璋冨害鏃ュ織璇︾粏 -->
- <el-dialog title="璋冨害鏃ュ織璇︾粏" v-model="open" width="700px" append-to-body>
- <el-form :model="form" label-width="100px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鏃ュ織搴忓彿锛�">{{ form.jobLogId }}</el-form-item>
- <el-form-item label="浠诲姟鍚嶇О锛�">{{ form.jobName }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠诲姟鍒嗙粍锛�">{{ form.jobGroup }}</el-form-item>
- <el-form-item label="鎵ц鏃堕棿锛�">{{ form.createTime }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="璋冪敤鏂规硶锛�">{{ form.invokeTarget }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鏃ュ織淇℃伅锛�">{{ form.jobMessage }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鎵ц鐘舵�侊細">
- <div v-if="form.status == 0">姝e父</div>
- <div v-else-if="form.status == 1">澶辫触</div>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="寮傚父淇℃伅锛�" v-if="form.status == 1">{{ form.exceptionInfo }}</el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="open = false">鍏� 闂�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="JobLog">
-import { getJob } from "@/api/monitor/job"
-import { listJobLog, delJobLog, cleanJobLog } from "@/api/monitor/jobLog"
-
-const { proxy } = getCurrentInstance()
-const { sys_common_status, sys_job_group } = proxy.useDict("sys_common_status", "sys_job_group")
-
-const jobLogList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const multiple = ref(true)
-const total = ref(0)
-const dateRange = ref([])
-const route = useRoute()
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- dictName: undefined,
- dictType: undefined,
- status: undefined
- }
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ璋冨害鏃ュ織鍒楄〃 */
-function getList() {
- loading.value = true
- listJobLog(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- jobLogList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-// 杩斿洖鎸夐挳
-function handleClose() {
- const obj = { path: "/monitor/job" }
- proxy.$tab.closeOpenPage(obj)
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-// 澶氶�夋閫変腑鏁版嵁
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.jobLogId)
- multiple.value = !selection.length
-}
-
-/** 璇︾粏鎸夐挳鎿嶄綔 */
-function handleView(row) {
- open.value = true
- form.value = row
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- proxy.$modal.confirm('鏄惁纭鍒犻櫎璋冨害鏃ュ織缂栧彿涓�"' + ids.value + '"鐨勬暟鎹」?').then(function () {
- return delJobLog(ids.value)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 娓呯┖鎸夐挳鎿嶄綔 */
-function handleClean() {
- proxy.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夎皟搴︽棩蹇楁暟鎹」?").then(function () {
- return cleanJobLog()
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("娓呯┖鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("monitor/jobLog/export", {
- ...queryParams.value,
- }, `job_log_${new Date().getTime()}.xlsx`)
-}
-
-(() => {
- const jobId = route.params && route.params.jobId
- if (jobId !== undefined && jobId != 0) {
- getJob(jobId).then(response => {
- queryParams.value.jobName = response.data.jobName
- queryParams.value.jobGroup = response.data.jobGroup
- getList()
- })
- } else {
- getList()
- }
-})()
-</script>
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
deleted file mode 100644
index aa42b52..0000000
--- a/src/views/monitor/logininfor/index.vue
+++ /dev/null
@@ -1,233 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
- <el-input
- v-model="queryParams.ipaddr"
- placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�"
- clearable
- style="width: 240px;"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
- <el-input
- v-model="queryParams.userName"
- placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
- clearable
- style="width: 240px;"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="鐧诲綍鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_common_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鐧诲綍鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['monitor:logininfor:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- @click="handleClean"
- v-hasPermi="['monitor:logininfor:remove']"
- >娓呯┖</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Unlock"
- :disabled="single"
- @click="handleUnlock"
- v-hasPermi="['monitor:logininfor:unlock']"
- >瑙i攣</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['monitor:logininfor:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="璁块棶缂栧彿" align="center" prop="infoId" />
- <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
- <el-table-column label="鍦板潃" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
- <el-table-column label="鐧诲綍鍦扮偣" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
- <el-table-column label="鎿嶄綔绯荤粺" align="center" prop="os" :show-overflow-tooltip="true" />
- <el-table-column label="娴忚鍣�" align="center" prop="browser" :show-overflow-tooltip="true" />
- <el-table-column label="鐧诲綍鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_common_status" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鎻忚堪" align="center" prop="msg" :show-overflow-tooltip="true" />
- <el-table-column label="璁块棶鏃堕棿" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.loginTime) }}</span>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- </div>
-</template>
-
-<script setup name="Logininfor">
-import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/monitor/logininfor"
-
-const { proxy } = getCurrentInstance()
-const { sys_common_status } = proxy.useDict("sys_common_status")
-
-const logininforList = ref([])
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const selectName = ref("")
-const total = ref(0)
-const dateRange = ref([])
-const defaultSort = ref({ prop: "loginTime", order: "descending" })
-
-// 鏌ヨ鍙傛暟
-const queryParams = ref({
- pageNum: 1,
- pageSize: 10,
- ipaddr: undefined,
- userName: undefined,
- status: undefined,
- orderByColumn: undefined,
- isAsc: undefined
-})
-
-/** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */
-function getList() {
- loading.value = true
- list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- logininforList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- queryParams.value.pageNum = 1
- proxy.$refs["logininforRef"].sort(defaultSort.value.prop, defaultSort.value.order)
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.infoId)
- multiple.value = !selection.length
- single.value = selection.length != 1
- selectName.value = selection.map(item => item.userName)
-}
-
-/** 鎺掑簭瑙﹀彂浜嬩欢 */
-function handleSortChange(column, prop, order) {
- queryParams.value.orderByColumn = column.prop
- queryParams.value.isAsc = column.order
- getList()
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const infoIds = row.infoId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎璁块棶缂栧彿涓�"' + infoIds + '"鐨勬暟鎹」?').then(function () {
- return delLogininfor(infoIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 娓呯┖鎸夐挳鎿嶄綔 */
-function handleClean() {
- proxy.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夌櫥褰曟棩蹇楁暟鎹」?").then(function () {
- return cleanLogininfor()
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("娓呯┖鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瑙i攣鎸夐挳鎿嶄綔 */
-function handleUnlock() {
- const username = selectName.value
- proxy.$modal.confirm('鏄惁纭瑙i攣鐢ㄦ埛"' + username + '"鏁版嵁椤�?').then(function () {
- return unlockLogininfor(username)
- }).then(() => {
- proxy.$modal.msgSuccess("鐢ㄦ埛" + username + "瑙i攣鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("monitor/logininfor/export", {
- ...queryParams.value,
- }, `logininfor_${new Date().getTime()}.xlsx`)
-}
-
-getList()
-</script>
diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue
deleted file mode 100644
index 21f6463..0000000
--- a/src/views/monitor/online/index.vue
+++ /dev/null
@@ -1,109 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true">
- <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
- <el-input
- v-model="queryParams.ipaddr"
- placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
- <el-input
- v-model="queryParams.userName"
- placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <el-table
- v-loading="loading"
- :data="onlineList.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
- style="width: 100%;"
- >
- <el-table-column label="搴忓彿" width="50" type="index" align="center">
- <template #default="scope">
- <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
- </template>
- </el-table-column>
- <el-table-column label="浼氳瘽缂栧彿" align="center" prop="tokenId" :show-overflow-tooltip="true" />
- <el-table-column label="鐧诲綍鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true" />
- <el-table-column label="鎵�灞為儴闂�" align="center" prop="deptName" :show-overflow-tooltip="true" />
- <el-table-column label="涓绘満" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
- <el-table-column label="鐧诲綍鍦扮偣" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
- <el-table-column label="鎿嶄綔绯荤粺" align="center" prop="os" :show-overflow-tooltip="true" />
- <el-table-column label="娴忚鍣�" align="center" prop="browser" :show-overflow-tooltip="true" />
- <el-table-column label="鐧诲綍鏃堕棿" align="center" prop="loginTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.loginTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Delete" @click="handleForceLogout(scope.row)" v-hasPermi="['monitor:online:forceLogout']">寮洪��</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" />
- </div>
-</template>
-
-<script setup name="Online">
-import { forceLogout, list as initData } from "@/api/monitor/online"
-
-const { proxy } = getCurrentInstance()
-
-const onlineList = ref([])
-const loading = ref(true)
-const total = ref(0)
-const pageNum = ref(1)
-const pageSize = ref(10)
-
-const queryParams = ref({
- ipaddr: undefined,
- userName: undefined
-})
-
-/** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */
-function getList() {
- loading.value = true
- initData(queryParams.value).then(response => {
- onlineList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- pageNum.value = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 寮洪��鎸夐挳鎿嶄綔 */
-function handleForceLogout(row) {
- proxy.$modal.confirm('鏄惁纭寮洪��鍚嶇О涓�"' + row.userName + '"鐨勭敤鎴�?').then(function () {
- return forceLogout(row.tokenId)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-getList()
-</script>
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
deleted file mode 100644
index 92f9c35..0000000
--- a/src/views/monitor/operlog/index.vue
+++ /dev/null
@@ -1,313 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="鎿嶄綔鍦板潃" prop="operIp">
- <el-input
- v-model="queryParams.operIp"
- placeholder="璇疯緭鍏ユ搷浣滃湴鍧�"
- clearable
- style="width: 240px;"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="绯荤粺妯″潡" prop="title">
- <el-input
- v-model="queryParams.title"
- placeholder="璇疯緭鍏ョ郴缁熸ā鍧�"
- clearable
- style="width: 240px;"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鎿嶄綔浜哄憳" prop="operName">
- <el-input
- v-model="queryParams.operName"
- placeholder="璇疯緭鍏ユ搷浣滀汉鍛�"
- clearable
- style="width: 240px;"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="绫诲瀷" prop="businessType">
- <el-select
- v-model="queryParams.businessType"
- placeholder="鎿嶄綔绫诲瀷"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_oper_type"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="鎿嶄綔鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_common_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鎿嶄綔鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['monitor:operlog:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- @click="handleClean"
- v-hasPermi="['monitor:operlog:remove']"
- >娓呯┖</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['monitor:operlog:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
- <el-table-column type="selection" width="50" align="center" />
- <el-table-column label="鏃ュ織缂栧彿" align="center" prop="operId" />
- <el-table-column label="绯荤粺妯″潡" align="center" prop="title" :show-overflow-tooltip="true" />
- <el-table-column label="鎿嶄綔绫诲瀷" align="center" prop="businessType">
- <template #default="scope">
- <dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔浜哄憳" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
- <el-table-column label="鎿嶄綔鍦板潃" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
- <el-table-column label="鎿嶄綔鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_common_status" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔鏃ユ湡" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
- <template #default="scope">
- <span>{{ parseTime(scope.row.operTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="娑堣�楁椂闂�" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']">
- <template #default="scope">
- <span>{{ scope.row.costTime }}姣</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']">璇︾粏</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 鎿嶄綔鏃ュ織璇︾粏 -->
- <el-dialog title="鎿嶄綔鏃ュ織璇︾粏" v-model="open" width="800px" append-to-body>
- <el-form :model="form" label-width="100px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鎿嶄綔妯″潡锛�">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
- <el-form-item
- label="鐧诲綍淇℃伅锛�"
- >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璇锋眰鍦板潃锛�">{{ form.operUrl }}</el-form-item>
- <el-form-item label="璇锋眰鏂瑰紡锛�">{{ form.requestMethod }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鎿嶄綔鏂规硶锛�">{{ form.method }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="璇锋眰鍙傛暟锛�">{{ form.operParam }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="杩斿洖鍙傛暟锛�">{{ form.jsonResult }}</el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎿嶄綔鐘舵�侊細">
- <div v-if="form.status === 0">姝e父</div>
- <div v-else-if="form.status === 1">澶辫触</div>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="娑堣�楁椂闂达細">{{ form.costTime }}姣</el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎿嶄綔鏃堕棿锛�">{{ parseTime(form.operTime) }}</el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="寮傚父淇℃伅锛�" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="open = false">鍏� 闂�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Operlog">
-import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog"
-import {onMounted} from "vue";
-
-const { proxy } = getCurrentInstance()
-const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type","sys_common_status")
-
-const operlogList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const dateRange = ref([])
-const defaultSort = ref({ prop: "operTime", order: "descending" })
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- operIp: undefined,
- title: undefined,
- operName: undefined,
- businessType: undefined,
- status: undefined
- }
-})
-
-const { queryParams, form } = toRefs(data)
-
-/** 鏌ヨ鐧诲綍鏃ュ織 */
-function getList() {
- loading.value = true
- list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- operlogList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鎿嶄綔鏃ュ織绫诲瀷瀛楀吀缈昏瘧 */
-function typeFormat(row, column) {
- return proxy.selectDictLabel(sys_oper_type.value, row.businessType)
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- queryParams.value.pageNum = 1
- proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order)
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.operId)
- multiple.value = !selection.length
-}
-
-/** 鎺掑簭瑙﹀彂浜嬩欢 */
-function handleSortChange(column, prop, order) {
- queryParams.value.orderByColumn = column.prop
- queryParams.value.isAsc = column.order
- getList()
-}
-
-/** 璇︾粏鎸夐挳鎿嶄綔 */
-function handleView(row) {
- open.value = true
- form.value = row
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const operIds = row.operId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎鏃ュ織缂栧彿涓�"' + operIds + '"鐨勬暟鎹」?').then(function () {
- return delOperlog(operIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 娓呯┖鎸夐挳鎿嶄綔 */
-function handleClean() {
- proxy.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?").then(function () {
- return cleanOperlog()
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("娓呯┖鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("monitor/operlog/export",{
- ...queryParams.value,
- }, `config_${new Date().getTime()}.xlsx`)
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue
deleted file mode 100644
index d9840ac..0000000
--- a/src/views/monitor/server/index.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div class="app-container">
- <el-row :gutter="10">
- <el-col :span="12" class="card-box">
- <el-card>
- <template #header><Cpu style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">CPU</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%;">
- <thead>
- <tr>
- <th class="el-table__cell is-leaf"><div class="cell">灞炴��</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鍊�</div></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鏍稿績鏁�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.cpuNum }}</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鐢ㄦ埛浣跨敤鐜�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.used }}%</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">绯荤粺浣跨敤鐜�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.sys }}%</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">褰撳墠绌洪棽鐜�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.free }}%</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="12" class="card-box">
- <el-card>
- <template #header><Tickets style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%;">
- <thead>
- <tr>
- <th class="el-table__cell is-leaf"><div class="cell">灞炴��</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鍐呭瓨</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">JVM</div></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鎬诲唴瀛�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.total }}G</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.total }}M</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">宸茬敤鍐呭瓨</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.used}}G</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.used}}M</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鍓╀綑鍐呭瓨</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.free }}G</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.free }}M</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">浣跨敤鐜�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem" :class="{'text-danger': server.mem.usage > 80}">{{ server.mem.usage }}%</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm" :class="{'text-danger': server.jvm.usage > 80}">{{ server.jvm.usage }}%</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="24" class="card-box">
- <el-card>
- <template #header><Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鏈嶅姟鍣ㄤ俊鎭�</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%;">
- <tbody>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鏈嶅姟鍣ㄥ悕绉�</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.computerName }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">鎿嶄綔绯荤粺</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.osName }}</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鏈嶅姟鍣↖P</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.computerIp }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">绯荤粺鏋舵瀯</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.osArch }}</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="24" class="card-box">
- <el-card>
- <template #header><CoffeeCup style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">Java铏氭嫙鏈轰俊鎭�</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%;table-layout:fixed;">
- <tbody>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">Java鍚嶇О</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.name }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">Java鐗堟湰</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.version }}</div></td>
- </tr>
- <tr>
- <td class="el-table__cell is-leaf"><div class="cell">鍚姩鏃堕棿</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.startTime }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">杩愯鏃堕暱</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.runTime }}</div></td>
- </tr>
- <tr>
- <td colspan="1" class="el-table__cell is-leaf"><div class="cell">瀹夎璺緞</div></td>
- <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.home }}</div></td>
- </tr>
- <tr>
- <td colspan="1" class="el-table__cell is-leaf"><div class="cell">椤圭洰璺緞</div></td>
- <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div></td>
- </tr>
- <tr>
- <td colspan="1" class="el-table__cell is-leaf"><div class="cell">杩愯鍙傛暟</div></td>
- <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.inputArgs }}</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="24" class="card-box">
- <el-card>
- <template #header><MessageBox style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">纾佺洏鐘舵��</span></template>
- <div class="el-table el-table--enable-row-hover el-table--medium">
- <table cellspacing="0" style="width: 100%;">
- <thead>
- <tr>
- <th class="el-table__cell el-table__cell is-leaf"><div class="cell">鐩樼璺緞</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鏂囦欢绯荤粺</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鐩樼绫诲瀷</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鎬诲ぇ灏�</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">鍙敤澶у皬</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">宸茬敤澶у皬</div></th>
- <th class="el-table__cell is-leaf"><div class="cell">宸茬敤鐧惧垎姣�</div></th>
- </tr>
- </thead>
- <tbody v-if="server.sysFiles">
- <tr v-for="(sysFile, index) in server.sysFiles" :key="index">
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.dirName }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.sysTypeName }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.typeName }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.total }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.free }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.used }}</div></td>
- <td class="el-table__cell is-leaf"><div class="cell" :class="{'text-danger': sysFile.usage > 80}">{{ sysFile.usage }}%</div></td>
- </tr>
- </tbody>
- </table>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import { getServer } from '@/api/monitor/server'
-import {onMounted} from "vue";
-
-const server = ref([])
-const { proxy } = getCurrentInstance()
-
-function getList() {
- proxy.$modal.loading("姝e湪鍔犺浇鏈嶅姟鐩戞帶鏁版嵁锛岃绋嶅�欙紒")
- getServer().then(response => {
- server.value = response.data
- proxy.$modal.closeLoading()
- })
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/personnelManagement/analytics/index.vue b/src/views/personnelManagement/analytics/index.vue
deleted file mode 100644
index 06b868b..0000000
--- a/src/views/personnelManagement/analytics/index.vue
+++ /dev/null
@@ -1,698 +0,0 @@
-<template>
- <div class="app-container analytics-container">
-
- <!-- 鍏抽敭鎸囨爣鍗$墖 -->
- <el-row :gutter="20" class="metrics-cards">
- <el-col :span="6" v-for="(item, index) in keyMetrics" :key="index">
- <el-card class="metric-card" :class="item.type">
- <div class="card-content">
- <div class="card-icon">
- <el-icon :size="32">
- <component :is="item.icon" />
- </el-icon>
- </div>
- <div class="card-info">
- <div class="card-number">
- <el-skeleton-item v-if="loading" variant="text" style="width: 60px; height: 32px;" />
- <span v-else>{{ item.value }}{{ item.unit }}</span>
- </div>
- <div class="card-label">{{ item.label }}</div>
- <div class="card-trend" :class="item.trend > 0 ? 'positive' : 'negative'">
- <el-icon>
- <component :is="item.trend > 0 ? 'ArrowUp' : 'ArrowDown'" />
- </el-icon>
- {{ Math.abs(item.trend) }}%
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 鍥捐〃鍖哄煙 -->
- <el-row :gutter="20" class="charts-section">
- <!-- 鍛樺伐娴佸姩鐜囪秼鍔垮浘 -->
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>鍛樺伐娴佸姩鐜囪秼鍔�</span>
- <el-tag type="info">杩�12涓湀</el-tag>
- </div>
- </template>
- <div class="chart-container">
- <div ref="turnoverChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
-
- <!-- 閮ㄩ棬浜哄憳鍒嗗竷 -->
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>閮ㄩ棬浜哄憳鍒嗗竷</span>
- <el-tag type="success">褰撳墠鐘舵��</el-tag>
- </div>
- </template>
- <div class="chart-container">
- <div ref="departmentChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 绗簩琛屽浘琛� -->
- <el-row :gutter="20" class="charts-section">
- <!-- 缂栧埗杈炬垚鐜� -->
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>缂栧埗杈炬垚鐜�</span>
- <el-tag type="warning">鍚勯儴闂ㄥ姣�</el-tag>
- </div>
- </template>
- <div class="chart-container">
- <div ref="staffingChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
-
- <!-- 鍛樺伐娴佸け鍘熷洜鍒嗘瀽 -->
- <el-col :span="12">
- <el-card class="chart-card">
- <template #header>
- <div class="card-header">
- <span>鍛樺伐娴佸け鍘熷洜鍒嗘瀽</span>
- <el-tag type="danger">骞村害缁熻</el-tag>
- </div>
- </template>
- <div class="chart-container">
- <div ref="attritionChartRef" class="chart"></div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage } from 'element-plus'
-import {
- Refresh,
- User,
- TrendCharts,
- DataAnalysis,
- PieChart,
- ArrowUp,
- ArrowDown
-} from '@element-plus/icons-vue'
-import * as echarts from 'echarts'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const autoRefreshEnabled = ref(true)
-const autoRefreshInterval = ref(null)
-
-// 鍥捐〃寮曠敤
-const turnoverChartRef = ref(null)
-const departmentChartRef = ref(null)
-const staffingChartRef = ref(null)
-const attritionChartRef = ref(null)
-
-// 鍥捐〃瀹炰緥
-let turnoverChart = null
-let departmentChart = null
-let staffingChart = null
-let attritionChart = null
-
-// 鑷姩鏇存柊闂撮殧锛�10鍒嗛挓锛�
-const AUTO_REFRESH_INTERVAL = 10 * 60 * 1000
-
-// 鍏抽敭鎸囨爣鏁版嵁
-const keyMetrics = ref([
- {
- label: '鍛樺伐娴佸姩鐜�',
- value: 0,
- unit: '%',
- icon: 'TrendCharts',
- type: 'primary',
- trend: 0
- },
- {
- label: '鍛樺伐娴佸け鐜�',
- value: 0,
- unit: '%',
- icon: 'User',
- type: 'danger',
- trend: 0
- },
- {
- label: '缂栧埗杈炬垚鐜�',
- value: 0,
- unit: '%',
- icon: 'DataAnalysis',
- type: 'success',
- trend: 0
- },
- {
- label: '鍦ㄨ亴鍛樺伐鏁�',
- value: 0,
- unit: '浜�',
- icon: 'PieChart',
- type: 'warning',
- trend: 0
- }
-])
-
-// 閮ㄩ棬鏁版嵁
-const departmentData = ref([])
-
-// 鍚姩鑷姩鍒锋柊
-const startAutoRefresh = () => {
- if (autoRefreshInterval.value) {
- clearInterval(autoRefreshInterval.value)
- }
- if (autoRefreshEnabled.value) {
- autoRefreshInterval.value = setInterval(() => {
- refreshData()
- }, AUTO_REFRESH_INTERVAL)
- }
-}
-
-// 鍋滄鑷姩鍒锋柊
-const stopAutoRefresh = () => {
- if (autoRefreshInterval.value) {
- clearInterval(autoRefreshInterval.value)
- autoRefreshInterval.value = null
- }
-}
-
-// 鍒囨崲鑷姩鍒锋柊鐘舵��
-const toggleAutoRefresh = (value) => {
- if (value) {
- startAutoRefresh()
- } else {
- stopAutoRefresh()
- }
-}
-
-// 鐢熸垚妯℃嫙鏁版嵁
-const generateMockData = () => {
- // 鐢熸垚鍏抽敭鎸囨爣鏁版嵁
- keyMetrics.value[0].value = (Math.random() * 5 + 2).toFixed(1)
- keyMetrics.value[0].trend = (Math.random() * 3 - 1.5).toFixed(1)
-
- keyMetrics.value[1].value = (Math.random() * 3 + 1).toFixed(1)
- keyMetrics.value[1].trend = (Math.random() * 2 - 1).toFixed(1)
-
- keyMetrics.value[2].value = (Math.random() * 15 + 85).toFixed(1)
- keyMetrics.value[2].trend = (Math.random() * 3 - 1.5).toFixed(1)
-
- keyMetrics.value[3].value = Math.floor(Math.random() * 50 + 200)
- keyMetrics.value[3].trend = (Math.random() * 2 - 1).toFixed(1)
-
- // 鐢熸垚閮ㄩ棬鏁版嵁
- const departments = ['鎶�鏈儴', '閿�鍞儴', '浜轰簨閮�', '璐㈠姟閮�', '鐢熶骇閮�', '甯傚満閮�']
- departmentData.value = departments.map(dept => ({
- department: dept,
- currentStaff: Math.floor(Math.random() * 30 + 20),
- plannedStaff: Math.floor(Math.random() * 10 + 35),
- staffingRate: Math.floor(Math.random() * 20 + 80),
- turnoverRate: (Math.random() * 4 + 1).toFixed(1),
- attritionRate: (Math.random() * 2 + 0.5).toFixed(1),
- newHires: Math.floor(Math.random() * 5 + 1),
- resignations: Math.floor(Math.random() * 3 + 1),
- status: Math.random() > 0.7 ? '寮傚父' : '姝e父'
- }))
-}
-
-// 鍒锋柊鏁版嵁
-const refreshData = async () => {
- loading.value = true
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 500))
-
- generateMockData()
- renderAllCharts()
-
- if (!autoRefreshEnabled.value) {
- ElMessage.success('鏁版嵁鍒锋柊鎴愬姛')
- }
- } catch (error) {
- console.error('鍒锋柊鏁版嵁澶辫触:', error)
- ElMessage.error('鍒锋柊鏁版嵁澶辫触')
- } finally {
- loading.value = false
- }
-}
-
-// 鍒濆鍖栧浘琛�
-const initCharts = () => {
- setTimeout(() => {
- if (turnoverChartRef.value) {
- turnoverChart = echarts.init(turnoverChartRef.value)
- }
- if (departmentChartRef.value) {
- departmentChart = echarts.init(departmentChartRef.value)
- }
- if (staffingChartRef.value) {
- staffingChart = echarts.init(staffingChartRef.value)
- }
- if (attritionChartRef.value) {
- attritionChart = echarts.init(attritionChartRef.value)
- }
-
- renderAllCharts()
- }, 300)
-}
-
-// 娓叉煋鎵�鏈夊浘琛�
-const renderAllCharts = () => {
- renderTurnoverChart()
- renderDepartmentChart()
- renderStaffingChart()
- renderAttritionChart()
-}
-
-// 娓叉煋鍛樺伐娴佸姩鐜囪秼鍔垮浘
-const renderTurnoverChart = () => {
- if (!turnoverChart) return
-
- const months = ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�', '8鏈�', '9鏈�', '10鏈�', '11鏈�', '12鏈�']
- const turnoverData = months.map(() => (Math.random() * 5 + 2).toFixed(1))
- const attritionData = months.map(() => (Math.random() * 3 + 1).toFixed(1))
-
- const option = {
- title: {
- text: '鍛樺伐娴佸姩鐜囪秼鍔�',
- left: 'center',
- textStyle: { fontSize: 16, fontWeight: 'normal' }
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: { type: 'cross' }
- },
- legend: {
- data: ['娴佸姩鐜�', '娴佸け鐜�'],
- bottom: 10
- },
- grid: {
- left: '3%',
- right: '4%',
- bottom: '15%',
- top: '15%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: months,
- boundaryGap: false
- },
- yAxis: {
- type: 'value',
- axisLabel: { formatter: '{value}%' }
- },
- series: [
- {
- name: '娴佸姩鐜�',
- type: 'line',
- data: turnoverData,
- smooth: true,
- lineStyle: { color: '#409EFF' },
- itemStyle: { color: '#409EFF' }
- },
- {
- name: '娴佸け鐜�',
- type: 'line',
- data: attritionData,
- smooth: true,
- lineStyle: { color: '#F56C6C' },
- itemStyle: { color: '#F56C6C' }
- }
- ]
- }
-
- turnoverChart.setOption(option)
-}
-
-// 娓叉煋閮ㄩ棬浜哄憳鍒嗗竷鍥�
-const renderDepartmentChart = () => {
- if (!departmentChart) return
-
- const data = departmentData.value.map(item => ({
- name: item.department,
- value: item.currentStaff
- }))
-
- const option = {
- title: {
- text: '閮ㄩ棬浜哄憳鍒嗗竷',
- left: 'center',
- textStyle: { fontSize: 16, fontWeight: 'normal' }
- },
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b}: {c}浜� ({d}%)'
- },
- legend: {
- orient: 'vertical',
- left: 'left',
- top: 'middle'
- },
- series: [
- {
- name: '浜哄憳鏁伴噺',
- type: 'pie',
- radius: ['40%', '70%'],
- center: ['60%', '50%'],
- data: data,
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: 'rgba(0, 0, 0, 0.5)'
- }
- }
- }
- ]
- }
-
- departmentChart.setOption(option)
-}
-
-// 娓叉煋缂栧埗杈炬垚鐜囧浘
-const renderStaffingChart = () => {
- if (!staffingChart) return
-
- const departments = departmentData.value.map(item => item.department)
- const rates = departmentData.value.map(item => item.staffingRate)
-
- const option = {
- title: {
- text: '缂栧埗杈炬垚鐜�',
- left: 'center',
- textStyle: { fontSize: 16, fontWeight: 'normal' }
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: { type: 'shadow' }
- },
- grid: {
- left: '3%',
- right: '4%',
- bottom: '15%',
- top: '15%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: departments,
- axisLabel: { rotate: 45 }
- },
- yAxis: {
- type: 'value',
- axisLabel: { formatter: '{value}%' },
- max: 100
- },
- series: [
- {
- name: '杈炬垚鐜�',
- type: 'bar',
- data: rates,
- itemStyle: {
- color: function(params) {
- const value = params.value
- if (value >= 90) return '#67C23A'
- if (value >= 80) return '#E6A23C'
- return '#F56C6C'
- }
- }
- }
- ]
- }
-
- staffingChart.setOption(option)
-}
-
-// 娓叉煋鍛樺伐娴佸け鍘熷洜鍒嗘瀽鍥�
-const renderAttritionChart = () => {
- if (!attritionChart) return
-
- const reasons = ['钖祫寰呴亣', '鑱屼笟鍙戝睍', '宸ヤ綔鐜', '涓汉鍘熷洜', '鍏朵粬']
- const data = reasons.map(() => Math.floor(Math.random() * 20 + 5))
-
- const option = {
- title: {
- text: '鍛樺伐娴佸け鍘熷洜鍒嗘瀽',
- left: 'center',
- textStyle: { fontSize: 16, fontWeight: 'normal' }
- },
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b}: {c}浜� ({d}%)'
- },
- legend: {
- orient: 'vertical',
- left: 'left',
- top: 'middle'
- },
- series: [
- {
- name: '娴佸け浜烘暟',
- type: 'pie',
- radius: '50%',
- center: ['60%', '50%'],
- data: reasons.map((reason, index) => ({
- name: reason,
- value: data[index]
- })),
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: 'rgba(0, 0, 0, 0.5)'
- }
- }
- }
- ]
- }
-
- attritionChart.setOption(option)
-}
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- generateMockData()
- initCharts()
- startAutoRefresh()
-})
-
-onUnmounted(() => {
- stopAutoRefresh()
-})
-</script>
-
-<style scoped>
-.analytics-container {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: 100vh;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- color: white;
-}
-
-.page-header h2 {
- color: white;
- margin-bottom: 10px;
- font-size: 28px;
- font-weight: 600;
-}
-
-.page-header p {
- color: rgba(255, 255, 255, 0.9);
- font-size: 14px;
- margin: 0 0 15px 0;
-}
-
-.header-controls {
- display: flex;
- justify-content: center;
- align-items: center;
- gap: 20px;
-}
-
-.refresh-btn {
- margin-left: 20px;
-}
-
-.metrics-cards {
- margin-bottom: 30px;
-}
-
-.metric-card {
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- transition: all 0.3s ease;
- border: none;
- overflow: hidden;
-}
-
-.metric-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-.metric-card.primary {
- border-left: 4px solid #409EFF;
- background: linear-gradient(135deg, #409EFF 0%, #36a3f7 100%);
-}
-
-.metric-card.danger {
- border-left: 4px solid #F56C6C;
- background: linear-gradient(135deg, #F56C6C 0%, #f78989 100%);
-}
-
-.metric-card.success {
- border-left: 4px solid #67C23A;
- background: linear-gradient(135deg, #67C23A 0%, #85ce61 100%);
-}
-
-.metric-card.warning {
- border-left: 4px solid #E6A23C;
- background: linear-gradient(135deg, #E6A23C 0%, #ebb563 100%);
-}
-
-.card-content {
- display: flex;
- align-items: center;
- padding: 20px;
-}
-
-.card-icon {
- margin-right: 20px;
- color: white;
-}
-
-.card-info {
- flex: 1;
-}
-
-.card-number {
- font-size: 32px;
- font-weight: 600;
- color: white;
- margin-bottom: 5px;
-}
-
-.card-label {
- font-size: 14px;
- color: rgba(255, 255, 255, 0.9);
- margin-bottom: 5px;
-}
-
-.card-trend {
- font-size: 12px;
- display: flex;
- align-items: center;
- gap: 4px;
-}
-
-.card-trend.positive {
- color: #67C23A;
-}
-
-.card-trend.negative {
- color: #F56C6C;
-}
-
-.charts-section {
- margin-bottom: 30px;
-}
-
-.chart-card {
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- border: none;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: 600;
- color: #303133;
- padding: 15px 20px;
- border-bottom: 1px solid #ebeef5;
-}
-
-.chart-container {
- height: 350px;
- padding: 20px;
-}
-
-.chart {
- width: 100%;
- height: 100%;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .analytics-container {
- padding: 10px;
- }
-
- .page-header {
- padding: 15px;
- }
-
- .page-header h2 {
- font-size: 24px;
- }
-
- .header-controls {
- flex-direction: column;
- gap: 15px;
- }
-
- .refresh-btn {
- margin-left: 0;
- }
-
- .metrics-cards .el-col {
- margin-bottom: 15px;
- }
-
- .charts-section .el-col {
- margin-bottom: 20px;
- }
-
- .chart-container {
- height: 300px;
- }
-}
-
-@media (max-width: 480px) {
- .page-header h2 {
- font-size: 20px;
- }
-
- .card-number {
- font-size: 24px;
- }
-
- .chart-container {
- height: 250px;
- }
-}
-</style>
diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
deleted file mode 100644
index 6538273..0000000
--- a/src/views/personnelManagement/contractManagement/components/formDia.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璇︽儏"
- width="70%"
- @close="closeDia"
- >
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="600"
- ></PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- staffOnJobInfo({staffNo: row.staffNo}).then(res => {
- tableData.value = res.data
- })
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/filesDia.vue b/src/views/personnelManagement/contractManagement/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/personnelManagement/contractManagement/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
deleted file mode 100644
index 98f0272..0000000
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ /dev/null
@@ -1,329 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input v-model="searchForm.staffName" style="width: 240px" placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery"
- clearable :prefix-icon="Search" />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
-<!-- <el-button type="info" @click="handleImport">瀵煎叆</el-button>-->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <div class="table_list">
- <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
- @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
- :total="page.total"></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
-
- <!-- 鍚堝悓瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <!-- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- > -->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref } from "vue";
-import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
-import { ElMessageBox } from "element-plus";
-import { staffOnJobListPage } from "@/api/personnelManagement/employeeRecord.js";
-import dayjs from "dayjs";
-import { getToken } from "@/utils/auth.js";
-import FilesDia from "./filesDia.vue";
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width: 200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width: 100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width: 200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width: 150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width: 150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- // {
- // label: "鍚堝悓寮�濮嬫棩鏈�",
- // prop: "contractStartTime",
- // width: 120
- // },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 120,
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- ],
- },
-]);
-const filesDia = ref()
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- console.log(row)
- nextTick(() => {
- filesDia.value?.openDialog( row,'鍚堝悓')
- })
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- staffOnJobListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {}, "鍚堝悓绠$悊.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鍚堝悓瀵煎叆";
- upload.open = true;
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- console.log(upload.url + '?updateSupport=' + upload.updateSupport)
- proxy.$refs["uploadRef"].submit();
-}
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue
deleted file mode 100644
index f63b011..0000000
--- a/src/views/personnelManagement/dimission/components/formDia.vue
+++ /dev/null
@@ -1,290 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffName">
- <!-- <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/> -->
- <el-select v-model="form.staffName" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.staffName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
- <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬у埆锛�" prop="sex">
- <el-select v-model="form.sex" disabled>
- <el-option label="鐢�" value="鐢�" />
- <el-option label="濂�" value="濂�" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫嶈疮锛�" prop="nativePlace">
- <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宀椾綅锛�" prop="postJob">
- <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
- <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
- <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓撲笟锛�" prop="profession">
- <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
- <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="骞撮緞锛�" prop="age">
- <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
- <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
- <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
- <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
- <el-date-picker
- disabled
- v-model="form.contractStartTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
- <el-date-picker
- disabled
- v-model="form.contractEndTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate,getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- staffNo: "",
- staffName: "",
- sex: "",
- nativePlace: "",
- postJob: "",
- adress: "",
- firstStudy: "",
- profession: "",
- identityCard: "",
- age: 0,
- phone: "",
- emergencyContact: "",
- emergencyContactPhone: "",
- contractTerm: 0,
- contractStartTime: "",
- contractEndTime: "",
- staffState: "",
- },
- rules: {
- staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- getList()
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 0
- if (operationType.value === "add") {
- staffJoinAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- staffJoinUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-
-const personList = ref([]);
-
-/**
- * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
- */
-const getList = () => {
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
-};
-
-const handleSelect = (val) => {
- let obj = personList.value.find(item => item.staffName === val)
- let {
- sex,
- phone,
- staffNo,
- nativePlace,
- postJob,
- adress,
- firstStudy,
- profession,
- identityCard,
- age,
- emergencyContact,
- emergencyContactPhone,
- contractTerm,
- contractStartTime,
- contractEndTime,
- staffName
- } = obj
- form.value = {
- sex,
- phone,
- staffNo,
- nativePlace,
- postJob,
- adress,
- firstStudy,
- profession,
- identityCard,
- age,
- emergencyContact,
- emergencyContactPhone,
- contractTerm,
- contractStartTime,
- contractEndTime,
- staffName
- }
-
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/dimission/index.vue b/src/views/personnelManagement/dimission/index.vue
deleted file mode 100644
index 6e20b1e..0000000
--- a/src/views/personnelManagement/dimission/index.vue
+++ /dev/null
@@ -1,284 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓寮�濮嬫棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.entryDateStart"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓寮�濮嬫棩鏈�"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDateEnd"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- width: 120
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- staffJoinListPage({...page, ...searchForm.value, staffState: 0}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 0}, "浜哄憳绂昏亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/employeeRecord/components/formDia.vue b/src/views/personnelManagement/employeeRecord/components/formDia.vue
deleted file mode 100644
index 6538273..0000000
--- a/src/views/personnelManagement/employeeRecord/components/formDia.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璇︽儏"
- width="70%"
- @close="closeDia"
- >
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="600"
- ></PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- staffOnJobInfo({staffNo: row.staffNo}).then(res => {
- tableData.value = res.data
- })
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
deleted file mode 100644
index 6965e96..0000000
--- a/src/views/personnelManagement/employeeRecord/index.vue
+++ /dev/null
@@ -1,249 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
-<!-- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
- <el-button @click="handleOut">瀵煎嚭</el-button>
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/employeeRecord/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- // {
- // label: "鍚堝悓寮�濮嬫棩鏈�",
- // prop: "contractStartTime",
- // width: 120
- // },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- staffOnJobListPage({...params, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍦ㄨ亴鍛樺伐鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/onboarding/components/formDia.vue b/src/views/personnelManagement/onboarding/components/formDia.vue
deleted file mode 100644
index d0e76cc..0000000
--- a/src/views/personnelManagement/onboarding/components/formDia.vue
+++ /dev/null
@@ -1,259 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
- <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffName">
- <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬у埆锛�" prop="sex">
- <el-select v-model="form.sex">
- <el-option label="鐢�" value="鐢�" />
- <el-option label="濂�" value="濂�" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫嶈疮锛�" prop="nativePlace">
- <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宀椾綅锛�" prop="postJob">
- <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
- <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
- <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓撲笟锛�" prop="profession">
- <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
- <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="骞撮緞锛�" prop="age">
- <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
- <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
- <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
- <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
- <el-date-picker
- v-model="form.contractStartTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- @change="calculateContractTerm"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
- <el-date-picker
- v-model="form.contractEndTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- @change="calculateContractTerm"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- staffNo: "",
- staffName: "",
- sex: "",
- nativePlace: "",
- postJob: "",
- adress: "",
- firstStudy: "",
- profession: "",
- identityCard: "",
- age: 0,
- phone: "",
- emergencyContact: "",
- emergencyContactPhone: "",
- contractTerm: 0,
- contractStartTime: "",
- contractEndTime: "",
- staffState: "",
- },
- rules: {
- staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...res.data}
- // 缂栬緫鏃朵篃璁$畻涓�娆″悎鍚屽勾闄�
- calculateContractTerm();
- })
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- staffJoinAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- staffJoinUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 璁$畻鍚堝悓骞撮檺
-const calculateContractTerm = () => {
- if (form.value.contractStartTime && form.value.contractEndTime) {
- const startDate = new Date(form.value.contractStartTime);
- const endDate = new Date(form.value.contractEndTime);
-
- if (endDate > startDate) {
- // 璁$畻骞翠唤宸�
- const yearDiff = endDate.getFullYear() - startDate.getFullYear();
- const monthDiff = endDate.getMonth() - startDate.getMonth();
- const dayDiff = endDate.getDate() - startDate.getDate();
-
- let years = yearDiff;
-
- // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
- if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
- years = yearDiff - 1;
- }
-
- form.value.contractTerm = Math.max(0, years);
- } else {
- form.value.contractTerm = 0;
- }
- } else {
- form.value.contractTerm = 0;
- }
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue
deleted file mode 100644
index d36f2e5..0000000
--- a/src/views/personnelManagement/onboarding/index.vue
+++ /dev/null
@@ -1,284 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓寮�濮嬫棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.entryDateStart"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓寮�濮嬫棩鏈�"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDateEnd"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍏ヨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- width: 120
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- staffJoinListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/payrollManagement/components/formDia.vue b/src/views/personnelManagement/payrollManagement/components/formDia.vue
deleted file mode 100644
index 6dbc326..0000000
--- a/src/views/personnelManagement/payrollManagement/components/formDia.vue
+++ /dev/null
@@ -1,315 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏈堜唤锛�" prop="payDate">
- <el-date-picker
- v-model="form.payDate"
- type="month"
- value-format="YYYY-MM-DD"
- format="YYYY-MM"
- placeholder="璇烽�夋嫨鏈堜唤"
- clearable
- :disabled="operationType === 'edit'"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffId">
- <el-select v-model="form.staffId" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect" :disabled="operationType === 'edit'">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴斿嚭鍕ゅぉ鏁帮細" prop="shouldAttendedNum">
- <el-input v-model="form.shouldAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹為檯鍑哄嫟澶╂暟锛�" prop="actualAttendedNum">
- <el-input v-model="form.actualAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍩烘湰宸ヨ祫锛�" prop="basicSalary">
- <el-input v-model="form.basicSalary" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="宀椾綅宸ヨ祫锛�" prop="postSalary">
- <el-input v-model="form.postSalary" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏ョ鑱岀己鍕ゆ墸娆撅細" prop="deductionAbsenteeism">
- <el-input v-model="form.deductionAbsenteeism" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐥呭亣鎵f锛�" prop="sickLeaveDeductions">
- <el-input v-model="form.sickLeaveDeductions" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜嬪亣鎵f锛�" prop="deductionPersonalLeave">
- <el-input v-model="form.deductionPersonalLeave" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="蹇樿鎵撳崱鎵f锛�" prop="forgetClockDeduct">
- <el-input v-model="form.forgetClockDeduct" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁╂晥寰楀垎锛�" prop="performanceScore">
- <el-input v-model="form.performanceScore" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁╂晥宸ヨ祫锛�" prop="performancePay">
- <el-input v-model="form.performancePay" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴斿彂鍚堣锛�" prop="payableWages">
- <el-input v-model="form.payableWages" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绀句繚涓汉锛�" prop="socialSecurityIndividuals">
- <el-input v-model="form.socialSecurityIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绀句繚鍏徃锛�" prop="socialSecurityCompanies">
- <el-input v-model="form.socialSecurityCompanies" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绀句繚鍚堣锛�" prop="socialSecurityTotal">
- <el-input v-model="form.socialSecurityTotal" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏Н閲戜釜浜猴細" prop="providentFundIndividuals">
- <el-input v-model="form.providentFundIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏Н閲戝叕鍙革細" prop="providentFundCompany">
- <el-input v-model="form.providentFundCompany" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏Н閲戝悎璁★細" prop="providentFundTotal">
- <el-input v-model="form.providentFundTotal" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="搴旂◣宸ヨ祫锛�" prop="taxableWaget">
- <el-input v-model="form.taxableWaget" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓汉鎵�寰楃◣锛�" prop="personalIncomeTax">
- <el-input v-model="form.personalIncomeTax" :step="0.1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹炲彂宸ヨ祫锛�" prop="actualWages">
- <el-input v-model="form.actualWages" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, getStaffOnJob, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {compensationAdd, compensationUpdate} from "@/api/personnelManagement/payrollManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- payDate: "",
- staffId: "",
- name: "",
- shouldAttendedNum: "",
- actualAttendedNum: "",
- basicSalary: "",
- postSalary: "",
- deductionAbsenteeism: "",
- sickLeaveDeductions: "",
- deductionPersonalLeave: "",
- forgetClockDeduct: "",
- performanceScore: "",
- performancePay: "",
- payableWages: "",
- socialSecurityIndividuals: "",
- socialSecurityCompanies: "",
- socialSecurityTotal: "",
- providentFundIndividuals: "",
- providentFundCompany: "",
- providentFundTotal: "",
- taxableWaget: "",
- personalIncomeTax: "",
- actualWages: "",
- },
- rules: {
- payDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- staffId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- shouldAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- basicSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- deductionAbsenteeism: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sickLeaveDeductions: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- deductionPersonalLeave: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- forgetClockDeduct: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- performanceScore: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- performancePay: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- payableWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityCompanies: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundCompany: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxableWaget: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- personalIncomeTax: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const personList = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
- form.value = {}
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...row}
- form.value.payDate = form.value.payDate + '-01'
- })
- }
-}
-const handleSelect = (value) => {
- console.log('value', value)
- const index = personList.value.findIndex(row => row.id === value)
- if (index > -1) {
- form.value.name = personList.value[index].staffName
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- compensationAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- compensationUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 璁$畻鍚堝悓骞撮檺
-const calculateContractTerm = () => {
- if (form.value.contractStartTime && form.value.contractEndTime) {
- const startDate = new Date(form.value.contractStartTime);
- const endDate = new Date(form.value.contractEndTime);
-
- if (endDate > startDate) {
- // 璁$畻骞翠唤宸�
- const yearDiff = endDate.getFullYear() - startDate.getFullYear();
- const monthDiff = endDate.getMonth() - startDate.getMonth();
- const dayDiff = endDate.getDate() - startDate.getDate();
-
- let years = yearDiff;
-
- // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
- if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
- years = yearDiff - 1;
- }
-
- form.value.contractTerm = Math.max(0, years);
- } else {
- form.value.contractTerm = 0;
- }
- } else {
- form.value.contractTerm = 0;
- }
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/payrollManagement/index.vue b/src/views/personnelManagement/payrollManagement/index.vue
deleted file mode 100644
index 1de23e4..0000000
--- a/src/views/personnelManagement/payrollManagement/index.vue
+++ /dev/null
@@ -1,291 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鏈堜唤锛�</span>
- <el-date-picker
- v-model="searchForm.payDateStr"
- type="month"
- @change="handleQuery"
- value-format="YYYY-MM"
- format="YYYY-MM"
- placeholder="璇烽�夋嫨鏈堜唤"
- style="width: 240px"
- clearable
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板钖祫</el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/payrollManagement/components/formDia.vue";
-import {staffJoinDel} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {compensationDelete, compensationListPage} from "@/api/personnelManagement/payrollManagement.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- payDateStr: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "钖祫鏈堜唤",
- prop: "payDate",
- },
- {
- label: "濮撳悕",
- prop: "name",
- },
- {
- label: "搴斿嚭鍕ゅぉ鏁�",
- prop: "shouldAttendedNum",
- width:100
- },
- {
- label: "瀹為檯鍑哄嫟澶╂暟",
- prop: "actualAttendedNum",
- width:110
- },
- {
- label: "鍩烘湰宸ヨ祫",
- prop: "basicSalary",
- },
- {
- label: "宀椾綅宸ヨ祫",
- prop: "postSalary",
- width:100
- },
- {
- label: "鍏ョ鑱岀己鍕ゆ墸娆�",
- prop: "deductionAbsenteeism",
- width:130
- },
- {
- label: "鐥呭亣鎵f",
- prop: "sickLeaveDeductions",
- width:100
- },
- {
- label: "浜嬪亣鎵f",
- prop: "deductionPersonalLeave",
- width:100
- },
- {
- label: "蹇樿鎵撳崱鎵f",
- prop: "forgetClockDeduct",
- width:110
- },
- {
- label: "缁╂晥寰楀垎",
- prop: "performanceScore",
- width:150
- },
- {
- label: "缁╂晥宸ヨ祫",
- prop: "performancePay",
- width: 120
- },
- {
- label: "搴斿彂鍚堣",
- prop: "payableWages",
- width:150
- },
- {
- label: "绀句繚涓汉",
- prop: "socialSecurityIndividuals",
- },
- {
- label: "绀句繚鍏徃",
- prop: "socialSecurityCompanies",
- width: 120
- },
- {
- label: "绀句繚鍚堣",
- prop: "socialSecurityTotal",
- width: 120
- },
- {
- label: "鍏Н閲戜釜浜�",
- prop: "providentFundIndividuals",
- width: 120
- },
- {
- label: "鍏Н閲戝叕鍙�",
- prop: "providentFundCompany",
- width: 120
- },
- {
- label: "鍏Н閲戝悎璁�",
- prop: "providentFundTotal",
- width: 120
- },
- {
- label: "搴旂◣宸ヨ祫",
- prop: "taxableWaget",
- },
- {
- label: "涓汉鎵�寰楃◣",
- prop: "personalIncomeTax",
- width: 120
- },
- {
- label: "瀹炲彂宸ヨ祫",
- prop: "actualWages",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- compensationListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- compensationDelete(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/scheduling/index.vue b/src/views/personnelManagement/scheduling/index.vue
deleted file mode 100644
index 2818055..0000000
--- a/src/views/personnelManagement/scheduling/index.vue
+++ /dev/null
@@ -1,601 +0,0 @@
-<template>
- <div class="app-container scheduling-container">
- <!-- 绛涢�夊尯鍩� -->
- <div class="filter-section">
- <el-form :inline="true" :model="filterForm" class="filter-form">
- <el-form-item label="鍛樺伐濮撳悕锛�">
- <el-input
- v-model="filterForm.staffName"
- placeholder="璇疯緭鍏ュ憳宸ュ鍚�"
- clearable
- style="width: 150px"
- />
- </el-form-item>
- <el-form-item label="鐝绫诲瀷锛�">
- <el-select v-model="filterForm.shiftType" placeholder="璇烽�夋嫨鐝" clearable style="width: 120px">
- <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
- </el-select>
- </el-form-item>
- <el-form-item label="鏃ユ湡鑼冨洿锛�">
- <el-date-picker
- v-model="filterForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- style="width: 250px"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleFilter">
- <el-icon><Search/></el-icon>
- 绛涢��
- </el-button>
- <el-button @click="resetFilter">
- <el-icon><Refresh/></el-icon>
- 閲嶇疆
- </el-button>
- <el-button type="primary" @click="openScheduleDialog('add')">
- <el-icon><Plus/></el-icon>
- 鏂板鎺掔彮
- </el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <!-- 鎺掔彮琛ㄦ牸 -->
- <div class="table-section">
- <el-table
- :data="scheduleList"
- border
- :loading="tableLoading"
- stripe
- style="width: 100%"
- height="calc(100vh - 18.5em)"
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55"/>
- <el-table-column prop="staffName" label="鍛樺伐濮撳悕" width="120"/>
- <el-table-column prop="staffNo" label="鍛樺伐宸ュ彿" width="100"/>
- <el-table-column prop="department" label="閮ㄩ棬" width="120">
- <template #default="scope">
- {{ (department_type.find(i => i.value === String(scope.row.department)) || {}).label }}
- </template>
- </el-table-column>
- <el-table-column prop="shiftType" label="鐝绫诲瀷" width="100">
- <template #default="scope">
- <el-tag :type="getShiftTagType(scope.row.shiftType)">
- {{ (shift_type.find(i => i.value === String(scope.row.shiftType)) || {}).label }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="workDate" label="宸ヤ綔鏃ユ湡" width="120"/>
- <el-table-column prop="startTime" label="寮�濮嬫椂闂�" width="100"/>
- <el-table-column prop="endTime" label="缁撴潫鏃堕棿" width="100"/>
- <el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100">
- <template #default="scope">
- {{ scope.row.workHours }}灏忔椂
- </template>
- </el-table-column>
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusTagType(scope.row.status)">
- {{ (schedule_status.find(i => i.value === String(scope.row.status)) || {}).label }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="remark" label="澶囨敞" min-width="150"/>
- <el-table-column label="鎿嶄綔" width="200" fixed="right">
- <template #default="scope">
- <el-button
- type="primary"
- size="small"
- @click="openScheduleDialog('edit', scope.row)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- size="small"
- @click="handleDelete(scope.row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-if="tableCount > 0"
- :total="tableCount"
- :page="filterForm.current"
- :limit="filterForm.size"
- @pagination="paginationChange"
- />
- </div>
-
- <!-- 鎵归噺鎿嶄綔 -->
- <div class="batch-actions" v-if="selectedRows.length > 0">
- <el-button
- type="danger"
- @click="handleBatchDelete"
- :disabled="selectedRows.length === 0"
- >
- 鎵归噺鍒犻櫎 ({{ selectedRows.length }})
- </el-button>
- </div>
-
- <!-- 鎺掔彮鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- v-model="scheduleDialog"
- :title="dialogType === 'add' ? '鏂板鎺掔彮' : '缂栬緫鎺掔彮'"
- width="700px"
- @close="closeScheduleDialog"
- >
- <el-form
- :model="scheduleForm"
- :rules="scheduleRules"
- ref="scheduleFormRef"
- label-width="120px"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍛樺伐濮撳悕锛�" prop="staffId">
- <el-select v-model="scheduleForm.staffId" placeholder="璇疯緭鍏ュ憳宸ュ鍚�" style="width: 100%"
- @change="handleSelectStaff">
- <el-option v-for="item in personList" :label="item.staffName" :value="item.id" :key="item.id"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍛樺伐宸ュ彿锛�" prop="staffNo">
- <el-input :disabled="true" v-model="scheduleForm.staffNo" placeholder=""/>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閮ㄩ棬锛�" prop="department">
- <el-select v-model="scheduleForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%">
- <el-option v-for="item in department_type" :label="item.label" :value="item.value" :key="item.value"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐝绫诲瀷锛�" prop="shiftType">
- <el-select v-model="scheduleForm.shiftType" placeholder="璇烽�夋嫨鐝" style="width: 100%">
- <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="宸ヤ綔鏃ユ湡锛�" prop="workDate">
- <el-date-picker
- v-model="scheduleForm.workDate"
- type="date"
- placeholder="閫夋嫨宸ヤ綔鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐘舵�侊細" prop="status">
- <el-select v-model="scheduleForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option v-for="item in schedule_status" :label="item.label" :value="item.value" :key="item.value"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="寮�濮嬫椂闂达細" prop="startTime">
- <el-time-picker
- v-model="scheduleForm.startTime"
- placeholder="閫夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- format="HH:mm"
- value-format="HH:mm"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁撴潫鏃堕棿锛�" prop="endTime">
- <el-time-picker
- v-model="scheduleForm.endTime"
- placeholder="閫夋嫨缁撴潫鏃堕棿"
- style="width: 100%"
- format="HH:mm"
- value-format="HH:mm"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞锛�" prop="remark">
- <el-input
- v-model="scheduleForm.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitScheduleForm">纭</el-button>
- <el-button @click="closeScheduleDialog">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, computed, onMounted} from 'vue'
-import {ElMessage, ElMessageBox} from 'element-plus'
-import {useDict} from "@/utils/dict.js"
-import {Plus, Download, Search, Refresh} from '@element-plus/icons-vue'
-import {save, del, delByIds, listPage} from "@/api/personnelManagement/scheduling.js"
-import {getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
-import dayjs from "dayjs";
-import pagination from "@/components/PIMTable/Pagination.vue";
-
-const tableCount = ref(0)
-// 鍝嶅簲寮忔暟鎹�
-const scheduleDialog = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-const scheduleFormRef = ref()
-
-// 绛涢�夎〃鍗�
-const filterForm = reactive({
- staffName: '',
- shiftType: '',
- dateRange: [],
- current:1,
- size: 10
-})
-
-// 鎺掔彮琛ㄥ崟
-const scheduleForm = reactive({
- id: '',
- staffId: '',
- staffNo: '',
- department: '',
- shiftType: '',
- workDate: '',
- startTime: '',
- endTime: '',
- workStartTime: '',
- workEndTime: '',
- workHours: 0,
- status: '',
- remark: ''
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const scheduleRules = reactive({
- staffId: [{required: true, message: '璇烽�夋嫨鍛樺伐', trigger: 'change'}],
- department: [{required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change'}],
- shiftType: [{required: true, message: '璇烽�夋嫨鐝绫诲瀷', trigger: 'change'}],
- workDate: [{required: true, message: '璇烽�夋嫨宸ヤ綔鏃ユ湡', trigger: 'change'}],
- startTime: [{required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'}],
- endTime: [{required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'}],
- status: [{required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change'}]
-})
-const tableLoading = ref(false)
-
-//瀛楀吀
-const {department_type, schedule_status, shift_type} = useDict("department_type", "schedule_status", "shift_type")
-// 浜哄憳鍒楄〃
-const personList = ref([]);
-
-// 妯℃嫙鎺掔彮鏁版嵁
-const scheduleList = ref([])
-
-
-/**
- * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
- */
-const getPersonList = () => {
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
-};
-const paginationChange = (obj) => {
- filterForm.current = obj.page;
- filterForm.size = obj.limit;
- handleFilter();
-};
-
-const handleSelectStaff = (val) => {
- let obj = personList.value.find(item => item.id === val)
- scheduleForm.staffNo = obj.staffNo
-
-}
-
-// 鑾峰彇鐝鏍囩绫诲瀷
-const getShiftTagType = (shiftType) => {
- const typeMap = Object.fromEntries(shift_type.value.map(i => [i.value, i.elTagType]))
- return typeMap[shiftType] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹爣绛剧被鍨�
-const getStatusTagType = (status) => {
- const typeMap = Object.fromEntries(schedule_status.value.map(i => [i.value, i.elTagType]))
- return typeMap[status] || 'info'
-}
-
-// 绛涢��
-const handleFilter = async () => {
- tableLoading.value = true
- let searchForm = {
- ...filterForm,
- ...(filterForm.dateRange.length > 0 && {
- startDate: filterForm.dateRange[0],
- endDate: filterForm.dateRange[1],
- })
- }
- let resp = await listPage(searchForm)
- tableCount.value = resp.data.total
- scheduleList.value = resp.data.records.map(it => {
- return {
- ...it,
- 'startTime': dayjs(it.workStartTime).format('HH:mm'),
- 'endTime': dayjs(it.workEndTime).format('HH:mm'),
- }
- })
- tableLoading.value = false
-
-}
-
-// 閲嶇疆绛涢��
-const resetFilter = () => {
- filterForm.staffName = ''
- filterForm.shiftType = ''
- filterForm.dateRange = []
-}
-
-// 鎵撳紑鎺掔彮瀵硅瘽妗�
-const openScheduleDialog = (type, data) => {
- dialogType.value = type
- scheduleDialog.value = true
- getPersonList()
- if (type === 'edit' && data) {
- // 缂栬緫妯″紡锛屽鍒舵暟鎹�
- Object.assign(scheduleForm, {...data})
- } else {
- // 鏂板妯″紡锛岄噸缃〃鍗�
- Object.keys(scheduleForm).forEach(key => {
- scheduleForm[key] = ''
- })
- // scheduleForm.status = '宸插畨鎺�'
- scheduleForm.workDate = new Date().toISOString().split('T')[0]
- }
-}
-
-// 鍏抽棴鎺掔彮瀵硅瘽妗�
-const closeScheduleDialog = () => {
- scheduleFormRef.value?.resetFields()
- scheduleDialog.value = false
-}
-
-// 璁$畻宸ヤ綔鏃堕暱
-const calculateWorkHours = () => {
- if (scheduleForm.workDate && scheduleForm.startTime && scheduleForm.endTime) {
- // 浣跨敤 workDate 涓� startTime 鍜� endTime 缁勫悎
- const startDateTime = new Date(`${scheduleForm.workDate} ${scheduleForm.startTime}`)
- const endDateTime = new Date(`${scheduleForm.workDate} ${scheduleForm.endTime}`)
-
- // 澶勭悊璺ㄥぉ鎯呭喌锛堢粨鏉熸椂闂存棭浜庡紑濮嬫椂闂达級
- if (endDateTime < startDateTime) {
- // 璺ㄥぉ锛屽皢缁撴潫鏃ユ湡鍔犱竴澶�
- endDateTime.setDate(endDateTime.getDate() + 1)
- }
- // 璁$畻宸ヤ綔鏃堕暱锛堝皬鏃讹級
- const diffMs = endDateTime - startDateTime
- const diffHours = diffMs / (1000 * 60 * 60)
- scheduleForm.workHours = Math.round(diffHours * 100) / 100
- scheduleForm.workStartTime = dayjs(startDateTime).format("YYYY-MM-DD HH:mm:ss")
- scheduleForm.workEndTime = dayjs(endDateTime).format("YYYY-MM-DD HH:mm:ss")
-
- }
-}
-
-// 鎻愪氦鎺掔彮琛ㄥ崟
-const submitScheduleForm = async () => {
- const valid = await scheduleFormRef.value.validate()
- if (!valid) return
-
- calculateWorkHours()
- const newSchedule = {...scheduleForm}
-
- try {
- await save(newSchedule)
- ElMessage.success('淇濆瓨鎺掔彮鎴愬姛')
-
- handleFilter()
- closeScheduleDialog()
- } catch (err) {
- ElMessage.error('淇濆瓨澶辫触')
- }
-}
-
-// 鍒犻櫎鎺掔彮
-const handleDelete = (row) => {
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄� ${row.staffName} 鐨勬帓鐝褰曞悧锛焋,
- '鍒犻櫎鎻愮ず',
- {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }
- ).then(() => {
- del(row.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
- handleFilter()
- }).catch(() => {
- ElMessage.info('宸插彇娑堝垹闄�')
- })
-}
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑璁板綍')
- return
- }
-
- ElMessageBox.confirm(
- `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃帓鐝褰曞悧锛焋,
- '鎵归噺鍒犻櫎鎻愮ず',
- {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }
- ).then(() => {
- delByIds(selectedRows.value.map(item => item.id))
- handleFilter()
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
- }).catch(() => {
- ElMessage.info('宸插彇娑堝垹闄�')
- })
-}
-
-// 閫夋嫨鍙樺寲浜嬩欢
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection
-}
-
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- // 椤甸潰鍒濆鍖�
- handleFilter()
-})
-</script>
-
-<style scoped>
-.scheduling-container {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: 100vh;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- color: white;
-}
-
-.page-header h2 {
- color: white;
- margin-bottom: 10px;
- font-size: 28px;
- font-weight: 600;
-}
-
-.page-header p {
- color: rgba(255, 255, 255, 0.9);
- font-size: 14px;
- margin: 0 0 15px 0;
-}
-
-.header-controls {
- display: flex;
- justify-content: center;
- gap: 15px;
-}
-
-.filter-section {
- background: white;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.filter-form {
- margin: 0;
-}
-
-.table-section {
- background: white;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
- margin-bottom: 20px;
-}
-
-.batch-actions {
- background: white;
- padding: 15px 20px;
- border-radius: 8px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-form-item__label) {
- font-weight: 500;
- color: #303133;
-}
-
-:deep(.el-input__wrapper) {
- box-shadow: 0 0 0 1px #dcdfe6 inset;
-}
-
-:deep(.el-input__wrapper:hover) {
- box-shadow: 0 0 0 1px #c0c4cc inset;
-}
-
-:deep(.el-input__wrapper.is-focus) {
- box-shadow: 0 0 0 1px #409eff inset;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .scheduling-container {
- padding: 10px;
- }
-
- .page-header {
- padding: 15px;
- }
-
- .page-header h2 {
- font-size: 24px;
- }
-
- .header-controls {
- flex-direction: column;
- gap: 10px;
- }
-}
-
-@media (max-width: 768px) {
- .filter-form .el-form-item {
- margin-bottom: 10px;
- }
-}
-</style>
diff --git a/src/views/personnelManagement/selfService/index.vue b/src/views/personnelManagement/selfService/index.vue
deleted file mode 100644
index 926229a..0000000
--- a/src/views/personnelManagement/selfService/index.vue
+++ /dev/null
@@ -1,805 +0,0 @@
-<template>
- <div class="app-container self-service-container">
-
- <!-- 鍔熻兘瀵艰埅鍗$墖 -->
- <el-row :gutter="20" class="nav-cards">
- <el-col :span="6" v-for="(item, index) in navItems" :key="index">
- <el-card class="nav-card" @click="handleNavClick(item.type)">
- <div class="nav-content">
- <el-icon :size="40" class="nav-icon">
- <component :is="item.icon" />
- </el-icon>
- <h3>{{ item.title }}</h3>
- <p>{{ item.desc }}</p>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 涓昏鍐呭鍖哄煙 -->
- <div class="main-content">
- <!-- 鑰冨嫟璁板綍 -->
- <el-card v-if="currentView === 'attendance'" class="content-card">
- <template #header>
- <div class="card-header">
- <span>涓汉鑰冨嫟璁板綍</span>
- <el-button type="primary" @click="addAttendanceRecord">鏂板璁板綍</el-button>
- </div>
- </template>
- <el-table :data="attendanceData" style="width: 100%" :loading="tableLoading">
- <el-table-column prop="date" label="鏃ユ湡" />
- <el-table-column prop="checkIn" label="绛惧埌鏃堕棿" />
- <el-table-column prop="checkOut" label="绛鹃��鏃堕棿" />
- <el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.status === '姝e父' ? 'success' : 'danger'">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="150">
- <template #default="scope">
- <el-button size="small" @click="editAttendanceRecord(scope.row)">缂栬緫</el-button>
- <el-button size="small" type="danger" @click="deleteAttendanceRecord(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 钖祫鍗� -->
- <el-card v-if="currentView === 'salary'" class="content-card">
- <template #header>
- <div class="card-header">
- <span>钖祫鍗曟煡璇�</span>
- <el-date-picker v-model="payDateStr" type="month" placeholder="閫夋嫨鏈堜唤" value-format="YYYY-MM" format="YYYY-MM" @change="changMonth"/>
- </div>
- </template>
- <el-table :data="salaryData" style="width: 100%">
- <el-table-column prop="payDate" label="鏈堜唤" />
- <el-table-column prop="basicSalary" label="鍩烘湰宸ヨ祫" />
- <el-table-column prop="bonus" label="濂栭噾" />
- <el-table-column prop="deduction" label="鎵f" />
- <el-table-column prop="actualWages" label="瀹炲彂宸ヨ祫" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === '宸插彂鏀�' ? 'success' : 'warning'">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 鍋囨湡鐢宠 -->
- <el-card v-if="currentView === 'leave'" class="content-card">
- <template #header>
- <div class="card-header">
- <span>鍋囨湡鐢宠绠$悊</span>
- <el-button type="primary" @click="openLeaveForm">鐢宠鍋囨湡</el-button>
- </div>
- </template>
- <el-table :data="leaveData" style="width: 100%">
- <el-table-column prop="type" label="鍋囨湡绫诲瀷" />
- <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" />
- <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" />
- <el-table-column prop="days" label="澶╂暟" width="80" />
- <el-table-column prop="reason" label="鐢宠鍘熷洜" />
- <el-table-column prop="status" label="瀹℃壒鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="150">
- <template #default="scope">
- <el-button size="small" @click="editLeaveRecord(scope.row)">缂栬緫</el-button>
- <el-button size="small" type="danger" @click="deleteLeaveRecord(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 涓汉淇℃伅 -->
- <el-card v-if="currentView === 'profile'" class="content-card">
- <template #header>
- <div class="card-header">
- <span>涓汉淇℃伅缁存姢</span>
- <el-button type="primary" @click="editProfileForm">缂栬緫淇℃伅</el-button>
- </div>
- </template>
- <el-descriptions :column="2" border>
- <el-descriptions-item label="濮撳悕">{{ profile.name }}</el-descriptions-item>
- <el-descriptions-item label="宸ュ彿">{{ profile.employeeId }}</el-descriptions-item>
- <el-descriptions-item label="閮ㄩ棬">{{ profile.department }}</el-descriptions-item>
- <el-descriptions-item label="鑱屼綅">{{ profile.position }}</el-descriptions-item>
- <el-descriptions-item label="鍏ヨ亴鏃ユ湡">{{ profile.hireDate }}</el-descriptions-item>
- <el-descriptions-item label="鑱旂郴鐢佃瘽">{{ profile.phone }}</el-descriptions-item>
- <el-descriptions-item label="閭">{{ profile.email }}</el-descriptions-item>
- <el-descriptions-item label="鍦板潃">{{ profile.adress }}</el-descriptions-item>
- </el-descriptions>
- </el-card>
- </div>
-
- <!-- 鍋囨湡鐢宠寮圭獥 -->
- <el-dialog v-model="showLeaveDialog" :title="leaveOperationType === 'add' ? '鐢宠鍋囨湡' : '缂栬緫鍋囨湡'" width="500px">
- <el-form :model="leaveForm" label-width="100px">
- <el-form-item label="鍋囨湡绫诲瀷">
- <el-select v-model="leaveForm.type" placeholder="璇烽�夋嫨鍋囨湡绫诲瀷">
- <el-option label="骞村亣" value="骞村亣" />
- <el-option label="鐥呭亣" value="鐥呭亣" />
- <el-option label="璋冧紤" value="璋冧紤" />
- <el-option label="浜嬪亣" value="浜嬪亣" />
- </el-select>
- </el-form-item>
- <el-form-item label="寮�濮嬫棩鏈�">
- <el-date-picker v-model="leaveForm.startDate" type="date" placeholder="閫夋嫨寮�濮嬫棩鏈�" />
- </el-form-item>
- <el-form-item label="缁撴潫鏃ユ湡">
- <el-date-picker v-model="leaveForm.endDate" type="date" placeholder="閫夋嫨缁撴潫鏃ユ湡" />
- </el-form-item>
- <el-form-item label="鐢宠鍘熷洜">
- <el-input v-model="leaveForm.reason" type="textarea" rows="3" />
- </el-form-item>
- <!-- <el-form-item label="瀹℃壒鐘舵��">
- <el-select v-model="leaveForm.status" placeholder="璇烽�夋嫨瀹℃壒鐘舵��">
- <el-option label="瀹℃壒涓�" value="瀹℃壒涓�" />
- <el-option label="宸查�氳繃" value="宸查�氳繃" />
- <el-option label="宸叉嫆缁�" value="宸叉嫆缁�" />
- </el-select>
- </el-form-item> -->
- </el-form>
- <template #footer>
- <el-button @click="showLeaveDialog = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitLeaveApplication">鎻愪氦鐢宠</el-button>
- </template>
- </el-dialog>
-
- <!-- 鏂板-缂栬緫鑰冨嫟璁板綍寮圭獥 -->
- <el-dialog v-model="showAttendanceDialog" :title="operationType === 'add' ? '鏂板鑰冨嫟璁板綍' : '缂栬緫鑰冨嫟璁板綍'" width="500px">
- <el-form :model="attendanceForm" :rules="attendanceRules" ref="attendanceFormRef" label-width="100px">
- <el-form-item label="鏃ユ湡" prop="date">
- <el-date-picker v-model="attendanceForm.date" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" placeholder="閫夋嫨鏃ユ湡" />
- </el-form-item>
- <el-form-item label="绛惧埌鏃堕棿" prop="checkIn">
- <el-time-picker v-model="attendanceForm.checkIn" placeholder="閫夋嫨绛惧埌鏃堕棿" format="HH:mm" value-format="HH:mm" />
- </el-form-item>
- <el-form-item label="绛鹃��鏃堕棿" prop="checkOut">
- <el-time-picker v-model="attendanceForm.checkOut" placeholder="閫夋嫨绛鹃��鏃堕棿" format="HH:mm" value-format="HH:mm" />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="attendanceForm.status" placeholder="璇烽�夋嫨鐘舵��">
- <el-option label="姝e父" value="姝e父" />
- <el-option label="杩熷埌" value="杩熷埌" />
- <el-option label="鏃╅��" value="鏃╅��" />
- <el-option label="缂哄嫟" value="缂哄嫟" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="showAttendanceDialog = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitAttendance">鎻愪氦</el-button>
- </template>
- </el-dialog>
-
- <!-- 涓汉淇℃伅缂栬緫寮圭獥 -->
- <el-dialog v-model="editProfile" title="缂栬緫涓汉淇℃伅" width="500px">
- <el-form :model="profileForm" label-width="100px">
- <el-form-item label="濮撳悕">
- <el-input v-model="profileForm.name" />
- </el-form-item>
- <el-form-item label="鑱旂郴鐢佃瘽">
- <el-input v-model="profileForm.phone" />
- </el-form-item>
- <el-form-item label="閭">
- <el-input v-model="profileForm.email" />
- </el-form-item>
- <el-form-item label="鍦板潃">
- <el-input v-model="profileForm.adress" type="textarea" rows="2" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="editProfile = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveProfile">淇濆瓨</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, watch, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
- Calendar,
- Money,
- Clock,
- User
-} from '@element-plus/icons-vue'
-import { personalAttendanceRecordsListPage, personalAttendanceRecordsAdd, personalAttendanceRecordsUpdate, personalAttendanceRecordsDelete, holidayApplicationListPage, holidayApplicationAdd, holidayApplicationUpdate, holidayApplicationDelete } from '@/api/personnelManagement/selfService'
-import { compensationListPage, compensationAdd, compensationUpdate, compensationDelete } from '@/api/personnelManagement/payrollManagement'
-
-const { proxy } = getCurrentInstance()
-import { getUserProfile } from '@/api/system/user.js'
-import {staffJoinUpdate, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import { fa, id } from 'element-plus/es/locales.mjs'
-
-const tableLoading = ref(false)
-// 鍒嗛〉鍙傛暟
-const page = reactive({
- current: 1,
- size: 10,
- total: 0
-})
-
-// 褰撳墠瑙嗗浘
-const currentView = ref('attendance')
-
-// 瀵艰埅椤�
-const navItems = [
- { type: 'attendance', title: '鑰冨嫟璁板綍', desc: '鏌ヨ涓汉鑰冨嫟淇℃伅', icon: 'Calendar' },
- { type: 'salary', title: '钖祫鍗�', desc: '鏌ョ湅钖祫鍙戞斁璁板綍', icon: 'Money' },
- { type: 'leave', title: '鍋囨湡鐢宠', desc: '鍦ㄧ嚎鐢宠鍚勭被鍋囨湡', icon: 'Clock' },
- { type: 'profile', title: '涓汉淇℃伅', desc: '缁存姢涓汉鍩烘湰淇℃伅', icon: 'User' }
-]
-
-// 鑰冨嫟鏁版嵁
-const attendanceData = ref([])
-
-// 钖祫鏁版嵁
-const salaryData = ref([])
-
-
-// 鍋囨湡鏁版嵁
-const leaveData = ref([])
-
-const currentUser = ref()
-const user= ref()
-// 涓汉淇℃伅
-const profile = ref({
- id: '',
- name: '',
- employeeId: '',
- department: '',
- position: '',
- hireDate: '',
- phone: '',
- email: '',
- adress: ''
- })
-
-// 寮圭獥鎺у埗
-const showLeaveDialog = ref(false)
-const editProfile = ref(false)
-const payDateStr = ref('')
-
-// 琛ㄥ崟鏁版嵁
-const leaveForm = reactive({
- id: '',
- type: '',
- startDate: '',
- endDate: '',
- days: 0,
- reason: '',
- status: ''
-})
-const profileForm = reactive({
- name: "",
- email: "",
- adress: "",
- phone: "",
-})
-const joinForm = reactive({
- id: "",
- staffNo: "",
- staffName: "",
- email: "",
- adress: "",
- sex: "",
- nativePlace: "",
- postJob: "",
- firstStudy: "",
- profession: "",
- identityCard: "",
- age: 0,
- phone: "",
- emergencyContact: "",
- emergencyContactPhone: "",
- contractTerm: 0,
- contractStartTime: "",
- contractEndTime: "",
- staffState: 1,
-})
-
-// 鏂板鑰冨嫟璁板綍锛氬脊绐椾笌琛ㄥ崟
-const operationType = ref('add')
-const leaveOperationType = ref('add')
-const showAttendanceDialog = ref(false)
-const attendanceFormRef = ref(null)
-const attendanceForm = reactive({
- id: '',
- date: '',
- checkIn: '',
- checkOut: '',
- workHours: '',
- status: '姝e父'
-})
-const attendanceRules = {
- date: [{ required: true, message: '璇烽�夋嫨鏃ユ湡', trigger: 'change' }],
- checkIn: [{ required: true, message: '璇烽�夋嫨绛惧埌鏃堕棿', trigger: 'change' }],
- checkOut: [{ required: true, message: '璇烽�夋嫨绛鹃��鏃堕棿', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-// 澶勭悊瀵艰埅鐐瑰嚮
-const handleNavClick = (type) => {
- currentView.value = type
-}
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const types = {
- '宸查�氳繃': 'success',
- '瀹℃壒涓�': 'warning',
- '宸叉嫆缁�': 'danger'
- }
- return types[status] || 'info'
-}
-
-// 鏂板鑰冨嫟璁板綍锛堟墦寮�寮圭獥骞堕濉粯璁ゅ�硷級
-const addAttendanceRecord = () => {
- operationType.value = 'add'
- attendanceForm.date = new Date().toISOString().split('T')[0]
- attendanceForm.checkIn = '09:00'
- attendanceForm.checkOut = '18:00'
- attendanceForm.status = '姝e父'
- showAttendanceDialog.value = true
-}
-
-// 璁$畻宸ユ椂
-const computeWorkHours = (inStr, outStr) => {
- const [inH, inM] = inStr.split(':').map(n => parseInt(n, 10))
- const [outH, outM] = outStr.split(':').map(n => parseInt(n, 10))
- const inMin = inH * 60 + inM
- const outMin = outH * 60 + outM
- const diff = Math.max(0, outMin - inMin)
- const h = Math.floor(diff / 60)
- const m = diff % 60
- return m === 0 ? `${h}灏忔椂` : `${h}灏忔椂${m}鍒哷
-}
-
-// 缂栬緫鑰冨嫟璁板綍
-const editAttendanceRecord = (row) => {
- operationType.value = 'edit'
- Object.assign(attendanceForm, row)
- showAttendanceDialog.value = true
-}
-// 鎻愪氦鏂板-缂栬緫鑰冨嫟璁板綍
-const submitAttendance = () => {
- // if (!attendanceFormRef.value) return
- const workHours = computeWorkHours(attendanceForm.checkIn, attendanceForm.checkOut)
- const newRecord = {
- date: attendanceForm.date,
- checkIn: attendanceForm.checkIn,
- checkOut: attendanceForm.checkOut,
- workHours,
- status: attendanceForm.status
- }
- if (operationType.value === 'add') {
- personalAttendanceRecordsAdd(newRecord)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鑰冨嫟璁板綍娣诲姞鎴愬姛')
- getPersonalAttendanceRecordsList()
- showAttendanceDialog.value = false
- // 閲嶇疆琛ㄥ崟
- attendanceForm.date = ''
- attendanceForm.checkIn = ''
- attendanceForm.checkOut = ''
- attendanceForm.status = '姝e父'
- }
- }).catch(err => {
- ElMessage.error('鑰冨嫟璁板綍娣诲姞澶辫触')
- })
- }else{
- attendanceForm.workHours = computeWorkHours(attendanceForm.checkIn, attendanceForm.checkOut)
- personalAttendanceRecordsUpdate(attendanceForm)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鑰冨嫟璁板綍鏇存柊鎴愬姛')
- getPersonalAttendanceRecordsList()
- showAttendanceDialog.value = false
- // 閲嶇疆琛ㄥ崟
- attendanceForm.date = ''
- attendanceForm.checkIn = ''
- attendanceForm.checkOut = ''
- attendanceForm.status = '姝e父'
- }
- }).catch(err => {
- ElMessage.error('鑰冨嫟璁板綍鏇存柊澶辫触')
- })
- }
- // attendanceFormRef.value.validate((valid) => {
- // if (!valid) return
-
-
- // })
-}
-// 鍒犻櫎鑰冨嫟璁板綍
-const deleteAttendanceRecord = (row) => {
-
- ElMessageBox.confirm('纭畾鍒犻櫎璇ヨ�冨嫟璁板綍鍚楋紵', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- personalAttendanceRecordsDelete(row.id)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鑰冨嫟璁板綍鍒犻櫎鎴愬姛')
- getPersonalAttendanceRecordsList()
- }
- }).catch(err => {
- ElMessage.error('鑰冨嫟璁板綍鍒犻櫎澶辫触')
- })
- }).catch(() => {
- ElMessage({
- type: 'info',
- message: '宸插彇娑堝垹闄�'
- })
- })
-}
-// 鐢宠鍋囨湡
-const openLeaveForm = () => {
- leaveOperationType.value = 'add'
- showLeaveDialog.value = true
- // leaveForm.type = ''
- // leaveForm.startDate = ''
- // leaveForm.endDate = ''
- // leaveForm.days = 0
- // leaveForm.reason = ''
- // leaveForm.status = 'warning'
-}
-// 缂栬緫鍋囨湡璁板綍
-const editLeaveRecord = (row) => {
- leaveOperationType.value = 'edit'
- showLeaveDialog.value = true
- Object.assign(leaveForm, row)
- // ElMessage.info('缂栬緫鍔熻兘寮�鍙戜腑...')
-}
-
-// 鍒犻櫎鍋囨湡璁板綍
-const deleteLeaveRecord = (row) => {
- ElMessageBox.confirm('纭畾鍒犻櫎璇ュ亣鏈熻褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- holidayApplicationDelete(row.id)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鍋囨湡璁板綍鍒犻櫎鎴愬姛')
- getHolidayApplicationList()
- }
- }).catch(err => {
- ElMessage.error('鍋囨湡璁板綍鍒犻櫎澶辫触')
- })
- }).catch(() => {
- ElMessage({
- type: 'info',
- message: '宸插彇娑堝垹闄�'
- })
- })
-}
-
-//璁$畻鍋囨湡澶╂暟
-const calculateDays = () => {
- try {
- if (leaveForm.startDate && leaveForm.endDate) {
- const start = new Date(leaveForm.startDate)
- const end = new Date(leaveForm.endDate)
- leaveForm.startDate = start.toISOString().split('T')[0]
- leaveForm.endDate = end.toISOString().split('T')[0]
-
- if (isNaN(start.getTime()) || isNaN(end.getTime())) {
- console.warn('鏃犳晥鐨勬棩鏈熸牸寮�')
- return
- }
-
- const diffTime = Math.abs(end - start)
- const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1
- leaveForm.days = diffDays
- }
- } catch (error) {
- console.error('璁$畻澶╂暟澶辫触:', error)
- }
-}
-
-// 鎻愪氦鍋囨湡鐢宠
-const submitLeaveApplication = () => {
- if (leaveOperationType.value === 'add') {
- if (!leaveForm.type || !leaveForm.startDate || !leaveForm.endDate || !leaveForm.reason) {
- ElMessage.warning('璇峰~鍐欏畬鏁翠俊鎭�')
- return
- }
- calculateDays()
- const newLeave = {
- type: leaveForm.type,
- startDate: leaveForm.startDate,
- endDate: leaveForm.endDate,
- days: leaveForm.days, // 绠�鍗曡绠�
- reason: leaveForm.reason,
- status: '瀹℃壒涓�'
- }
-
- holidayApplicationAdd(newLeave)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鍋囨湡鐢宠鎻愪氦鎴愬姛')
- getHolidayApplicationList()
- showLeaveDialog.value = false
- // 閲嶇疆琛ㄥ崟
- Object.keys(leaveForm).forEach(key => {
- leaveForm[key] = ''
- })
- }
- }).catch(err => {
- ElMessage.error('鍋囨湡鐢宠鎻愪氦澶辫触')
- })
- }else{
- calculateDays()
- holidayApplicationUpdate(leaveForm)
- .then(res => {
- if (res.code === 200) {
- ElMessage.success('鍋囨湡鐢宠鏇存柊鎴愬姛')
- getHolidayApplicationList()
- showLeaveDialog.value = false
- // 閲嶇疆琛ㄥ崟
- Object.keys(leaveForm).forEach(key => {
- leaveForm[key] = ''
- })
- }
- }).catch(err => {
- ElMessage.error('鍋囨湡鐢宠鏇存柊澶辫触')
- })
- }
-}
-
-// 鑾峰彇涓汉淇℃伅
-const getProfile = () => {
- tableLoading.value = true;
- getUserProfile().then(res => {
- if (res.code === 200) {
- currentUser.value = res.data
- // console.log("----",currentUser.value)
- //寰楀埌浜哄憳鍒楄〃
- staffJoinListPage({staffState: 1}).then(res => {
- //绛涢�夊嚭鍜宑urrentUser鍚屽悕鐨勪汉鍛�
- // let tableData = res.data.records
- user.value = res.data.records.find(item => item.staffName === currentUser.value.userName)
- // console.log("++++",user.value)
- if(user.value){
- profile.value.id=user.value.id
- profile.value.name=user.value.staffName
- profile.value.employeeId=user.value.staffNo
- profile.value.phone=user.value.phone
- profile.value.email=currentUser.value.email
- profile.value.adress=user.value.adress
- profile.value.position=user.value.postJob
- profile.value.hireDate=user.value.createTime
- profile.value.department=currentUser.value.deptNames
- }
- // console.log(profile.value)
- // tableLoading.value = false;
- }).catch(err => {})
- }
- }).catch(err => {
- tableLoading.value = false;
- ElMessage.error('鑾峰彇涓汉淇℃伅澶辫触')
- })
-}
-// 淇濆瓨涓汉淇℃伅
-const saveProfile = async () => {
- tableLoading.value = true;
- try {
- const userRes = await getUserProfile();
- if (userRes.code === 200) {
- currentUser.value = userRes.data;
- const staffListRes = await staffJoinListPage({ staffState: 1 });
- user.value = staffListRes.data.records.find(item => item.staffName === currentUser.value.userName);
- // console.log("++++", user.value);
-
- Object.assign(joinForm, user.value);
- joinForm.staffName = profileForm.name;
- joinForm.phone = profileForm.phone;
- joinForm.email = profileForm.email;
- joinForm.adress = profileForm.adress;
- console.log(joinForm)
- // 璋冪敤鏇存柊涓汉淇℃伅鐨勬帴鍙�
- staffJoinUpdate(joinForm).then(res => {
- if (res.code === 200) {
- ElMessage.success('涓汉淇℃伅淇濆瓨鎴愬姛');
- getProfile();
- editProfile.value = false;
- }
- }).catch(err => {
- ElMessage.error('涓汉淇℃伅淇濆瓨澶辫触');
- })
- }
- } catch (err) {
- ElMessage.error('鑾峰彇涓汉淇℃伅澶辫触');
- } finally {
- tableLoading.value = false;
- }
-};
-
-// 缂栬緫涓汉淇℃伅
-const editProfileForm = () => {
- editProfile.value = true;
- Object.assign(profileForm, {
- name: profile.value.name,
- phone: profile.value.phone,
- email: profile.value.email,
- adress: profile.value.adress,
- });
-};
-
-//鏈堜唤鏀瑰彉
-const changMonth = () => {
- getCompensationList()
-}
-//鑾峰彇鑰冨嫟璁板綍鍒楄〃
-const getPersonalAttendanceRecordsList = async () => {
- tableLoading.value = true
- personalAttendanceRecordsListPage(page)
- .then(res => {
-
- attendanceData.value = res.data.records
- page.value.total = res.data.total;
- tableLoading.value = false;
-
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-//钖祫鍗曟煡璇�
-const getCompensationList = async () => {
- tableLoading.value = true
- compensationListPage({...page,payDateStr:payDateStr.value})
- .then(res => {
- salaryData.value = res.data.records
- //杩囨护鍑哄綋鍓嶆湀浠界殑鎵f鍚堣
- salaryData.value.forEach(item => {
- item.deduction =0 + item.deductionAbsenteeism+item.sickLeaveDeductions+item.deductionPersonalLeave+item.forgetClockDeduct,
- item.bonus=0,
- item.status='宸插彂鏀�'
- })
-
- page.value.total = res.data.total;
- tableLoading.value = false;
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-//鑾峰彇鍋囨湡鐢宠鍒楄〃
-const getHolidayApplicationList = async () => {
- tableLoading.value = true
- holidayApplicationListPage(page)
- .then(res => {
- leaveData.value = res.data.records
- page.value.total = res.data.total;
- tableLoading.value = false;
- }).catch(err => {
- tableLoading.value = false;
- })
-}
-onMounted(() => {
- // 鍒濆鍖�
- getPersonalAttendanceRecordsList()
- getCompensationList()
- getHolidayApplicationList()
- getProfile()
-})
-</script>
-
-<style scoped>
-.self-service-container {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: 100vh;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- color: white;
-}
-
-.page-header h2 {
- color: white;
- margin-bottom: 10px;
- font-size: 28px;
- font-weight: 600;
-}
-
-.page-header p {
- color: rgba(255, 255, 255, 0.9);
- font-size: 14px;
- margin: 0;
-}
-
-.nav-cards {
- margin-bottom: 30px;
-}
-
-.nav-card {
- cursor: pointer;
- transition: all 0.3s ease;
- border-radius: 12px;
- border: none;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-}
-
-.nav-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-.nav-content {
- text-align: center;
- padding: 20px;
-}
-
-.nav-icon {
- color: #409EFF;
- margin-bottom: 15px;
-}
-
-.nav-content h3 {
- margin: 0 0 10px 0;
- color: #303133;
- font-size: 18px;
-}
-
-.nav-content p {
- margin: 0;
- color: #909399;
- font-size: 14px;
-}
-
-.main-content {
- margin-bottom: 30px;
-}
-
-.content-card {
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- border: none;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: 600;
- color: #303133;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .self-service-container {
- padding: 10px;
- }
-
- .nav-cards .el-col {
- margin-bottom: 15px;
- }
-
- .page-header h2 {
- font-size: 24px;
- }
-}
-</style>
diff --git a/src/views/procurementManagement/arrivalManagement/index.vue b/src/views/procurementManagement/arrivalManagement/index.vue
deleted file mode 100644
index 0143538..0000000
--- a/src/views/procurementManagement/arrivalManagement/index.vue
+++ /dev/null
@@ -1,189 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="search-card" shadow="never">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="閲囪喘璁㈠崟鍙凤細">
- <el-input v-model="searchForm.orderNo" placeholder="璇疯緭鍏ヨ鍗曞彿" clearable />
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" clearable />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <el-card class="table-card" shadow="never">
- <div class="table-header">
- <el-button type="primary" @click="openDialog('add')">鏂板鍒拌揣</el-button>
- <el-button type="success" @click="handleBatchReceive">鎵归噺鏀惰揣</el-button>
- <el-button type="danger" @click="handleBatchDelete">鎵归噺鍒犻櫎</el-button>
- </div>
-
- <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鍒拌揣鍗曞彿" prop="arrivalNo" width="180" />
- <el-table-column label="閲囪喘璁㈠崟鍙�" prop="orderNo" width="180" />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column label="鍒拌揣鐘舵��" prop="status" width="100">
- <template #default="{ row }">
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鍒拌揣鏁伴噺" prop="arrivalQuantity" width="100" />
- <el-table-column label="鍒拌揣鏃堕棿" prop="arrivalTime" width="180" />
- <el-table-column label="鎿嶄綔" width="200" align="center">
- <template #default="{ row }">
- <el-button type="primary" link @click="openDialog('edit', row)">缂栬緫</el-button>
- <el-button type="success" link @click="handleReceive(row)">鏀惰揣</el-button>
- <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板鍒拌揣' : '缂栬緫鍒拌揣'" width="600px">
- <el-form :model="formData" label-width="120px">
- <el-form-item label="閲囪喘璁㈠崟鍙�">
- <el-select v-model="formData.orderNo" placeholder="璇烽�夋嫨閲囪喘璁㈠崟" style="width: 100%">
- <el-option label="PO20241201001" value="PO20241201001" />
- <el-option label="PO20241201002" value="PO20241201002" />
- </el-select>
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input v-model="formData.supplierName" placeholder="渚涘簲鍟嗗悕绉�" readonly />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-
-const searchForm = reactive({
- orderNo: '',
- supplierName: ''
-})
-
-const formData = reactive({
- orderNo: '',
- supplierName: '',
- remark: ''
-})
-
-const mockData = [
- {
- id: 1,
- arrivalNo: 'AR20241201001',
- orderNo: 'PO20241201001',
- supplierName: '渚涘簲鍟咥',
- status: 'received',
- arrivalQuantity: 250,
- arrivalTime: '2025-12-01 15:30:00',
- remark: '姝e父鍒拌揣'
- }
-]
-
-const tableData = ref([...mockData])
-
-const getStatusType = (status) => {
- const statusMap = { pending: 'warning', received: 'success', stored: 'info' }
- return statusMap[status] || 'info'
-}
-
-const getStatusText = (status) => {
- const statusMap = { pending: '寰呮敹璐�', received: '宸叉敹璐�', stored: '宸插叆搴�' }
- return statusMap[status] || '鏈煡'
-}
-
-const handleSearch = () => {
- loading.value = true
- setTimeout(() => { loading.value = false }, 500)
-}
-
-const resetSearch = () => {
- Object.assign(searchForm, { orderNo: '', supplierName: '' })
-}
-
-const openDialog = (type, row = {}) => {
- dialogType.value = type
- if (type === 'edit' && row.id) {
- Object.assign(formData, { orderNo: row.orderNo, supplierName: row.supplierName, remark: row.remark })
- } else {
- Object.assign(formData, { orderNo: '', supplierName: '', remark: '' })
- }
- dialogVisible.value = true
-}
-
-const handleSubmit = () => {
- if (dialogType.value === 'add') {
- const newArrival = {
- id: Date.now(),
- arrivalNo: `AR${Date.now()}`,
- orderNo: formData.orderNo,
- supplierName: formData.supplierName,
- status: 'pending',
- arrivalQuantity: 0,
- arrivalTime: new Date().toLocaleString(),
- remark: formData.remark
- }
- tableData.value.unshift(newArrival)
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
-}
-
-const handleReceive = (row) => {
- row.status = 'received'
- ElMessage.success('鏀惰揣鎴愬姛')
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = tableData.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleBatchReceive = () => {
- ElMessage.success('鎵归噺鏀惰揣鎴愬姛')
-}
-
-const handleBatchDelete = () => {
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
-}
-
-const handleSelectionChange = (rows) => {
- selectedRows.value = rows
-}
-</script>
-
-<style scoped>
-.app-container { padding: 20px; }
-.search-card { margin-bottom: 20px; }
-.table-card { margin-bottom: 20px; }
-.table-header { margin-bottom: 20px; }
-</style>
diff --git a/src/views/procurementManagement/index.vue b/src/views/procurementManagement/index.vue
deleted file mode 100644
index dd7c3c4..0000000
--- a/src/views/procurementManagement/index.vue
+++ /dev/null
@@ -1,378 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>閲囪喘绠$悊绯荤粺</h2>
- <p>缁熶竴绠$悊閲囪喘鍏ㄦ祦绋嬶紝鎻愬崌閲囪喘鏁堢巼涓庤川閲�</p>
- </div>
-
- <!-- 鍔熻兘妯″潡鍗$墖 -->
- <el-row :gutter="20" class="module-cards">
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/purchaseOrder')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#409EFF"><Document /></el-icon>
- </div>
- <div class="card-info">
- <h3>閲囪喘璁㈠崟绠$悊</h3>
- <p>鏂板缓銆佺紪杈戙�佸垹闄ら噰璐鍗曪紝閫夋嫨渚涘簲鍟嗭紝濉啓鍟嗗搧鏄庣粏</p>
- <div class="card-stats">
- <span>寰呭鏍�: {{ stats.pendingOrders }}</span>
- <span>宸插鏍�: {{ stats.approvedOrders }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/arrivalManagement')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#67C23A"><Box /></el-icon>
- </div>
- <div class="card-info">
- <h3>鍒拌揣绠$悊</h3>
- <p>鑷姩鍏宠仈閲囪喘璁㈠崟锛屽綍鍏ュ埌璐у晢鍝佷俊鎭紝鏀寔鎵撳嵃鏌ョ湅</p>
- <div class="card-stats">
- <span>寰呮敹璐�: {{ stats.pendingArrivals }}</span>
- <span>宸叉敹璐�: {{ stats.receivedArrivals }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/qualityInspection')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#E6A23C"><Search /></el-icon>
- </div>
- <div class="card-info">
- <h3>璐ㄦ绠$悊</h3>
- <p>鍒拌揣鍚庤嚜鍔ㄧ敓鎴愯川妫�鍗曪紝濉啓鍚堟牸涓庝笉鍚堟牸鍟嗗搧鏁伴噺鍙婂師鍥�</p>
- <div class="card-stats">
- <span>寰呰川妫�: {{ stats.pendingInspections }}</span>
- <span>宸插畬鎴�: {{ stats.completedInspections }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <el-row :gutter="20" class="module-cards">
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/returnManagement')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#F56C6C"><RefreshLeft /></el-icon>
- </div>
- <div class="card-info">
- <h3>閫�璐х鐞�</h3>
- <p>鐢熸垚閲囪喘閫�璐у崟鍜岃川妫�閫�璐у崟锛屾敮鎸佺瓫閫夋煡璇笌鍗曟嵁璇︽儏</p>
- <div class="card-stats">
- <span>寰呭鏍�: {{ stats.pendingReturns }}</span>
- <span>宸插鏍�: {{ stats.approvedReturns }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/priceManagement')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#909399"><Money /></el-icon>
- </div>
- <div class="card-info">
- <h3>浠锋牸绠$悊</h3>
- <p>鏍规嵁鍟嗗搧鍙婂競鍦轰环鏍煎彉鍖栬繘琛岄噰璐环璋冩暣锛岃嚜鍔ㄦ洿鏂伴噰璐崟鎹�</p>
- <div class="card-stats">
- <span>鏈夋晥浠锋牸: {{ stats.activePrices }}</span>
- <span>寰呯敓鏁�: {{ stats.pendingPrices }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <el-col :span="8">
- <el-card class="module-card" shadow="hover" @click="navigateTo('/procurementManagement/procurementLedger')">
- <div class="card-content">
- <div class="card-icon">
- <el-icon size="48" color="#9C27B0"><List /></el-icon>
- </div>
- <div class="card-info">
- <h3>閲囪喘鍙拌处</h3>
- <p>鏌ョ湅閲囪喘鍘嗗彶璁板綍锛岀粺璁″垎鏋愰噰璐暟鎹紝鐢熸垚閲囪喘鎶ヨ〃</p>
- <div class="card-stats">
- <span>鎬昏鍗�: {{ stats.totalOrders }}</span>
- <span>鎬婚噾棰�: 楼{{ stats.totalAmount.toFixed(2) }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 缁熻姒傝 -->
- <el-card class="stats-card" shadow="never">
- <template #header>
- <div class="card-header">
- <span>閲囪喘缁熻姒傝</span>
- <el-button type="primary" size="small" @click="refreshStats">鍒锋柊鏁版嵁</el-button>
- </div>
- </template>
-
- <el-row :gutter="20">
- <el-col :span="6">
- <div class="stat-item">
- <div class="stat-number">{{ stats.totalOrders }}</div>
- <div class="stat-label">閲囪喘璁㈠崟鎬绘暟</div>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <div class="stat-number">{{ stats.totalAmount.toFixed(2) }}</div>
- <div class="stat-label">閲囪喘鎬婚噾棰�(涓囧厓)</div>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <div class="stat-number">{{ stats.avgDeliveryTime }}</div>
- <div class="stat-label">骞冲潎浜や粯澶╂暟</div>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <div class="stat-number">{{ stats.qualityRate }}%</div>
- <div class="stat-label">璐ㄦ鍚堟牸鐜�</div>
- </div>
- </el-col>
- </el-row>
- </el-card>
-
- <!-- 鏈�杩戞椿鍔� -->
- <el-card class="activity-card" shadow="never">
- <template #header>
- <span>鏈�杩戞椿鍔�</span>
- </template>
-
- <el-timeline>
- <el-timeline-item
- v-for="(activity, index) in recentActivities"
- :key="index"
- :timestamp="activity.time"
- :type="activity.type"
- >
- {{ activity.content }}
- </el-timeline-item>
- </el-timeline>
- </el-card>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from 'vue'
-import { useRouter } from 'vue-router'
-import { Document, Box, Search, RefreshLeft, Money, List } from '@element-plus/icons-vue'
-
-const router = useRouter()
-
-// 缁熻鏁版嵁
-const stats = ref({
- pendingOrders: 5,
- approvedOrders: 25,
- pendingArrivals: 3,
- receivedArrivals: 18,
- pendingInspections: 2,
- completedInspections: 15,
- pendingReturns: 1,
- approvedReturns: 3,
- activePrices: 45,
- pendingPrices: 2,
- totalOrders: 30,
- totalAmount: 125.8,
- avgDeliveryTime: 7,
- qualityRate: 96.5
-})
-
-// 鏈�杩戞椿鍔�
-const recentActivities = ref([
- {
- time: '2025-12-01 18:30',
- content: '鏂板閲囪喘璁㈠崟 PO20241201004',
- type: 'primary'
- },
- {
- time: '2025-12-01 17:45',
- content: '瀹屾垚璐ㄦ鍗� QI20241201002',
- type: 'success'
- },
- {
- time: '2025-12-01 16:20',
- content: '鍒拌揣鍗� AR20241201003 宸叉敹璐�',
- type: 'success'
- },
- {
- time: '2025-12-01 15:15',
- content: '浠锋牸璋冩暣锛氬晢鍝丅 浠� 楼80 璋冩暣涓� 楼75',
- type: 'warning'
- },
- {
- time: '2025-12-01 14:30',
- content: '閫�璐у崟 RT20241201003 宸插鏍�',
- type: 'info'
- }
-])
-
-// 瀵艰埅鍒版寚瀹氶〉闈�
-const navigateTo = (path) => {
- router.push(path)
-}
-
-// 鍒锋柊缁熻鏁版嵁
-const refreshStats = () => {
- // 妯℃嫙鍒锋柊鏁版嵁
- stats.value.pendingOrders = Math.floor(Math.random() * 10) + 1
- stats.value.totalAmount = (Math.random() * 100 + 100).toFixed(1)
-}
-
-onMounted(() => {
- // 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栭�昏緫
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: 100vh;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 10px;
- color: white;
-}
-
-.page-header h2 {
- margin: 0 0 10px 0;
- font-size: 28px;
- font-weight: 600;
-}
-
-.page-header p {
- margin: 0;
- font-size: 16px;
- opacity: 0.9;
-}
-
-.module-cards {
- margin-bottom: 20px;
-}
-
-.module-card {
- cursor: pointer;
- transition: all 0.3s ease;
- border: none;
- border-radius: 12px;
-}
-
-.module-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-.card-content {
- display: flex;
- align-items: center;
- padding: 20px;
-}
-
-.card-icon {
- margin-right: 20px;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 80px;
- height: 80px;
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
- border-radius: 50%;
- color: white;
-}
-
-.card-info h3 {
- margin: 0 0 10px 0;
- font-size: 18px;
- font-weight: 600;
- color: #303133;
-}
-
-.card-info p {
- margin: 0 0 15px 0;
- font-size: 14px;
- color: #606266;
- line-height: 1.5;
-}
-
-.card-stats {
- display: flex;
- gap: 15px;
-}
-
-.card-stats span {
- font-size: 12px;
- color: #909399;
- background-color: #f5f7fa;
- padding: 4px 8px;
- border-radius: 4px;
-}
-
-.stats-card {
- margin-bottom: 20px;
- border-radius: 12px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.stat-item {
- text-align: center;
- padding: 20px;
-}
-
-.stat-number {
- font-size: 32px;
- font-weight: 600;
- color: #409EFF;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #606266;
-}
-
-.activity-card {
- border-radius: 12px;
-}
-
-.el-timeline-item {
- padding-bottom: 20px;
-}
-
-.el-timeline-item:last-child {
- padding-bottom: 0;
-}
-</style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
deleted file mode 100644
index 24a368a..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :tableLoading="loading"
- :summaryMethod="summarizeChildrenTable"
- :isShowSummary="true"
- height="auto"
- >
- </PIMTable>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import { nextTick } from "vue";
-const { proxy } = getCurrentInstance();
-
-defineOptions({
- name: "鏉ョエ鐧昏鎶樺彔琛�",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
-} = usePaginationApi(
- productList,
- {
- salesLedgerId: undefined,
- type: 2,
- },
- [
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "绋庣巼(%)",
- prop: "taxRate",
- },
- {
- label: "鍚◣鍗曚环(鍏�)",
- prop: "taxInclusiveUnitPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鍚◣鎬讳环(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "涓嶅惈绋庢�讳环(鍏�)",
- prop: "taxExclusiveTotalPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鏈鏉ョエ閲戦(鍏�)",
- prop: "ticketsAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鏈潵绁ㄦ暟",
- prop: "futureTickets",
- },
- {
- label: "鏈潵绁ㄩ噾棰�(鍏�)",
- prop: "futureTicketsAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- ],
- {},
- {},
- (data) => {
- dataList.value = data;
- }
-);
-
-const getList = async (id) => {
- await nextTick();
- filters.salesLedgerId = id;
- getTableData();
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-defineExpose({
- getList,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
deleted file mode 100644
index f29b78a..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ /dev/null
@@ -1,456 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
- <el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="120px"
- label-position="top"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
- <el-input v-model="form.purchaseLedgerNo" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- :disabled="true"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="issUer">
- <el-input
- v-model="form.issUer"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.entryDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓婁紶闄勪欢">
- <FileUpload
- :showTip="false"
- accept="*"
- :autoUpload="true"
- :action="action"
- :headers="{
- Authorization: 'Bearer ' + getToken(),
- }"
- :limit="10"
- @success="uploadSuccess"
- @remove="removeFile"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.enterDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="form.productData"
- :summaryMethod="summarizeChildrenTable"
- :isShowSummary="true"
- height="auto"
- >
- <template #ticketsNumRef="{ row }">
- <el-input-number
- v-model="row.ticketsNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- @change="invoiceNumBlur(row)"
- />
- </template>
- <template #ticketsAmountRef="{ row }">
- <el-input-number
- v-model="row.ticketsAmount"
- placeholder="璇疯緭鍏�"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceAmountBlur(row)"
- />
- </template>
- </PIMTable>
- </el-form>
- <template #footer>
- <el-button type="primary" :loading="modalLoading" @click="submitForm">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { defineEmits } from 'vue';
-import { useModal } from "@/hooks/useModal";
-import useFormData from "@/hooks/useFormData";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-import {
- getPurchaseNoById,
- getInfo,
- addOrUpdateRegistration,
-} from "@/api/procurementManagement/invoiceEntry.js";
-import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
-import { getToken } from "@/utils/auth";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-defineOptions({
- name: "鏉ョエ鐧昏妯℃�佹",
-});
-
-const userStore = useUserStore();
-const action = import.meta.env.VITE_APP_BASE_API + "/file/upload";
-const formRef = ref();
-const { proxy } = getCurrentInstance();
-const { form } = useFormData({
- purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
- salesContractNo: undefined, // 閿�鍞悎鍚屽彿
- supplierName: undefined, // 渚涘簲鍟嗗悕绉�
- projectName: undefined, // 椤圭洰鍚嶇О
- invoiceNumber: undefined, // 鍙戠エ鍙�
- invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
- issUerId: userStore.id, // 褰曞叆浜�
- issUer: userStore.nickName, // 褰曞叆浜�
- entryDate: undefined, // 寮�绁ㄦ棩鏈�
- salesContractNoId: undefined, // 寮�绁ㄦ棩鏈�
- enterDate: dayjs().format("YYYY-MM-DD"),
- productData: [], // 琛ㄦ牸
- tempFileIds: [], // 鏂囦欢
-});
-
-const rules = ref({
- invoiceNumber: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
- { type: "string" },
- ],
- invoiceAmount: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
- ],
- entryDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
- enterDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
-});
-
-const {
- id,
- visible,
- loading: modalLoading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({
- title: "鏉ョエ鐧昏",
-});
-
-const emit = defineEmits(['refreshList']);
-
-const columns = [
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 120,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 120,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width: 80,
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 80,
- },
- {
- label: "绋庣巼(%)",
- prop: "taxRate",
- width: 80,
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "registerDate",
- width: 120,
- },
- {
- label: "鍚◣鍗曚环(鍏�)",
- prop: "taxInclusiveUnitPrice",
- width: 150,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "鍚◣鎬讳环(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width: 150,
- formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
- },
- },
- {
- label: "涓嶅惈绋庢�讳环(鍏�)",
- prop: "taxExclusiveTotalPrice",
- width: 150,
- formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
- },
- },
- {
- label: "鏈鏉ョエ鏁�",
- prop: "ticketsNum",
- dataType: "slot",
- slot: "ticketsNumRef",
- width: 180,
- align: "center",
- },
- {
- label: "鏈鏉ョエ閲戦(鍏�)",
- prop: "ticketsAmount",
- dataType: "slot",
- slot: "ticketsAmountRef",
- width: 180,
- align: "center",
- },
- {
- label: "鏈潵绁ㄦ暟",
- prop: "futureTickets",
- width: 100,
- },
- {
- label: "鏈潵绁ㄩ噾棰�(鍏�)",
- prop: "futureTicketsAmount",
- width: 200,
- },
-];
-
-const getTableData = async (type, id) => {
- if (type == "add") {
- const { data } = await getPurchaseNoById({ id });
- form.purchaseLedgerNo = data.purchaseContractNumber;
- form.invoiceAmount = data.invoiceAmount;
- form.invoiceNumber = data.invoiceNumber;
- form.entryDate = data.entryDate;
- form.salesContractNoId = data.salesContractNoId;
-
- const { data: infoData } = await getInfo({ id });
- form.salesContractNo = infoData.salesContractNo;
- form.projectName = infoData.projectName;
- form.supplierName = infoData.supplierName;
- form.productData = infoData.productData;
- } else if (type == "edit") {
- const data = await getPurchaseById({ id, type: 2 });
- form.purchaseLedgerNo = data.purchaseContractNumber;
- form.invoiceAmount = data.invoiceAmount;
- form.invoiceNumber = data.invoiceNumber;
- form.salesContractNo = data.salesContractNo;
- form.projectName = data.projectName;
- form.supplierName = data.supplierName;
- form.entryDate = data.entryDate;
- form.productData = data.productData;
- }
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "ticketsAmountRef",
- "futureTickets",
- "futureTicketsAmount",
- ]);
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.ticketsNum || row.ticketsNum === "") {
- row.ticketsNum = 0;
- }
- if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.ticketsNum = 0;
- return;
- }
- // 璁$畻鏈鏉ョエ閲戦
- row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2)
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
- calculateinvoiceAmount();
-};
-
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
- if (!row.ticketsAmount) {
- row.ticketsAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
- if (row.ticketsAmount > row.tempFutureTicketsAmount) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
- row.ticketsAmount = 0;
- }
- // 璁$畻鏈鏉ョエ鏁�
- row.ticketsNum = Number(
- (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
- );
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
- calculateinvoiceAmount();
-};
-
-const calculateinvoiceAmount = () => {
- let invoiceAmountTotal = 0;
- form.productData.forEach((item) => {
- if (item.ticketsAmount) {
- invoiceAmountTotal += Number(item.ticketsAmount);
- }
- });
- form.invoiceAmount = invoiceAmountTotal.toFixed(2);
-};
-
-const open = (type, eid) => {
- openModal();
- getTableData(type, eid);
- id.value = eid;
-};
-
-const uploadSuccess = (response) => {
- form.tempFileIds.push(response.data.tempId);
- console.log(form);
-};
-
-const removeFile = (file) => {
- const { tempId } = file.response.data;
- form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
-
-const closeAndRefresh = () => {
- closeModal();
- emit('refreshList');
-};
-
-const submitForm = () => {
- formRef.value.validate(async (valid, fields) => {
- if (valid) {
- // modalLoading.value = true;
- const { code } = await addOrUpdateRegistration({
- purchaseLedgerId: id.value,
- purchaseContractNumber: form.purchaseLedgerNo,
- invoiceNumber: form.invoiceNumber,
- invoiceAmount: form.invoiceAmount,
- salesContractNo: form.salesContractNo,
- projectName: form.projectName,
- productData: form.productData,
- issueDate: form.entryDate,
- issUerId: form.issUerId, // 褰曞叆浜篿d
- issUer: form.issUer, // 褰曞叆浜�
- salesContractNoId: form.salesContractNoId,
- supplierName: form.supplierName,
- tempFileIds: form.tempFileIds,
- enterDate: form.enterDate,
- type: 4,
- });
- modalLoading.value = false;
- if (code == 200) {
- closeAndRefresh();
- }
- } else {
- modalLoading.value = false;
- }
- });
-};
-
-defineExpose({
- open,
- closeAndRefresh,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
deleted file mode 100644
index 4b25c38..0000000
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ /dev/null
@@ -1,294 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="filters" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input
- v-model="filters.supplierName"
- placeholder="璇疯緭鍏ュ悕绉版悳绱�"
- clearable
- prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="閲囪喘璁㈠崟鍙凤細">
- <el-input
- v-model="filters.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
-
- <el-form-item label="閿�鍞悎鍚屽彿">
- <el-input
- v-model="filters.salesContractNo"
- placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"
- clearable
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="filters.projectName"
- placeholder="璇疯緭鍏ラ」鐩悕绉�"
- clearable
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="handleAdd('add')">
- 鏂板鐧昏
- </el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :tableLoading="loading"
- :isSelection="true"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- :expand-row-keys="expandRowKeys"
- :summaryMethod="summarizeMainTable"
- :isShowSummary="true"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #expand="{ row }">
- <ExpandTable ref="expandTableRef" />
- </template>
- <template #operation="{ row }">
- <el-button
- text
- type="primary"
- size="small"
- @click="handleEdit('edit', row.id)"
- >
- 缂栬緫
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @refreshList="getTableData"></Modal>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {delRegistration, gePurchaseListPage} from "@/api/procurementManagement/invoiceEntry.js";
-import { nextTick, onMounted, getCurrentInstance } from "vue";
-import ExpandTable from "./components/ExpandTable.vue";
-import Modal from "./components/Modal.vue";
-import {ElMessageBox} from "element-plus";
-
-defineOptions({
- name: "鏉ョエ鐧昏",
-});
-
-const { proxy } = getCurrentInstance();
-const expandRowKeys = ref([]);
-const expandTableRef = ref();
-const modalRef = ref();
-const selectedRows = ref([]);
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- gePurchaseListPage,
- {
- purchaseContractNumber: undefined,
- },
- [
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "閲囪喘璁㈠崟鍙�",
- prop: "purchaseContractNumber",
- width:150
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width:150
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:300
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:400
- },
- {
- label: "褰曞叆浜�",
- prop: "recorderName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width:110
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "contractAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "宸叉潵绁ㄩ噾棰�(鍏�)",
- prop: "receiptPaymentAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "寰呮潵绁ㄩ噾棰�(鍏�)",
- prop: "unReceiptPaymentAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- // {
- // fixed: "right",
- // label: "鎿嶄綔",
- // dataType: "slot",
- // slot: "operation",
- // align: "center",
- // width: "200px",
- // },
- ]
-);
-
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection.filter(
- (item) => item.purchaseContractNumber !== undefined
- );
-};
-
-const handleAdd = (type) => {
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
- return;
- }
- modalRef.value.open(type, selectedRows.value[0].id);
-};
-
-const handleEdit = (type, id) => {
- modalRef.value.open(type, id);
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 鏂板鍒ゆ柇锛氬鏋滄湁閫変腑鐨勬暟鎹病鏈塼icketRegistrationId锛屾彁绀哄苟缁堟
- const noTicket = selectedRows.value.some(item => !item.ticketRegistrationId);
- if (noTicket) {
- proxy.$modal.msgWarning("閲囪喘鍙拌处杩樻湭杩涜鏉ョエ鐧昏,鏃犳硶杩涜鍒犻櫎鎿嶄綔");
- return;
- }
- ids = selectedRows.value.map((item) => item.ticketRegistrationId);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delRegistration(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const expandChange = async (row, expandedRows) => {
- if (expandedRows.length > 0) {
- await nextTick();
- expandTableRef.value.getList(row.id);
- }
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/procurementManagement/invoiceEntry/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue
deleted file mode 100644
index 1b4c6b9..0000000
--- a/src/views/procurementManagement/invoiceEntry/indexOld.vue
+++ /dev/null
@@ -1,727 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="handleQuery"
- style="margin-left: 10px"
- >
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="宸插紑绁ㄩ噾棰�(鍏�)"
- prop="receiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寰呭紑绁ㄩ噾棰�(鍏�)"
- prop="unReceiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- text
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- >
- 缂栬緫
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'"
- width="80%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
- <el-input v-model="form.purchaseLedgerNo" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input
- type="number"
- :step="0.01"
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- :disabled="true"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="issUer">
- <el-input
- v-model="form.issUer"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.issueDate"
- type="date"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓婁紶闄勪欢">
- <FileUpload :showTip="false" accept="*" :autoUpload="true" />
- </el-form-item>
- </el-col>
- </el-row>
- <!-- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row> -->
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- @selection-change="productSelected"
- show-summary
- style="width: 100%"
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- width="200"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- width="200"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- width="200"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.ticketsNum"
- placeholder="璇烽�夋嫨"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceNumBlur(scope.row)"
- />
- </template>
- </el-table-column>
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :min="0"
- :step="0.1"
- :formatter="formattedNumber"
- width="200"
- >
- <template #default="scope">
- <el-input-number
- v-model="scope.row.ticketsAmount"
- placeholder="璇烽�夋嫨"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceAmountBlur(scope.row)"
- />
- </template>
- </el-table-column>
- <el-table-column
- label="鏈潵绁ㄦ暟"
- prop="futureTickets"
- :formatter="
- (row) =>
- row.futureTickets == null || row.futureTickets === ''
- ? row.quantity
- : row.futureTickets
- "
- >
- </el-table-column>
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="
- (row) =>
- row.futureTicketsAmount !== undefined &&
- row.futureTicketsAmount !== null &&
- row.futureTicketsAmount !== ''
- ? row.futureTicketsAmount
- : row.taxExclusiveTotalPrice
- "
- >
- </el-table-column>
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import useUserStore from "@/store/modules/user";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const userList = ref([]);
-const purchaseLedgerList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import {
- addOrUpdateRegistration,
- delRegistration,
- gePurchaseListPage,
- getInfo,
- getProduct,
- getPurchaseNoById,
- getRegistrationById,
-} from "@/api/procurementManagement/invoiceEntry.js";
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- purchaseContractNumber: "",
- },
- form: {
- issueDate: "", // 寮�绁ㄦ棩鏈�
- purchaseLedgerId: "",
- purchaseLedgerNo: "",
- issUerId: "", // 寮�绁ㄤ汉id
- issUer: "", // 寮�绁ㄤ汉濮撳悕
- invoiceNumber: "", // 鍙戠エ鍙�
- invoiceAmount: "", // 鍙戠エ閲戦
- createTime: "", // 褰曞叆鏃ユ湡
- },
- rules: {
- invoiceNumber: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
- { type: "string" },
- ],
- invoiceAmount: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
- ],
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const currentId = ref("");
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- gePurchaseListPage({ ...searchForm.value, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2) ?? 0;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection.filter(
- (item) => item.purchaseContractNumber !== undefined
- );
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-const handleAdd = () => {
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
- return;
- }
- openForm("add", selectedRows.value[0]);
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- invoiceNumBlur(row);
- operationType.value = type;
- form.value = {};
- productData.value = [];
- fileList.value = [];
- form.value.issUerId = userStore.id;
- form.value.issUer = userStore.name;
- form.value.issueDate = getNowFormatDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿
- if (type === "add" && row && row.id) {
- form.value.purchaseLedgerId = row.id;
- getPurchaseNoById({ id: row.id }).then((res) => {
- let result = res.data;
- purchaseLedgerList.value = result;
- form.value.purchaseLedgerNo = result.purchaseContractNumber;
- form.value.invoiceAmount = result.invoiceAmount;
- form.value.invoiceNumber = result.invoiceNumber;
- setInfo(result.id);
- });
- } else {
- getProduct().then((res) => {
- purchaseLedgerList.value = res;
- });
- }
- if (type === "edit") {
- currentId.value = row.id;
- getRegistrationById({ id: row.id }).then((res) => {
- const { code, data } = res;
- if (code == 200) {
- form.value.invoiceAmount = data.invoiceAmount;
- productData.value = data.productData;
- if (data.salesLedgerFiles) {
- fileList.value = data.salesLedgerFiles;
- } else {
- fileList.value = [];
- }
- }
- });
- }
- dialogFormVisible.value = true;
-};
-// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊�
-const setInfo = (value) => {
- getInfo({ id: value }).then((res) => {
- let result = res.data;
- form.value.salesContractNo = result.salesContractNo;
- form.value.projectName = result.projectName;
- productData.value = result.productData;
- form.value.supplierName = result.supplierName;
- });
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.productData = proxy.HaveJson(productData.value);
- addOrUpdateRegistration(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delRegistration(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.ticketsNum || row.ticketsNum === "") {
- row.ticketsNum = 0;
- }
- if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.ticketsNum = 0;
- return;
- }
- // 璁$畻鏈鏉ョエ閲戦
- row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice;
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = row.tempFutureTickets - row.ticketsNum;
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
- calculateinvoiceAmount();
-};
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
- if (!row.ticketsAmount) {
- row.ticketsAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
- if (row.ticketsAmount > row.tempFutureTicketsAmount) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
- row.ticketsAmount = 0;
- }
- // 璁$畻鏈鏉ョエ鏁�
- row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2);
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = row.tempFutureTickets - row.ticketsNum;
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
- calculateinvoiceAmount();
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟
-function getNowFormatDate() {
- let date = new Date(),
- year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�)
- month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
- strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31)
- if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0
- if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0
- return `${year}-${month}-${strDate}`;
-}
-
-function calculateinvoiceAmount() {
- console.log("productData", productData.value);
- var invoiceAmountTotal = 0;
- productData.value.forEach((item) => {
- if (item.ticketsAmount) {
- invoiceAmountTotal += item.ticketsAmount;
- }
- });
- form.value.invoiceAmount = invoiceAmountTotal.toFixed(2);
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
deleted file mode 100644
index 0749292..0000000
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ /dev/null
@@ -1,580 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm" style="width: 100%">
- <el-row justify="space-between">
- <el-col :span="20">
- <el-form-item label="渚涘簲鍟嗗悕绉�/鍚堝悓鍙�">
- <el-input
- v-model="searchForm.supplierNameOrContractNo"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
- clearable
- prefix-icon="Search"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀哄緟浠樻涓�0"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-col>
- <el-col :span="4">
- <el-form-item style="float: right; margin-right: unset">
- <el-button type="primary" @click="openForm('add')">
- 鏂板浠樻
- </el-button>
-<!-- <el-button type="danger" plain @click="handleDelete">-->
-<!-- 鍒犻櫎-->
-<!-- </el-button>-->
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :expandRowKeys="expandedRowKeys"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- @selection-change="handleSelectionChange"
- @expand-change="expandChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- >
- <template #expand="{ row }">
- <el-table
- :data="expandData"
- border
- show-summary
- v-loading="childrenLoading"
- :summary-method="summarizeMainTable2"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浠樻鏃ユ湡" prop="paymentDate" />
- <el-table-column label="浠樻閲戦" prop="currentPaymentAmount">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.currentPaymentAmount"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </template>
- </el-table-column>
- <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod">
- <template #default="scope">
- <el-select
- :disabled="!scope.row.editType"
- v-model="scope.row.paymentMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="鐢垫眹" value="鐢垫眹" />
- <el-option label="鎵垮厬" value="鎵垮厬" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="registrant" />
- <el-table-column label="鐧昏鏃ユ湡" prop="registrationtDate" />
- <el-table-column label="鎿嶄綔" width="150">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >淇濆瓨</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="handleDelete(scope.row)"
- :disabled="scope.row.registrant !== userStore.nickName"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'"
- width="60%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈浠樻閲戦锛�" prop="currentPaymentAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="form.currentPaymentAmount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡锛�" prop="paymentMethod">
- <el-select
- v-model="form.paymentMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="鐢垫眹" value="鐢垫眹" />
- <el-option label="鎵垮厬" value="鎵垮厬" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠樻鏃ユ湡锛�" prop="paymentDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.paymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="registrant">
- <el-input
- v-model="form.registrant"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏鏃ユ湡锛�" prop="registrationtDate">
- <el-input
- v-model="form.registrationtDate"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import {
- byPurchaseId,
- paymentRegistrationAdd,
- paymentRegistrationDel,
- paymentRegistrationEdit,
- getTicketNo,
-} from "@/api/procurementManagement/paymentEntry.js";
-import {
- delPaymentRegistration,
- invoiceListPage,
- registrationListPageGetById,
- updatePaymentRegistration
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import useFormData from "@/hooks/useFormData";
-
-const { proxy } = getCurrentInstance();
-const tableColumn = ref([
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "鍙戠エ鍙�",
- prop: "invoiceNumber",
- width:200
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "宸蹭粯娆鹃噾棰�(鍏�)",
- prop: "paymentAmountTotal",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "寰呬粯娆鹃噾棰�(鍏�)",
- prop: "unPaymentAmountTotal",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "褰曞叆浜�",
- prop: "issUer",
- },
-]);
-const tableData = ref([]);
-const expandData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const userStore = useUserStore();
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- status: false,
- },
- form: {
- purchaseContractNumber: "",
- purchaseLedgerId: "",
- salesContractNo: "",
- supplierName: "",
- invoiceNumber: "",
- invoiceAmount: "",
- taxRate: "",
- currentPaymentAmount: "",
- paymentMethod: "",
- registrant: "",
- registrantId: "",
- paymentDate: "",
- registrationtDate: "",
- },
- rules: {
- purchaseLedgerId: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- currentPaymentAmount: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceNumber: [
- { required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" },
- ],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const isShowSummarySon = ref(true);
-const expandedRowKeys = ref([]);
-
-
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable2 = (param) => {
- return proxy.summarizeTable(param, ["currentPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- invoiceListPage({ ...searchForm, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- if (expandedRowKeys.value.length > 0) {
- const arr = []
- const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
- if (index > -1) {
- arr.push(tableData.value[index]);
- expandChange(tableData.value[index], arr)
- }
- }
- });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- nextTick(() => {
- expandedRowKeys.value = [];
- try {
- childrenLoading.value = true;
- registrationListPageGetById({ id: row.id }).then((res) => {
- childrenLoading.value = false;
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- expandData.value = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- childrenLoading.value = false;
- console.log(error);
- }
- })
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
- let updateData = {
- id: row.id,
- currentPaymentAmount: row.currentPaymentAmount,
- paymentMethod: row.paymentMethod,
- };
- updatePaymentRegistration(updateData).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�");
- return;
- }
- if (selectedRows.value[0].unPaymentAmountTotal == 0) {
- proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
- return;
- }
- operationType.value = type;
- form.value = {};
- form.value = { ...selectedRows.value[0] };
- form.value.ticketRegistrationId = selectedRows.value[0].id;
- form.value.id = null;
- // 鏌ヨ閲囪喘鍚堝悓鍙�
- form.value.registrationtDate = getCurrentDate();
- form.value.paymentDate = getCurrentDate();
- form.value.registrant = userStore.name;
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- paymentRegistrationAdd(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- paymentRegistrationEdit(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delPaymentRegistration(row.id)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-getList();
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentHistory/index.vue b/src/views/procurementManagement/paymentHistory/index.vue
deleted file mode 100644
index 7c71979..0000000
--- a/src/views/procurementManagement/paymentHistory/index.vue
+++ /dev/null
@@ -1,173 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input
- v-model="searchForm.searchText"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="浠樻鏃ユ湡">
- <el-date-picker
- v-model="searchForm.paymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="changeDateRange"
- @clear="clearRange"
- />
- </el-form-item>
- <el-form-item>
- <el-button
- type="primary"
- @click="handleQuery"
- style="margin-left: 10px"
- >
- 鎼滅储
- </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { paymentHistoryListPage } from "@/api/procurementManagement/paymentEntry.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const isShowSummarySon = ref(true);
-const tableColumn = ref([
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- },
- {
- label: "浠樻鏃ユ湡",
- prop: "paymentDate",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "浠樻閲戦",
- prop: "currentPaymentAmount",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻鏂瑰紡",
- prop: "paymentMethod",
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "registrationtDate",
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-const { form: searchForm } = useFormData({
- searchText: undefined,
- paymentDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- paymentDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- paymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { paymentDate, ...rest } = searchForm;
- paymentHistoryListPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(param, ["currentPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.paymentDateStart = date[0];
- searchForm.paymentDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.paymentDate = [];
- searchForm.paymentDateStart = undefined;
- searchForm.paymentDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
deleted file mode 100644
index 741e6ac..0000000
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ /dev/null
@@ -1,315 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉�:</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div></div>
- </div>
- <el-row :gutter="20">
- <el-col :span="14">
- <div class="table_list">
- <el-table
- ref="multipleTable"
- border
- v-loading="tableLoading"
- :data="tableData"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- height="calc(100vh - 18.5em)"
- :highlight-current-row="true"
- style="width: 100%"
- tooltip-effect="dark"
- @row-click="rowClick"
- :show-summary="isShowSummary"
- :summary-method="summarizeMainTable"
- class="lims-table"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column
- label="鍙戠エ閲戦(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="浠樻閲戦(鍏�)"
- prop="paymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="搴斾粯閲戦(鍏�)"
- prop="payableAmount"
- show-overflow-tooltip
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.payableAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :layout="page.layout"
- :page="page.current"
- :limit="page.size"
- />
- </div>
- </el-col>
- <el-col :span="10">
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumnSon"
- :tableData="originalTableDataSon"
- :isSelection="false"
- :tableLoading="tableLoadingSon"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- >
- <template #payableAmountSlot="{ row }">
- <el-text type="danger">
- {{ parseFloat(row.payableAmount).toFixed(2) }}
- </el-text>
- </template>
- </PIMTable>
- <pagination
- v-show="sonTotal > 0"
- :total="sonTotal"
- @pagination="sonPaginationSearch"
- :layout="page.layout"
- :page="sonPage.current"
- :limit="sonPage.size"
- />
- </div>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import { ref, toRefs } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import {
- paymentLedgerList,
- paymentRecordList,
-} from "@/api/procurementManagement/paymentLedger.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
-
-const tableColumn = ref([
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "paymentAmount",
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- prop: "payableAmount",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- },
-});
-const page = reactive({
- current: 1,
- size: 100,
-});
-const sonPage = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const sonTotal = ref(0);
-const isShowSummary = ref(true);
-const { searchForm } = toRefs(data);
-const currentSupplierId = ref("");
-const rowClick = (row) => {
- currentSupplierId.value = row.supplierId;
- getPaymenRecordtList(row.supplierId);
-};
-// 瀛愭ā鍧�
-const tableColumnSon = ref([
- {
- label: "鍙戠敓鏃ユ湡",
- prop: "happenTime",
- width: 110,
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- width: 200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "currentPaymentAmount",
- width: 200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- dataType: "slot",
- width: 200,
- prop: "payableAmount",
- slot: "payableAmountSlot",
- },
-]);
-const tableDataSon = ref([]);
-const originalTableDataSon = ref([]);
-const tableLoadingSon = ref(false);
-const isShowSummarySon = ref(true);
-const detailPageNum = ref(1);
-const detailPageSize = ref(10);
-const { proxy } = getCurrentInstance();
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceAmount", "paymentAmount", "payableAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- let summarizeTable = proxy.summarizeTable(
- param,
- ["invoiceAmount", "currentPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
- if (originalTableDataSon.value.length > 0) {
- summarizeTable[summarizeTable.length - 1] =
- originalTableDataSon.value[
- originalTableDataSon.value.length - 1
- ].payableAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
-};
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- paymentLedgerList({
- ...searchForm.value,
- ...page,
- detailPageNum: detailPageNum.value, // 鏂板
- detailPageSize: detailPageSize.value, // 鏂板
- }).then((res) => {
- let result = res.data;
- tableLoading.value = false;
- tableData.value = result.records || [];
- total.value = result.total || 0;
- if (tableData.value.length > 0) {
- getPaymenRecordtList(tableData.value[0].supplierId);
- currentSupplierId.value = tableData.value[0].supplierId;
- }
- });
-};
-
-const getPaymenRecordtList = (supplierId) => {
- tableLoadingSon.value = true;
- paymentRecordList(supplierId)
- .then((res) => {
- tableLoadingSon.value = false;
- tableDataSon.value = res.data;
- handlePagination({ page: 1, limit: sonPage.size });
- sonTotal.value = res.data.length;
- })
- .catch((e) => {
- tableLoadingSon.value = false;
- });
-};
-const handlePagination = ({ page, limit }) => {
- sonPage.current = page;
- sonPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- originalTableDataSon.value = tableDataSon.value.slice(start, end);
-};
-
-const sonPaginationSearch = (pagination) => {
- // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
- handlePagination(pagination);
-};
-const formattedNumber = (row, column, cellValue) => {
- if (column.property !== "supplierName") {
- return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
- }
-};
-getList();
-</script>
-
-<style scoped lang="scss">
-.el-pagination {
- width: 100%;
- height: 55px;
- display: flex;
- justify-content: flex-end;
- float: right;
- flex-direction: row;
- align-items: center;
- background: #fff;
- margin: -20px 0 0 0;
- padding: 0 20px;
-}
-.pagination-container {
- margin-top: 0;
-}
-</style>
diff --git a/src/views/procurementManagement/priceManagement/index.vue b/src/views/procurementManagement/priceManagement/index.vue
deleted file mode 100644
index 006ce3c..0000000
--- a/src/views/procurementManagement/priceManagement/index.vue
+++ /dev/null
@@ -1,276 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="search-card" shadow="never">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="鍟嗗搧鍚嶇О锛�">
- <el-input v-model="searchForm.productName" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�" clearable />
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" clearable />
- </el-form-item>
- <el-form-item label="浠锋牸鐘舵�侊細">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="鏈夋晥" value="active" />
- <el-option label="宸茶繃鏈�" value="expired" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <el-card class="table-card" shadow="never">
- <div class="table-header">
- <el-button type="primary" @click="openDialog('add')">鏂板浠锋牸</el-button>
- <el-button type="success" @click="handleBatchUpdate">鎵归噺鏇存柊</el-button>
- <el-button type="danger" @click="handleBatchDelete">鎵归噺鍒犻櫎</el-button>
- </div>
-
- <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鍟嗗搧鍚嶇О" prop="productName" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column label="鍘熶环鏍�" prop="oldPrice" width="120">
- <template #default="{ row }">楼{{ row.oldPrice.toFixed(2) }}</template>
- </el-table-column>
- <el-table-column label="鏂颁环鏍�" prop="newPrice" width="120">
- <template #default="{ row }">楼{{ row.newPrice.toFixed(2) }}</template>
- </el-table-column>
- <el-table-column label="璋冧环骞呭害" prop="priceChange" width="120">
- <template #default="{ row }">
- <span :style="{ color: row.priceChange >= 0 ? '#f56c6c' : '#67c23a' }">
- {{ row.priceChange >= 0 ? '+' : '' }}{{ row.priceChange.toFixed(2) }}%
- </span>
- </template>
- </el-table-column>
- <el-table-column label="鐢熸晥鏃堕棿" prop="effectiveTime" width="180" />
- <el-table-column label="鐘舵��" prop="status" width="100">
- <template #default="{ row }">
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="200" align="center">
- <template #default="{ row }">
- <el-button type="primary" link @click="openDialog('edit', row)">缂栬緫</el-button>
- <el-button type="success" link @click="handleApply(row)" v-if="row.status === 'pending'">搴旂敤</el-button>
- <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板浠锋牸' : '缂栬緫浠锋牸'" width="600px">
- <el-form :model="formData" label-width="120px">
- <el-form-item label="鍟嗗搧鍚嶇О">
- <el-select v-model="formData.productName" placeholder="璇烽�夋嫨鍟嗗搧" style="width: 100%">
- <el-option label="鍟嗗搧A" value="鍟嗗搧A" />
- <el-option label="鍟嗗搧B" value="鍟嗗搧B" />
- <el-option label="鍟嗗搧C" value="鍟嗗搧C" />
- </el-select>
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input v-model="formData.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-select v-model="formData.supplierName" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
- <el-option label="渚涘簲鍟咥" value="渚涘簲鍟咥" />
- <el-option label="渚涘簲鍟咮" value="渚涘簲鍟咮" />
- <el-option label="渚涘簲鍟咰" value="渚涘簲鍟咰" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍘熶环鏍�">
- <el-input v-model="formData.oldPrice" placeholder="璇疯緭鍏ュ師浠锋牸" type="number" />
- </el-form-item>
- <el-form-item label="鏂颁环鏍�">
- <el-input v-model="formData.newPrice" placeholder="璇疯緭鍏ユ柊浠锋牸" type="number" />
- </el-form-item>
- <el-form-item label="鐢熸晥鏃堕棿">
- <el-date-picker v-model="formData.effectiveTime" type="datetime" placeholder="閫夋嫨鐢熸晥鏃堕棿" style="width: 100%" />
- </el-form-item>
- <el-form-item label="璋冧环鍘熷洜">
- <el-select v-model="formData.reason" placeholder="璇烽�夋嫨璋冧环鍘熷洜" style="width: 100%">
- <el-option label="甯傚満浠锋牸鍙樺姩" value="market" />
- <el-option label="鎴愭湰鍙樺寲" value="cost" />
- <el-option label="渚涘簲鍟嗚皟鏁�" value="supplier" />
- <el-option label="鍏朵粬鍘熷洜" value="other" />
- </el-select>
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-
-const searchForm = reactive({
- productName: '',
- supplierName: '',
- status: ''
-})
-
-const formData = reactive({
- productName: '',
- specification: '',
- supplierName: '',
- oldPrice: 0,
- newPrice: 0,
- effectiveTime: '',
- reason: '',
- remark: ''
-})
-
-const mockData = [
- {
- id: 1,
- productName: '鍟嗗搧A',
- specification: '瑙勬牸1',
- supplierName: '渚涘簲鍟咥',
- oldPrice: 50.00,
- newPrice: 55.00,
- priceChange: 10.00,
- effectiveTime: '2025-12-01 00:00:00',
- status: 'active',
- reason: '甯傚満浠锋牸鍙樺姩',
- remark: '甯傚満浠锋牸涓婃定'
- },
- {
- id: 2,
- productName: '鍟嗗搧B',
- specification: '瑙勬牸2',
- supplierName: '渚涘簲鍟咮',
- oldPrice: 80.00,
- newPrice: 75.00,
- priceChange: -6.25,
- effectiveTime: '2025-12-01 00:00:00',
- status: 'active',
- reason: '鎴愭湰鍙樺寲',
- remark: '鎴愭湰涓嬮檷'
- }
-]
-
-const tableData = ref([...mockData])
-
-const getStatusType = (status) => {
- const statusMap = { active: 'success', expired: 'info', pending: 'warning' }
- return statusMap[status] || 'info'
-}
-
-const getStatusText = (status) => {
- const statusMap = { active: '鏈夋晥', expired: '宸茶繃鏈�', pending: '寰呯敓鏁�' }
- return statusMap[status] || '鏈煡'
-}
-
-const handleSearch = () => {
- loading.value = true
- setTimeout(() => { loading.value = false }, 500)
-}
-
-const resetSearch = () => {
- Object.assign(searchForm, { productName: '', supplierName: '', status: '' })
-}
-
-const openDialog = (type, row = {}) => {
- dialogType.value = type
- if (type === 'edit' && row.id) {
- Object.assign(formData, {
- productName: row.productName,
- specification: row.specification,
- supplierName: row.supplierName,
- oldPrice: row.oldPrice,
- newPrice: row.newPrice,
- effectiveTime: row.effectiveTime,
- reason: row.reason,
- remark: row.remark
- })
- } else {
- Object.assign(formData, {
- productName: '',
- specification: '',
- supplierName: '',
- oldPrice: 0,
- newPrice: 0,
- effectiveTime: '',
- reason: '',
- remark: ''
- })
- }
- dialogVisible.value = true
-}
-
-const handleSubmit = () => {
- if (dialogType.value === 'add') {
- const priceChange = ((formData.newPrice - formData.oldPrice) / formData.oldPrice) * 100
- const newPrice = {
- id: Date.now(),
- productName: formData.productName,
- specification: formData.specification,
- supplierName: formData.supplierName,
- oldPrice: formData.oldPrice,
- newPrice: formData.newPrice,
- priceChange: priceChange,
- effectiveTime: formData.effectiveTime,
- status: 'pending',
- reason: formData.reason,
- remark: formData.remark
- }
- tableData.value.unshift(newPrice)
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
-}
-
-const handleApply = (row) => {
- row.status = 'active'
- ElMessage.success('浠锋牸宸插簲鐢�')
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = tableData.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleBatchUpdate = () => {
- ElMessage.success('鎵归噺鏇存柊鎴愬姛')
-}
-
-const handleBatchDelete = () => {
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
-}
-
-const handleSelectionChange = (rows) => {
- selectedRows.value = rows
-}
-</script>
-
-<style scoped>
-.app-container { padding: 20px; }
-.search-card { margin-bottom: 20px; }
-.table-card { margin-bottom: 20px; }
-.table-header { margin-bottom: 20px; }
-</style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue b/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue
deleted file mode 100644
index f939be4..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-<template>
- <el-form :model="form">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-tag size="large">{{ form.purchaseContractNumber }}</el-tag>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-text>{{ form.salesContractNo }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�">
- <el-text type="primary">{{ form.taxInclusiveUnitPrice }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒涘缓鏃堕棿锛�">
- <el-text>{{ form.createdAt }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細">
- <el-input disabled v-model="form.invoiceNumber" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏉ョエ鏁帮細">
- <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsNum" @change="inputTicketsNum" :precision="2"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鏉ョエ閲戦(鍏�)锛�">
- <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsAmount" @change="inputTicketsAmount" :precision="2"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈潵绁ㄦ暟锛�">
- <el-text type="success">{{ form.futureTickets }}</el-text>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getProductRecordById } from "@/api/procurementManagement/procurementInvoiceLedger";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏉ョエ鍙拌处琛ㄥ崟",
-});
-const temFutureTickets = ref(0)
-const { form, resetForm } = useFormData({
- id: undefined,
- purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
- salesContractNo: undefined, // 閿�鍞悎鍚屽彿
- createdAt: undefined, // 鍒涘缓鏃堕棿
- invoiceNumber: undefined, // 鍙戠エ鍙�
- ticketsNum: undefined, // 鏉ョエ鏁�
- ticketsAmount: undefined, // 鏉ョエ閲戦
- taxInclusiveUnitPrice: undefined, // 鍚◣鍗曚环
-});
-
-const load = async (id) => {
- const { code, data } = await getProductRecordById({ id });
- if (code === 200) {
- form.id = data.id;
- form.purchaseContractNumber = data.purchaseContractNumber;
- form.salesContractNo = data.salesContractNo;
- form.createdAt = data.createdAt;
- form.invoiceNumber = data.invoiceNumber;
- form.ticketsNum = data.ticketsNum;
- form.ticketsAmount = data.ticketsAmount.toFixed(2);
- form.taxInclusiveUnitPrice = data.taxInclusiveUnitPrice;
- form.futureTickets = data.futureTickets;
- temFutureTickets.value = data.futureTickets;
- }
-};
-
-const inputTicketsNum = (val) => {
- // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
- if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
- proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
- return;
- }
- if (Number(form.ticketsNum) > Number(temFutureTickets.value)) {
- proxy.$modal.msgWarning("寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- form.ticketsNum = temFutureTickets.value
- }
-
- // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
- const ticketsAmount = Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice);
- const futureTickets = Number(temFutureTickets.value) - Number(form.ticketsNum);
- form.futureTickets = Number(futureTickets.toFixed(2));
- form.ticketsAmount = Number(ticketsAmount.toFixed(2));
-};
-const inputTicketsAmount = (val) => {
- // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
- if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
- proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
- return;
- }
-
- if (Number(val) > Number(form.futureTickets*form.taxInclusiveUnitPrice)) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鎬婚噾棰�");
- form.ticketsAmount = (form.futureTickets*form.taxInclusiveUnitPrice).toFixed(2)
- const ticketsNum = Number(form.ticketsAmount) / Number(form.taxInclusiveUnitPrice);
- form.ticketsNum = Number(ticketsNum.toFixed(2))
- return;
- }
-
- // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
- const ticketsNum = Number(val) / Number(form.taxInclusiveUnitPrice);
- form.ticketsNum = Number(ticketsNum.toFixed(2));
-};
-
-defineExpose({
- load,
- form,
- resetForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
deleted file mode 100644
index 82b4164..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close">
- <EditForm ref="editFormRef" />
- <template #footer>
- <el-button type="primary" :loading="loading" @click="sendForm">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import EditForm from "../Form/EditForm.vue";
-import { updateRegistration } from "@/api/procurementManagement/procurementInvoiceLedger";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "鏉ョエ鍙拌处缂栬緫",
-});
-const emits = defineEmits(["success"]);
-
-const saleLedgerProjectId = ref('')
-const editFormRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏉ョエ鍙拌处" });
-
-const open = async (row) => {
- openModal(row.id);
- saleLedgerProjectId.value = row.saleLedgerProjectId;
- await nextTick();
- editFormRef.value.load(row.id);
-};
-
-const close = () => {
- editFormRef.value.resetForm();
- closeModal();
-};
-
-const sendForm = async () => {
- const form = editFormRef.value.form;
- form.saleLedgerProjectId = saleLedgerProjectId.value;
- const { code } = await updateRegistration(form);
- if (code === 200) {
- emits("success");
- ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
- close();
- }
-};
-
-defineExpose({
- open,
-});
-</script>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
deleted file mode 100644
index b82bd10..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<template>
- <el-dialog v-model="upload.open" :title="upload.title" :width="500">
- <FileUpload
- ref="fileUploadRef"
- accept=".xlsx, .xls, .pdf"
- :headers="upload.headers"
- :autoUpload="true"
- :action="upload.url"
- :disabled="upload.isUploading"
- :showTip="false"
- :limit="10"
- @success="handleFileSuccess"
- @remove="removeFile"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { reactive } from "vue";
-import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
-import { ElMessage } from "element-plus";
-import { ref } from "vue";
-import useFormData from "@/hooks/useFormData";
-
-defineOptions({
- name: "鏉ョエ鍙拌处闄勪欢琛ュ厖",
-});
-
-const { form, resetForm } = useFormData({
- id: undefined,
- tempFileIds: [],
-});
-const emits = defineEmits(["uploadSuccess"]);
-const fileUploadRef = ref();
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
-});
-// 鐐瑰嚮瀵煎叆
-const handleImport = (id) => {
- form.id = id;
- upload.open = true;
- upload.title = "鏉ョエ鍙拌处闄勪欢琛ュ厖";
-};
-
-const submitFileForm = () => {
- emits("uploadSuccess", form);
- resetForm();
- upload.open = false;
- // 娓呯┖鏂囦欢鍒楄〃
- fileUploadRef.value.fileList = [];
-};
-
-const handleFileSuccess = (response) => {
- if (response.code == 200) {
- form.tempFileIds.push(response.data.tempId);
- console.log('form',form);
- ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
- } else {
- ElMessage({ message: response.msg, type: "error" });
- }
-};
-
-const removeFile = (file) => {
- const { tempId } = file.response.data;
- form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
-
-defineExpose({
- handleImport,
-});
-</script>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
deleted file mode 100644
index 439837b..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ /dev/null
@@ -1,362 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="閲囪喘鍚堝悓鍙�">
- <el-input
- v-model="filters.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="渚涘簲鍟�">
- <el-input
- v-model="filters.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鏉ョエ鏃ユ湡">
- <el-date-picker
- style="width: 240px"
- v-model="filters.createdAt"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableLoading="loading"
- :tableData="dataList"
- :isSelection="true"
- height="calc(100vh - 19.5em)"
- :isShowSummary="true"
- :summaryMethod="summarizeMainTable"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #commonFilesRef="{ row }">
- <el-dropdown @command="(command) => handleCommand(command, row)">
- <el-button link :icon="Files" type="danger"> 闄勪欢 </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item
- v-if="row.commonFiles.length !== 0"
- :icon="Download"
- command="download"
- >
- 涓嬭浇
- </el-dropdown-item>
- <el-dropdown-item :icon="Upload" command="upload">
- 涓婁紶
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </template>
- <template #operation="{ row }">
- <el-button
- type="primary"
- text
- @click="openEdit(row)"
- :disabled="row.issUerId !== userStore.id"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- :disabled="row.issUerId !== userStore.id"
- @click="handleDelete(row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </PIMTable>
- </div>
- <UploadModal ref="modalRef" @uploadSuccess="uploadSuccess"></UploadModal>
- <EditModal ref="editmodalRef" @success="getTableData"></EditModal>
- </div>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {
- Files,
- Download,
- Search,
- Upload,
- EditPen,
-} from "@element-plus/icons-vue";
-import {
- delRegistration,
- productRecordPage,
- productUploadFile,
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import { onMounted } from "vue";
-import { ElMessageBox } from "element-plus";
-import UploadModal from "./Modal/UploadModal.vue";
-import EditModal from "./Modal/EditModal.vue";
-import useUserStore from "@/store/modules/user.js";
-import {delInvoiceLedgerByRegProductId} from "@/api/salesManagement/invoiceLedger.js";
-const userStore = useUserStore();
-
-defineOptions({
- name: "鏉ョエ鍙拌处",
-});
-
-const modalRef = ref();
-const editmodalRef = ref();
-
-const { proxy } = getCurrentInstance();
-const multipleVal = ref([]);
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- productRecordPage,
- {
- purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
- supplierName: undefined, // 渚涘簲鍟�
- createdAt: [], // 鏉ョエ鏃ユ湡
- },
- [
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- width: 150,
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width: 150,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width: 240,
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width: 240,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍙戠エ鍙�",
- prop: "invoiceNumber",
- width: 200,
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "寮�绁ㄦ棩鏈�",
- prop: "createdAt",
- width: 110,
- },
- {
- label: "寮�绁ㄩ噾棰�",
- prop: "ticketsAmount",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "涓嶅惈绋庨噾棰�",
- prop: "unTicketsPrice",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "澧炲�肩◣",
- prop: "invoiceAmount",
- width: 200,
- },
- {
- label: "褰曞叆浜�",
- prop: "issUer",
- width: 200,
- },
- {
- label: "闄勪欢",
- align: "center",
- prop: "commonFiles",
- dataType: "slot",
- fixed: "right",
- slot: "commonFilesRef",
- width: 120,
- },
- {
- fixed: "right",
- width: 150,
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- },
- ],
- {},
- {
- createdAt: (aim) => ({
- createdAtStart: aim ? aim[0] : undefined,
- createdAtEnd: aim ? aim[1] : undefined,
- }),
- }
-);
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveTotalPrice",
- "ticketsAmount",
- "unTicketsPrice",
- "invoiceAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-const handleSelectionChange = (val) => {
- multipleVal.value = val;
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const handleFiles = (fileList) => {
- fileList.forEach((e) => {
- proxy.$download.name(e.url);
- });
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-const handleCommand = (command, row) => {
- switch (command) {
- case "download":
- handleFiles(row.commonFiles);
- break;
- case "upload":
- console.log(row.commonFiles);
- openUoload(row.ticketRegistrationId);
- break;
- }
-};
-
-const openUoload = (id) => {
- modalRef.value.handleImport(id);
-};
-
-const openEdit = (row) => {
- editmodalRef.value.open(row);
-};
-
-// 涓婁紶鎴愬姛鍚庡仛浠�涔�
-const uploadSuccess = async (data) => {
- const { code } = await productUploadFile({
- ticketRegistrationId: data.id,
- tempFileIds: data.tempFileIds,
- });
- if (code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getTableData();
- }
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
- let ids = [];
- ids.push(row.id);
- ElMessageBox.confirm("璇ュ紑绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- loading.value = true;
- delRegistration(ids).then((res) => {
- getTableData();
- });
- loading.value = false;
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.tagBox {
- margin-top: 4px;
-}
-</style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue b/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue
deleted file mode 100644
index 987e6a4..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue
+++ /dev/null
@@ -1,311 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title" style="margin-left: 10px">渚涘簲鍟嗭細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title" style="margin-left: 10px">鏉ョエ鏃ユ湡锛�</span>
- <el-date-picker
- style="width: 240px"
- v-model="searchForm.issueDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="changeDateRange"
- @clear="clearRange"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column align="center" label="搴忓彿" type="index" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍙戠エ鍙�"
- prop="invoiceNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column label="寮�绁ㄤ汉" prop="issUer" show-overflow-tooltip />
- <el-table-column
- label="寮�绁ㄦ棩鏈�"
- prop="issueDate"
- show-overflow-tooltip
- />
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import {
- invoiceListPage,
- productRecordList,
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const data = reactive({
- searchForm: {
- purchaseContractNumber: "",
- supplierName: "",
- issueDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- issueDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- issueDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
- },
- form: {
- issueDate: "", // 寮�绁ㄦ棩鏈�
- purchaseLedgerId: "",
- purchaseLedgerNo: "",
- issUerId: "", // 寮�绁ㄤ汉id
- issUer: "", // 寮�绁ㄤ汉濮撳悕
- },
- rules: {
- purchaseLedgerId: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { issueDate, ...rest } = searchForm.value;
- invoiceListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productRecordList({ id: row.id }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["invoiceAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.value.receiptPaymentDateStart = date[0];
- searchForm.value.receiptPaymentDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.value.issueDate = [];
- searchForm.value.issueDateStart = undefined;
- searchForm.value.issueDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
deleted file mode 100644
index 2877efd..0000000
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ /dev/null
@@ -1,1577 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡锛�">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- </div>
-
- </div>
- <div class="table_list">
- <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
- <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
- <el-button type="success" @click="openScanAddDialog">鎵爜鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- width="240"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- width="420"
- show-overflow-tooltip
- />
- <el-table-column
- label="浠樻鏂瑰紡"
- width="100"
- prop="paymentMethod"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- width="200"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="褰曞叆浜�"
- prop="recorderName"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="褰曞叆鏃ユ湡"
- prop="entryDate"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="150"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- :disabled="scope.row.receiptPaymentAmount>0 || scope.row.recorderName !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="success"
- size="small"
- @click="showQRCode(scope.row)"
- >鐢熸垚浜岀淮鐮�</el-button
- >
-
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
- <el-select
- v-model="form.salesLedgerId"
- placeholder="璇烽�夋嫨"
- clearable
- @change="salesLedgerChange"
- >
- <el-option
- v-for="item in salesContractList"
- :key="item.id"
- :label="item.salesContractNo"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
- <el-select
- v-model="form.supplierId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in supplierList"
- :key="item.id"
- :label="item.supplierName"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="recorderId">
- <el-select
- v-model="form.recorderId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- disabled
- style="width: 100%"
- v-model="form.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input
- v-model="form.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
- <el-button type="primary" @click="openProductForm('add')"
- >娣诲姞</el-button
- >
- <el-button plain type="danger" @click="deleteProduct"
- >鍒犻櫎</el-button
- >
- </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- @selection-change="productSelected"
- show-summary
- :summary-method="summarizeProTable"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openProductForm('edit', scope.row, scope.$index)"
- >缂栬緫</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶囨敞路锛�" prop="remark">
- <el-input
- v-model="form.remark"
- placeholder="璇疯緭鍏�"
- clearable
- type="textarea"
- :rows="2"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload
- v-model:file-list="fileList"
- :action="upload.url"
- multiple
- ref="fileUpload"
- auto-upload
- :headers="upload.headers"
- :before-upload="handleBeforeUpload"
- :on-error="handleUploadError"
- :on-success="handleUploadSuccess"
- :on-remove="handleRemove"
- >
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="productFormVisible"
- :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
- width="40%"
- @close="closeProductDia"
- >
- <el-form
- :model="productForm"
- label-width="140px"
- label-position="top"
- :rules="productRules"
- ref="productFormRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�" prop="productId">
- <el-tree-select
- v-model="productForm.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
- <el-select
- v-model="productForm.productModelId"
- placeholder="璇烽�夋嫨"
- clearable
- @change="getProductModel"
- >
- <el-option
- v-for="item in modelOptions"
- :key="item.id"
- :label="item.model"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="productForm.unit"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
- <el-select
- v-model="productForm.taxRate"
- placeholder="璇烽�夋嫨"
- clearable
- @change="mathNum"
- >
- <el-option label="1" value="1" />
- <el-option label="6" value="6" />
- <el-option label="13" value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
- <el-input-number
- v-model="productForm.taxInclusiveUnitPrice"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number
- :step="0.1"
- clearable
- :precision="2"
- style="width: 100%"
- v-model="productForm.quantity"
- placeholder="璇疯緭鍏�"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
- <el-input-number
- v-model="productForm.taxInclusiveTotalPrice"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="reverseMathNum('taxInclusiveTotalPrice')"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="涓嶅惈绋庢�讳环(鍏�)锛�"
- prop="taxExclusiveTotalPrice"
- >
- <el-input
- v-model="productForm.taxExclusiveTotalPrice"
- @change="reverseMathNum('taxExclusiveTotalPrice')"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
- <el-select
- v-model="productForm.invoiceType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
- <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitProduct">纭</el-button>
- <el-button @click="closeProductDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 浜岀淮鐮佹樉绀哄璇濇 -->
- <el-dialog
- v-model="qrCodeDialogVisible"
- title="閲囪喘鍚堝悓鍙蜂簩缁寸爜"
- width="400px"
- center
- >
- <div style="text-align: center;">
- <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
- <div style="margin: 20px;">
- <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
- </div>
- </div>
- </el-dialog>
-
- <!-- 鎵爜鏂板瀵硅瘽妗� -->
- <el-dialog
- v-model="scanAddDialogVisible"
- title="鎵爜鏂板閲囪喘鍙拌处"
- width="70%"
- @close="closeScanAddDialog"
- >
- <el-form
- :model="scanAddForm"
- label-width="140px"
- label-position="top"
- :rules="scanAddRules"
- ref="scanAddFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜鍐呭锛�">
- <el-input
- v-model="scanAddForm.scanContent"
- type="textarea"
- :rows="3"
- placeholder="璇锋壂鎻忎簩缁寸爜鎴栨墜鍔ㄨ緭鍏ラ噰璐悎鍚屼俊鎭�"
- @input="parseScanContent"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="scanAddForm.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="scanAddForm.supplierName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="scanAddForm.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓閲戦(鍏�)锛�" prop="contractAmount">
- <el-input-number
- v-model="scanAddForm.contractAmount"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡锛�">
- <el-input
- v-model="scanAddForm.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細">
- <el-input v-model="scanAddForm.recorderName" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞锛�">
- <el-input
- v-model="scanAddForm.remark"
- type="textarea"
- :rows="2"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitScanAdd">纭鏂板</el-button>
- <el-button @click="closeScanAddDialog">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鎵爜鐧昏瀵硅瘽妗� -->
- <el-dialog
- v-model="scanDialogVisible"
- title="鎵爜鐧昏"
- width="60%"
- @close="closeScanDialog"
- >
- <el-form
- :model="scanForm"
- label-width="120px"
- label-position="left"
- :rules="scanRules"
- ref="scanFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-input v-model="scanForm.purchaseContractNumber" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="scanForm.supplierName" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="scanForm.projectName" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵爜鏃堕棿锛�">
- <el-input v-model="scanForm.scanTime" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鎵爜浜猴細">
- <el-input v-model="scanForm.scannerName" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵爜鐘舵�侊細">
- <el-tag :type="scanForm.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
- {{ scanForm.scanStatus }}
- </el-tag>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜澶囨敞锛�">
- <el-input
- v-model="scanForm.scanRemark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ユ壂鐮佸娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜璁板綍锛�">
- <el-table :data="scanRecords" border style="width: 100%">
- <el-table-column label="搴忓彿" type="index" width="60" align="center" />
- <el-table-column label="鎵爜鏃堕棿" prop="scanTime" width="180" />
- <el-table-column label="鎵爜浜�" prop="scannerName" width="120" />
- <el-table-column label="鎵爜鐘舵��" prop="scanStatus" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
- {{ scope.row.scanStatus }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="澶囨敞" prop="scanRemark" />
- </el-table>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitScan">纭鎵爜</el-button>
- <el-button @click="closeScanDialog">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import {
- getSalesLedgerWithProducts,
- addOrUpdateSalesLedgerProduct,
- delProduct,
- delLedgerFile,
- getProductInfoByContractNo,
-} from "@/api/salesManagement/salesLedger.js";
-import {
- addOrEditPurchase,
- delPurchase,
- getSalesNo,
- purchaseListPage,
- productList,
- getPurchaseById,
- getOptions,
- createPurchaseNo,
-} from "@/api/procurementManagement/procurementLedger.js";
-import useFormData from "@/hooks/useFormData.js";
-import QRCode from "qrcode";
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const modelOptions = ref([]);
-const userList = ref([]);
-const productOptions = ref([]);
-const salesContractList = ref([]);
-const supplierList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import useUserStore from "@/store/modules/user";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
-import dayjs from "dayjs";
-
-const userStore = useUserStore();
-
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false);
-const qrCodeUrl = ref("");
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierName: "", // 渚涘簲鍟嗗悕绉�
- purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
- salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
- projectName: "", // 椤圭洰鍚嶇О
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- form: {
- purchaseContractNumber: "",
- salesLedgerId: "",
- projectName: "",
- recorderId: "",
- entryDate: "",
- productData: [],
- supplierName: "",
- supplierId: "",
- paymentMethod: "",
- },
- rules: {
- purchaseContractNumber: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm } = useFormData(data.searchForm);
-
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const productOperationIndex = ref("");
-const currentId = ref("");
-const productFormData = reactive({
- productForm: {
- productId: "",
- productCategory: "",
- productModelId: "",
- specificationModel: "",
- unit: "",
- quantity: "",
- taxInclusiveUnitPrice: "",
- taxRate: "",
- taxInclusiveTotalPrice: "",
- taxExclusiveTotalPrice: "",
- invoiceType: "",
- },
- productRules: {
- productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxInclusiveUnitPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- taxInclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxExclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { productForm, productRules } = toRefs(productFormData);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-const changeDaterange = (value) => {
- if (value) {
- searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
- }
- handleQuery();
-};
-
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { entryDate, ...rest } = searchForm;
- purchaseListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.data.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["contractAmount"]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeProTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- productData.value = [];
- fileList.value = [];
- if (operationType.value == "add") {
- createPurchaseNo().then((res) => {
- form.value.purchaseContractNumber = res.data;
- });
- }
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- getSalesNo().then((res) => {
- salesContractList.value = res;
- });
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- form.value.recorderId = userStore.id;
- form.value.entryDate = getCurrentDate();
- if (type === "edit") {
- currentId.value = row.id;
- getPurchaseById({ id: row.id, type: 2 }).then((res) => {
- form.value = { ...res };
- productData.value = form.value.productData;
- if (form.value.salesLedgerFiles) {
- fileList.value = form.value.salesLedgerFiles;
- } else {
- fileList.value = [];
- }
- });
- }
- dialogFormVisible.value = true;
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- if (file.size > 1024 * 1024 * 10) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- return false;
- }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- console.log("handleRemove", file.id);
- if (file.size > 1024 * 1024 * 10) {
- // 浠呭墠绔竻鐞嗭紝涓嶈皟鐢ㄥ垹闄ゆ帴鍙e拰鎻愮ず
- return;
- }
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (productData.value.length > 0) {
- form.value.productData = proxy.HaveJson(productData.value);
- } else {
- proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
- return;
- }
- let tempFileIds = [];
- if (fileList.value.length > 0) {
- tempFileIds = fileList.value.map((item) => item.tempId);
- }
- form.value.tempFileIds = tempFileIds;
- form.value.type = 2;
- addOrEditPurchase(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 鎵撳紑浜у搧寮规
-const openProductForm = (type, row, index) => {
- productOperationType.value = type;
- productOperationIndex.value = index;
- productForm.value = {};
- proxy.resetForm("productFormRef");
- if (type === "edit") {
- productForm.value = { ...row };
- }
- productFormVisible.value = true;
- getProductOptions();
-};
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({ id: value }).then((res) => {
- modelOptions.value = res;
- });
-};
-const getProductModel = (value) => {
- const index = modelOptions.value.findIndex((item) => item.id === value);
- if (index !== -1) {
- productForm.value.specificationModel = modelOptions.value[index].model;
- productForm.value.unit = modelOptions.value[index].unit;
- } else {
- productForm.value.specificationModel = null;
- productForm.value.unit = null;
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitProduct = () => {
- proxy.$refs["productFormRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitProductEdit();
- } else {
- if (productOperationType.value === "add") {
- productData.value.push({ ...productForm.value });
- console.log("productData.value---", productData.value);
- } else {
- productData.value[productOperationIndex.value] = {
- ...productForm.value,
- };
- }
- closeProductDia();
- }
- }
- });
-};
-const submitProductEdit = () => {
- productForm.value.salesLedgerId = currentId.value;
- productForm.value.type = 2;
- addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProductDia();
- getPurchaseById({ id: currentId.value, type: 2 }).then((res) => {
- productData.value = res.productData;
- });
- });
-};
-// 鍒犻櫎浜у搧
-const deleteProduct = () => {
- if (productSelectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- if (operationType.value === "add") {
- productSelectedRows.value.forEach((selectedRow) => {
- const index = productData.value.findIndex(
- (product) => product.id === selectedRow.id
- );
- if (index !== -1) {
- productData.value.splice(index, 1);
- }
- });
- } else {
- let ids = [];
- if (productSelectedRows.value.length > 0) {
- ids = productSelectedRows.value.map((item) => item.id);
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delProduct(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
- (res) => {
- productData.value = res.productData;
- }
- );
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- }
-};
-// 鍏抽棴浜у搧寮规
-const closeProductDia = () => {
- proxy.resetForm("productFormRef");
- productFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.recorderName !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delPurchase(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-const mathNum = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (!productForm.value.taxInclusiveUnitPrice) {
- return;
- }
- if (!productForm.value.quantity) {
- return;
- }
- // 鍚◣鎬讳环璁$畻
- productForm.value.taxInclusiveTotalPrice =
- proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
- );
- if (productForm.value.taxRate) {
- // 涓嶅惈绋庢�讳环璁$畻
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-};
-const reverseMathNum = (field) => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- const taxRate = Number(productForm.value.taxRate);
- if (!taxRate) return;
- if (field === 'taxInclusiveTotalPrice') {
- // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
- if (productForm.value.quantity) {
- productForm.value.taxInclusiveUnitPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
- }
- // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
- else if (productForm.value.taxInclusiveUnitPrice) {
- productForm.value.quantity =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
- }
- // 鍙嶇畻涓嶅惈绋庢�讳环
- productForm.value.taxExclusiveTotalPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / (1 + taxRate / 100)).toFixed(2);
- } else if (field === 'taxExclusiveTotalPrice') {
- // 鍙嶇畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice =
- (Number(productForm.value.taxExclusiveTotalPrice) * (1 + taxRate / 100)).toFixed(2);
- // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
- if (productForm.value.quantity) {
- productForm.value.taxInclusiveUnitPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
- }
- // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
- else if (productForm.value.taxInclusiveUnitPrice) {
- productForm.value.quantity =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
- }
- }
-};
-// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-const salesLedgerChange = async (row) => {
- console.log("row", row);
- var index = salesContractList.value.findIndex((item) => item.id == row);
- console.log("index", index);
- if (index > -1) {
- form.value.projectName = salesContractList.value[index].projectName;
- await querygProductInfoByContractNo();
- }
-};
-
-const querygProductInfoByContractNo = async () => {
- const { code, data } = await getProductInfoByContractNo({
- contractNo: form.value.salesLedgerId,
- });
- if (code == 200) {
- productData.value = data;
- }
-};
-
-// 鏄剧ず浜岀淮鐮�
-const showQRCode = async (row) => {
- try {
- // 鏋勫缓浜岀淮鐮佸唴瀹癸紝鍙寘鍚噰璐悎鍚屽彿锛堢函鏂囨湰锛�
- const qrContent = row.purchaseContractNumber || '';
- // 妫�鏌ュ唴瀹规槸鍚︿负绌�
- if (!qrContent || qrContent.trim() === '') {
- proxy.$modal.msgWarning("璇ヨ娌℃湁閲囪喘鍚堝悓鍙凤紝鏃犳硶鐢熸垚浜岀淮鐮�");
- return;
- }
- qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
- width: 200,
- margin: 2,
- color: {
- dark: '#000000',
- light: '#FFFFFF'
- }
- });
- qrCodeDialogVisible.value = true;
- } catch (error) {
- console.error('鐢熸垚浜岀淮鐮佸け璐�:', error);
- proxy.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐ワ細" + error.message);
- }
-};
-
-// 涓嬭浇浜岀淮鐮�
-const downloadQRCode = () => {
- if (!qrCodeUrl.value) {
- proxy.$modal.msgWarning("浜岀淮鐮佹湭鐢熸垚");
- return;
- }
-
- const a = document.createElement('a');
- a.href = qrCodeUrl.value;
- a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${new Date().getTime()}.png`;
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-};
-
-// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanAddDialogVisible = ref(false);
-const scanAddForm = reactive({
- scanContent: "",
- purchaseContractNumber: "",
- supplierName: "",
- projectName: "",
- contractAmount: "",
- paymentMethod: "",
- recorderName: "",
- scanRemark: "",
-});
-const scanAddRules = {
- purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
- supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
- projectName: [{ required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" }],
-};
-
-// 鎵爜鐧昏瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanDialogVisible = ref(false);
-const scanForm = reactive({
- purchaseContractNumber: "",
- supplierName: "",
- projectName: "",
- scanTime: "",
- scannerName: "",
- scanStatus: "鏈壂鐮�",
- scanRemark: "",
-});
-const scanRules = {
- scanRemark: [{ required: true, message: "璇疯緭鍏ユ壂鐮佸娉�", trigger: "blur" }],
-};
-const scanRecords = ref([]);
-
-// 鎵撳紑鎵爜鏂板瀵硅瘽妗�
-const openScanAddDialog = () => {
- scanAddForm.scanContent = "";
- scanAddForm.purchaseContractNumber = "";
- scanAddForm.supplierName = "";
- scanAddForm.projectName = "";
- scanAddForm.contractAmount = "";
- scanAddForm.paymentMethod = "";
- scanAddForm.recorderName = userStore.nickName;
- scanAddForm.scanRemark = "";
- scanAddDialogVisible.value = true;
-};
-
-// 瑙f瀽鎵爜鍐呭锛堟ā鎷熻В鏋愪簩缁寸爜鏁版嵁锛�
-const parseScanContent = (content) => {
- if (!content) return;
-
- // 妯℃嫙瑙f瀽浜岀淮鐮佸唴瀹癸紝杩欓噷鍙互鏍规嵁瀹為檯闇�姹傝皟鏁磋В鏋愰�昏緫
- // 鍋囪鎵爜鍐呭鏍煎紡涓猴細鍚堝悓鍙穦渚涘簲鍟唡椤圭洰|閲戦|浠樻鏂瑰紡
- const parts = content.split('|');
- if (parts.length >= 3) {
- scanAddForm.purchaseContractNumber = parts[0] || "";
- scanAddForm.supplierName = parts[1] || "";
- scanAddForm.projectName = parts[2] || "";
- scanAddForm.contractAmount = parts[3] || "";
- scanAddForm.paymentMethod = parts[4] || "";
- }
-};
-
-// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
-const closeScanAddDialog = () => {
- scanAddDialogVisible.value = false;
- proxy.resetForm("scanAddFormRef");
-};
-
-// 鎻愪氦鎵爜鏂板
-const submitScanAdd = () => {
- proxy.$refs["scanAddFormRef"].validate((valid) => {
- if (valid) {
- // 鏋勫缓鏂板鏁版嵁
- const newData = {
- purchaseContractNumber: scanAddForm.purchaseContractNumber,
- supplierName: scanAddForm.supplierName,
- projectName: scanAddForm.projectName,
- contractAmount: scanAddForm.contractAmount,
- paymentMethod: scanAddForm.paymentMethod,
- recorderName: scanAddForm.recorderName,
- entryDate: getCurrentDate(),
- remark: scanAddForm.scanRemark,
- type: 2
- };
-
- // 妯℃嫙鏂板鎴愬姛
- proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
- closeScanAddDialog();
-
- // 鍙互閫夋嫨鏄惁鍒锋柊鍒楄〃
- // getList();
- }
- });
-};
-
-// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
-const openScanDialog = (row) => {
- scanForm.purchaseContractNumber = row.purchaseContractNumber;
- scanForm.supplierName = row.supplierName;
- scanForm.projectName = row.projectName;
- scanForm.scanTime = getCurrentDateTime();
- scanForm.scannerName = userStore.nickName;
- scanForm.scanStatus = "鏈壂鐮�";
- scanForm.scanRemark = "";
- scanRecords.value = [];
- scanDialogVisible.value = true;
-};
-
-// 鍏抽棴鎵爜鐧昏瀵硅瘽妗�
-const closeScanDialog = () => {
- scanDialogVisible.value = false;
- proxy.resetForm("scanFormRef");
-};
-
-// 鎻愪氦鎵爜鐧昏
-const submitScan = () => {
- proxy.$refs["scanFormRef"].validate((valid) => {
- if (valid) {
- // 娣诲姞鎵爜璁板綍
- scanRecords.value.push({
- ...scanForm,
- id: Date.now(), // 妯℃嫙ID
- scanTime: getCurrentDateTime(),
- });
- scanForm.scanStatus = "宸叉壂鐮�";
- scanForm.scanRemark = scanForm.scanRemark || "鏃�";
- proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
- closeScanDialog();
- }
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
-function getCurrentDateTime() {
- const now = new Date();
- const year = now.getFullYear();
- const month = String(now.getMonth() + 1).padStart(2, "0");
- const day = String(now.getDate()).padStart(2, "0");
- const hours = String(now.getHours()).padStart(2, "0");
- const minutes = String(now.getMinutes()).padStart(2, "0");
- const seconds = String(now.getSeconds()).padStart(2, "0");
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/purchaseOrder/index.vue b/src/views/procurementManagement/purchaseOrder/index.vue
deleted file mode 100644
index 79ca2fe..0000000
--- a/src/views/procurementManagement/purchaseOrder/index.vue
+++ /dev/null
@@ -1,188 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="search-card" shadow="never">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" clearable />
- </el-form-item>
- <el-form-item label="璁㈠崟鐘舵�侊細">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="鑽夌" value="draft" />
- <el-option label="寰呭鏍�" value="pending" />
- <el-option label="宸插鏍�" value="approved" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <el-card class="table-card" shadow="never">
- <div class="table-header">
- <el-button type="primary" @click="openDialog('add')">鏂板璁㈠崟</el-button>
- <el-button type="danger" @click="handleBatchDelete" :disabled="!selectedRows.length">鎵归噺鍒犻櫎</el-button>
- </div>
-
- <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="璁㈠崟缂栧彿" prop="orderNo" width="180" />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column label="璁㈠崟鐘舵��" prop="status" width="100">
- <template #default="{ row }">
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎬婚噾棰�" prop="totalAmount" width="120">
- <template #default="{ row }">楼{{ row.totalAmount.toFixed(2) }}</template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" prop="createTime" width="180" />
- <el-table-column label="鎿嶄綔" width="200" align="center">
- <template #default="{ row }">
- <el-button type="primary" size="small" @click="openDialog('edit', row)">缂栬緫</el-button>
- <el-button type="success" size="small" @click="viewDetails(row)">鏌ョ湅</el-button>
- <el-button type="danger" size="small" @click="handleDelete(row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閲囪喘璁㈠崟' : '缂栬緫閲囪喘璁㈠崟'" width="800px">
- <el-form :model="formData" ref="formRef" label-width="120px">
- <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-select v-model="formData.supplierName" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
- <el-option label="渚涘簲鍟咥" value="渚涘簲鍟咥" />
- <el-option label="渚涘簲鍟咮" value="渚涘簲鍟咮" />
- </el-select>
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-
-const searchForm = reactive({
- supplierName: '',
- status: ''
-})
-
-const formData = reactive({
- supplierName: '',
- remark: ''
-})
-
-const mockData = [
- {
- id: 1,
- orderNo: 'PO20241201001',
- supplierName: '渚涘簲鍟咥',
- status: 'approved',
- totalAmount: 12500.00,
- createTime: '2025-12-01 10:30:00',
- remark: '甯歌閲囪喘'
- }
-]
-
-const tableData = ref([...mockData])
-
-const getStatusType = (status) => {
- const statusMap = { draft: 'info', pending: 'warning', approved: 'success' }
- return statusMap[status] || 'info'
-}
-
-const getStatusText = (status) => {
- const statusMap = { draft: '鑽夌', pending: '寰呭鏍�', approved: '宸插鏍�' }
- return statusMap[status] || '鏈煡'
-}
-
-const handleSearch = () => {
- loading.value = true
- setTimeout(() => {
- loading.value = false
- }, 500)
-}
-
-const resetSearch = () => {
- Object.assign(searchForm, { supplierName: '', status: '' })
-}
-
-const openDialog = (type, row = {}) => {
- dialogType.value = type
- if (type === 'edit' && row.id) {
- Object.assign(formData, { supplierName: row.supplierName, remark: row.remark })
- } else {
- Object.assign(formData, { supplierName: '', remark: '' })
- }
- dialogVisible.value = true
-}
-
-const handleSubmit = () => {
- if (dialogType.value === 'add') {
- const newOrder = {
- id: Date.now(),
- orderNo: `PO${Date.now()}`,
- supplierName: formData.supplierName,
- status: 'draft',
- totalAmount: 0,
- createTime: new Date().toLocaleString(),
- remark: formData.remark
- }
- tableData.value.unshift(newOrder)
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
-}
-
-const viewDetails = (row) => {
- ElMessage.info('鏌ョ湅璇︽儏鍔熻兘')
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = tableData.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleBatchDelete = () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑璁板綍')
- return
- }
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
-}
-
-const handleSelectionChange = (rows) => {
- selectedRows.value = rows
-}
-</script>
-
-<style scoped>
-.app-container { padding: 20px; }
-.search-card { margin-bottom: 20px; }
-.table-card { margin-bottom: 20px; }
-.table-header { margin-bottom: 20px; }
-</style>
diff --git a/src/views/procurementManagement/qualityInspection/index.vue b/src/views/procurementManagement/qualityInspection/index.vue
deleted file mode 100644
index fd25ccf..0000000
--- a/src/views/procurementManagement/qualityInspection/index.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="search-card" shadow="never">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="璐ㄦ鍗曞彿锛�" style="width: 300px;">
- <el-input v-model="searchForm.inspectionNo" placeholder="璇疯緭鍏ヨ川妫�鍗曞彿" clearable />
- </el-form-item>
- <el-form-item label="璐ㄦ鐘舵�侊細" style="width: 300px;">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="寰呰川妫�" value="pending" />
- <el-option label="璐ㄦ涓�" value="inspecting" />
- <el-option label="宸插畬鎴�" value="completed" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <el-card class="table-card" shadow="never">
- <div class="table-header">
- <el-button type="primary" @click="openDialog('add')">鏂板璐ㄦ鍗�</el-button>
- <el-button type="success" @click="handleBatchComplete">鎵归噺瀹屾垚</el-button>
- <el-button type="danger" @click="handleBatchDelete">鎵归噺鍒犻櫎</el-button>
- </div>
-
- <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="璐ㄦ鍗曞彿" prop="inspectionNo" width="180" />
- <el-table-column label="鍒拌揣鍗曞彿" prop="arrivalNo" width="180" />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column label="璐ㄦ鐘舵��" prop="status" width="100">
- <template #default="{ row }">
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鍚堟牸鏁伴噺" prop="qualifiedQuantity" width="100" />
- <el-table-column label="涓嶅悎鏍兼暟閲�" prop="unqualifiedQuantity" width="100" />
- <el-table-column label="璐ㄦ鏃堕棿" prop="inspectionTime" width="180" />
- <el-table-column label="鎿嶄綔" width="200" align="center">
- <template #default="{ row }">
- <el-button type="primary" link @click="openDialog('edit', row)">缂栬緫</el-button>
- <el-button type="success" link @click="handleComplete(row)" v-if="row.status !== 'completed'">瀹屾垚</el-button>
- <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板璐ㄦ鍗�' : '缂栬緫璐ㄦ鍗�'" width="1000px">
- <el-form :model="formData" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍒拌揣鍗曞彿">
- <el-select v-model="formData.arrivalNo" placeholder="璇烽�夋嫨鍒拌揣鍗�" style="width: 100%">
- <el-option label="AR20241201001" value="AR20241201001" />
- <el-option label="AR20241201002" value="AR20241201002" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input v-model="formData.supplierName" placeholder="渚涘簲鍟嗗悕绉�" readonly />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-form-item label="璐ㄦ鍟嗗搧">
- <div class="product-list" style="width: 100%;">
- <el-table :data="formData.products" border width="100%">
- <el-table-column label="鍟嗗搧鍚嶇О" width="150">
- <template #default="{ row }">
- <el-input v-model="row.productName" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�" />
- </template>
- </el-table-column>
- <el-table-column label="瑙勬牸鍨嬪彿" width="150">
- <template #default="{ row }">
- <el-input v-model="row.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </template>
- </el-table-column>
- <el-table-column label="鍒拌揣鏁伴噺" width="150">
- <template #default="{ row }">
- <el-input-number v-model="row.arrivalQuantity" :min="0" placeholder="鏁伴噺" style="width: 100%;"/>
- </template>
- </el-table-column>
- <el-table-column label="鍚堟牸鏁伴噺" width="150">
- <template #default="{ row }">
- <el-input-number v-model="row.qualifiedQuantity" :min="0" placeholder="鏁伴噺" style="width: 100%;"/>
- </template>
- </el-table-column>
- <el-table-column label="涓嶅悎鏍兼暟閲�" width="150">
- <template #default="{ row }">
- <el-input-number v-model="row.unqualifiedQuantity" :min="0" placeholder="鏁伴噺" style="width: 100%;"/>
- </template>
- </el-table-column>
- <el-table-column label="涓嶅悎鏍煎師鍥�" width="200">
- <template #default="{ row }">
- <el-input v-model="row.unqualifiedReason" placeholder="璇疯緭鍏ヤ笉鍚堟牸鍘熷洜" />
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="100">
- <template #default="{ $index }">
- <el-button type="danger" link @click="removeProduct($index)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <div class="add-product-btn">
- <el-button type="primary" @click="addProduct">娣诲姞鍟嗗搧</el-button>
- </div>
- </div>
- </el-form-item>
-
- <el-form-item label="璐ㄦ鍛�">
- <el-input v-model="formData.inspector" placeholder="璇疯緭鍏ヨ川妫�鍛樺鍚�" />
- </el-form-item>
-
- <el-form-item label="澶囨敞">
- <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-
-const searchForm = reactive({
- inspectionNo: '',
- status: ''
-})
-
-const formData = reactive({
- arrivalNo: '',
- supplierName: '',
- products: [],
- inspector: '',
- remark: ''
-})
-
-const mockData = [
- {
- id: 1,
- inspectionNo: 'QI20241201001',
- arrivalNo: 'AR20241201001',
- supplierName: '渚涘簲鍟咥',
- status: 'completed',
- qualifiedQuantity: 240,
- unqualifiedQuantity: 10,
- inspectionTime: '2025-12-01 16:30:00',
- inspector: '闄堝織寮�',
- remark: '璐ㄦ瀹屾垚'
- }
-]
-
-const tableData = ref([...mockData])
-
-const getStatusType = (status) => {
- const statusMap = { pending: 'info', inspecting: 'warning', completed: 'success' }
- return statusMap[status] || 'info'
-}
-
-const getStatusText = (status) => {
- const statusMap = { pending: '寰呰川妫�', inspecting: '璐ㄦ涓�', completed: '宸插畬鎴�' }
- return statusMap[status] || '鏈煡'
-}
-
-const handleSearch = () => {
- loading.value = true
- setTimeout(() => { loading.value = false }, 500)
-}
-
-const resetSearch = () => {
- Object.assign(searchForm, { inspectionNo: '', status: '' })
-}
-
-const openDialog = (type, row = {}) => {
- dialogType.value = type
- if (type === 'edit' && row.id) {
- Object.assign(formData, {
- arrivalNo: row.arrivalNo,
- supplierName: row.supplierName,
- inspector: row.inspector,
- remark: row.remark
- })
- } else {
- Object.assign(formData, {
- arrivalNo: '',
- supplierName: '',
- products: [],
- inspector: '',
- remark: ''
- })
- }
- dialogVisible.value = true
-}
-
-const handleSubmit = () => {
- if (dialogType.value === 'add') {
- const newInspection = {
- id: Date.now(),
- inspectionNo: `QI${Date.now()}`,
- arrivalNo: formData.arrivalNo,
- supplierName: formData.supplierName,
- status: 'pending',
- qualifiedQuantity: 0,
- unqualifiedQuantity: 0,
- inspectionTime: new Date().toLocaleString(),
- inspector: formData.inspector,
- remark: formData.remark
- }
- tableData.value.unshift(newInspection)
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
-}
-
-const handleComplete = (row) => {
- row.status = 'completed'
- ElMessage.success('璐ㄦ瀹屾垚')
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = tableData.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleBatchComplete = () => {
- ElMessage.success('鎵归噺瀹屾垚鎴愬姛')
-}
-
-const handleBatchDelete = () => {
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
-}
-
-const handleSelectionChange = (rows) => {
- selectedRows.value = rows
-}
-
-const addProduct = () => {
- formData.products.push({
- productName: '',
- specification: '',
- arrivalQuantity: 0,
- qualifiedQuantity: 0,
- unqualifiedQuantity: 0,
- unqualifiedReason: ''
- })
-}
-
-const removeProduct = (index) => {
- formData.products.splice(index, 1)
-}
-</script>
-
-<style scoped>
-.app-container { padding: 20px; }
-.search-card { margin-bottom: 20px; }
-.table-card { margin-bottom: 20px; }
-.table-header { margin-bottom: 20px; }
-.product-list { border: 1px solid #dcdfe6; border-radius: 4px; padding: 15px; }
-.product-item { margin-bottom: 15px; padding: 10px; background-color: #f5f7fa; border-radius: 4px; }
-.add-product-btn { margin-top: 15px; text-align: center; }
-</style>
diff --git a/src/views/procurementManagement/returnManagement/index.vue b/src/views/procurementManagement/returnManagement/index.vue
deleted file mode 100644
index d86e524..0000000
--- a/src/views/procurementManagement/returnManagement/index.vue
+++ /dev/null
@@ -1,234 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="search-card" shadow="never">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="閫�璐у崟鍙凤細" style="width: 300px;">
- <el-input v-model="searchForm.returnNo" placeholder="璇疯緭鍏ラ��璐у崟鍙�" clearable />
- </el-form-item>
- <el-form-item label="閫�璐х被鍨嬶細" style="width: 300px;">
- <el-select v-model="searchForm.returnType" placeholder="璇烽�夋嫨绫诲瀷" clearable>
- <el-option label="閲囪喘閫�璐�" value="purchase" />
- <el-option label="璐ㄦ閫�璐�" value="quality" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <el-card class="table-card" shadow="never">
- <div class="table-header">
- <el-button type="primary" @click="openDialog('add')">鏂板閫�璐у崟</el-button>
- <el-button type="success" @click="handleBatchApprove">鎵归噺瀹℃牳</el-button>
- <el-button type="danger" @click="handleBatchDelete">鎵归噺鍒犻櫎</el-button>
- </div>
-
- <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="閫�璐у崟鍙�" prop="returnNo" width="180" />
- <el-table-column label="鍏宠仈鍗曞彿" prop="relatedNo" width="180" />
- <el-table-column label="閫�璐х被鍨�" prop="returnType" width="100">
- <template #default="{ row }">
- <el-tag :type="row.returnType === 'purchase' ? 'danger' : 'warning'">
- {{ getReturnTypeText(row.returnType) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column label="閫�璐х姸鎬�" prop="status" width="100">
- <template #default="{ row }">
- <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="閫�璐ч噾棰�" prop="returnAmount" width="120">
- <template #default="{ row }">楼{{ row.returnAmount.toFixed(2) }}</template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" prop="createTime" width="180" />
- <el-table-column label="鎿嶄綔" width="200" align="center">
- <template #default="{ row }">
- <el-button type="primary" link @click="openDialog('edit', row)">缂栬緫</el-button>
- <el-button type="success" link @click="handleApprove(row)" v-if="row.status === 'pending'">瀹℃牳</el-button>
- <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閫�璐у崟' : '缂栬緫閫�璐у崟'" width="600px">
- <el-form :model="formData" label-width="120px">
- <el-form-item label="閫�璐х被鍨�">
- <el-select v-model="formData.returnType" placeholder="璇烽�夋嫨閫�璐х被鍨�" style="width: 100%">
- <el-option label="閲囪喘閫�璐�" value="purchase" />
- <el-option label="璐ㄦ閫�璐�" value="quality" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍏宠仈鍗曞彿">
- <el-input v-model="formData.relatedNo" placeholder="璇疯緭鍏ュ叧鑱斿崟鍙�" />
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input v-model="formData.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" />
- </el-form-item>
- <el-form-item label="閫�璐у師鍥�">
- <el-select v-model="formData.returnReason" placeholder="璇烽�夋嫨閫�璐у師鍥�" style="width: 100%">
- <el-option label="璐ㄩ噺闂" value="quality" />
- <el-option label="瑙勬牸涓嶇" value="specification" />
- <el-option label="鏁伴噺閿欒" value="quantity" />
- </el-select>
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSubmit">纭畾</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-const loading = ref(false)
-const dialogVisible = ref(false)
-const dialogType = ref('add')
-const selectedRows = ref([])
-
-const searchForm = reactive({
- returnNo: '',
- returnType: ''
-})
-
-const formData = reactive({
- returnType: '',
- relatedNo: '',
- supplierName: '',
- returnReason: '',
- remark: ''
-})
-
-const mockData = [
- {
- id: 1,
- returnNo: 'RT20241201001',
- relatedNo: 'PO20241201001',
- returnType: 'purchase',
- supplierName: '渚涘簲鍟咥',
- status: 'approved',
- returnAmount: 500.00,
- createTime: '2025-12-01 17:30:00',
- returnReason: '璐ㄩ噺闂',
- remark: '鍟嗗搧瀛樺湪璐ㄩ噺闂'
- }
-]
-
-const tableData = ref([...mockData])
-
-const getReturnTypeText = (type) => {
- const typeMap = { purchase: '閲囪喘閫�璐�', quality: '璐ㄦ閫�璐�' }
- return typeMap[type] || '鏈煡'
-}
-
-const getStatusType = (status) => {
- const statusMap = { pending: 'warning', approved: 'success', returned: 'info' }
- return statusMap[status] || 'info'
-}
-
-const getStatusText = (status) => {
- const statusMap = { pending: '寰呭鏍�', approved: '宸插鏍�', returned: '宸查��璐�' }
- return statusMap[status] || '鏈煡'
-}
-
-const handleSearch = () => {
- loading.value = true
- setTimeout(() => { loading.value = false }, 500)
-}
-
-const resetSearch = () => {
- Object.assign(searchForm, { returnNo: '', returnType: '' })
-}
-
-const openDialog = (type, row = {}) => {
- dialogType.value = type
- if (type === 'edit' && row.id) {
- Object.assign(formData, {
- returnType: row.returnType,
- relatedNo: row.relatedNo,
- supplierName: row.supplierName,
- returnReason: row.returnReason,
- remark: row.remark
- })
- } else {
- Object.assign(formData, {
- returnType: '',
- relatedNo: '',
- supplierName: '',
- returnReason: '',
- remark: ''
- })
- }
- dialogVisible.value = true
-}
-
-const handleSubmit = () => {
- if (dialogType.value === 'add') {
- const newReturn = {
- id: Date.now(),
- returnNo: `RT${Date.now()}`,
- relatedNo: formData.relatedNo,
- returnType: formData.returnType,
- supplierName: formData.supplierName,
- status: 'pending',
- returnAmount: 0,
- createTime: new Date().toLocaleString(),
- returnReason: formData.returnReason,
- remark: formData.remark
- }
- tableData.value.unshift(newReturn)
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
-}
-
-const handleApprove = (row) => {
- row.status = 'approved'
- ElMessage.success('瀹℃牳閫氳繃')
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = tableData.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- tableData.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleBatchApprove = () => {
- ElMessage.success('鎵归噺瀹℃牳鎴愬姛')
-}
-
-const handleBatchDelete = () => {
- ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
-}
-
-const handleSelectionChange = (rows) => {
- selectedRows.value = rows
-}
-</script>
-
-<style scoped>
-.app-container { padding: 20px; }
-.search-card { margin-bottom: 20px; }
-.table-card { margin-bottom: 20px; }
-.table-header { margin-bottom: 20px; }
-</style>
diff --git a/src/views/procurementManagement/thePaymentLedger/index.vue b/src/views/procurementManagement/thePaymentLedger/index.vue
deleted file mode 100644
index 5fa9e6f..0000000
--- a/src/views/procurementManagement/thePaymentLedger/index.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉�/鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.supplierNameOrContractNo"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="total"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { registrationList } from "@/api/procurementManagement/paymentEntry.js";
-const tableColumn = ref([
- {
- label: "浠樻鏃ユ湡",
- prop: "paymentDate",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- },
- {
- label: "浠樻閲戦",
- prop: "currentPaymentAmount",
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "registrationtDate",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const purchaseLedgerList = ref([]);
-const invoiceNumberList = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
-});
-const total = ref(0);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = ({ current, limit }) => {
- page.current = current;
- page.size = limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- registrationList({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.rows;
- total.value = res.total;
- });
-};
-getList();
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productManagement/productIdentifier/index.vue b/src/views/productManagement/productIdentifier/index.vue
deleted file mode 100644
index 59d8f90..0000000
--- a/src/views/productManagement/productIdentifier/index.vue
+++ /dev/null
@@ -1,708 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.productName"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
- clearable
- @keyup.enter="handleSearch"
- >
- <template #prefix>
- <el-icon><Search /></el-icon>
- </template>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.identifierType" placeholder="璇烽�夋嫨鏍囪瘑绫诲瀷" clearable>
- <el-option label="浜岀淮鐮�" value="浜岀淮鐮�"></el-option>
- <el-option label="闃蹭吉鐮�" value="闃蹭吉鐮�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="宸茬敓鎴�" value="宸茬敓鎴�"></el-option>
- <el-option label="宸插垎閰�" value="宸插垎閰�"></el-option>
- <el-option label="宸蹭娇鐢�" value="宸蹭娇鐢�"></el-option>
- <el-option label="宸蹭綔搴�" value="宸蹭綔搴�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button style="float: right;" type="primary" @click="handleAdd">
- 鏂板鏍囪瘑
- </el-button>
- </el-col>
- </el-row>
-
- <!-- 浜у搧鏍囪瘑鍒楄〃 -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="productName" label="浜у搧鍚嶇О" width="150" />
- <el-table-column prop="productCode" label="浜у搧缂栫爜" width="120" />
- <el-table-column prop="batchNo" label="鎵规鍙�" width="120" />
- <el-table-column prop="identifierType" label="鏍囪瘑绫诲瀷" width="100">
- <template #default="scope">
- <el-tag :type="getIdentifierTypeType(scope.row.identifierType)">
- {{ scope.row.identifierType }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="identifierCode" label="鏍囪瘑鐮�" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="generateTime" label="鐢熸垚鏃堕棿" width="160" />
- <el-table-column label="鎿嶄綔" fixed="right" align="center" width="280">
- <template #default="scope">
- <el-button link type="primary" @click="handleView(scope.row)">鏌ョ湅</el-button>
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="success" @click="generateQRCode(scope.row)">鐢熸垚浜岀淮鐮�</el-button>
- <el-button link type="primary" @click="handleExport(scope.row)">瀵煎嚭</el-button>
- <el-button link type="primary" @click="handleReassign(scope.row)" v-if="scope.row.status === '宸插垎閰�'">閲嶆柊鍒嗛厤</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О" prop="productName">
- <el-input v-model="form.productName" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧缂栫爜" prop="productCode">
- <el-input v-model="form.productCode" placeholder="璇疯緭鍏ヤ骇鍝佺紪鐮�"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鎵规鍙�" prop="batchNo">
- <el-input v-model="form.batchNo" placeholder="璇疯緭鍏ユ壒娆″彿"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏍囪瘑绫诲瀷" prop="identifierType">
- <el-select v-model="form.identifierType" placeholder="璇烽�夋嫨鏍囪瘑绫诲瀷" style="width: 100%">
- <el-option label="浜岀淮鐮�" value="浜岀淮鐮�"></el-option>
- <el-option label="闃蹭吉鐮�" value="闃蹭吉鐮�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鐢熸垚鏁伴噺" prop="quantity">
- <el-input-number v-model="form.quantity" :min="1" :max="10000" style="width: 100%"></el-input-number>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="宸茬敓鎴�" value="宸茬敓鎴�"></el-option>
- <el-option label="宸插垎閰�" value="宸插垎閰�"></el-option>
- <el-option label="宸蹭娇鐢�" value="宸蹭娇鐢�"></el-option>
- <el-option label="宸蹭綔搴�" value="宸蹭綔搴�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" rows="3"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鏍囪瘑鐢熸垚瀵硅瘽妗� -->
- <el-dialog v-model="generateDialogVisible" title="鏍囪瘑鐢熸垚" width="500px">
- <el-form label-width="100px">
- <el-form-item label="浜у搧鍚嶇О">
- <span>{{ currentProduct.productName }}</span>
- </el-form-item>
- <el-form-item label="浜у搧缂栫爜">
- <span>{{ currentProduct.productCode }}</span>
- </el-form-item>
- <el-form-item label="鎵规鍙�">
- <span>{{ currentProduct.batchNo }}</span>
- </el-form-item>
- <el-form-item label="鏍囪瘑绫诲瀷">
- <span>{{ currentProduct.identifierType }}</span>
- </el-form-item>
- <el-form-item label="鐢熸垚鏁伴噺" prop="generateQuantity">
- <el-input-number v-model="generateQuantity" :min="1" :max="10000" style="width: 100%"></el-input-number>
- </el-form-item>
- <el-form-item label="缂栫爜瑙勫垯" prop="codeRule">
- <el-select v-model="codeRule" placeholder="璇烽�夋嫨缂栫爜瑙勫垯" style="width: 100%">
- <el-option label="浜у搧缂栫爜+鎵规鍙�+搴忓彿" value="浜у搧缂栫爜+鎵规鍙�+搴忓彿"></el-option>
- <el-option label="鏃堕棿鎴�+闅忔満鏁�" value="鏃堕棿鎴�+闅忔満鏁�"></el-option>
- <el-option label="鑷畾涔夎鍒�" value="鑷畾涔夎鍒�"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="鑷畾涔夊墠缂�" prop="customPrefix" v-if="codeRule === '鑷畾涔夎鍒�'">
- <el-input v-model="customPrefix" placeholder="璇疯緭鍏ヨ嚜瀹氫箟鍓嶇紑"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="generateDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="generateIdentifiers">鐢� 鎴�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 閲嶆柊鍒嗛厤瀵硅瘽妗� -->
- <el-dialog v-model="reassignDialogVisible" title="閲嶆柊鍒嗛厤鏍囪瘑" width="500px">
- <el-form label-width="100px">
- <el-form-item label="浜у搧鍚嶇О">
- <span>{{ currentProduct.productName }}</span>
- </el-form-item>
- <el-form-item label="鏍囪瘑鐮�">
- <span>{{ currentProduct.identifierCode }}</span>
- </el-form-item>
- <el-form-item label="鏂版壒娆″彿" prop="newBatchNo">
- <el-input v-model="newBatchNo" placeholder="璇疯緭鍏ユ柊鎵规鍙�"></el-input>
- </el-form-item>
- <el-form-item label="鍒嗛厤鍘熷洜" prop="reassignReason">
- <el-input type="textarea" v-model="reassignReason" rows="3" placeholder="璇疯緭鍏ラ噸鏂板垎閰嶅師鍥�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="reassignDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="saveReassign">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 浜岀淮鐮侀瑙堝璇濇 -->
- <el-dialog v-model="qrCodeDialogVisible" title="浜岀淮鐮侀瑙�" width="500px" center>
- <div class="qr-preview-container">
- <div v-if="qrCodeUrl" class="qr-image-container">
- <img :src="qrCodeUrl" alt="浜岀淮鐮�" class="qr-image" />
- <div class="qr-info">
- <p><strong>浜у搧鍚嶇О锛�</strong>{{ currentQRProduct.productName }}</p>
- <p><strong>浜у搧缂栫爜锛�</strong>{{ currentQRProduct.productCode }}</p>
- <p><strong>鎵规鍙凤細</strong>{{ currentQRProduct.batchNo }}</p>
- <p><strong>鏍囪瘑鐮侊細</strong>{{ currentQRProduct.identifierCode }}</p>
- <p><strong>鏍囪瘑绫诲瀷锛�</strong>{{ currentQRProduct.identifierType }}</p>
- </div>
- </div>
- <div v-else class="qr-loading">
- <el-icon class="is-loading"><Loading /></el-icon>
- <p>姝e湪鐢熸垚浜岀淮鐮�...</p>
- </div>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="qrCodeDialogVisible = false">鍏抽棴</el-button>
- <el-button
- v-if="qrCodeUrl"
- type="primary"
- @click="copyQRContent"
- icon="CopyDocument"
- >
- 澶嶅埗鍐呭
- </el-button>
- <el-button
- v-if="qrCodeUrl"
- type="success"
- @click="downloadQRCode"
- icon="Download"
- >
- 涓嬭浇浜岀淮鐮�
- </el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search, Loading, Download } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
-import QRCode from 'qrcode'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- productName: '',
- identifierType: '',
- status: ''
-})
-
-const identifierList = ref([
- {
- id: 1,
- productName: '宸ヤ笟浼犳劅鍣ˋ鍨�',
- productCode: 'SENSOR001',
- batchNo: 'B202312001',
- identifierType: '浜岀淮鐮�',
- identifierCode: 'QR_SENSOR001_B202312001_001',
- status: '宸插垎閰�',
- generateTime: '2023-12-01 10:00:00',
- remark: '閲嶈浜у搧鏍囪瘑'
- },
- {
- id: 2,
- productName: '鎺у埗闈㈡澘B鍨�',
- productCode: 'PANEL002',
- batchNo: 'B202312002',
- identifierType: '闃蹭吉鐮�',
- identifierCode: 'SEC_PANEL002_B202312002_001',
- status: '宸茬敓鎴�',
- generateTime: '2023-12-02 14:30:00',
- remark: '甯歌浜у搧鏍囪瘑'
- },
- {
- id: 3,
- productName: '鏁版嵁閲囬泦鍣–鍨�',
- productCode: 'COLLECTOR003',
- batchNo: 'B202312003',
- identifierType: '闃蹭吉鐮�',
- identifierCode: 'SEC_COLLECTOR003_B202312003_001',
- status: '宸蹭娇鐢�',
- generateTime: '2023-12-03 09:15:00',
- remark: '娴嬭瘯浜у搧鏍囪瘑'
- }
-])
-
-const pagination = reactive({
- total: 3,
- currentPage: 1,
- pageSize: 10
-})
-
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板鏍囪瘑')
-const form = reactive({
- productName: '',
- productCode: '',
- batchNo: '',
- identifierType: '',
- quantity: 1,
- status: '宸茬敓鎴�',
- remark: ''
-})
-
-const rules = {
- productName: [{ required: true, message: '璇疯緭鍏ヤ骇鍝佸悕绉�', trigger: 'blur' }],
- productCode: [{ required: true, message: '璇疯緭鍏ヤ骇鍝佺紪鐮�', trigger: 'blur' }],
- batchNo: [{ required: true, message: '璇疯緭鍏ユ壒娆″彿', trigger: 'blur' }],
- identifierType: [{ required: true, message: '璇烽�夋嫨鏍囪瘑绫诲瀷', trigger: 'change' }],
- quantity: [{ required: true, message: '璇疯緭鍏ョ敓鎴愭暟閲�', trigger: 'blur' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const generateDialogVisible = ref(false)
-const reassignDialogVisible = ref(false)
-const currentProduct = ref({})
-const generateQuantity = ref(1)
-const codeRule = ref('')
-const customPrefix = ref('')
-const newBatchNo = ref('')
-const reassignReason = ref('')
-const formRef = ref()
-
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false)
-const qrCodeUrl = ref('')
-const currentQRProduct = ref({})
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = identifierList.value
- if (searchForm.productName) {
- list = list.filter(item => item.productName.includes(searchForm.productName))
- }
- if (searchForm.identifierType) {
- list = list.filter(item => item.identifierType === searchForm.identifierType)
- }
- if (searchForm.status) {
- list = list.filter(item => item.status === searchForm.status)
- }
- return list
-})
-
-// 鏂规硶
-const getIdentifierTypeType = (type) => {
- const typeMap = {
- '浜岀淮鐮�': 'success',
- '闃蹭吉鐮�': 'warning'
- }
- return typeMap[type] || 'info'
-}
-
-const getStatusType = (status) => {
- const statusMap = {
- '宸茬敓鎴�': 'info',
- '宸插垎閰�': 'primary',
- '宸蹭娇鐢�': 'success',
- '宸蹭綔搴�': 'danger'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.productName = ''
- searchForm.identifierType = ''
- searchForm.status = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板鏍囪瘑'
- isEdit.value = false
- form.productName = ''
- form.productCode = ''
- form.batchNo = ''
- form.identifierType = ''
- form.quantity = 1
- form.status = '宸茬敓鎴�'
- form.remark = ''
- dialogVisible.value = true
-}
-
-const handleView = (row) => {
- // 鏌ョ湅鏍囪瘑璇︽儏
- ElMessage.info('鏌ョ湅鏍囪瘑璇︽儏鍔熻兘寰呭疄鐜�')
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫鏍囪瘑'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleExport = (row) => {
- // 瀵煎嚭鏍囪瘑
- ElMessage.success(`宸插鍑烘爣璇�: ${row.identifierCode}`)
-}
-
-const handleReassign = (row) => {
- currentProduct.value = row
- newBatchNo.value = ''
- reassignReason.value = ''
- reassignDialogVisible.value = true
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ユ爣璇嗗悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = identifierList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- identifierList.value.splice(index, 1)
- pagination.total--
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-// 鐢熸垚浜岀淮鐮�
-const generateQRCode = async (row) => {
- try {
- // 妫�鏌ュ繀瑕佸瓧娈�
- if (!row.productName || !row.productCode || !row.batchNo) {
- ElMessage.warning('浜у搧淇℃伅涓嶅畬鏁达紝鏃犳硶鐢熸垚浜岀淮鐮�')
- return
- }
-
- currentQRProduct.value = row
- qrCodeUrl.value = ''
- qrCodeDialogVisible.value = true
-
- // 鏋勫缓浜岀淮鐮佸唴瀹�
- let qrContent = ''
- if (row.identifierType === '浜岀淮鐮�') {
- qrContent = `${row.productName}|${row.productCode}|${row.batchNo}|${row.identifierCode}`
- } else if (row.identifierType === '闃蹭吉鐮�') {
- // 闃蹭吉鐮佹牸寮忥細SEC_浜у搧缂栫爜_鎵规鍙穇鏃堕棿鎴砡闅忔満鏁�
- const timestamp = Date.now()
- const random = Math.random().toString(36).substr(2, 8)
- qrContent = `SEC_${row.productCode}_${row.batchNo}_${timestamp}_${random}`
- }
-
- // 鐢熸垚浜岀淮鐮�
- qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
- width: 256,
- margin: 2,
- color: {
- dark: '#000000',
- light: '#FFFFFF'
- },
- errorCorrectionLevel: row.identifierType === '闃蹭吉鐮�' ? 'H' : 'M'
- })
-
- ElMessage.success('浜岀淮鐮佺敓鎴愭垚鍔燂紒')
-
- } catch (error) {
- console.error('鐢熸垚浜岀淮鐮佸け璐�:', error)
- ElMessage.error('鐢熸垚浜岀淮鐮佸け璐ワ細' + error.message)
- qrCodeDialogVisible.value = false
- }
-}
-
-// 涓嬭浇浜岀淮鐮�
-const downloadQRCode = () => {
- if (!qrCodeUrl.value) {
- ElMessage.warning('璇峰厛鐢熸垚浜岀淮鐮�')
- return
- }
-
- const a = document.createElement('a')
- a.href = qrCodeUrl.value
- a.download = `${currentQRProduct.value.productName}_${currentQRProduct.value.identifierType}_${new Date().getTime()}.png`
- document.body.appendChild(a)
- a.click()
- document.body.removeChild(a)
- ElMessage.success('涓嬭浇鎴愬姛锛�')
-}
-
-// 澶嶅埗浜岀淮鐮佸唴瀹�
-const copyQRContent = async () => {
- if (!currentQRProduct.value) {
- ElMessage.warning('娌℃湁鍙鍒剁殑鍐呭')
- return
- }
-
- try {
- let content = ''
- if (currentQRProduct.value.identifierType === '浜岀淮鐮�') {
- content = `${currentQRProduct.value.productName}|${currentQRProduct.value.productCode}|${currentQRProduct.value.batchNo}|${currentQRProduct.value.identifierCode}`
- } else if (currentQRProduct.value.identifierType === '闃蹭吉鐮�') {
- const timestamp = Date.now()
- const random = Math.random().toString(36).substr(2, 8)
- content = `SEC_${currentQRProduct.value.productCode}_${currentQRProduct.value.batchNo}_${timestamp}_${random}`
- }
-
- await navigator.clipboard.writeText(content)
- ElMessage.success('鍐呭宸插鍒跺埌鍓创鏉�')
- } catch (error) {
- // 闄嶇骇鏂规
- const textArea = document.createElement('textarea')
- textArea.value = content
- document.body.appendChild(textArea)
- textArea.select()
- document.execCommand('copy')
- document.body.removeChild(textArea)
- ElMessage.success('鍐呭宸插鍒跺埌鍓创鏉�')
- }
-}
-
-const generateIdentifiers = () => {
- if (!codeRule.value) {
- ElMessage.warning('璇烽�夋嫨缂栫爜瑙勫垯')
- return
- }
-
- // 鐢熸垚鏍囪瘑鐨勯�昏緫
- const newIdentifiers = []
- for (let i = 1; i <= generateQuantity.value; i++) {
- let identifierCode = ''
- if (codeRule.value === '浜у搧缂栫爜+鎵规鍙�+搴忓彿') {
- identifierCode = `${currentProduct.value.productCode}_${currentProduct.value.batchNo}_${String(i).padStart(3, '0')}`
- } else if (codeRule.value === '鏃堕棿鎴�+闅忔満鏁�') {
- identifierCode = `TS_${Date.now()}_${Math.floor(Math.random() * 1000)}`
- } else if (codeRule.value === '鑷畾涔夎鍒�') {
- identifierCode = `${customPrefix.value || 'CUSTOM'}_${Date.now()}_${i}`
- }
-
- newIdentifiers.push({
- id: Math.max(...identifierList.value.map(item => item.id)) + i,
- productName: currentProduct.value.productName,
- productCode: currentProduct.value.productCode,
- batchNo: currentProduct.value.batchNo,
- identifierType: currentProduct.value.identifierType,
- identifierCode: identifierCode,
- status: '宸茬敓鎴�',
- generateTime: new Date().toLocaleString(),
- remark: '鎵归噺鐢熸垚'
- })
- }
-
- identifierList.value.push(...newIdentifiers)
- pagination.total += newIdentifiers.length
- ElMessage.success(`鎴愬姛鐢熸垚 ${newIdentifiers.length} 涓爣璇哷)
- generateDialogVisible.value = false
-}
-
-const saveReassign = () => {
- if (!newBatchNo.value) {
- ElMessage.warning('璇疯緭鍏ユ柊鎵规鍙�')
- return
- }
-
- const index = identifierList.value.findIndex(item => item.id === currentProduct.value.id)
- if (index > -1) {
- identifierList.value[index].batchNo = newBatchNo.value
- identifierList.value[index].status = '宸插垎閰�'
- ElMessage.success('鏍囪瘑閲嶆柊鍒嗛厤鎴愬姛')
- reassignDialogVisible.value = false
- }
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- const index = identifierList.value.findIndex(item => item.id === editId.value)
- if (index > -1) {
- identifierList.value[index] = { ...form, id: editId.value }
- ElMessage.success('缂栬緫鎴愬姛')
- }
- } else {
- // 鏂板
- const newId = Math.max(...identifierList.value.map(item => item.id)) + 1
-
- // 鏍规嵁鏍囪瘑绫诲瀷鐢熸垚涓嶅悓鐨勬爣璇嗙爜
- let identifierCode = ''
- if (form.identifierType === '浜岀淮鐮�') {
- identifierCode = `QR_${form.productCode}_${form.batchNo}_001`
- } else if (form.identifierType === '闃蹭吉鐮�') {
- identifierCode = `SEC_${form.productCode}_${form.batchNo}_001`
- }
-
- identifierList.value.push({
- ...form,
- id: newId,
- identifierCode: identifierCode,
- generateTime: new Date().toLocaleString()
- })
- pagination.total++
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
- }
- })
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val.page
- pagination.pageSize = val.limit
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-
-.quick-actions-row {
- margin-bottom: 20px;
-}
-
-.quick-actions-row .el-alert {
- margin-bottom: 0;
-}
-
-.quick-actions-row .el-alert p {
- margin: 5px 0;
- font-size: 14px;
- line-height: 1.5;
-}
-
-/* 浜岀淮鐮侀瑙堟牱寮� */
-.qr-preview-container {
- text-align: center;
- padding: 20px;
-}
-
-.qr-image-container {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20px;
-}
-
-.qr-image {
- max-width: 100%;
- height: auto;
- border: 2px solid #e0e0e0;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-}
-
-.qr-info {
- text-align: left;
- background: #f8f9fa;
- padding: 15px;
- border-radius: 8px;
- min-width: 300px;
-}
-
-.qr-info p {
- margin: 8px 0;
- color: #666;
- font-size: 14px;
-}
-
-.qr-loading {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 15px;
- padding: 40px 0;
-}
-
-.qr-loading .el-icon {
- font-size: 32px;
- color: #409EFF;
-}
-
-.qr-loading p {
- color: #666;
- margin: 0;
-}
-</style>
diff --git a/src/views/productionManagement/operationScheduling/components/formDia.vue b/src/views/productionManagement/operationScheduling/components/formDia.vue
deleted file mode 100644
index ad37c4b..0000000
--- a/src/views/productionManagement/operationScheduling/components/formDia.vue
+++ /dev/null
@@ -1,185 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="宸ュ簭鎺掍骇"
- width="70%"
- @close="closeDia"
- >
- <el-button type="primary" @click="addRow" style="margin-bottom: 10px;">鏂板</el-button>
- <span style="font-size: 18px;margin-left: 10px">寰呮帓浜ф暟閲忥細{{pendingNum}}</span>
- <el-table :data="tableData" border style="width: 100%" :summary-method="summarizeMainTable" show-summary :row-key="row => row.id">
- <el-table-column label="搴忓彿" width="60">
- <template #default="scope">
- {{ scope.$index + 1 }}
- </template>
- </el-table-column>
- <el-table-column label="宸ュ簭" prop="process">
- <template #default="scope">
- <el-select v-model="scope.row.process" placeholder="璇烽�夋嫨" clearable style="width: 100%">
- <el-option
- v-for="dict in work_step"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鍗曚綅" prop="unit">
- <template #default="scope">
- <el-input v-model="scope.row.unit" placeholder="璇疯緭鍏ュ崟浣�" />
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇鏁伴噺" width="200" prop="schedulingNum">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.schedulingNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="宸ユ椂瀹氶" width="200" prop="workHours">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.workHours"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇鏃ユ湡" prop="schedulingDate">
- <template #default="scope">
- <el-date-picker v-model="scope.row.schedulingDate" type="date" placeholder="閫夋嫨鏃ユ湡" style="width: 100%;" value-format="YYYY-MM-DD" format="YYYY-MM-DD"/>
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇浜�" prop="schedulingUserId">
- <template #default="scope">
- <el-select
- v-model="scope.row.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="80">
- <template #default="scope">
- <el-button type="danger" size="small" @click="removeRow(scope.$index)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {processScheduling} from "@/api/productionManagement/operationScheduling.js";
-const { proxy } = getCurrentInstance()
-const { work_step } = proxy.useDict("work_step")
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableData = ref([
- { process: '', schedulingDate: '', schedulingNum: '', schedulingUserId: '', workHours: '', unit: '' }
-]);
-const unitFromRow = ref('');
-const idFromRow = ref('');
-const pendingNum = ref('');
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- pendingNum.value = row.pendingNum
- if (row && row.unit !== undefined) {
- unitFromRow.value = row.unit;
- idFromRow.value = row.id;
- tableData.value.forEach(item => {
- item.unit = row.unit;
- item.id = row.id;
- });
- } else {
- unitFromRow.value = '';
- }
-}
-const submitForm = () => {
- // 1. 妫�鏌ユ瘡涓�琛屾槸鍚﹀~鍐欏畬鏁�
- for (let i = 0; i < tableData.value.length; i++) {
- const row = tableData.value[i];
- if (
- !row.process ||
- !row.schedulingDate ||
- row.schedulingNum === '' || row.schedulingNum === null ||
- !row.schedulingUserId ||
- row.workHours === '' || row.workHours === null ||
- !row.unit
- ) {
- proxy.$modal.msgError(`绗�${i + 1}琛屾暟鎹湭濉啓瀹屾暣`);
- return;
- }
- }
- // 2. 鍚堣鎺掍骇鏁伴噺
- const totalSchedulingNum = tableData.value.reduce((sum, row) => {
- return sum + Number(row.schedulingNum || 0);
- }, 0);
- if (totalSchedulingNum > Number(pendingNum.value)) {
- proxy.$modal.msgError('鎺掍骇鏁伴噺鍚堣涓嶈兘瓒呰繃寰呮帓浜ф暟閲�');
- return;
- }
- processScheduling(tableData.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['schedulingNum']);
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-
-const addRow = () => {
- tableData.value.push({ id: idFromRow.value, process: '', unit: unitFromRow.value, schedulingNum: '', workHours: '', schedulingDate: '', schedulingUserId: '' });
-};
-const removeRow = (index) => {
- tableData.value.splice(index, 1);
-};
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/operationScheduling/index.vue b/src/views/productionManagement/operationScheduling/index.vue
deleted file mode 100644
index 983101f..0000000
--- a/src/views/productionManagement/operationScheduling/index.vue
+++ /dev/null
@@ -1,258 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О:">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О:">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="娲惧伐鏃ユ湡:">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鐘舵��:">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呮帓浜�" :value="1"></el-option>
- <el-option label="宸叉帓浜�" :value="3"></el-option>
- <el-option label="鎺掍骇涓�" :value="2"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div style="text-align: right" class="mb10">
- <el-button type="primary" @click="openForm">宸ュ簭鎺掍骇</el-button>
- <el-button type="danger" @click="handleDelete" plain>鍙栨秷鎺掍骇</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/operationScheduling/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {listPageProcess, productionDispatchDelete} from "@/api/productionManagement/operationScheduling.js";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- status: 1,
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 3) {
- return "宸叉帓浜�";
- } else if (params == 1) {
- return "寰呮帓浜�";
- } else {
- return '鎺掍骇涓�';
- }
- },
- formatType: (params) => {
- if (params == 3) {
- return "success";
- } else if (params == 1) {
- return "primary";
- } else {
- return 'warning';
- }
- },
- },
- {
- label: "娲惧伐鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "娲惧伐浜�",
- prop: "schedulingUserName",
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 150,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鎺掍骇鎬绘暟",
- prop: "schedulingNum",
- },
- {
- label: "宸叉帓浜ф暟閲�",
- prop: "successNum",
- width: 100,
- },
- {
- label: "寰呮帓浜ф暟閲�",
- prop: "pendingNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- listPageProcess(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingNum: (Number(item.schedulingNum) || 0) - (Number(item.successNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingNum == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆帓浜�");
- return;
- }
- nextTick(() => {
- formDia.value?.openDialog(type, selectedRows.value[0])
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 鏂板锛氬垽鏂槸鍚︽湁宸叉帓浜х殑鏁版嵁
- const hasScheduled = selectedRows.value.some(item => item.status == 3);
- if (hasScheduled) {
- proxy.$modal.msgWarning("宸叉帓浜ф暟鎹笉鑳藉彇娑堟帓浜�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("鏄惁纭鍙栨秷鎺掍骇锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- productionDispatchDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍙栨秷鎺掍骇鎴愬姛");
- getList();
- })
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/productionCosting/index.vue b/src/views/productionManagement/productionCosting/index.vue
deleted file mode 100644
index 76e7414..0000000
--- a/src/views/productionManagement/productionCosting/index.vue
+++ /dev/null
@@ -1,186 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鐢熶骇鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <span class="search_title ml10">鐢熶骇浜猴細</span>
- <el-input
- v-model="searchForm.schedulingUserName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import {
- listCustomer,
-} from "@/api/basicData/customerFile.js";
-import { ElMessageBox } from "element-plus";
-import dayjs from "dayjs";
-import {productionAccountingListPage} from "@/api/productionManagement/productionCosting.js";
-const { proxy } = getCurrentInstance();
-
-const tableColumn = ref([
- {
- label: "鐢熶骇鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "鐢熶骇浜�",
- prop: "schedulingUserName",
- width: 90,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 160,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭",
- prop: "process",
- },
- {
- label: "鐢熶骇鏁伴噺",
- prop: "finishedNum",
- width: 100,
- },
- {
- label: "宸ユ椂瀹氶",
- prop: "workHours",
- width: 100,
- },
- {
- label: "宸ヨ祫",
- prop: "wages",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-const data = reactive({
- searchForm: {
- schedulingUserName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- productionAccountingListPage(params).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/basic/customer/export", {}, "鐢熶骇鏍哥畻.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productionManagement/productionDispatching/components/formDia.vue b/src/views/productionManagement/productionDispatching/components/formDia.vue
deleted file mode 100644
index a60f751..0000000
--- a/src/views/productionManagement/productionDispatching/components/formDia.vue
+++ /dev/null
@@ -1,169 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢熶骇娲惧伐"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
- <el-input v-model="form.productCategory" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬绘暟閲忥細" prop="quantity">
- <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寰呮帓浜ф暟閲忥細" prop="pendingQuantity">
- <el-input v-model="form.pendingQuantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏈鎺掍骇鏁伴噺锛�" prop="schedulingNum">
- <el-input-number
- v-model="form.schedulingNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- @change="changeNum"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="娲惧伐浜猴細" prop="schedulingUserId">
- <el-select
- v-model="form.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="娲惧伐鏃ユ湡锛�" prop="schedulingDate">
- <el-date-picker
- v-model="form.schedulingDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {productionDispatch} from "@/api/productionManagement/productionOrder.js";
-import useUserStore from "@/store/modules/user.js";
-import dayjs from "dayjs";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- projectName: "",
- productCategory: "",
- quantity: "",
- schedulingNum: "",
- schedulingUserId: "",
- schedulingDate: "",
- pendingQuantity: "",
- },
- rules: {
- schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- schedulingUserId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- schedulingDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- },
-});
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const userStore = useUserStore()
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- form.value.schedulingNum = 0
- form.value.schedulingUserId = userStore.id
- form.value.schedulingDate = dayjs().format("YYYY-MM-DD");
-}
-
-//
-const changeNum = (value) => {
- if (value > form.value.pendingQuantity) {
- form.value.schedulingNum = form.value.pendingQuantity;
- proxy.$modal.msgWarning('鎺掍骇鏁伴噺涓嶅彲澶т簬寰呮帓浜ф暟閲�')
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- productionDispatch(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- })
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productionDispatching/index.vue b/src/views/productionManagement/productionDispatching/index.vue
deleted file mode 100644
index 5aebfc3..0000000
--- a/src/views/productionManagement/productionDispatching/index.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.projectName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鐢熶骇娲惧伐</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/productionDispatching/components/formDia.vue";
-import dayjs from "dayjs";
-import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
-
-const data = reactive({
- searchForm: {
- customerName: "",
- projectName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 120,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 220,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width:90
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "寰呮帓鏁伴噺",
- prop: "pendingQuantity",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- schedulingListPage(params).then((res) => {
- tableLoading.value = false;
- // 澶勭悊姣忔潯鏁版嵁锛屽鍔爌endingQuantity瀛楁
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingQuantity == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆淳宸�");
- return;
- }
- nextTick(() => {
- formDia.value?.openDialog(type, selectedRows.value[0])
- })
-};
-
-onMounted(() => {
- searchForm.value.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- searchForm.value.entryDateStart = dayjs().format("YYYY-MM-DD")
- searchForm.value.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
deleted file mode 100644
index e65fd3b..0000000
--- a/src/views/productionManagement/productionOrder/index.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.projectName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { ElMessageBox } from "element-plus";
-import dayjs from "dayjs";
-import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
-const { proxy } = getCurrentInstance();
-
-const tableColumn = ref([
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 120,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 220,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width:90
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "瀹屽伐鏁伴噺",
- prop: "successNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-const data = reactive({
- searchForm: {
- customerName: "",
- projectName: "",
- entryDate: [], // 褰曞叆鏃ユ湡
- entryDateStart: '',
- entryDateEnd: '',
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const getList = () => {
- tableLoading.value = true;
- // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- schedulingListPage(params).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/salesLedger/scheduling/export", {}, "鐢熶骇璁㈠崟.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- searchForm.value.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- searchForm.value.entryDateStart = dayjs().format("YYYY-MM-DD")
- searchForm.value.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productionManagement/productionReporting/components/formDia.vue b/src/views/productionManagement/productionReporting/components/formDia.vue
deleted file mode 100644
index 89f6c76..0000000
--- a/src/views/productionManagement/productionReporting/components/formDia.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢熶骇鎶ュ伐"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎺掍骇鏁伴噺锛�" prop="schedulingNum">
- <el-input v-model="form.schedulingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鐢熶骇鏁伴噺锛�" prop="finishedNum">
- <el-input-number
- v-model="form.finishedNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- @change="changeNum"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寰呯敓浜ф暟閲忥細" prop="pendingNum">
- <el-input v-model="form.pendingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢熶骇浜猴細" prop="schedulingUserId">
- <el-select
- v-model="form.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢熶骇鏃ユ湡锛�" prop="schedulingDate">
- <el-date-picker
- v-model="form.schedulingDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {productionReport, productionReportUpdate} from "@/api/productionManagement/productionReporting.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const userList = ref([])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- successNum: "",
- schedulingNum: "",
- finishedNum: "",
- schedulingUserId: "",
- schedulingDate: "",
- },
- rules: {
- schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
-}
-
-const changeNum = (value) => {
- if (value > form.value.schedulingNum) {
- form.value.finishedNum = form.value.schedulingNum;
- proxy.$modal.msgWarning('鏈鐢熶骇鏁伴噺涓嶅彲澶т簬鎺掍骇鏁伴噺')
- }
- form.value.pendingNum = form.value.schedulingNum - form.value.finishedNum;
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- productionReport(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- productionReportUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
deleted file mode 100644
index 3ceae74..0000000
--- a/src/views/productionManagement/productionReporting/index.vue
+++ /dev/null
@@ -1,430 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О:">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О:">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="鎺掍骇鏃ユ湡:">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鐘舵��:">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 140px" clearable>
- <el-option label="寰呯敓浜�" :value="1"></el-option>
- <el-option label="宸叉姤宸�" :value="3"></el-option>
- <el-option label="鐢熶骇涓�" :value="2"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div style="text-align: right" class="mb10">
- <el-button type="primary" @click="openForm('add')">鐢熶骇鎶ュ伐</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :expandRowKeys="expandedRowKeys"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- >
- <template #expand="{ row }">
- <el-table
- :data="expandData"
- border
- show-summary
- :summary-method="summarizeMainTable"
- v-loading="childrenLoading"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="鏈鐢熶骇鏁伴噺" prop="finishedNum" align="center" width="400">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.finishedNum"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- @change="changeNum(scope.row)"
- />
- </template>
- </el-table-column>
-<!-- <el-table-column label="寰呯敓浜ф暟閲�" prop="pendingNum" width="240" align="center"></el-table-column>-->
- <el-table-column label="鐢熶骇浜�" prop="schedulingUserId" width="400">
- <template #default="scope">
- <el-select
- v-model="scope.row.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- :disabled="!scope.row.editType"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐢熶骇鏃ユ湡" prop="schedulingDate" width="400">
- <template #default="scope">
- <el-date-picker
- v-model="scope.row.schedulingDate"
- type="date"
- :disabled="!scope.row.editType"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="60">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.parentStatus === 3"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- >淇濆瓨</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/productionReporting/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {
- productionReportUpdate,
- workListPage,
- workListPageById
-} from "@/api/productionManagement/productionReporting.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const expandedRowKeys = ref([]);
-const expandData = ref([]);
-const userList = ref([])
-const tableColumn = ref([
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 3) {
- return "宸叉姤宸�";
- } else if (params == 1) {
- return "寰呯敓浜�";
- } else {
- return '鐢熶骇涓�';
- }
- },
- formatType: (params) => {
- if (params == 3) {
- return "success";
- } else if (params == 1) {
- return "primary";
- } else {
- return 'warning';
- }
- },
- },
- {
- label: "鎺掍骇鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "鎺掍骇浜�",
- prop: "schedulingUserName",
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 150,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭",
- prop: "process",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "鐢熶骇鏁伴噺",
- prop: "finishedNum",
- width: 100,
- },
- {
- label: "寰呯敓浜ф暟閲�",
- prop: "pendingFinishNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- expandedRowKeys.value = []
- workListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingFinishNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (expandedRows.length > 0) {
- nextTick(() => {
- expandedRowKeys.value = [];
- try {
- childrenLoading.value = true;
- workListPageById({ id: row.id }).then((res) => {
- childrenLoading.value = false;
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- expandData.value = res.data.map(item => ({
- ...item,
- pendingNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0),
- parentStatus: row.status // 鏂板鐖惰〃鐘舵��
- }));
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- childrenLoading.value = false;
- console.log(error);
- }
- })
- } else {
- expandedRowKeys.value = [];
- }
-};
-const changeNum = (row) => {
- // 鎵惧埌鐖惰〃鏍兼暟鎹�
- const parentRow = tableData.value.find(item => item.id === expandedRowKeys.value[0]);
- // 璁$畻鎵�鏈夊瓙琛ㄦ牸 finishedNum 鐨勬�诲拰
- const totalFinishedNum = expandData.value.reduce((sum, item) => sum + (Number(item.finishedNum) || 0), 0);
- // 鐖惰〃鏍肩殑鎺掍骇鏁伴噺
- const schedulingNum = parentRow ? Number(parentRow.schedulingNum) : 0;
-
- if (totalFinishedNum > schedulingNum) {
- // 鍥為��鏈杈撳叆
- row.finishedNum = schedulingNum - (totalFinishedNum - Number(row.finishedNum));
- proxy.$modal.msgWarning('鎵�鏈夋湰娆$敓浜ф暟閲忎箣鍜屼笉鍙ぇ浜庢帓浜ф暟閲�');
- }
- row.pendingNum = row.schedulingNum - row.finishedNum;
-}
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-// 淇濆瓨璁板綍
-const saveReceiptPayment = (row) => {
- productionReportUpdate(row).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "finishedNum"
- ]);
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingFinishNum == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆姤宸�");
- return;
- }
- nextTick(() => {
- const rowInfo = type === 'add' ? selectedRows.value[0] : row
- formDia.value?.openDialog(type, rowInfo)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/safetyMonitoring/index.vue b/src/views/productionManagement/safetyMonitoring/index.vue
deleted file mode 100644
index 12922e7..0000000
--- a/src/views/productionManagement/safetyMonitoring/index.vue
+++ /dev/null
@@ -1,873 +0,0 @@
-<template>
- <div class="safety-monitoring">
- <el-row :gutter="20">
- <!-- 宸︿晶锛氬疄鏃剁洃鎺у尯鍩� -->
- <el-col :span="16">
- <el-card class="monitoring-card">
- <div slot="header" class="card-header">
- <span>瀹炴椂姘斾綋娴撳害鐩戞帶</span>
- <el-tag :type="systemStatus === 'normal' ? 'success' : 'danger'">
- {{ systemStatus === 'normal' ? '绯荤粺姝e父' : '绯荤粺鍛婅' }}
- </el-tag>
- </div>
-
- <!-- 鍌ㄧ綈鍖虹洃鎺� -->
- <div class="monitoring-section">
- <h3>鍌ㄧ綈鍖虹洃鎺�</h3>
- <div class="sensor-grid">
- <div class="sensor-item" v-for="sensor in tankSensors" :key="sensor.id">
- <div class="sensor-header">
- <span>{{ sensor.name }}</span>
- <el-tag :type="sensor.status === 'normal' ? 'success' : 'danger'" size="small">
- {{ sensor.status === 'normal' ? '姝e父' : '瓒呮爣' }}
- </el-tag>
- </div>
- <div class="sensor-data">
- <div class="data-item">
- <span>鐢茬兎: {{ sensor.methane.toFixed(2) }}%</span>
- <el-progress
- :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)"
- :color="getProgressColor(Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100), 80)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- <div class="data-item">
- <span>纭寲姘�: {{ sensor.h2s.toFixed(2) }}ppm</span>
- <el-progress
- :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)"
- :color="getProgressColor(Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100), 80)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 浜曞彛鍘嬬缉鏈虹洃鎺� -->
- <div class="monitoring-section">
- <h3>浜曞彛鍘嬬缉鏈虹洃鎺�</h3>
- <div class="sensor-grid">
- <div class="sensor-item" v-for="sensor in compressorSensors" :key="sensor.id">
- <div class="sensor-header">
- <span>{{ sensor.name }}</span>
- <el-tag :type="sensor.status === 'normal' ? 'success' : 'danger'" size="small">
- {{ sensor.status === 'normal' ? '姝e父' : '瓒呮爣' }}
- </el-tag>
- </div>
- <div class="sensor-data">
- <div class="data-item">
- <span>鐢茬兎: {{ sensor.methane.toFixed(2) }}%</span>
- <el-progress
- :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)"
- :color="getProgressColor(sensor.methane, 2.5)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- <div class="data-item">
- <span>纭寲姘�: {{ sensor.h2s.toFixed(2) }}ppm</span>
- <el-progress
- :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)"
- :color="getProgressColor(sensor.h2s, 10)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 瀹炴椂鏇茬嚎鍥� -->
- <div class="chart-section">
- <h3>瀹炴椂娴撳害鏇茬嚎</h3>
- <div class="chart-container">
- <div ref="chart" class="chart"></div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <!-- 鍙充晶锛氭帶鍒堕潰鏉� -->
- <el-col :span="8">
- <el-card class="control-card">
- <div slot="header" class="card-header">
- <span>搴旀�ユ帶鍒堕潰鏉�</span>
- </div>
-
- <!-- 鍠锋穻鐘舵�� -->
- <div class="control-section">
- <h4>鍠锋穻绯荤粺鐘舵��</h4>
- <div class="status-grid">
- <div class="status-item" v-for="sprinkler in sprinklerSystems" :key="sprinkler.id">
- <div class="status-indicator" :class="sprinkler.status">
- <i class="el-icon-circle-check" v-if="sprinkler.status === 'active'"></i>
- <i class="el-icon-circle-close" v-else></i>
- </div>
- <span>{{ sprinkler.name }}</span>
- <el-tag :type="sprinkler.status === 'active' ? 'success' : 'info'" size="small">
- {{ sprinkler.status === 'active' ? '杩愯涓�' : '寰呮満' }}
- </el-tag>
- </div>
- </div>
- </div>
-
- <!-- 搴旀�ヨ褰曟寜閽� -->
- <h4>搴旀�ョ鐞�</h4>
-
- <div class="control-section1">
- <el-button type="primary" @click="showEmergencyRecords" style="margin-bottom: 10px;">
- 搴旀�ヨ褰�
- </el-button>
- <el-button type="warning" @click="triggerEmergency" :disabled="!hasEmergency">
- 瑙﹀彂搴旀�ュ搷搴�
- </el-button>
- </div>
-
- <!-- 绯荤粺鏃ュ織 -->
- <div class="control-section">
- <h4>绯荤粺鏃ュ織</h4>
- <div class="log-container">
- <div class="log-item" v-for="log in systemLogs" :key="log.id">
- <span class="log-time">{{ log.time }}</span>
- <span class="log-content">{{ log.content }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 娉勬紡棰勮寮圭獥 -->
- <el-dialog
- title="鈿狅笍 娉勬紡棰勮"
- :visible.sync="leakWarningVisible"
- width="500px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- class="leak-warning-dialog"
- >
- <div class="warning-content">
- <div class="warning-icon">
- <i class="el-icon-warning"></i>
- </div>
- <div class="warning-text">
- <h3>妫�娴嬪埌姘斾綋娴撳害瓒呮爣锛�</h3>
- <p>浣嶇疆锛歿{ currentWarning.location }}</p>
- <p>瓒呮爣姘斾綋锛歿{ currentWarning.gas }}</p>
- <p>褰撳墠娴撳害锛歿{ currentWarning.value }}</p>
- </div>
- </div>
- <div slot="footer" class="dialog-footer">
- <el-button type="danger" @click="acknowledgeWarning">纭鍛婅</el-button>
- <el-button type="primary" @click="viewDetails">鏌ョ湅璇︽儏</el-button>
- </div>
- </el-dialog>
-
- <!-- 搴旀�ヨ褰曞脊绐� -->
- <el-dialog
- title="搴旀�ヨ褰�"
- :visible.sync="emergencyRecordsVisible"
- width="800px"
- >
- <el-table :data="emergencyRecords" style="width: 100%">
- <el-table-column prop="time" label="鏃堕棿" width="180"></el-table-column>
- <el-table-column prop="location" label="浣嶇疆" width="150"></el-table-column>
- <el-table-column prop="type" label="绫诲瀷" width="120"></el-table-column>
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template slot-scope="scope">
- <el-tag :type="scope.row.status === 'resolved' ? 'success' : 'warning'">
- {{ scope.row.status === 'resolved' ? '宸茶В鍐�' : '澶勭悊涓�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="description" label="鎻忚堪"></el-table-column>
- <el-table-column label="鎿嶄綔" width="120">
- <template slot-scope="scope">
- <el-button type="text" @click="viewBlockchainDetails(scope.row)">
- 鍖哄潡閾捐鎯�
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
-
- <!-- 鍖哄潡閾惧瓨璇佽鎯呭脊绐� -->
- <el-dialog
- title="鍖哄潡閾惧瓨璇佽鎯�"
- :visible.sync="blockchainDetailsVisible"
- width="900px"
- >
- <div class="blockchain-details">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="浜嬩欢ID">{{ currentEvent.id }}</el-descriptions-item>
- <el-descriptions-item label="鏃堕棿鎴�">{{ currentEvent.timestamp }}</el-descriptions-item>
- <el-descriptions-item label="浣嶇疆">{{ currentEvent.location }}</el-descriptions-item>
- <el-descriptions-item label="浜嬩欢绫诲瀷">{{ currentEvent.type }}</el-descriptions-item>
- </el-descriptions>
-
- <div class="sensor-data-section">
- <h4>浼犳劅鍣ㄦ暟鎹�</h4>
- <el-table :data="currentEvent.sensorData" style="width: 100%">
- <el-table-column prop="sensor" label="浼犳劅鍣�"></el-table-column>
- <el-table-column prop="methane" label="鐢茬兎娴撳害"></el-table-column>
- <el-table-column prop="h2s" label="纭寲姘㈡祿搴�"></el-table-column>
- <el-table-column prop="timestamp" label="璁板綍鏃堕棿"></el-table-column>
- </el-table>
- </div>
-
- <div class="action-log-section">
- <h4>澶勭疆鍔ㄤ綔璁板綍</h4>
- <el-timeline>
- <el-timeline-item
- v-for="action in currentEvent.actions"
- :key="action.id"
- :timestamp="action.timestamp"
- :type="action.type === 'emergency' ? 'danger' : 'primary'"
- >
- {{ action.description }}
- </el-timeline-item>
- </el-timeline>
- </div>
-
- <div class="blockchain-info">
- <h4>鍖哄潡閾句俊鎭�</h4>
- <el-descriptions :column="1" border>
- <el-descriptions-item label="鍖哄潡鍝堝笇">{{ currentEvent.blockHash }}</el-descriptions-item>
- <el-descriptions-item label="浜ゆ槗鍝堝笇">{{ currentEvent.txHash }}</el-descriptions-item>
- <el-descriptions-item label="纭鏁�">{{ currentEvent.confirmations }}</el-descriptions-item>
- </el-descriptions>
- </div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script>
-import * as echarts from 'echarts'
-
-export default {
- name: 'SafetyMonitoring',
- data() {
- return {
- systemStatus: 'normal',
- leakWarningVisible: false,
- emergencyRecordsVisible: false,
- blockchainDetailsVisible: false,
- currentWarning: {},
- currentEvent: {},
- hasEmergency: false,
-
- // 鍌ㄧ綈鍖轰紶鎰熷櫒鏁版嵁
- tankSensors: [
- { id: 1, name: '鍌ㄧ綈T-001', methane: 1.20, h2s: 2.10, status: 'normal' },
- { id: 2, name: '鍌ㄧ綈T-002', methane: 0.80, h2s: 1.50, status: 'normal' },
- { id: 3, name: '鍌ㄧ綈T-003', methane: 3.20, h2s: 8.50, status: 'warning' },
- { id: 4, name: '鍌ㄧ綈T-004', methane: 0.60, h2s: 0.80, status: 'normal' }
- ],
-
- // 浜曞彛鍘嬬缉鏈轰紶鎰熷櫒鏁版嵁
- compressorSensors: [
- { id: 5, name: '鍘嬬缉鏈篊-001', methane: 2.10, h2s: 3.20, status: 'normal' },
- { id: 6, name: '鍘嬬缉鏈篊-002', methane: 4.80, h2s: 12.50, status: 'warning' },
- { id: 7, name: '鍘嬬缉鏈篊-003', methane: 1.80, h2s: 2.80, status: 'normal' }
- ],
-
- // 鍠锋穻绯荤粺鐘舵��
- sprinklerSystems: [
- { id: 1, name: '鍌ㄧ綈鍖哄柗娣�', status: 'active' },
- { id: 2, name: '鍘嬬缉鏈哄尯鍠锋穻', status: 'standby' },
- { id: 3, name: '绱ф�ュ柗娣�', status: 'standby' }
- ],
-
- // 绯荤粺鏃ュ織
- systemLogs: [
- { id: 1, time: '14:30:25', content: '绯荤粺鍚姩瀹屾垚锛屾墍鏈変紶鎰熷櫒姝e父' },
- { id: 2, time: '14:35:12', content: '鍌ㄧ綈T-003鐢茬兎娴撳害瓒呮爣锛岃Е鍙戦璀�' },
- { id: 3, time: '14:35:15', content: '鍚姩鍌ㄧ綈鍖哄柗娣嬬郴缁�' },
- { id: 4, time: '14:35:20', content: '鍙戦�佺揣鎬ョ枏鏁e箍鎾�' }
- ],
-
- // 搴旀�ヨ褰�
- emergencyRecords: [
- {
- id: 'EM001',
- time: '2025-01-15 14:35:12',
- location: '鍌ㄧ綈T-003',
- type: '鐢茬兎瓒呮爣',
- status: 'resolved',
- description: '鍌ㄧ綈T-003鐢茬兎娴撳害杈惧埌3.2%锛岃秴杩囧畨鍏ㄩ槇鍊�2.5%'
- },
- {
- id: 'EM002',
- time: '2025-01-15 14:35:15',
- location: '鍘嬬缉鏈篊-002',
- type: '纭寲姘㈣秴鏍�',
- status: 'processing',
- description: '鍘嬬缉鏈篊-002纭寲姘㈡祿搴﹁揪鍒�12.5ppm锛岃秴杩囧畨鍏ㄩ槇鍊�10ppm'
- }
- ],
-
- // 鍥捐〃瀹炰緥
- chart: null,
-
- // 瀹氭椂鍣�
- timer: null
- }
- },
-
- mounted() {
- this.initChart()
- this.startDataRefresh()
- this.checkEmergencyStatus()
- },
-
- beforeDestroy() {
- if (this.timer) {
- clearInterval(this.timer)
- }
- if (this.chart) {
- this.chart.dispose()
- }
- },
-
- methods: {
- // 缁熶竴杩涘害鏉℃牸寮忓寲涓轰袱浣嶅皬鏁帮紝閬垮厤娴偣璇樊鏄剧ず
- formatProgress(percentage) {
- if (percentage == null || isNaN(percentage)) return '0.00%'
- const val = Math.round(Number(percentage) * 100) / 100
- return `${val.toFixed(2)}%`
- },
- // 鍒濆鍖栧浘琛�
- initChart() {
- this.chart = echarts.init(this.$refs.chart)
- this.updateChart()
- },
-
- // 鏇存柊鍥捐〃鏁版嵁
- updateChart() {
- const option = {
- title: {
- text: '瀹炴椂姘斾綋娴撳害鐩戞帶',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'cross'
- }
- },
- legend: {
- data: ['鍌ㄧ綈鍖虹敳鐑�', '鍌ㄧ綈鍖虹~鍖栨阿', '鍘嬬缉鏈虹敳鐑�', '鍘嬬缉鏈虹~鍖栨阿'],
- top: 30
- },
- grid: {
- left: '3%',
- right: '4%',
- bottom: '3%',
- top: '15%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: this.generateTimeData()
- },
- yAxis: [
- {
- type: 'value',
- name: '鐢茬兎娴撳害(%)',
- position: 'left'
- },
- {
- type: 'value',
- name: '纭寲姘㈡祿搴�(ppm)',
- position: 'right'
- }
- ],
- series: [
- {
- name: '鍌ㄧ綈鍖虹敳鐑�',
- type: 'line',
- data: this.generateRandomData(20, 0.5, 3.5),
- smooth: true,
- yAxisIndex: 0
- },
- {
- name: '鍌ㄧ綈鍖虹~鍖栨阿',
- type: 'line',
- data: this.generateRandomData(20, 0.5, 12),
- smooth: true,
- yAxisIndex: 1
- },
- {
- name: '鍘嬬缉鏈虹敳鐑�',
- type: 'line',
- data: this.generateRandomData(20, 1.0, 5.0),
- smooth: true,
- yAxisIndex: 0
- },
- {
- name: '鍘嬬缉鏈虹~鍖栨阿',
- type: 'line',
- data: this.generateRandomData(20, 1.0, 15),
- smooth: true,
- yAxisIndex: 1
- }
- ]
- }
-
- this.chart.setOption(option)
- },
-
- // 鐢熸垚鏃堕棿鏁版嵁
- generateTimeData() {
- const times = []
- const now = new Date()
- for (let i = 19; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 5 * 60 * 1000)
- times.push(time.toLocaleTimeString('zh-CN', { hour12: false }))
- }
- return times
- },
-
- // 鐢熸垚闅忔満鏁版嵁
- generateRandomData(count, min, max) {
- const data = []
- for (let i = 0; i < count; i++) {
- data.push(+(Math.random() * (max - min) + min).toFixed(2))
- }
- return data
- },
-
- // 寮�濮嬫暟鎹埛鏂�
- startDataRefresh() {
- this.timer = setInterval(() => {
- this.refreshSensorData()
- this.updateChart()
- this.checkEmergencyStatus()
- }, 5000) // 姣�5绉掑埛鏂颁竴娆�
- },
-
- // 鍒锋柊浼犳劅鍣ㄦ暟鎹�
- refreshSensorData() {
- // 鏇存柊鍌ㄧ綈鍖轰紶鎰熷櫒鏁版嵁
- this.tankSensors.forEach(sensor => {
- sensor.methane = +(Math.random() * 4).toFixed(2)
- sensor.h2s = +(Math.random() * 15).toFixed(2)
- sensor.status = this.getSensorStatus(sensor.methane, sensor.h2s)
- })
-
- // 鏇存柊鍘嬬缉鏈轰紶鎰熷櫒鏁版嵁
- this.compressorSensors.forEach(sensor => {
- sensor.methane = +(Math.random() * 6).toFixed(2)
- sensor.h2s = +(Math.random() * 20).toFixed(2)
- sensor.status = this.getSensorStatus(sensor.methane, sensor.h2s)
- })
-
- // 妫�鏌ユ槸鍚﹂渶瑕佽Е鍙戦璀�
- this.checkLeakWarning()
- },
-
- // 鑾峰彇浼犳劅鍣ㄧ姸鎬�
- getSensorStatus(methane, h2s) {
- const methanePct = Math.min(Math.round(methane * 40 * 100) / 100, 100)
- const h2sPct = Math.min(Math.round((h2s / 20) * 100 * 100) / 100, 100)
- if (methanePct >= 80 || h2sPct >= 80) {
- return 'warning'
- }
- return 'normal'
- },
-
- // 妫�鏌ユ硠婕忛璀�
- checkLeakWarning() {
- const allSensors = [...this.tankSensors, ...this.compressorSensors]
- const warningSensor = allSensors.find(sensor => this.getSensorStatus(sensor.methane, sensor.h2s) === 'warning')
-
- if (warningSensor && !this.leakWarningVisible) {
- this.triggerLeakWarning(warningSensor)
- }
- },
-
- // 瑙﹀彂娉勬紡棰勮
- triggerLeakWarning(sensor) {
- const methanePct = Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)
- const h2sPct = Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)
- const isMethaneMajor = methanePct >= h2sPct
- const overGas = isMethaneMajor ? '鐢茬兎' : '纭寲姘�'
- const percent = (isMethaneMajor ? methanePct : h2sPct).toFixed(2)
- this.currentWarning = {
- location: sensor.name,
- gas: overGas,
- value: `${percent}%`
- }
-
- this.leakWarningVisible = true
- this.hasEmergency = true
-
- // 鑷姩瑙﹀彂搴旀�ュ搷搴�
- this.autoEmergencyResponse(sensor)
-
- // 娣诲姞绯荤粺鏃ュ織
- this.addSystemLog(`妫�娴嬪埌${sensor.name}姘斾綋娴撳害瓒呮爣锛岃Е鍙戞硠婕忛璀)
- },
-
- // 鑷姩搴旀�ュ搷搴�
- autoEmergencyResponse(sensor) {
- // 鍚姩鍠锋穻绯荤粺
- if (sensor.name.includes('鍌ㄧ綈')) {
- this.sprinklerSystems[0].status = 'active'
- } else if (sensor.name.includes('鍘嬬缉鏈�')) {
- this.sprinklerSystems[1].status = 'active'
- }
-
- // 娣诲姞绯荤粺鏃ュ織
- this.addSystemLog(`鍚姩${sensor.name}鍖哄煙鍠锋穻绯荤粺`)
- this.addSystemLog(`鍙戦�佺揣鎬ョ枏鏁e箍鎾璥)
-
- // 鍒涘缓搴旀�ヨ褰�
- this.createEmergencyRecord(sensor)
- },
-
- // 娣诲姞绯荤粺鏃ュ織
- addSystemLog(content) {
- const now = new Date()
- const time = now.toLocaleTimeString('zh-CN', { hour12: false })
-
- this.systemLogs.unshift({
- id: Date.now(),
- time: time,
- content: content
- })
-
- // 淇濇寔鏈�澶�20鏉℃棩蹇�
- if (this.systemLogs.length > 20) {
- this.systemLogs = this.systemLogs.slice(0, 20)
- }
- },
-
- // 鍒涘缓搴旀�ヨ褰�
- createEmergencyRecord(sensor) {
- const now = new Date()
- const record = {
- id: `EM${Date.now()}`,
- time: now.toLocaleString('zh-CN'),
- location: sensor.name,
- type: sensor.methane > 2.5 ? '鐢茬兎瓒呮爣' : '纭寲姘㈣秴鏍�',
- status: 'processing',
- description: `${sensor.name}妫�娴嬪埌${sensor.methane > 2.5 ? '鐢茬兎' : '纭寲姘�'}娴撳害瓒呮爣`
- }
-
- this.emergencyRecords.unshift(record)
- },
-
- // 鑾峰彇杩涘害鏉¢鑹�
- getProgressColor(value, threshold) {
- if (value > threshold) {
- return '#F56C6C'
- } else if (value > threshold * 0.8) {
- return '#E6A23C'
- }
- return '#67C23A'
- },
-
- // 妫�鏌ュ簲鎬ョ姸鎬�
- checkEmergencyStatus() {
- const allSensors = [...this.tankSensors, ...this.compressorSensors]
- const has = allSensors.some(sensor => this.getSensorStatus(sensor.methane, sensor.h2s) === 'warning')
- this.hasEmergency = has
- this.systemStatus = has ? 'warning' : 'normal'
- },
-
- // 纭鍛婅
- acknowledgeWarning() {
- this.leakWarningVisible = false
- this.addSystemLog('娉勬紡棰勮宸茬‘璁�')
- },
-
- // 鏌ョ湅璇︽儏
- viewDetails() {
- this.leakWarningVisible = false
- // 杩欓噷鍙互璺宠浆鍒拌缁嗛〉闈㈡垨鏄剧ず鏇村淇℃伅
- },
-
- // 鏄剧ず搴旀�ヨ褰�
- showEmergencyRecords() {
- this.emergencyRecordsVisible = true
- },
-
- // 鏌ョ湅鍖哄潡閾捐鎯�
- viewBlockchainDetails(record) {
- this.currentEvent = {
- id: record.id,
- timestamp: record.time,
- location: record.location,
- type: record.type,
- sensorData: [
- {
- sensor: '鐢茬兎浼犳劅鍣�',
- methane: '3.2%',
- h2s: '8.5ppm',
- timestamp: record.time
- },
- {
- sensor: '纭寲姘紶鎰熷櫒',
- methane: '2.8%',
- h2s: '12.5ppm',
- timestamp: record.time
- }
- ],
- actions: [
- {
- id: 1,
- timestamp: record.time,
- type: 'emergency',
- description: '妫�娴嬪埌姘斾綋娴撳害瓒呮爣锛岃Е鍙戦璀�'
- },
- {
- id: 2,
- timestamp: new Date(new Date(record.time).getTime() + 3000).toLocaleString('zh-CN'),
- type: 'action',
- description: '鍚姩鍠锋穻绯荤粺闄嶆俯'
- },
- {
- id: 3,
- timestamp: new Date(new Date(record.time).getTime() + 5000).toLocaleString('zh-CN'),
- type: 'action',
- description: '鍙戦�佺揣鎬ョ枏鏁e箍鎾�'
- }
- ],
- blockHash: '0x1234567890abcdef...',
- txHash: '0xabcdef1234567890...',
- confirmations: 12
- }
-
- this.emergencyRecordsVisible = false
- this.blockchainDetailsVisible = true
- },
-
- // 瑙﹀彂搴旀�ュ搷搴�
- triggerEmergency() {
- this.$message.success('搴旀�ュ搷搴斿凡瑙﹀彂')
- this.addSystemLog('鎵嬪姩瑙﹀彂搴旀�ュ搷搴�')
- }
- }
-}
-</script>
-
-<style scoped>
-.safety-monitoring {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: calc(100vh - 84px);
-}
-
-.monitoring-card, .control-card {
- margin-bottom: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.monitoring-section {
- margin-bottom: 30px;
-}
-
-.monitoring-section h3 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 2px solid #409EFF;
-}
-
-.sensor-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 15px;
-}
-
-.sensor-item {
- background: #fff;
- border: 1px solid #e4e7ed;
- border-radius: 8px;
- padding: 15px;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
-}
-
-.sensor-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 15px;
- font-weight: bold;
-}
-
-.sensor-data .data-item {
- margin-bottom: 12px;
-}
-
-.sensor-data .data-item span {
- display: block;
- margin-bottom: 5px;
- font-size: 14px;
- color: #606266;
-}
-
-.chart-section {
- margin-top: 30px;
-}
-
-.chart-section h3 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 2px solid #409EFF;
-}
-
-.chart-container {
- background: #fff;
- border-radius: 8px;
- padding: 20px;
-}
-
-.chart {
- width: 100%;
- height: 400px;
-}
-
-.control-section {
- margin-bottom: 25px;
-}
-.control-section1 {
- display: flex;
-}
-
-.control-section h4 {
- color: #303133;
- margin-bottom: 15px;
- font-size: 16px;
-}
-
-.status-grid {
- display: grid;
- gap: 10px;
-}
-
-.status-item {
- display: flex;
- align-items: center;
- gap: 10px;
- padding: 10px;
- background: #f8f9fa;
- border-radius: 6px;
-}
-
-.status-indicator {
- width: 20px;
- height: 20px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.status-indicator.active {
- color: #67C23A;
-}
-
-.status-indicator.standby {
- color: #909399;
-}
-
-.log-container {
- max-height: 200px;
- overflow-y: auto;
- background: #f8f9fa;
- border-radius: 6px;
- padding: 10px;
-}
-
-.log-item {
- display: flex;
- gap: 10px;
- margin-bottom: 8px;
- font-size: 12px;
-}
-
-.log-time {
- color: #909399;
- min-width: 60px;
-}
-
-.log-content {
- color: #606266;
-}
-
-/* 娉勬紡棰勮寮圭獥鏍峰紡 */
-.leak-warning-dialog {
- background: #fff5f5;
-}
-
-.warning-content {
- text-align: center;
- padding: 20px 0;
-}
-
-.warning-icon {
- font-size: 60px;
- color: #F56C6C;
- margin-bottom: 20px;
-}
-
-.warning-text h3 {
- color: #F56C6C;
- margin-bottom: 15px;
-}
-
-.warning-text p {
- margin: 8px 0;
- color: #606266;
-}
-
-/* 鍖哄潡閾捐鎯呮牱寮� */
-.blockchain-details {
- padding: 20px 0;
-}
-
-.sensor-data-section, .action-log-section, .blockchain-info {
- margin-top: 25px;
-}
-
-.sensor-data-section h4, .action-log-section h4, .blockchain-info h4 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 1px solid #e4e7ed;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 1200px) {
- .sensor-grid {
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- }
-}
-
-@media (max-width: 768px) {
- .safety-monitoring {
- padding: 10px;
- }
-
- .sensor-grid {
- grid-template-columns: 1fr;
- }
-
- .chart {
- height: 300px;
- }
-}
-</style>
diff --git a/src/views/qualityManagement/finalInspection/components/filesDia.vue b/src/views/qualityManagement/finalInspection/components/filesDia.vue
deleted file mode 100644
index 66392f3..0000000
--- a/src/views/qualityManagement/finalInspection/components/filesDia.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
deleted file mode 100644
index 6547e3f..0000000
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ /dev/null
@@ -1,278 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍑哄巶妫�楠�' : '缂栬緫鍑哄巶妫�楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸" />
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {userListNoPage} from "@/api/system/user.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const userList = ref([]);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 2
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
deleted file mode 100644
index 3f2595f..0000000
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ /dev/null
@@ -1,381 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">浜у搧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.productName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- productName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const currentRow = ref(null)
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-const userList = ref([]);
-const form = ref({
- checkName: ""
-});
-const dialogFormVisible = ref(false);
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 2}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 2}, "鍑哄巶妫�楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '鍘熸潗鏂欐楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
deleted file mode 100644
index 016a4c1..0000000
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ /dev/null
@@ -1,415 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板妫�娴嬫寚鏍�
- </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="modelDia"
- title="妫�娴嬫寚鏍�"
- width="400px"
- @close="closeModelDia"
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-row>
- <el-col :span="24">
- <el-form-item label="鎸囨爣锛�" prop="parameterItem">
- <el-input
- v-model="modelForm.parameterItem"
- placeholder="璇疯緭鍏ユ寚鏍�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="modelForm.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鏍囧噯鍊硷細" prop="standardValue">
- <el-input
- v-model="modelForm.standardValue"
- placeholder="璇疯緭鍏ユ爣鍑嗗��"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍐呮帶鍊硷細" prop="controlValue">
- <el-input
- v-model="modelForm.controlValue"
- placeholder="璇疯緭鍏ュ唴鎺у��"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {addOrEditProductModel, delProductModel, modelListPage, productTreeList} from "@/api/basicData/product.js";
-import ImportExcel from "@/views/basicData/product/ImportExcel/index.vue";
-import {ElMessageBox} from "element-plus";
-import {
- qualityTestStandardAdd, qualityTestStandardDel,
- qualityTestStandardListPage,
- qualityTestStandardUpdate
-} from "@/api/qualityManagement/metricMaintenance.js";
-const { proxy } = getCurrentInstance();
-// 鏍�
-const search = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const currentId = ref("");
-const currentParentId = ref("");
-// 鎸囨爣琛ㄦ牸
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 10,
-});
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const selectedRows = ref([]);
-// 鎸囨爣寮规
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const data = reactive({
- modelForm: {
- parameterItem: "",
- unit: "",
- standardValue: "",
- controlValue: "",
- },
- modelRules: {
- parameterItem: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- standardValue: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- controlValue: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { modelForm, modelRules } = toRefs(data);
-
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- productTreeList().then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- }).catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList();
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鏌ヨ鎸囨爣鏁版嵁
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = () => {
- tableLoading.value = true;
- qualityTestStandardListPage({
- productId: currentId.value,
- current: page.current,
- size: page.size,
- }).then((res) => {
- tableData.value = res.data.records;
- page.total = res.data.total;
- tableLoading.value = false;
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-// 鎵撳紑鎸囨爣寮规
-const openModelDia = (type, data) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.model = "";
- modelForm.value.model = "";
- modelForm.value.id = "";
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- proxy.download("/quality/qualityTestStandard/export", {}, "妫�娴嬫寚鏍�.xlsx");
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鍒犻櫎鎸囨爣
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- tableLoading.value = true;
- qualityTestStandardDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- }).finally(() => {
- tableLoading.value = false;
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.productId = Number(currentId.value);
- if(modelOperationType.value === 'add') {
- qualityTestStandardAdd(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- } else {
- qualityTestStandardUpdate(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- }
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
deleted file mode 100644
index 13a231d..0000000
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ /dev/null
@@ -1,249 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板涓嶅悎鏍肩鐞�' : '缂栬緫涓嶅悎鏍肩鐞�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐘舵�侊細" prop="inspectState">
- <el-select v-model="form.inspectState">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫诲埆锛�" prop="inspectType">
- <el-select v-model="form.inspectType">
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
- <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
- <el-input v-model="form.dealResult" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="dealName">
- <el-input v-model="form.dealName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
- <el-date-picker
- v-model="form.dealTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {productTreeList} from "@/api/basicData/product.js";
-import {
- getQualityUnqualifiedInfo,
- qualityUnqualifiedAdd,
- qualityUnqualifiedUpdate
-} from "@/api/qualityManagement/nonconformingManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- inspectState: '',
- inspectType: '',
- defectivePhenomena: '',
- dealResult: '',
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- getQualityUnqualifiedInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- form.value.productName = findNodeById(productOptions.value, value);
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- qualityUnqualifiedAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityUnqualifiedUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
deleted file mode 100644
index 308d960..0000000
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,257 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐘舵�侊細" prop="inspectState">
- <el-select v-model="form.inspectState">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫诲埆锛�" prop="inspectType">
- <el-select v-model="form.inspectType" disabled>
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- disabled
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
- <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
- <el-input v-model="form.dealResult" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="dealName">
- <el-input v-model="form.dealName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
- <el-date-picker
- v-model="form.dealTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {productTreeList} from "@/api/basicData/product.js";
-import {
- getQualityUnqualifiedInfo,
- qualityUnqualifiedAdd,
- qualityUnqualifiedUpdate
-} from "@/api/qualityManagement/nonconformingManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- inspectState: '',
- inspectType: '',
- defectivePhenomena: '',
- dealResult: '',
- dealName: '',
- dealTime: '',
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- defectivePhenomena: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealResult: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealTime: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- getQualityUnqualifiedInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- form.value.productName = findNodeById(productOptions.value, value);
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- qualityUnqualifiedAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityUnqualifiedUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
deleted file mode 100644
index 169a2f3..0000000
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div style="display: flex;flex-direction: row;align-items: center;">
- <div>
- <span class="search_title">绫诲瀷锛�</span>
- <el-select v-model="searchForm.inspectType" clearable style="width: 200px" @change="handleQuery">
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </div>
- <div style="margin-left: 10px">
- <span class="search_title">鐘舵�侊細</span>
- <el-select v-model="searchForm.inspectState" clearable style="width: 200px" @change="handleQuery">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </div>
- <div style="margin-left: 10px">
- <span class="search_title">浜у搧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.productName"
- style="width: 200px"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </div>
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- style="width: 300px"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
-import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- inspectType: "",
- inspectState: "",
- productName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "inspectState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "寰呭鐞�";
- } else if (params == 1) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "绫诲埆",
- prop: "inspectType",
- dataType: "tag",
- width: 120,
- formatData: (params) => {
- if (params == 0) {
- return "鍘熸潗鏂欐楠�";
- } else if (params == 1) {
- return "杩囩▼妫�楠�";
- } else {
- return '鍑哄巶妫�楠�';
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "info";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return 'primary';
- }
- },
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "涓嶅悎鏍肩幇璞�",
- prop: "defectivePhenomena",
- width: 120
- },
- {
- label: "澶勭悊缁撴灉",
- prop: "dealResult",
- width: 120
- },
- {
- label: "澶勭悊浜�",
- prop: "dealName",
- width: 120
- },
- {
- label: "澶勭悊鏃ユ湡",
- prop: "dealTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 120,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- {
- name: "澶勭悊",
- type: "text",
- clickFun: (row) => {
- openInspectionForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityUnqualifiedListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑澶勭悊寮规
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityUnqualifiedDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityUnqualified/export", {}, "涓嶅悎鏍肩鐞�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/processInspection/components/filesDia.vue b/src/views/qualityManagement/processInspection/components/filesDia.vue
deleted file mode 100644
index fb47850..0000000
--- a/src/views/qualityManagement/processInspection/components/filesDia.vue
+++ /dev/null
@@ -1,197 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import filePreview from '@/components/filePreview/index.vue'
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
deleted file mode 100644
index c24d425..0000000
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板杩囩▼妫�楠�' : '缂栬緫杩囩▼妫�楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宸ュ簭锛�" prop="process">
- <el-input v-model="form.process" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸" />
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-import {userListNoPage} from "@/api/system/user.js";
-import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const userList = ref([]);
-const { form, rules } = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 1
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
deleted file mode 100644
index 6f5ddec..0000000
--- a/src/views/qualityManagement/processInspection/index.vue
+++ /dev/null
@@ -1,380 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">宸ュ簭锛�</span>
- <el-input
- v-model="searchForm.process"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- process: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "宸ュ簭",
- prop: "process",
- width: 230
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const userList = ref([]);
-const currentRow = ref(null)
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const dialogFormVisible = ref(false);
-const form = ref({
- checkName: ""
-});
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '杩囩▼妫�楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 1}, "杩囩▼妫�楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue
deleted file mode 100644
index 9907fbe..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue
+++ /dev/null
@@ -1,198 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import filePreview from '@/components/filePreview/index.vue'
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const filePreviewRef = ref()
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
deleted file mode 100644
index 977b420..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ /dev/null
@@ -1,302 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗭細" prop="supplier">
- <el-select
- v-model="form.supplier"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in supplierList"
- :key="item.id"
- :label="item.supplierName"
- :value="item.supplierName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�"
- clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸"/>
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable/>
-
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-<!-- <div style="margin-bottom: 10px;text-align: right">-->
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
-<!-- </div>-->
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {ElMessageBox} from "element-plus";
-import {qualityInspectParamDel, qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-
-const {proxy} = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- supplier: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
- supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- model: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
- },
-});
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-const {form, rules} = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-
-function convertIdToValue(data) {
- return data.map((item) => {
- const {id, children, ...rest} = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 0
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- tableData.value = []
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
deleted file mode 100644
index 7536274..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ /dev/null
@@ -1,382 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗭細</span>
- <el-input
- v-model="searchForm.supplier"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ緵搴斿晢鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储
- </el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- supplier: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const {searchForm, rules} = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "渚涘簲鍟�",
- prop: "supplier",
- width: 230
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 120
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params === '涓嶅悎鏍�') {
- return "danger";
- } else if (params === '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const userList = ref([]);
-const dialogFormVisible = ref(false);
-const form = ref({
- checkName: ""
-});
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const currentRow = ref(null)
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const {proxy} = getCurrentInstance()
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = {...searchForm.value, ...page};
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 0}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 0}, "鍘熸潗鏂欐楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '鍘熸潗鏂欐楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/visualization/qualityDashboard.vue b/src/views/qualityManagement/visualization/qualityDashboard.vue
deleted file mode 100644
index 57462b7..0000000
--- a/src/views/qualityManagement/visualization/qualityDashboard.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
- <div class="quality-dashboard">
- <el-row :gutter="16">
- <el-col :xs="24" :sm="12">
- <el-card shadow="hover" class="panel">
- <template #header>
- <div class="panel-title">
- 妫�娴嬫牱鍝佸姩鎬佺姸鎬�
- <div class="actions">
- <el-switch v-model="voiceEnabled" active-text="璇煶棰勮" inactive-text="闈欓煶" />
- </div>
- </div>
- </template>
- <div class="status-list">
- <div v-for="item in sampleStatus" :key="item.id" class="status-item" :class="item.status">
- <div class="left">
- <span class="dot" :class="item.status"></span>
- <span class="name">{{ item.name }}</span>
- </div>
- <div class="right">
- <el-tag :type="statusTagType(item.status)" size="small">{{ statusLabel(item.status) }}</el-tag>
- <span class="time">{{ item.time }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :xs="24" :sm="12">
- <el-card shadow="hover" class="panel">
- <template #header>
- <div class="panel-title">浠诲姟鎺掕锛圱op 10锛�</div>
- </template>
- <EChart :xAxis="tasksXAxis" :yAxis="[{ type: 'value' }]" :series="tasksSeries" :grid="{ left: 40, right: 20, top: 20, bottom: 40 }" :tooltip="{ trigger: 'axis' }" :barColors="['#3b82f6']" :chartStyle="{ height: '320px', width: '100%' }" />
- </el-card>
- </el-col>
- </el-row>
-
- <el-row :gutter="16" style="margin-top: 16px;">
- <el-col :xs="24" :sm="14">
- <el-card shadow="hover" class="panel">
- <template #header>
- <div class="panel-title">鍘嗗彶瓒嬪娍</div>
- </template>
- <EChart :xAxis="[{ type: 'category', data: trendXAxis }]" :yAxis="[{ type: 'value', name: '鏁伴噺' }]" :series="trendSeries" :tooltip="{ trigger: 'axis' }" :legend="{ top: 0 }" :lineColors="['#10b981', '#f59e0b']" :chartStyle="{ height: '340px', width: '100%' }" />
- </el-card>
- </el-col>
- <el-col :xs="24" :sm="10">
- <el-card shadow="hover" class="panel">
- <template #header>
- <div class="panel-title">鍚堟牸鐜囧垎鏋�</div>
- </template>
- <EChart :series="passRateSeries" :legend="{ show: false }" :chartStyle="{ height: '340px', width: '100%' }" />
- <div class="passrate-text">
- 褰撳墠鍚堟牸鐜囷細<b>{{ (passRate * 100).toFixed(1) }}%</b>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <el-row :gutter="16" style="margin-top: 16px;">
- <el-col :xs="24">
- <el-card shadow="hover" class="panel">
- <template #header>
- <div class="panel-title">SPC 鎺у埗鍥撅紙Xbar锛�</div>
- </template>
- <EChart :xAxis="[{ type: 'category', data: spcXAxis }]" :yAxis="[{ type: 'value', name: '娴嬮噺鍊�' }]" :series="spcSeries" :legend="{ top: 0 }" :tooltip="{ trigger: 'axis' }" :lineColors="['#2563eb', '#ef4444', '#f97316', '#22c55e']" :chartStyle="{ height: '380px', width: '100%' }" />
- </el-card>
- </el-col>
- </el-row>
- </div>
-
-</template>
-
-<script setup>
-import { onMounted, onBeforeUnmount, reactive, ref } from 'vue'
-import EChart from '@/components/Echarts/echarts.vue'
-
-const voiceEnabled = ref(true)
-let dataTimer = null
-
-// 1) 鏍峰搧鍔ㄦ�佺姸鎬侊紙婊氬姩鏇存柊锛�
-const sampleStatus = ref([])
-const statusPool = ['processing', 'warning', 'error', 'success']
-function statusLabel(s) {
- return s === 'processing' ? '妫�娴嬩腑' : s === 'warning' ? '棰勮' : s === 'error' ? '涓嶅悎鏍�' : '鍚堟牸'
-}
-function statusTagType(s) {
- return s === 'processing' ? 'info' : s === 'warning' ? 'warning' : s === 'error' ? 'danger' : 'success'
-}
-function randomSample() {
- const id = Math.random().toString(36).slice(2, 8)
- const status = statusPool[Math.floor(Math.random() * statusPool.length)]
- const name = `鏍峰搧-${Math.floor(Math.random() * 900 + 100)}`
- const time = new Date().toLocaleTimeString('zh-CN', { hour12: false })
- return { id, name, status, time }
-}
-
-// 2) 浠诲姟鎺掕锛堟煴鐘跺浘锛�
-const tasksXAxis = reactive([{ type: 'category', data: [] }])
-const tasksSeries = ref([
- {
- type: 'bar',
- data: [],
- label: { show: true, position: 'inside', align: 'center', verticalAlign: 'middle', color: '#fff' },
- encode: undefined,
- },
-])
-
-// 3) 鍘嗗彶瓒嬪娍锛堟姌绾匡級
-const trendXAxis = ref([])
-const trendSeries = ref([
- { name: '鏉ユ牱鏁�', type: 'line', smooth: true, data: [] },
- { name: '瀹屾垚鏁�', type: 'line', smooth: true, data: [] },
-])
-
-// 4) 鍚堟牸鐜囧垎鏋愶紙浠〃鐩橈級
-const passRate = ref(0.92)
-const passRateSeries = ref([
- {
- type: 'gauge',
- progress: { show: true, width: 12 },
- axisLine: { lineStyle: { width: 12 } },
- pointer: { show: true },
- detail: { valueAnimation: true, formatter: (v) => `${(v * 100).toFixed(1)}%` },
- data: [{ value: passRate.value }],
- },
-])
-
-// 5) SPC 鎺у埗鍥�
-const spcXAxis = ref([])
-const spcData = ref([]) // 瀹為檯娴嬮噺鍊�
-const CL = ref(50)
-const UCL = ref(55)
-const LCL = ref(45)
-const spcSeries = ref([
- {
- name: '娴嬮噺鍧囧��',
- type: 'line',
- smooth: false,
- symbol: 'circle',
- data: [],
- markLine: {
- symbol: 'none',
- lineStyle: { type: 'dashed', color: '#999' },
- data: [
- { yAxis: () => UCL.value, name: 'UCL' },
- { yAxis: () => CL.value, name: 'CL' },
- { yAxis: () => LCL.value, name: 'LCL' },
- ],
- label: { formatter: ({ name }) => name },
- },
- },
- { name: 'UCL', type: 'line', data: [], symbol: 'none', lineStyle: { type: 'dashed', color: '#ef4444' } },
- { name: 'CL', type: 'line', data: [], symbol: 'none', lineStyle: { type: 'dashed', color: '#f97316' } },
- { name: 'LCL', type: 'line', data: [], symbol: 'none', lineStyle: { type: 'dashed', color: '#22c55e' } },
-])
-
-// 璇煶鎾姤
-function speak(text) {
- if (!voiceEnabled.value) return
- if (!('speechSynthesis' in window)) return
- const utter = new SpeechSynthesisUtterance(text)
- utter.lang = 'zh-CN'
- try {
- window.speechSynthesis.cancel()
- window.speechSynthesis.speak(utter)
- } catch (e) {
- // ignore
- }
-}
-
-function refreshFakeData() {
- // 鏍峰搧鐘舵�佹粴鍔�
- const next = randomSample()
- sampleStatus.value = [next, ...sampleStatus.value].slice(0, 8)
-
- // 浠诲姟鎺掕
- const tasks = Array.from({ length: 10 }).map((_, i) => ({ name: `浠诲姟-${i + 1}`, count: Math.floor(Math.random() * 100 + 20) }))
- tasks.sort((a, b) => a.count - b.count)
- tasksXAxis.data = tasks.map(t => t.name)
- tasksSeries.value[0].data = tasks.map(t => t.count)
-
- // 鍘嗗彶瓒嬪娍锛堣拷鍔犵偣锛�
- const nowLabel = new Date().toLocaleTimeString('zh-CN', { minute: '2-digit', second: '2-digit' })
- if (trendXAxis.value.length > 15) {
- trendXAxis.value.shift()
- trendSeries.value[0].data.shift()
- trendSeries.value[1].data.shift()
- }
- trendXAxis.value.push(nowLabel)
- const incoming = Math.floor(Math.random() * 30 + 20)
- const finished = Math.max(0, incoming - Math.floor(Math.random() * 10))
- trendSeries.value[0].data.push(incoming)
- trendSeries.value[1].data.push(finished)
-
- // 鍚堟牸鐜囷紙杞诲井娉㈠姩锛�
- const delta = (Math.random() - 0.5) * 0.02
- passRate.value = Math.min(0.99, Math.max(0.6, passRate.value + delta))
- passRateSeries.value[0].data[0].value = passRate.value
-
- // SPC 鏁版嵁锛堢獥鍙gЩ鍔級
- const nextVal = CL.value + (Math.random() - 0.5) * 8 // 娉㈠姩
- if (spcXAxis.value.length > 30) {
- spcXAxis.value.shift()
- spcData.value.shift()
- }
- spcXAxis.value.push(`${spcXAxis.value.length + 1}`)
- spcData.value.push(parseFloat(nextVal.toFixed(2)))
- spcSeries.value[0].data = [...spcData.value]
- spcSeries.value[1].data = new Array(spcData.value.length).fill(UCL.value)
- spcSeries.value[2].data = new Array(spcData.value.length).fill(CL.value)
- spcSeries.value[3].data = new Array(spcData.value.length).fill(LCL.value)
-
- // 瑙﹀彂鎾姤锛氬悎鏍肩巼杩囦綆鎴� SPC 瓒呴檺
- if (passRate.value < 0.8) {
- speak(`棰勮锛屽綋鍓嶅悎鏍肩巼涓� ${(passRate.value * 100).toFixed(0)}%锛屼綆浜� 80% 闃堝�糮)
- }
- const last = spcData.value[spcData.value.length - 1]
- if (last > UCL.value) {
- speak(`棰勮锛屾渶鏂版祴閲忓�� ${last.toFixed(2)} 瓒呰繃涓婇檺`)
- }
- if (last < LCL.value) {
- speak(`棰勮锛屾渶鏂版祴閲忓�� ${last.toFixed(2)} 浣庝簬涓嬮檺`)
- }
-}
-
-onMounted(() => {
- // 鍒濆鍖栧嚑鏉″亣鏁版嵁
- sampleStatus.value = Array.from({ length: 5 }).map(() => randomSample())
- for (let i = 0; i < 10; i++) {
- trendXAxis.value.push(`T-${i}`)
- trendSeries.value[0].data.push(Math.floor(Math.random() * 30 + 20))
- trendSeries.value[1].data.push(Math.floor(Math.random() * 25 + 15))
- }
- for (let i = 0; i < 20; i++) {
- spcXAxis.value.push(`${i + 1}`)
- const v = CL.value + (Math.random() - 0.5) * 6
- spcData.value.push(parseFloat(v.toFixed(2)))
- }
- spcSeries.value[0].data = [...spcData.value]
- spcSeries.value[1].data = new Array(spcData.value.length).fill(UCL.value)
- spcSeries.value[2].data = new Array(spcData.value.length).fill(CL.value)
- spcSeries.value[3].data = new Array(spcData.value.length).fill(LCL.value)
-
- dataTimer = setInterval(refreshFakeData, 10000)
-})
-
-onBeforeUnmount(() => {
- if (dataTimer) clearInterval(dataTimer)
- try { window.speechSynthesis && window.speechSynthesis.cancel() } catch (e) {}
-})
-</script>
-
-<style scoped>
-.quality-dashboard {
- padding: 8px;
-}
-.panel-title {
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-weight: 600;
-}
-.status-list {
- display: flex;
- flex-direction: column;
- gap: 8px;
- max-height: 320px;
- overflow: auto;
-}
-.status-item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 8px 10px;
- border-radius: 6px;
- background: var(--el-fill-color-light);
-}
-.status-item .left {
- display: flex;
- align-items: center;
- gap: 8px;
-}
-.status-item .right {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-.status-item .name { font-weight: 500; }
-.status-item .time { color: var(--el-text-color-secondary); font-size: 12px; }
-.dot {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- display: inline-block;
-}
-.dot.processing { background: #60a5fa; }
-.dot.warning { background: #f59e0b; }
-.dot.error { background: #ef4444; }
-.dot.success { background: #10b981; }
-.passrate-text {
- text-align: center;
- margin-top: 8px;
-}
-</style>
-
-
diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue
deleted file mode 100644
index d932b25..0000000
--- a/src/views/redirect/index.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-<template>
- <div></div>
-</template>
-
-<script setup>
-import { useRoute, useRouter } from 'vue-router'
-
-const route = useRoute()
-const router = useRouter()
-const { params, query } = route
-const { path } = params
-
-router.replace({ path: '/' + path, query })
-</script>
\ No newline at end of file
diff --git a/src/views/register.vue b/src/views/register.vue
deleted file mode 100644
index 58d9ba5..0000000
--- a/src/views/register.vue
+++ /dev/null
@@ -1,220 +0,0 @@
-<template>
- <div class="register">
- <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
- <h3 class="title">{{ title }}</h3>
- <el-form-item prop="username">
- <el-input
- v-model="registerForm.username"
- type="text"
- size="large"
- auto-complete="off"
- placeholder="璐﹀彿"
- >
- <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input
- v-model="registerForm.password"
- type="password"
- size="large"
- auto-complete="off"
- placeholder="瀵嗙爜"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="confirmPassword">
- <el-input
- v-model="registerForm.confirmPassword"
- type="password"
- size="large"
- auto-complete="off"
- placeholder="纭瀵嗙爜"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="code" v-if="captchaEnabled">
- <el-input
- size="large"
- v-model="registerForm.code"
- auto-complete="off"
- placeholder="楠岃瘉鐮�"
- style="width: 63%"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
- </el-input>
- <div class="register-code">
- <img :src="codeUrl" @click="getCode" class="register-code-img"/>
- </div>
- </el-form-item>
- <el-form-item style="width:100%;">
- <el-button
- :loading="loading"
- size="large"
- type="primary"
- style="width:100%;"
- @click.prevent="handleRegister"
- >
- <span v-if="!loading">娉� 鍐�</span>
- <span v-else>娉� 鍐� 涓�...</span>
- </el-button>
- <div style="float: right;">
- <router-link class="link-type" :to="'/login'">浣跨敤宸叉湁璐︽埛鐧诲綍</router-link>
- </div>
- </el-form-item>
- </el-form>
- <!-- 搴曢儴 -->
- <div class="el-register-footer">
- <span>Copyright 漏 2018-2025 ruoyi.vip All Rights Reserved.</span>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ElMessageBox } from "element-plus"
-import { getCodeImg, register } from "@/api/login"
-
-const title = import.meta.env.VITE_APP_TITLE
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-
-const registerForm = ref({
- username: "",
- password: "",
- confirmPassword: "",
- code: "",
- uuid: ""
-})
-
-const equalToPassword = (rule, value, callback) => {
- if (registerForm.value.password !== value) {
- callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"))
- } else {
- callback()
- }
-}
-
-const registerRules = {
- username: [
- { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
- { min: 2, max: 20, message: "鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }
- ],
- password: [
- { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
- { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" },
- { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }
- ],
- confirmPassword: [
- { required: true, trigger: "blur", message: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�" },
- { required: true, validator: equalToPassword, trigger: "blur" }
- ],
- code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }]
-}
-
-const codeUrl = ref("")
-const loading = ref(false)
-const captchaEnabled = ref(true)
-
-function handleRegister() {
- proxy.$refs.registerRef.validate(valid => {
- if (valid) {
- loading.value = true
- register(registerForm.value).then(res => {
- const username = registerForm.value.username
- ElMessageBox.alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + " 娉ㄥ唽鎴愬姛锛�</font>", "绯荤粺鎻愮ず", {
- dangerouslyUseHTMLString: true,
- type: "success",
- }).then(() => {
- router.push("/login")
- }).catch(() => {})
- }).catch(() => {
- loading.value = false
- if (captchaEnabled) {
- getCode()
- }
- })
- }
- })
-}
-
-function getCode() {
- getCodeImg().then(res => {
- captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
- if (captchaEnabled.value) {
- codeUrl.value = "data:image/gif;base64," + res.img
- registerForm.value.uuid = res.uuid
- }
- })
-}
-
-getCode()
-</script>
-
-<style lang='scss' scoped>
-.register {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100%;
- background-image: url("../assets/images/login-background.png");
- background-size: cover;
-}
-.title {
- margin: 0px auto 30px auto;
- text-align: center;
- color: #707070;
-}
-
-.register-form {
- border-radius: 6px;
- background: #ffffff;
- width: 400px;
- padding: 25px 25px 5px 25px;
- .el-input {
- height: 40px;
- input {
- height: 40px;
- }
- }
- .input-icon {
- height: 39px;
- width: 14px;
- margin-left: 0px;
- }
-}
-.register-tip {
- font-size: 13px;
- text-align: center;
- color: #bfbfbf;
-}
-.register-code {
- width: 33%;
- height: 40px;
- float: right;
- img {
- cursor: pointer;
- vertical-align: middle;
- }
-}
-.el-register-footer {
- height: 40px;
- line-height: 40px;
- position: fixed;
- bottom: 0;
- width: 100%;
- text-align: center;
- color: #fff;
- font-family: Arial;
- font-size: 12px;
- letter-spacing: 1px;
-}
-.register-code-img {
- height: 40px;
- padding-left: 12px;
-}
-</style>
diff --git a/src/views/reportAnalysis/projectProfit/index.vue b/src/views/reportAnalysis/projectProfit/index.vue
deleted file mode 100644
index c987e3c..0000000
--- a/src/views/reportAnalysis/projectProfit/index.vue
+++ /dev/null
@@ -1,109 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true" label-width="80px">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input v-model="filters.customerName" placeholder="璇疯緭鍏ュ鎴峰悕绉�" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableLoading="loading"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @pagination="changePage"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getPurchaseList } from "@/api/procurementManagement/projectProfit";
-import { onMounted } from "vue";
-
-defineOptions({
- name: "椤圭洰鍒╂鼎",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getPurchaseList,
- {
- customerName: undefined,
- },
- [
- {
- label: "閿�鍞悎鍚屽彿",
- align: "center",
- prop: "customerContractNo",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- align: "center",
- prop: "customerName",
- },
- {
- label: "椤圭洰鍚嶇О",
- align: "center",
- prop: "projectName",
- },
- {
- label: "鍚堝悓閲戦",
- align: "center",
- prop: "contractAmount",
- },
- {
- label: "閲囪喘閲戦",
- align: "center",
- prop: "purchaseAmount",
- },
- {
- label: "鍒╂鼎",
- align: "center",
- prop: "balance",
- },
- {
- label: "鍒╂鼎鐜�",
- align: "center",
- prop: "balanceRatio",
- },
- {
- label: "澧炲�肩◣",
- align: "center",
- prop: "balanceAmount",
- },
- ]
-);
-
-const changePage = ({ page }) => {
- pagination.currentPage = page;
- onCurrentChange(page);
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/reportAnalysis/reportManagement.vue b/src/views/reportAnalysis/reportManagement.vue
deleted file mode 100644
index 3c87550..0000000
--- a/src/views/reportAnalysis/reportManagement.vue
+++ /dev/null
@@ -1,733 +0,0 @@
-<template>
- <div class="report-management">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>鎶ヨ〃绠$悊</h2>
- <p>鎻愪緵鏍峰搧杩涘害銆佽澶囦娇鐢ㄣ�佹娴嬮」鐩�侀鐢ㄨ褰曠瓑鍚勭被鑷姩缁熻鎶ヨ〃</p>
- </div>
-
- <!-- 绛涢�夋潯浠� -->
- <el-card class="filter-card" shadow="never">
- <el-form :model="filterForm" inline>
- <el-form-item label="鏃堕棿鑼冨洿">
- <el-date-picker
- v-model="filterForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- @change="handleFilterChange"
- />
- </el-form-item>
- <el-form-item label="鎶ヨ〃绫诲瀷">
- <el-select v-model="filterForm.reportType" placeholder="璇烽�夋嫨鎶ヨ〃绫诲瀷" @change="handleFilterChange">
- <el-option label="鏍峰搧杩涘害鎶ヨ〃" value="sample" />
- <el-option label="璁惧浣跨敤鎶ヨ〃" value="equipment" />
- <el-option label="妫�娴嬮」鐩姤琛�" value="inspection" />
- <el-option label="棰嗙敤璁板綍鎶ヨ〃" value="usage" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleFilterChange">鏌ヨ</el-button>
- <el-button @click="resetFilter">閲嶇疆</el-button>
- <el-button type="success" @click="exportReport">瀵煎嚭鎶ヨ〃</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <!-- 缁熻鍗$墖 -->
- <div class="statistics-cards">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Box /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.totalSamples }}</div>
- <div class="stat-label">鎬绘牱鍝佹暟</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Tools /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.activeEquipment }}</div>
- <div class="stat-label">鍦ㄧ敤璁惧</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Document /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.completedInspections }}</div>
- <div class="stat-label">宸插畬鎴愭娴�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><ShoppingCart /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.totalUsage }}</div>
- <div class="stat-label">鎬婚鐢ㄦ鏁�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鍥捐〃鍖哄煙 -->
- <div class="charts-container">
- <el-row :gutter="20">
- <!-- 鏍峰搧杩涘害鍥捐〃 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>鏍峰搧杩涘害缁熻</span>
- <el-button type="text" @click="refreshSampleChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="sampleChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
-
- <!-- 璁惧浣跨敤鍥捐〃 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>璁惧浣跨敤鐜囩粺璁�</span>
- <el-button type="text" @click="refreshEquipmentChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="equipmentChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
- </el-row>
-
- <el-row :gutter="20" style="margin-top: 20px;">
- <!-- 妫�娴嬮」鐩粺璁� -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>妫�娴嬮」鐩垎甯�</span>
- <el-button type="text" @click="refreshInspectionChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="inspectionChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
-
- <!-- 棰嗙敤璁板綍瓒嬪娍 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>棰嗙敤璁板綍瓒嬪娍</span>
- <el-button type="text" @click="refreshUsageChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="usageChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璇︾粏鏁版嵁琛ㄦ牸 -->
- <el-card class="table-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>璇︾粏鏁版嵁</span>
- <div>
- <el-button type="primary" size="small" @click="refreshTable">鍒锋柊</el-button>
- <el-button type="success" size="small" @click="exportTable">瀵煎嚭</el-button>
- </div>
- </div>
- </template>
-
- <el-table
- :data="tableData"
- style="width: 100%"
- v-loading="tableLoading"
- stripe
- border
- >
- <el-table-column prop="id" label="缂栧彿" width="80" />
- <el-table-column prop="name" label="鍚嶇О" />
- <el-table-column prop="type" label="绫诲瀷" width="120" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="progress" label="杩涘害" width="120">
- <template #default="scope">
- <el-progress :percentage="scope.row.progress" :status="getProgressStatus(scope.row.progress)" />
- </template>
- </el-table-column>
- <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
- <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
- <el-table-column label="鎿嶄綔" width="150" fixed="right">
- <template #default="scope">
- <el-button type="text" size="small" @click="viewDetail(scope.row)">鏌ョ湅</el-button>
- <el-button type="text" size="small" @click="editItem(scope.row)">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <div class="pagination-container">
- <el-pagination
- v-model:current-page="pagination.currentPage"
- v-model:page-size="pagination.pageSize"
- :page-sizes="[10, 20, 50, 100]"
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </el-card>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import * as echarts from 'echarts'
-import { Box, Tools, Document, ShoppingCart } from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const filterForm = reactive({
- dateRange: [],
- reportType: 'sample'
-})
-
-const statistics = reactive({
- totalSamples: 1250,
- activeEquipment: 45,
- completedInspections: 890,
- totalUsage: 2340
-})
-
-const tableData = ref([])
-const tableLoading = ref(false)
-const pagination = reactive({
- currentPage: 1,
- pageSize: 20,
- total: 0
-})
-
-// 鍥捐〃寮曠敤
-const sampleChartRef = ref(null)
-const equipmentChartRef = ref(null)
-const inspectionChartRef = ref(null)
-const usageChartRef = ref(null)
-
-// 鍥捐〃瀹炰緥
-let sampleChart = null
-let equipmentChart = null
-let inspectionChart = null
-let usageChart = null
-
-// 鍒濆鍖栨暟鎹�
-const initData = () => {
- // 妯℃嫙琛ㄦ牸鏁版嵁
- tableData.value = [
- {
- id: 'SP001',
- name: '鏍峰搧A-001',
- type: '閲戝睘鏉愭枡',
- status: '妫�娴嬩腑',
- progress: 75,
- createTime: '2025-01-15 09:30:00',
- updateTime: '2025-01-20 14:20:00'
- },
- {
- id: 'SP002',
- name: '鏍峰搧B-002',
- type: '濉戞枡鍒跺搧',
- status: '宸插畬鎴�',
- progress: 100,
- createTime: '2025-01-10 10:15:00',
- updateTime: '2025-01-18 16:45:00'
- },
- {
- id: 'SP003',
- name: '鏍峰搧C-003',
- type: '鐢靛瓙鍏冧欢',
- status: '寰呮娴�',
- progress: 0,
- createTime: '2025-01-22 08:45:00',
- updateTime: '2025-01-22 08:45:00'
- },
- {
- id: 'EQ001',
- name: '妫�娴嬭澶嘇',
- type: '鍏夎氨浠�',
- status: '浣跨敤涓�',
- progress: 60,
- createTime: '2025-01-05 14:20:00',
- updateTime: '2025-01-20 11:30:00'
- },
- {
- id: 'EQ002',
- name: '妫�娴嬭澶嘊',
- type: '鏄惧井闀�',
- status: '绌洪棽',
- progress: 0,
- createTime: '2025-01-08 16:10:00',
- updateTime: '2025-01-19 09:15:00'
- }
- ]
-
- pagination.total = tableData.value.length
-}
-
-// 鍒濆鍖栨牱鍝佽繘搴﹀浘琛�
-const initSampleChart = () => {
- if (sampleChartRef.value) {
- sampleChart = echarts.init(sampleChartRef.value)
- const option = {
- title: {
- text: '鏍峰搧杩涘害鍒嗗竷',
- left: 'center'
- },
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b}: {c} ({d}%)'
- },
- legend: {
- orient: 'vertical',
- left: 'left'
- },
- series: [
- {
- name: '鏍峰搧鐘舵��',
- type: 'pie',
- radius: ['40%', '70%'],
- avoidLabelOverlap: false,
- label: {
- show: false,
- position: 'center'
- },
- emphasis: {
- label: {
- show: true,
- fontSize: '18',
- fontWeight: 'bold'
- }
- },
- labelLine: {
- show: false
- },
- data: [
- { value: 450, name: '宸插畬鎴�' },
- { value: 320, name: '妫�娴嬩腑' },
- { value: 280, name: '寰呮娴�' },
- { value: 200, name: '宸叉殏鍋�' }
- ]
- }
- ]
- }
- sampleChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栬澶囦娇鐢ㄥ浘琛�
-const initEquipmentChart = () => {
- if (equipmentChartRef.value) {
- equipmentChart = echarts.init(equipmentChartRef.value)
- const option = {
- title: {
- text: '璁惧浣跨敤鐜�',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'shadow'
- }
- },
- xAxis: {
- type: 'category',
- data: ['鍏夎氨浠�', '鏄惧井闀�', '纭害璁�', '鎷夊姏鏈�', '鍐插嚮鏈�', '閲戠浉浠�']
- },
- yAxis: {
- type: 'value',
- name: '浣跨敤鐜�(%)'
- },
- series: [
- {
- name: '浣跨敤鐜�',
- type: 'bar',
- data: [85, 60, 75, 90, 45, 70],
- label: {
- show: true,
- position: 'inside',
- align: 'center',
- verticalAlign: 'middle',
- formatter: '{c}%',
- color: '#fff'
- },
- itemStyle: {
- color: function(params) {
- const colors = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C', '#909399', '#9C27B0']
- return colors[params.dataIndex]
- }
- }
- }
- ]
- }
- equipmentChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栨娴嬮」鐩浘琛�
-const initInspectionChart = () => {
- if (inspectionChartRef.value) {
- inspectionChart = echarts.init(inspectionChartRef.value)
- const option = {
- title: {
- text: '妫�娴嬮」鐩垎甯�',
- left: 'center'
- },
- tooltip: {
- trigger: 'item'
- },
- legend: {
- orient: 'vertical',
- left: 'left'
- },
- series: [
- {
- name: '妫�娴嬮」鐩�',
- type: 'pie',
- radius: '50%',
- data: [
- { value: 335, name: '鐗╃悊鎬ц兘' },
- { value: 310, name: '鍖栧鍒嗘瀽' },
- { value: 234, name: '灏哄娴嬮噺' },
- { value: 135, name: '澶栬妫�鏌�' },
- { value: 148, name: '鍏朵粬妫�娴�' }
- ],
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: 'rgba(0, 0, 0, 0.5)'
- }
- }
- }
- ]
- }
- inspectionChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栭鐢ㄨ褰曞浘琛�
-const initUsageChart = () => {
- if (usageChartRef.value) {
- usageChart = echarts.init(usageChartRef.value)
- const option = {
- title: {
- text: '棰嗙敤璁板綍瓒嬪娍',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis'
- },
- legend: {
- data: ['棰嗙敤娆℃暟', '褰掕繕娆℃暟']
- },
- xAxis: {
- type: 'category',
- boundaryGap: false,
- data: ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�', '8鏈�', '9鏈�', '10鏈�', '11鏈�', '12鏈�']
- },
- yAxis: {
- type: 'value'
- },
- series: [
- {
- name: '棰嗙敤娆℃暟',
- type: 'line',
- stack: 'Total',
- data: [120, 132, 101, 134, 90, 230, 210, 182, 191, 234, 290, 330]
- },
- {
- name: '褰掕繕娆℃暟',
- type: 'line',
- stack: 'Total',
- data: [110, 125, 95, 128, 85, 220, 200, 175, 185, 225, 280, 320]
- }
- ]
- }
- usageChart.setOption(option)
- }
-}
-
-// 浜嬩欢澶勭悊鍑芥暟
-const handleFilterChange = () => {
- ElMessage.success('绛涢�夋潯浠跺凡鏇存柊')
- // 杩欓噷鍙互鏍规嵁绛涢�夋潯浠堕噸鏂板姞杞芥暟鎹�
-}
-
-const resetFilter = () => {
- filterForm.dateRange = []
- filterForm.reportType = 'sample'
- ElMessage.info('绛涢�夋潯浠跺凡閲嶇疆')
-}
-
-const exportReport = () => {
- ElMessage.success('鎶ヨ〃瀵煎嚭鍔熻兘寮�鍙戜腑...')
-}
-
-const refreshSampleChart = () => {
- initSampleChart()
- ElMessage.success('鏍峰搧杩涘害鍥捐〃宸插埛鏂�')
-}
-
-const refreshEquipmentChart = () => {
- initEquipmentChart()
- ElMessage.success('璁惧浣跨敤鍥捐〃宸插埛鏂�')
-}
-
-const refreshInspectionChart = () => {
- initInspectionChart()
- ElMessage.success('妫�娴嬮」鐩浘琛ㄥ凡鍒锋柊')
-}
-
-const refreshUsageChart = () => {
- initUsageChart()
- ElMessage.success('棰嗙敤璁板綍鍥捐〃宸插埛鏂�')
-}
-
-const refreshTable = () => {
- tableLoading.value = true
- setTimeout(() => {
- tableLoading.value = false
- ElMessage.success('琛ㄦ牸鏁版嵁宸插埛鏂�')
- }, 1000)
-}
-
-const exportTable = () => {
- ElMessage.success('琛ㄦ牸瀵煎嚭鍔熻兘寮�鍙戜腑...')
-}
-
-const handleSizeChange = (val) => {
- pagination.pageSize = val
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const getStatusType = (status) => {
- const statusMap = {
- '宸插畬鎴�': 'success',
- '妫�娴嬩腑': 'warning',
- '寰呮娴�': 'info',
- '宸叉殏鍋�': 'danger',
- '浣跨敤涓�': 'primary',
- '绌洪棽': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-const getProgressStatus = (progress) => {
- if (progress === 100) return 'success'
- if (progress >= 80) return 'warning'
- if (progress >= 50) return ''
- return 'exception'
-}
-
-const viewDetail = (row) => {
- ElMessage.info(`鏌ョ湅璇︽儏: ${row.name}`)
-}
-
-const editItem = (row) => {
- ElMessage.info(`缂栬緫椤圭洰: ${row.name}`)
-}
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initData()
- nextTick(() => {
- initSampleChart()
- initEquipmentChart()
- initInspectionChart()
- initUsageChart()
- })
-
- // 鐩戝惉绐楀彛澶у皬鍙樺寲锛岄噸鏂拌皟鏁村浘琛ㄥぇ灏�
- window.addEventListener('resize', () => {
- sampleChart?.resize()
- equipmentChart?.resize()
- inspectionChart?.resize()
- usageChart?.resize()
- })
-})
-</script>
-
-<style scoped>
-.report-management {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- margin-bottom: 20px;
- text-align: center;
-}
-
-.page-header h2 {
- color: #303133;
- margin-bottom: 8px;
- font-size: 24px;
- font-weight: 600;
-}
-
-.page-header p {
- color: #909399;
- font-size: 14px;
- margin: 0;
-}
-
-.filter-card {
- margin-bottom: 20px;
-}
-
-.statistics-cards {
- margin-bottom: 20px;
-}
-
-.stat-card {
- height: 120px;
-}
-
-.stat-content {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.stat-icon {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 20px;
- font-size: 24px;
- color: white;
-}
-
-.stat-card:nth-child(1) .stat-icon {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-}
-
-.stat-card:nth-child(2) .stat-icon {
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
-}
-
-.stat-card:nth-child(3) .stat-icon {
- background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
-}
-
-.stat-card:nth-child(4) .stat-icon {
- background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
-}
-
-.stat-info {
- flex: 1;
-}
-
-.stat-number {
- font-size: 28px;
- font-weight: bold;
- color: #303133;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #909399;
-}
-
-.charts-container {
- margin-bottom: 20px;
-}
-
-.chart-card {
- margin-bottom: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.chart-container {
- height: 300px;
- width: 100%;
-}
-
-.table-card {
- margin-bottom: 20px;
-}
-
-.pagination-container {
- margin-top: 20px;
- text-align: right;
-}
-
-:deep(.el-card__header) {
- padding: 15px 20px;
- border-bottom: 1px solid #ebeef5;
- background-color: #fafafa;
-}
-
-:deep(.el-card__body) {
- padding: 20px;
-}
-
-:deep(.el-table) {
- margin-bottom: 20px;
-}
-
-:deep(.el-progress) {
- margin: 0;
-}
-
-:deep(.el-tag) {
- margin: 0;
-}
-</style>
diff --git a/src/views/reportAnalysis/reportManagement/index.vue b/src/views/reportAnalysis/reportManagement/index.vue
deleted file mode 100644
index 3248712..0000000
--- a/src/views/reportAnalysis/reportManagement/index.vue
+++ /dev/null
@@ -1,716 +0,0 @@
-<template>
- <div class="report-management">
- <!-- 绛涢�夋潯浠� -->
- <el-card class="filter-card" shadow="never">
- <el-form :model="filterForm" inline>
- <el-form-item label="鏃堕棿鑼冨洿">
- <el-date-picker
- style="width: 300px"
- v-model="filterForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- @change="handleFilterChange"
- />
- </el-form-item>
- <el-form-item label="鎶ヨ〃绫诲瀷">
- <el-select v-model="filterForm.reportType" placeholder="璇烽�夋嫨鎶ヨ〃绫诲瀷" @change="handleFilterChange" style="width: 300px">
- <el-option label="鏍峰搧杩涘害鎶ヨ〃" value="sample" />
- <el-option label="璁惧浣跨敤鎶ヨ〃" value="equipment" />
- <el-option label="妫�娴嬮」鐩姤琛�" value="inspection" />
- <el-option label="棰嗙敤璁板綍鎶ヨ〃" value="usage" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleFilterChange">鏌ヨ</el-button>
- <el-button @click="resetFilter">閲嶇疆</el-button>
- <el-button type="success" @click="exportReport">瀵煎嚭鎶ヨ〃</el-button>
- </el-form-item>
- </el-form>
- </el-card>
-
- <!-- 缁熻鍗$墖 -->
- <div class="statistics-cards">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Box /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.totalSamples }}</div>
- <div class="stat-label">鎬绘牱鍝佹暟</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Tools /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.activeEquipment }}</div>
- <div class="stat-label">鍦ㄧ敤璁惧</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><Document /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.completedInspections }}</div>
- <div class="stat-label">宸插畬鎴愭娴�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card" shadow="hover">
- <div class="stat-content">
- <div class="stat-icon">
- <el-icon><ShoppingCart /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-number">{{ statistics.totalUsage }}</div>
- <div class="stat-label">鎬婚鐢ㄦ鏁�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鍥捐〃鍖哄煙 -->
- <div class="charts-container">
- <el-row :gutter="20">
- <!-- 鏍峰搧杩涘害鍥捐〃 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>鏍峰搧杩涘害缁熻</span>
- <el-button link @click="refreshSampleChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="sampleChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
-
- <!-- 璁惧浣跨敤鍥捐〃 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>璁惧浣跨敤鐜囩粺璁�</span>
- <el-button link @click="refreshEquipmentChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="equipmentChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
- </el-row>
-
- <el-row :gutter="20" style="margin-top: 20px;">
- <!-- 妫�娴嬮」鐩粺璁� -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>妫�娴嬮」鐩垎甯�</span>
- <el-button link @click="refreshInspectionChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="inspectionChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
-
- <!-- 棰嗙敤璁板綍瓒嬪娍 -->
- <el-col :span="12">
- <el-card class="chart-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>棰嗙敤璁板綍瓒嬪娍</span>
- <el-button link @click="refreshUsageChart">鍒锋柊</el-button>
- </div>
- </template>
- <div ref="usageChartRef" class="chart-container"></div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璇︾粏鏁版嵁琛ㄦ牸 -->
- <el-card class="table-card" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>璇︾粏鏁版嵁</span>
- <div>
- <el-button type="primary" size="small" @click="refreshTable">鍒锋柊</el-button>
- <el-button type="success" size="small" @click="exportTable">瀵煎嚭</el-button>
- </div>
- </div>
- </template>
-
- <el-table
- :data="tableData"
- style="width: 100%"
- v-loading="tableLoading"
- stripe
- border
- >
- <el-table-column prop="id" label="缂栧彿" width="80" />
- <el-table-column prop="name" label="鍚嶇О" />
- <el-table-column prop="type" label="绫诲瀷" width="120" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="progress" label="杩涘害" width="120">
- <template #default="scope">
- <el-progress :percentage="scope.row.progress" :status="getProgressStatus(scope.row.progress)" />
- </template>
- </el-table-column>
- <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
- <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
- <el-table-column label="鎿嶄綔" width="150" fixed="right">
- <template #default="scope">
- <el-button link size="small" @click="viewDetail(scope.row)">鏌ョ湅</el-button>
- <el-button link size="small" @click="editItem(scope.row)">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <div class="pagination-container">
- <el-pagination
- v-model:current-page="pagination.currentPage"
- v-model:page-size="pagination.pageSize"
- :page-sizes="[10, 20, 50, 100]"
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </el-card>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import * as echarts from 'echarts'
-import { Box, Tools, Document, ShoppingCart } from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const filterForm = reactive({
- dateRange: [],
- reportType: 'sample'
-})
-
-const statistics = reactive({
- totalSamples: 1250,
- activeEquipment: 45,
- completedInspections: 890,
- totalUsage: 2340
-})
-
-const tableData = ref([])
-const tableLoading = ref(false)
-const pagination = reactive({
- currentPage: 1,
- pageSize: 20,
- total: 0
-})
-
-// 鍥捐〃寮曠敤
-const sampleChartRef = ref(null)
-const equipmentChartRef = ref(null)
-const inspectionChartRef = ref(null)
-const usageChartRef = ref(null)
-
-// 鍥捐〃瀹炰緥
-let sampleChart = null
-let equipmentChart = null
-let inspectionChart = null
-let usageChart = null
-
-// 鍒濆鍖栨暟鎹�
-const initData = () => {
- // 妯℃嫙琛ㄦ牸鏁版嵁
- tableData.value = [
- {
- id: 'SP001',
- name: '鏍峰搧A-001',
- type: '閲戝睘鏉愭枡',
- status: '妫�娴嬩腑',
- progress: 75,
- createTime: '2025-01-15 09:30:00',
- updateTime: '2025-01-20 14:20:00'
- },
- {
- id: 'SP002',
- name: '鏍峰搧B-002',
- type: '濉戞枡鍒跺搧',
- status: '宸插畬鎴�',
- progress: 100,
- createTime: '2025-01-10 10:15:00',
- updateTime: '2025-01-18 16:45:00'
- },
- {
- id: 'SP003',
- name: '鏍峰搧C-003',
- type: '鐢靛瓙鍏冧欢',
- status: '寰呮娴�',
- progress: 0,
- createTime: '2025-01-22 08:45:00',
- updateTime: '2025-01-22 08:45:00'
- },
- {
- id: 'EQ001',
- name: '妫�娴嬭澶嘇',
- type: '鍏夎氨浠�',
- status: '浣跨敤涓�',
- progress: 60,
- createTime: '2025-01-05 14:20:00',
- updateTime: '2025-01-20 11:30:00'
- },
- {
- id: 'EQ002',
- name: '妫�娴嬭澶嘊',
- type: '鏄惧井闀�',
- status: '绌洪棽',
- progress: 0,
- createTime: '2025-01-08 16:10:00',
- updateTime: '2025-01-19 09:15:00'
- }
- ]
-
- pagination.total = tableData.value.length
-}
-
-// 鍒濆鍖栨牱鍝佽繘搴﹀浘琛�
-const initSampleChart = () => {
- if (sampleChartRef.value) {
- sampleChart = echarts.init(sampleChartRef.value)
- const option = {
- title: {
- show: false
- },
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b}: {c} ({d}%)'
- },
- legend: {
- orient: 'vertical',
- left: 'left'
- },
- series: [
- {
- name: '鏍峰搧鐘舵��',
- type: 'pie',
- radius: ['40%', '70%'],
- avoidLabelOverlap: false,
- label: {
- show: false,
- position: 'center'
- },
- emphasis: {
- label: {
- show: true,
- fontSize: '18',
- fontWeight: 'bold'
- }
- },
- labelLine: {
- show: false
- },
- data: [
- { value: 450, name: '宸插畬鎴�' },
- { value: 320, name: '妫�娴嬩腑' },
- { value: 280, name: '寰呮娴�' },
- { value: 200, name: '宸叉殏鍋�' }
- ]
- }
- ]
- }
- sampleChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栬澶囦娇鐢ㄥ浘琛�
-const initEquipmentChart = () => {
- if (equipmentChartRef.value) {
- equipmentChart = echarts.init(equipmentChartRef.value)
- const option = {
- title: {
- show: false
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'shadow'
- }
- },
- xAxis: {
- type: 'category',
- data: ['鍏夎氨浠�', '鏄惧井闀�', '纭害璁�', '鎷夊姏鏈�', '鍐插嚮鏈�', '閲戠浉浠�']
- },
- yAxis: {
- type: 'value',
- name: '浣跨敤鐜�(%)'
- },
- series: [
- {
- name: '浣跨敤鐜�',
- type: 'bar',
- data: [85, 60, 75, 90, 45, 70],
- itemStyle: {
- color: function(params) {
- const colors = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C', '#909399', '#9C27B0']
- return colors[params.dataIndex]
- }
- }
- }
- ]
- }
- equipmentChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栨娴嬮」鐩浘琛�
-const initInspectionChart = () => {
- if (inspectionChartRef.value) {
- inspectionChart = echarts.init(inspectionChartRef.value)
- const option = {
- title: {
- show: false
- },
- tooltip: {
- trigger: 'item'
- },
- legend: {
- orient: 'vertical',
- left: 'left'
- },
- series: [
- {
- name: '妫�娴嬮」鐩�',
- type: 'pie',
- radius: '50%',
- data: [
- { value: 335, name: '鐗╃悊鎬ц兘' },
- { value: 310, name: '鍖栧鍒嗘瀽' },
- { value: 234, name: '灏哄娴嬮噺' },
- { value: 135, name: '澶栬妫�鏌�' },
- { value: 148, name: '鍏朵粬妫�娴�' }
- ],
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: 'rgba(0, 0, 0, 0.5)'
- }
- }
- }
- ]
- }
- inspectionChart.setOption(option)
- }
-}
-
-// 鍒濆鍖栭鐢ㄨ褰曞浘琛�
-const initUsageChart = () => {
- if (usageChartRef.value) {
- usageChart = echarts.init(usageChartRef.value)
- const option = {
- title: {
- show: false
- },
- tooltip: {
- trigger: 'axis'
- },
- legend: {
- data: ['棰嗙敤娆℃暟', '褰掕繕娆℃暟']
- },
- xAxis: {
- type: 'category',
- boundaryGap: false,
- data: ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�', '8鏈�', '9鏈�', '10鏈�', '11鏈�', '12鏈�']
- },
- yAxis: {
- type: 'value'
- },
- series: [
- {
- name: '棰嗙敤娆℃暟',
- type: 'line',
- stack: 'Total',
- data: [120, 132, 101, 134, 90, 230, 210, 182, 191, 234, 290, 330]
- },
- {
- name: '褰掕繕娆℃暟',
- type: 'line',
- stack: 'Total',
- data: [110, 125, 95, 128, 85, 220, 200, 175, 185, 225, 280, 320]
- }
- ]
- }
- usageChart.setOption(option)
- }
-}
-
-// 浜嬩欢澶勭悊鍑芥暟
-const handleFilterChange = () => {
- ElMessage.success('绛涢�夋潯浠跺凡鏇存柊')
- // 杩欓噷鍙互鏍规嵁绛涢�夋潯浠堕噸鏂板姞杞芥暟鎹�
-}
-
-const resetFilter = () => {
- filterForm.dateRange = []
- filterForm.reportType = 'sample'
- ElMessage.info('绛涢�夋潯浠跺凡閲嶇疆')
-}
-
-const exportReport = () => {
- ElMessage.success('鎶ヨ〃瀵煎嚭鍔熻兘寮�鍙戜腑...')
-}
-
-const refreshSampleChart = () => {
- initSampleChart()
- ElMessage.success('鏍峰搧杩涘害鍥捐〃宸插埛鏂�')
-}
-
-const refreshEquipmentChart = () => {
- initEquipmentChart()
- ElMessage.success('璁惧浣跨敤鍥捐〃宸插埛鏂�')
-}
-
-const refreshInspectionChart = () => {
- initInspectionChart()
- ElMessage.success('妫�娴嬮」鐩浘琛ㄥ凡鍒锋柊')
-}
-
-const refreshUsageChart = () => {
- initUsageChart()
- ElMessage.success('棰嗙敤璁板綍鍥捐〃宸插埛鏂�')
-}
-
-const refreshTable = () => {
- tableLoading.value = true
- setTimeout(() => {
- tableLoading.value = false
- ElMessage.success('琛ㄦ牸鏁版嵁宸插埛鏂�')
- }, 1000)
-}
-
-const exportTable = () => {
- ElMessage.success('琛ㄦ牸瀵煎嚭鍔熻兘寮�鍙戜腑...')
-}
-
-const handleSizeChange = (val) => {
- pagination.pageSize = val
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val
- // 閲嶆柊鍔犺浇鏁版嵁
-}
-
-const getStatusType = (status) => {
- const statusMap = {
- '宸插畬鎴�': 'success',
- '妫�娴嬩腑': 'warning',
- '寰呮娴�': 'info',
- '宸叉殏鍋�': 'danger',
- '浣跨敤涓�': 'primary',
- '绌洪棽': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-const getProgressStatus = (progress) => {
- if (progress === 100) return 'success'
- if (progress >= 80) return 'warning'
- if (progress >= 50) return ''
- return 'exception'
-}
-
-const viewDetail = (row) => {
- ElMessage.info(`鏌ョ湅璇︽儏: ${row.name}`)
-}
-
-const editItem = (row) => {
- ElMessage.info(`缂栬緫椤圭洰: ${row.name}`)
-}
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initData()
- nextTick(() => {
- initSampleChart()
- initEquipmentChart()
- initInspectionChart()
- initUsageChart()
- })
-
- // 鐩戝惉绐楀彛澶у皬鍙樺寲锛岄噸鏂拌皟鏁村浘琛ㄥぇ灏�
- window.addEventListener('resize', () => {
- sampleChart?.resize()
- equipmentChart?.resize()
- inspectionChart?.resize()
- usageChart?.resize()
- })
-})
-</script>
-
-<style scoped>
-.report-management {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- margin-bottom: 20px;
- text-align: center;
-}
-
-.page-header h2 {
- color: #303133;
- margin-bottom: 8px;
- font-size: 24px;
- font-weight: 600;
-}
-
-.page-header p {
- color: #909399;
- font-size: 14px;
- margin: 0;
-}
-
-.filter-card {
- margin-bottom: 20px;
-}
-
-.statistics-cards {
- margin-bottom: 20px;
-}
-
-.stat-card {
- height: 120px;
-}
-
-.stat-content {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.stat-icon {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 20px;
- font-size: 24px;
- color: white;
-}
-
-.stat-card:nth-child(1) .stat-icon {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-}
-
-.stat-card:nth-child(2) .stat-icon {
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
-}
-
-.stat-card:nth-child(3) .stat-icon {
- background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
-}
-
-.stat-card:nth-child(4) .stat-icon {
- background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
-}
-
-.stat-info {
- flex: 1;
-}
-
-.stat-number {
- font-size: 28px;
- font-weight: bold;
- color: #303133;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #909399;
-}
-
-.charts-container {
- margin-bottom: 20px;
-}
-
-.chart-card {
- margin-bottom: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.chart-container {
- height: 300px;
- width: 100%;
-}
-
-.table-card {
- margin-bottom: 20px;
-}
-
-.pagination-container {
- margin-top: 20px;
- text-align: right;
-}
-
-:deep(.el-card__header) {
- padding: 15px 20px;
- border-bottom: 1px solid #ebeef5;
- background-color: #fafafa;
-}
-
-:deep(.el-card__body) {
- padding: 20px;
-}
-
-:deep(.el-table) {
- margin-bottom: 20px;
-}
-
-:deep(.el-progress) {
- margin: 0;
-}
-
-:deep(.el-tag) {
- margin: 0;
-}
-</style>
diff --git a/src/views/reportAnalysis/taxComparison/index.vue b/src/views/reportAnalysis/taxComparison/index.vue
deleted file mode 100644
index a97ca4f..0000000
--- a/src/views/reportAnalysis/taxComparison/index.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏃ユ湡">
- <el-date-picker
- style="width: 240px"
- v-model="filters.month"
- value-format="YYYY-MM"
- format="YYYY-MM"
- type="month"
- placeholder="閫夋嫨鏈堜唤"
- clearable
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @pagination="changePage"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { onMounted } from "vue";
-import { getTaxList } from "@/api/procurementManagement/taxComparison";
-
-defineOptions({
- name: "澧炲�肩◣姣斿",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getTaxList,
- {
- month: [], // 鏉ョエ鏃ユ湡
- },
- [
- {
- label: "鏈堜唤",
- prop: "month",
- align: "center",
- },
- {
- label: "閿�椤圭◣棰�",
- prop: "jtaxAmount",
- align: "center",
- },
- {
- label: "杩涢」绋庨",
- prop: "xtaxAmount",
- align: "center",
- },
- {
- label: "閿�-杩�",
- prop: "taxAmount",
- align: "center",
- },
- ],
- {}
-);
-
-const changePage = ({ page }) => {
- pagination.currentPage = page;
- onCurrentChange(page);
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/customerManagement/index.vue b/src/views/salesManagement/customerManagement/index.vue
deleted file mode 100644
index f66b5f4..0000000
--- a/src/views/salesManagement/customerManagement/index.vue
+++ /dev/null
@@ -1,423 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.name"
- placeholder="璇疯緭鍏ュ鎴峰悕绉�"
- clearable
- @keyup.enter="handleSearch"
- >
- <template #prefix>
- <el-icon><Search /></el-icon>
- </template>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.region" placeholder="璇烽�夋嫨鍖哄煙" clearable>
- <el-option label="鍗庝笢鍖�" value="鍗庝笢鍖�"></el-option>
- <el-option label="鍗庡崡鍖�" value="鍗庡崡鍖�"></el-option>
- <el-option label="鍗庡寳鍖�" value="鍗庡寳鍖�"></el-option>
- <el-option label="瑗垮崡鍖�" value="瑗垮崡鍖�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.level" placeholder="璇烽�夋嫨瀹㈡埛绛夌骇" clearable>
- <el-option label="VIP瀹㈡埛" value="VIP瀹㈡埛"></el-option>
- <el-option label="閲嶈瀹㈡埛" value="閲嶈瀹㈡埛"></el-option>
- <el-option label="鏅�氬鎴�" value="鏅�氬鎴�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button style="float: right;" type="primary" @click="handleAdd">
- 鏂板瀹㈡埛
- </el-button>
- </el-col>
- </el-row>
-
- <!-- 瀹㈡埛鍒楄〃 -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="name" label="瀹㈡埛鍚嶇О" width="150" />
- <el-table-column prop="contactPerson" label="鑱旂郴浜�" width="100" />
- <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="140" />
- <el-table-column prop="email" label="閭" />
- <el-table-column prop="region" label="鍖哄煙" width="100" />
- <el-table-column prop="level" label="瀹㈡埛绛夌骇" width="100">
- <template #default="scope">
- <el-tag :type="getLevelType(scope.row.level)">
- {{ scope.row.level }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="salesperson" label="璐熻矗涓氬姟鍛�" width="120" />
- <el-table-column prop="status" label="鐘舵��" width="80">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center">
- <template #default="scope">
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="primary" @click="handleAllocation(scope.row)">鍒嗛厤</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鎴峰悕绉�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴浜�" prop="contactPerson">
- <el-input v-model="form.contactPerson" placeholder="璇疯緭鍏ヨ仈绯讳汉"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閭" prop="email">
- <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍖哄煙" prop="region">
- <el-select v-model="form.region" placeholder="璇烽�夋嫨鍖哄煙" style="width: 100%">
- <el-option label="鍗庝笢鍖�" value="鍗庝笢鍖�"></el-option>
- <el-option label="鍗庡崡鍖�" value="鍗庡崡鍖�"></el-option>
- <el-option label="鍗庡寳鍖�" value="鍗庡寳鍖�"></el-option>
- <el-option label="瑗垮崡鍖�" value="瑗垮崡鍖�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛绛夌骇" prop="level">
- <el-select v-model="form.level" placeholder="璇烽�夋嫨瀹㈡埛绛夌骇" style="width: 100%">
- <el-option label="VIP瀹㈡埛" value="VIP瀹㈡埛"></el-option>
- <el-option label="閲嶈瀹㈡埛" value="閲嶈瀹㈡埛"></el-option>
- <el-option label="鏅�氬鎴�" value="鏅�氬鎴�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璐熻矗涓氬姟鍛�" prop="salesperson">
- <el-select v-model="form.salesperson" placeholder="璇烽�夋嫨涓氬姟鍛�" style="width: 100%">
- <el-option label="闄堝織寮�" value="闄堝織寮�"></el-option>
- <el-option label="鍒橀泤濠�" value="鍒橀泤濠�"></el-option>
- <el-option label="鐜嬪缓鍥�" value="鐜嬪缓鍥�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="娲昏穬" value="娲昏穬"></el-option>
- <el-option label="娼滃湪" value="娼滃湪"></el-option>
- <el-option label="娴佸け" value="娴佸け"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 瀹㈡埛鍒嗛厤瀵硅瘽妗� -->
- <el-dialog v-model="allocationDialogVisible" title="瀹㈡埛鍒嗛厤" width="500px">
- <el-form label-width="100px">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <span>{{ currentCustomer.name }}</span>
- </el-form-item>
- <el-form-item label="褰撳墠涓氬姟鍛�">
- <span>{{ currentCustomer.salesperson }}</span>
- </el-form-item>
- <el-form-item label="閲嶆柊鍒嗛厤">
- <el-select v-model="newSalesperson" placeholder="璇烽�夋嫨鏂颁笟鍔″憳" style="width: 100%">
- <el-option label="闄堝織寮�" value="闄堝織寮�"></el-option>
- <el-option label="鍒橀泤濠�" value="鍒橀泤濠�"></el-option>
- <el-option label="鐜嬪缓鍥�" value="鐜嬪缓鍥�"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="鍒嗛厤鍘熷洜">
- <el-input v-model="allocationReason" type="textarea" rows="3" placeholder="璇疯緭鍏ュ垎閰嶅師鍥�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="allocationDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="saveAllocation">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- name: '',
- region: '',
- level: ''
-})
-
-const customerList = ref([
- {
- id: 1,
- name: '涓婃捣绉戞妧鏈夐檺鍏徃',
- contactPerson: '闄堝織寮�',
- phone: '021-12345678',
- email: 'zhang@shanghai-tech.com',
- region: '鍗庝笢鍖�',
- level: 'VIP瀹㈡埛',
- salesperson: '闄堝織寮�',
- status: '娲昏穬'
- },
- {
- id: 2,
- name: '娣卞湷鐢靛瓙鏈夐檺鍏徃',
- contactPerson: '鍒橀泤濠�',
- phone: '0755-87654321',
- email: 'li@shenzhen-elec.com',
- region: '鍗庡崡鍖�',
- level: '閲嶈瀹㈡埛',
- salesperson: '鍒橀泤濠�',
- status: '娲昏穬'
- },
- {
- id: 3,
- name: '鍖椾含璐告槗鍏徃',
- contactPerson: '鐜嬪缓鍥�',
- phone: '010-11223344',
- email: 'wang@beijing-trade.com',
- region: '鍗庡寳鍖�',
- level: '鏅�氬鎴�',
- salesperson: '鐜嬪缓鍥�',
- status: '娼滃湪'
- }
-])
-
-const pagination = reactive({
- total: 3,
- currentPage: 1,
- pageSize: 10
-})
-
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板瀹㈡埛')
-const form = reactive({
- name: '',
- contactPerson: '',
- phone: '',
- email: '',
- region: '',
- level: '',
- salesperson: '',
- status: '娲昏穬'
-})
-
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ鎴峰悕绉�', trigger: 'blur' }],
- contactPerson: [{ required: true, message: '璇疯緭鍏ヨ仈绯讳汉', trigger: 'blur' }],
- phone: [{ required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' }],
- email: [{ required: true, message: '璇疯緭鍏ラ偖绠�', trigger: 'blur' }],
- region: [{ required: true, message: '璇烽�夋嫨鍖哄煙', trigger: 'change' }],
- level: [{ required: true, message: '璇烽�夋嫨瀹㈡埛绛夌骇', trigger: 'change' }],
- salesperson: [{ required: true, message: '璇烽�夋嫨涓氬姟鍛�', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const allocationDialogVisible = ref(false)
-const currentCustomer = ref({})
-const newSalesperson = ref('')
-const allocationReason = ref('')
-const formRef = ref()
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = customerList.value
- if (searchForm.name) {
- list = list.filter(item => item.name.includes(searchForm.name))
- }
- if (searchForm.region) {
- list = list.filter(item => item.region === searchForm.region)
- }
- if (searchForm.level) {
- list = list.filter(item => item.level === searchForm.level)
- }
- return list
-})
-
-// 鏂规硶
-const getLevelType = (level) => {
- const levelMap = {
- 'VIP瀹㈡埛': 'danger',
- '閲嶈瀹㈡埛': 'warning',
- '鏅�氬鎴�': 'info'
- }
- return levelMap[level] || 'info'
-}
-
-const getStatusType = (status) => {
- const statusMap = {
- '娲昏穬': 'success',
- '娼滃湪': 'warning',
- '娴佸け': 'danger'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.name = ''
- searchForm.region = ''
- searchForm.level = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板瀹㈡埛'
- isEdit.value = false
- form.name = ''
- form.contactPerson = ''
- form.phone = ''
- form.email = ''
- form.region = ''
- form.level = ''
- form.salesperson = ''
- form.status = '娲昏穬'
- dialogVisible.value = true
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫瀹㈡埛'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ュ鎴峰悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = customerList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- customerList.value.splice(index, 1)
- pagination.total--
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handleAllocation = (row) => {
- currentCustomer.value = row
- newSalesperson.value = ''
- allocationReason.value = ''
- allocationDialogVisible.value = true
-}
-
-const saveAllocation = () => {
- if (!newSalesperson.value) {
- ElMessage.warning('璇烽�夋嫨鏂颁笟鍔″憳')
- return
- }
-
- const index = customerList.value.findIndex(item => item.id === currentCustomer.value.id)
- if (index > -1) {
- customerList.value[index].salesperson = newSalesperson.value
- ElMessage.success('瀹㈡埛鍒嗛厤鎴愬姛')
- allocationDialogVisible.value = false
- }
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- const index = customerList.value.findIndex(item => item.id === editId.value)
- if (index > -1) {
- customerList.value[index] = { ...form, id: editId.value }
- ElMessage.success('缂栬緫鎴愬姛')
- }
- } else {
- // 鏂板
- const newId = Math.max(...customerList.value.map(item => item.id)) + 1
- customerList.value.push({
- ...form,
- id: newId
- })
- pagination.total++
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
- }
- })
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val.page
- pagination.pageSize = val.limit
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
deleted file mode 100644
index 0dd6871..0000000
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ /dev/null
@@ -1,448 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm">
- <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�">
- <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О/閿�鍞悎鍚屽彿鎼滅储"
- @change="handleQuery" clearable :prefix-icon="Search" />
- </el-form-item>
- <el-form-item label="寮�绁ㄦ棩鏈�">
- <el-date-picker style="width: 240px" v-model="searchForm.invoiceDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
- @change="changeDateRange" @clear="clearRange" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡">
- <el-date-picker style="width: 100%" v-model="searchForm.createTimeStart" value-format="YYYY-MM-DD HH:mm:ss"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable @change="handleQuery" />
- </el-form-item>
- <el-form-item label="涓嶆樉绀烘湁鍙戠エ琛�">
- <el-checkbox v-model="searchForm.status" @change="handleQuery" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- <el-button @click="resetForm"> 閲嶇疆 </el-button>
- <el-button @click="handleOut" type="primary">瀵煎嚭</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
- <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip width="180" />
- <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
- <el-table-column label="椤圭洰" prop="projectName" width="320" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="160" show-overflow-tooltip />
- <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
- <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"
- width="200" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
- <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip />
- <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
- <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" />
- <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
- <template #default="scope">
- <el-button v-if="scope.row.invoiceFileName" text bg type="primary"
- @click="handleFile(scope.row.commonFiles)">
- 鏌ョ湅闄勪欢
- </el-button>
- <el-button v-else link type="primary" @click="handleDownload(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">
- 涓婁紶
- </el-button>
- </template>
- </el-table-column>
- <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">缂栬緫</el-button>
- <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" width="70%" @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" disabled></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
- <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item :label="`鍙戠エ閲戦(鍏�)锛� 鍚堝悓鎬婚(${form.taxInclusiveTotalPrice}鍏�)`" prop="invoiceTotal">
- <el-input-number :step="0.01" :min="0" :max="form.taxInclusiveTotalPrice" style="width: 100%" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson">
- <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate">
- <el-date-picker style="width: 100%" v-model="form.invoiceDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
- :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <!-- 鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
- <div class="el-upload__tip">鏂囦欢鏍煎紡鏀寔 pdf</div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog title="涓婁紶寮圭獥" width="50%" v-model="uploadModal">
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" accept=".pdf" :limit="10" style="width: 100%" :on-exceed="handleExceed"
- :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess"
- :on-remove="handleRemove">
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="commiInvoicetFile" type="primary">纭</el-button>
- <el-button @click="uploadModal = false">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { getToken } from "@/utils/auth";
-import {
- invoiceLedgerSaveOrUpdate,
- invoiceLedgerProductInfo,
- commitFile,
- registrationProductPage,
- delInvoiceLedgerByRegProductId,
-} from "../../../api/salesManagement/invoiceLedger.js";
-import useUserStore from "@/store/modules/user.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- searchText: "",
- status: false,
- invoiceDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- invoiceDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- invoiceDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
- createTimeStart: "", // 褰曞叆鏃ユ湡
- },
- form: {
- salesLedgerId: "",
- customerId: "",
- invoiceNo: "",
- invoiceTotal: "",
- taxRate: "",
- invoicePerson: "",
- invoiceDate: "",
- customerName: "",
- fileList: [],
- createTime: "", // 褰曞叆鏃ユ湡
- },
- rules: {
- salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceAmount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoicePerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerName: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const currentId = ref("");
-const userStore = useUserStore();
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/invoiceLedger/uploadFile",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-const matchFileType = ref(["pdf"]);
-const uploadModal = ref(false);
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-const formatDate = (row, column, cellValue) => {
- return dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss");
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { invoiceDate, ...rest } = searchForm;
- registrationProductPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["invoiceTotal"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 鎵撳紑寮规
-const openForm = (row) => {
- form.value = {};
- productData.value = [];
- fileList.value = [];
- currentId.value = row.id;
-
- invoiceLedgerProductInfo({ id: row.id }).then((res) => {
- form.value = { ...res.data };
- fileList.value = res.data.fileList;
- if (!form.value.invoicePerson) {
- form.value.invoicePerson = userStore.nickName;
- form.value.entryDate = getCurrentDate();
- }
- if (!form.value.invoiceDate) {
- form.value.invoiceDate = getCurrentDate();
- }
- });
- dialogFormVisible.value = true;
-};
-// 涓婁紶澶氫釜鏂囦欢灏辫鐩栧師鏉ョ殑
-const handleExceed = (files) => {
- proxy.$refs["fileUpload"].clearFiles();
- const file = files[0];
- file.uid = genFileId();
- proxy.$refs["fileUpload"].handleStart(file);
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- console.log("file", file);
- // 鏍℃鏂囦欢澶у皬
- if (file.size > 1024 * 1024 * 10) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- return false;
- }
- // 鍒ゆ柇鏂囦欢鏍煎紡鏄惁绗﹀悎
- const fileType = file.name.split(".").pop().toLowerCase();
- if (!matchFileType.value.includes(fileType)) {
- proxy.$modal.msgError("鏂囦欢鏍煎紡涓嶅尮閰�");
- return false;
- }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- proxy.$refs["fileUpload"].handleRemove(file);
- fileList.value.push(res.data);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- let index = fileList.value.findIndex((item) => item.url === file.url);
- if (index > -1) {
- fileList.value.splice(index, 1);
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.fileList = fileList.value;
- invoiceLedgerSaveOrUpdate(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/invoiceLedger/export", {}, "寮�绁ㄥ彴璐�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎵撳紑闄勪欢涓婁紶寮圭獥
-const handleDownload = (val) => {
- fileList.value = [];
- uploadModal.value = true;
- currentId.value = val.id;
-};
-
-// 纭鏂囦欢涓婁紶
-const commiInvoicetFile = () => {
- const object = {
- fileList: fileList.value,
- id: currentId.value,
- };
- commitFile(object).then((res) => {
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- uploadModal.value = false;
- }
- getList();
- currentId.value = "";
- fileList.value = [];
- });
-};
-// 鍒犻櫎寮�绁ㄥ彴璐�
-const delInvoiceLedger = (row) => {
- ElMessageBox.confirm("璇ュ彂绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delInvoiceLedgerByRegProductId(row.id).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-const changeDateRange = (date) => {
- if (date) {
- searchForm.invoiceDateStart = date[0];
- searchForm.invoiceDateEnd = date[1];
- getList();
- }
-};
-
-const handleFile = (commonFiles) => {
- commonFiles.forEach((e) => {
- proxy.$download.name(e.url);
- });
-};
-
-const clearRange = () => {
- searchForm.invoiceDate = [];
- searchForm.invoiceDateStart = undefined;
- searchForm.invoiceDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
deleted file mode 100644
index 9a2add4..0000000
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ /dev/null
@@ -1,668 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ悕绉版悳绱�"
- clearable
- :prefix-icon="Search"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="璇疯緭鍏ュ鎴峰悎鍚屽彿"
- clearable
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="璇疯緭鍏ラ」鐩悕绉�"
- clearable
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀烘湭寮�绁ㄩ噾棰濅负0"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- <el-button @click="resetForm"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="flex justify-between">
- <div></div>
- <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
- 鏂板鐧昏
- </el-button>
- </div>
- <el-table
- :data="tableData"
- :border="true"
- height="calc(100vh - 21em)"
- v-loading="tableLoading"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="150"
- />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寮�绁ㄦ暟"
- prop="invoiceNum"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceAmount"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鏈紑绁ㄦ暟"
- prop="noInvoiceNum"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="瀹㈡埛鍚堝悓鍙�"
- prop="customerContractNo"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip width="90"/>
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="220"
-
- />
- <el-table-column
- label="宸插紑绁ㄩ噾棰�(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="120"
- />
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmountTotal"
- show-overflow-tooltip
- width="120"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
- width="85%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" disabled></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="鑷姩濉厖"
- disabled
- ></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓氬姟鍛橈細" prop="salesman">
- <el-input
- v-model="form.salesman"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜�" prop="createUer">
- <el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈�" prop="issueDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.issueDate"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙风爜锛�" prop="invoiceNo">
- <el-input
- v-model="form.invoiceNo"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="150"
- />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
- <template #default="scope">
- <el-input-number :step="0.1" :min="0" style="width: 100%"
- :precision="2"
- v-model="scope.row.currentInvoiceNum"
- @change="invoiceNumBlur(scope.row)"
- ></el-input-number>
- </template>
- </el-table-column>
- <el-table-column
- label="鏈寮�绁ㄩ噾棰�(鍏�)"
- prop="currentInvoiceAmount"
- width="180"
- >
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="scope.row.currentInvoiceAmount"
- @change="invoiceAmountBlur(scope.row)"
- ></el-input-number>
- </template>
- </el-table-column>
- <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
- <template #default="scope">
- <el-input
- type="number"
- min="0"
- disabled
- v-model="scope.row.noInvoiceNum"
- ></el-input>
- </template>
- </el-table-column>
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmount"
- width="200"
- >
- <template #default="scope">
- <el-input
- type="number"
- min="0"
- disabled
- v-model="scope.row.noInvoiceAmount"
- :formatter="formattedInputNumber"
- :precision="2"
- :step="0.01"
- ></el-input>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="register" width="100">
- <!-- <template #default="{ row }">
- <el-input
- v-model="row.register"
- placeholder="璇疯緭鍏ョ櫥璁颁汉"
- disabled
- />
- </template> -->
- </el-table-column>
- <el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
- <!-- <template #default="{ row }">
- <el-date-picker
- style="width: 100%"
- v-model="row.registerDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </template> -->
- </el-table-column>
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-// import {userListNoPage} from "@/api/system/user.js";
-import {
- getSalesLedgerWithProducts,
- ledgerListPage,
- productList,
-} from "@/api/salesManagement/salesLedger.js";
-import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- customerName: "",
- status: false,
- customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
- projectName: undefined, // 椤圭洰鍚嶇О
- createUer: undefined, // 鐧昏浜�
- issueDate: undefined, // 寮�绁ㄦ棩鏈�
- createTime: undefined, // 褰曞叆鏃ユ湡锛�
- },
- form: {
- salesLedgerId: "",
- customerName: "",
- salesman: "",
- projectName: "",
- productData: [],
- invoiceNo: "",
- createUer: userStore.nickName,
- issueDate: dayjs().format("YYYY-MM-DD"),
- },
- rules: {
- salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
- issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-
-const formattedNumber = (row, column, cellValue) => {
- if (cellValue == 0) {
- return parseFloat(cellValue).toFixed(2);
- }
- if (cellValue) {
- return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
- }
-};
-
-const formattedInputNumber = (value) => {
- return value ? parseFloat(value).toFixed(2) : 0;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- ledgerListPage({ ...searchForm, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- total.value = res.total;
- expandedRowKeys.value = [];
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- console.log("selection", selection);
- selectedRows.value = selection.filter(
- (item) => item.salesContractNo !== undefined
- );
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "invoiceTotal",
- "noInvoiceAmountTotal",
- ]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "invoiceNum",
- "invoiceAmount",
- "currentInvoiceAmount",
- "noInvoiceNum",
- "noInvoiceAmount",
- "currentInvoiceNum",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
- // 鍒ゆ柇鏄惁澶氶��
- if (selectedRows.value.length != 1) {
- proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
- return;
- }
- form.value = {};
- productData.value = [];
- getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
- form.value = { ...res };
- form.value.createTime = dayjs().format("YYYY-MM-DD");
- form.value.issueDate = dayjs().format("YYYY-MM-DD");
- form.value.createUer = userStore.nickName;
- productData.value = form.value.productData.map((item) => {
- return item;
- });
- dialogFormVisible.value = true;
- console.log("productData.value ", productData.value);
- });
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.productData = proxy.HaveJson(productData.value);
- invoiceRegistrationSave(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-//鏈寮�绁ㄥけ鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.currentInvoiceNum) {
- row.currentInvoiceNum = 0;
- }
- if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.currentInvoiceNum = 0;
- }
- // 璁$畻鏈寮�绁ㄩ噾棰�
- row.currentInvoiceAmount = (
- row.currentInvoiceNum * row.taxInclusiveUnitPrice
- ).toFixed(2);
- // 璁$畻鏈紑绁ㄦ暟
- row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
- 2
- );
- // 璁$畻鏈紑绁ㄩ噾棰�
- row.noInvoiceAmount = (
- row.tempnoInvoiceAmount - row.currentInvoiceAmount
- ).toFixed(2);
-};
-// 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
-const invoiceAmountBlur = (row) => {
- if (!row.currentInvoiceAmount) {
- row.currentInvoiceAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
- if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
- proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
- row.currentInvoiceAmount = 0;
- }
- // 璁$畻鏈寮�绁ㄦ暟
- row.currentInvoiceNum = (
- row.currentInvoiceAmount / row.taxInclusiveUnitPrice
- ).toFixed(2);
- console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
- console.log(" row.originalNoInvoiceNum ", row.originalNoInvoiceNum);
- // 璁$畻鏈紑绁ㄦ暟
- row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
- 2
- );
- // 璁$畻鏈紑绁ㄩ噾棰�
- row.noInvoiceAmount = (
- row.tempnoInvoiceAmount - row.currentInvoiceAmount
- ).toFixed(2);
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-.flex {
- display: flex;
-}
-.justify-between {
- justify-content: space-between;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-</style>
diff --git a/src/views/salesManagement/orderManagement/index.vue b/src/views/salesManagement/orderManagement/index.vue
deleted file mode 100644
index aac840f..0000000
--- a/src/views/salesManagement/orderManagement/index.vue
+++ /dev/null
@@ -1,495 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.orderNo"
- placeholder="璇疯緭鍏ヨ鍗曞彿"
- clearable
- @keyup.enter="handleSearch"
- >
- <template #prefix>
- <el-icon><Search /></el-icon>
- </template>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.customer" placeholder="璇烽�夋嫨瀹㈡埛" clearable>
- <el-option label="涓婃捣绉戞妧鏈夐檺鍏徃" value="涓婃捣绉戞妧鏈夐檺鍏徃"></el-option>
- <el-option label="娣卞湷鐢靛瓙鏈夐檺鍏徃" value="娣卞湷鐢靛瓙鏈夐檺鍏徃"></el-option>
- <el-option label="鍖椾含璐告槗鍏徃" value="鍖椾含璐告槗鍏徃"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨璁㈠崟鐘舵��" clearable>
- <el-option label="寰呭鏍�" value="寰呭鏍�"></el-option>
- <el-option label="宸插鏍�" value="宸插鏍�"></el-option>
- <el-option label="宸插彂璐�" value="宸插彂璐�"></el-option>
- <el-option label="宸插畬鎴�" value="宸插畬鎴�"></el-option>
- <el-option label="宸插彇娑�" value="宸插彇娑�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button style="float: right;" type="primary" @click="handleAdd">
- 鏂板璁㈠崟
- </el-button>
- </el-col>
- </el-row>
-
- <!-- 璁㈠崟鍒楄〃 -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="orderNo" label="璁㈠崟鍙�" width="150" />
- <el-table-column prop="customer" label="瀹㈡埛鍚嶇О" />
- <el-table-column prop="salesperson" label="涓氬姟鍛�" width="100" />
- <el-table-column prop="orderDate" label="涓嬪崟鏃ユ湡" width="120" />
- <el-table-column prop="amount" label="璁㈠崟閲戦" width="120">
- <template #default="scope">
- 楼{{ scope.row.amount.toFixed(2) }}
- </template>
- </el-table-column>
- <el-table-column prop="paymentMethod" label="浠樻鏂瑰紡" width="120" />
- <el-table-column prop="status" label="璁㈠崟鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="250" fixed="right" align="center">
- <template #default="scope">
- <el-button link type="primary" @click="handleView(scope.row)">鏌ョ湅</el-button>
- <el-button link type="primary" @click="handleEdit(scope.row)" v-if="scope.row.status === '寰呭鏍�'">缂栬緫</el-button>
- <el-button link type="primary" @click="handleReview(scope.row)" v-if="scope.row.status === '寰呭鏍�'">瀹℃牳</el-button>
- <el-button link type="primary" @click="handleTransfer(scope.row)" v-if="scope.row.status === '宸插鏍�'">杞崟</el-button>
- <el-button link type="danger" @click="handleCancel(scope.row)" v-if="scope.row.status === '寰呭鏍�'">鍙栨秷</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О" prop="customer">
- <el-select v-model="form.customer" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%">
- <el-option label="涓婃捣绉戞妧鏈夐檺鍏徃" value="涓婃捣绉戞妧鏈夐檺鍏徃"></el-option>
- <el-option label="娣卞湷鐢靛瓙鏈夐檺鍏徃" value="娣卞湷鐢靛瓙鏈夐檺鍏徃"></el-option>
- <el-option label="鍖椾含璐告槗鍏徃" value="鍖椾含璐告槗鍏徃"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓氬姟鍛�" prop="salesperson">
- <el-select v-model="form.salesperson" placeholder="璇烽�夋嫨涓氬姟鍛�" style="width: 100%">
- <el-option label="闄堝織寮�" value="闄堝織寮�"></el-option>
- <el-option label="鍒橀泤濠�" value="鍒橀泤濠�"></el-option>
- <el-option label="鐜嬪缓鍥�" value="鐜嬪缓鍥�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁㈠崟鏃ユ湡" prop="orderDate">
- <el-date-picker
- v-model="form.orderDate"
- type="date"
- placeholder="閫夋嫨璁㈠崟鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁㈠崟閲戦" prop="amount">
- <el-input-number v-model="form.amount" :precision="2" :min="0" style="width: 100%"></el-input-number>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
- <el-select v-model="form.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%">
- <el-option label="鍏ㄦ鍒颁粯" value="鍏ㄦ鍒颁粯"></el-option>
- <el-option label="鍒嗘湡浠樻" value="鍒嗘湡浠樻"></el-option>
- <el-option label="鏈堢粨" value="鏈堢粨"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁㈠崟鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="寰呭鏍�" value="寰呭鏍�"></el-option>
- <el-option label="宸插鏍�" value="宸插鏍�"></el-option>
- <el-option label="宸插彂璐�" value="宸插彂璐�"></el-option>
- <el-option label="宸插畬鎴�" value="宸插畬鎴�"></el-option>
- <el-option label="宸插彇娑�" value="宸插彇娑�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" rows="3"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 璁㈠崟瀹℃牳瀵硅瘽妗� -->
- <el-dialog v-model="reviewDialogVisible" title="璁㈠崟瀹℃牳" width="500px">
- <el-form label-width="100px">
- <el-form-item label="璁㈠崟鍙�">
- <span>{{ currentOrder.orderNo }}</span>
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚嶇О">
- <span>{{ currentOrder.customer }}</span>
- </el-form-item>
- <el-form-item label="璁㈠崟閲戦">
- <span>楼{{ currentOrder.amount.toFixed(2) }}</span>
- </el-form-item>
- <el-form-item label="瀹℃牳缁撴灉" prop="reviewResult">
- <el-radio-group v-model="reviewResult">
- <el-radio label="閫氳繃">閫氳繃</el-radio>
- <el-radio label="鎷掔粷">鎷掔粷</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="瀹℃牳鎰忚" prop="reviewComment">
- <el-input type="textarea" v-model="reviewComment" rows="3" placeholder="璇疯緭鍏ュ鏍告剰瑙�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="reviewDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="saveReview">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 璁㈠崟杞崟瀵硅瘽妗� -->
- <el-dialog v-model="transferDialogVisible" title="璁㈠崟杞崟" width="500px">
- <el-form label-width="100px">
- <el-form-item label="璁㈠崟鍙�">
- <span>{{ currentOrder.orderNo }}</span>
- </el-form-item>
- <el-form-item label="褰撳墠涓氬姟鍛�">
- <span>{{ currentOrder.salesperson }}</span>
- </el-form-item>
- <el-form-item label="杞崟缁�" prop="newSalesperson">
- <el-select v-model="newSalesperson" placeholder="璇烽�夋嫨鏂颁笟鍔″憳" style="width: 100%">
- <el-option label="闄堝織寮�" value="闄堝織寮�"></el-option>
- <el-option label="鍒橀泤濠�" value="鍒橀泤濠�"></el-option>
- <el-option label="鐜嬪缓鍥�" value="鐜嬪缓鍥�"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="杞崟鍘熷洜" prop="transferReason">
- <el-input type="textarea" v-model="transferReason" rows="3" placeholder="璇疯緭鍏ヨ浆鍗曞師鍥�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="transferDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="saveTransfer">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- orderNo: '',
- customer: '',
- status: ''
-})
-
-const orderList = ref([
- {
- id: 1,
- orderNo: 'ORD202312001',
- customer: '涓婃捣绉戞妧鏈夐檺鍏徃',
- salesperson: '闄堝織寮�',
- orderDate: '2023-12-01',
- amount: 50000.00,
- paymentMethod: '鍏ㄦ鍒颁粯',
- status: '寰呭鏍�',
- remark: '閲嶈瀹㈡埛璁㈠崟'
- },
- {
- id: 2,
- orderNo: 'ORD202312002',
- customer: '娣卞湷鐢靛瓙鏈夐檺鍏徃',
- salesperson: '鍒橀泤濠�',
- orderDate: '2023-12-02',
- amount: 35000.00,
- paymentMethod: '鍒嗘湡浠樻',
- status: '宸插鏍�',
- remark: '甯歌璁㈠崟'
- },
- {
- id: 3,
- orderNo: 'ORD202312003',
- customer: '鍖椾含璐告槗鍏徃',
- salesperson: '鐜嬪缓鍥�',
- orderDate: '2023-12-03',
- amount: 28000.00,
- paymentMethod: '鏈堢粨',
- status: '宸插彂璐�',
- remark: '鏂板鎴疯鍗�'
- }
-])
-
-const pagination = reactive({
- total: 3,
- currentPage: 1,
- pageSize: 10
-})
-
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板璁㈠崟')
-const form = reactive({
- customer: '',
- salesperson: '',
- orderDate: '',
- amount: 0,
- paymentMethod: '',
- status: '寰呭鏍�',
- remark: ''
-})
-
-const rules = {
- customer: [{ required: true, message: '璇烽�夋嫨瀹㈡埛', trigger: 'change' }],
- salesperson: [{ required: true, message: '璇烽�夋嫨涓氬姟鍛�', trigger: 'change' }],
- orderDate: [{ required: true, message: '璇烽�夋嫨璁㈠崟鏃ユ湡', trigger: 'change' }],
- amount: [{ required: true, message: '璇疯緭鍏ヨ鍗曢噾棰�', trigger: 'blur' }],
- paymentMethod: [{ required: true, message: '璇烽�夋嫨浠樻鏂瑰紡', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const reviewDialogVisible = ref(false)
-const transferDialogVisible = ref(false)
-const currentOrder = ref({})
-const reviewResult = ref('')
-const reviewComment = ref('')
-const newSalesperson = ref('')
-const transferReason = ref('')
-const formRef = ref()
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = orderList.value
- if (searchForm.orderNo) {
- list = list.filter(item => item.orderNo.includes(searchForm.orderNo))
- }
- if (searchForm.customer) {
- list = list.filter(item => item.customer === searchForm.customer)
- }
- if (searchForm.status) {
- list = list.filter(item => item.status === searchForm.status)
- }
- return list
-})
-
-// 鏂规硶
-const getStatusType = (status) => {
- const statusMap = {
- '寰呭鏍�': 'warning',
- '宸插鏍�': 'primary',
- '宸插彂璐�': 'success',
- '宸插畬鎴�': 'success',
- '宸插彇娑�': 'danger'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.orderNo = ''
- searchForm.customer = ''
- searchForm.status = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板璁㈠崟'
- isEdit.value = false
- form.customer = ''
- form.salesperson = ''
- form.orderDate = ''
- form.amount = 0
- form.paymentMethod = ''
- form.status = '寰呭鏍�'
- form.remark = ''
- dialogVisible.value = true
-}
-
-const handleView = (row) => {
- // 鏌ョ湅璁㈠崟璇︽儏
- ElMessage.info('鏌ョ湅璁㈠崟璇︽儏鍔熻兘寰呭疄鐜�')
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫璁㈠崟'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleReview = (row) => {
- currentOrder.value = row
- reviewResult.value = ''
- reviewComment.value = ''
- reviewDialogVisible.value = true
-}
-
-const handleTransfer = (row) => {
- currentOrder.value = row
- newSalesperson.value = ''
- transferReason.value = ''
- transferDialogVisible.value = true
-}
-
-const handleCancel = (row) => {
- ElMessageBox.confirm('纭鍙栨秷璇ヨ鍗曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = orderList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- orderList.value[index].status = '宸插彇娑�'
- ElMessage.success('璁㈠崟宸插彇娑�')
- }
- })
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ヨ鍗曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = orderList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- orderList.value.splice(index, 1)
- pagination.total--
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const saveReview = () => {
- if (!reviewResult.value) {
- ElMessage.warning('璇烽�夋嫨瀹℃牳缁撴灉')
- return
- }
-
- const index = orderList.value.findIndex(item => item.id === currentOrder.value.id)
- if (index > -1) {
- if (reviewResult.value === '閫氳繃') {
- orderList.value[index].status = '宸插鏍�'
- ElMessage.success('璁㈠崟瀹℃牳閫氳繃')
- } else {
- orderList.value[index].status = '宸插彇娑�'
- ElMessage.success('璁㈠崟瀹℃牳鎷掔粷')
- }
- reviewDialogVisible.value = false
- }
-}
-
-const saveTransfer = () => {
- if (!newSalesperson.value) {
- ElMessage.warning('璇烽�夋嫨鏂颁笟鍔″憳')
- return
- }
-
- const index = orderList.value.findIndex(item => item.id === currentOrder.value.id)
- if (index > -1) {
- orderList.value[index].salesperson = newSalesperson.value
- ElMessage.success('璁㈠崟杞崟鎴愬姛')
- transferDialogVisible.value = false
- }
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- const index = orderList.value.findIndex(item => item.id === editId.value)
- if (index > -1) {
- orderList.value[index] = { ...form, id: editId.value }
- ElMessage.success('缂栬緫鎴愬姛')
- }
- } else {
- // 鏂板
- const newId = Math.max(...orderList.value.map(item => item.id)) + 1
- const orderNo = `ORD${new Date().getFullYear()}${String(new Date().getMonth() + 1).padStart(2, '0')}${String(new Date().getDate()).padStart(2, '0')}${String(newId).padStart(3, '0')}`
- orderList.value.push({
- ...form,
- id: newId,
- orderNo: orderNo
- })
- pagination.total++
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
- }
- })
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val.page
- pagination.pageSize = val.limit
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/salesManagement/paymentShipping/index.vue b/src/views/salesManagement/paymentShipping/index.vue
deleted file mode 100644
index 20c5b40..0000000
--- a/src/views/salesManagement/paymentShipping/index.vue
+++ /dev/null
@@ -1,534 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.orderNo"
- placeholder="璇疯緭鍏ヨ鍗曞彿"
- clearable
- @keyup.enter="handleSearch"
- >
- <template #prefix>
- <el-icon><Search /></el-icon>
- </template>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.paymentStatus" placeholder="璇烽�夋嫨浠樻鐘舵��" clearable>
- <el-option label="鏈粯娆�" value="鏈粯娆�"></el-option>
- <el-option label="宸蹭粯娆�" value="宸蹭粯娆�"></el-option>
- <el-option label="閮ㄥ垎浠樻" value="閮ㄥ垎浠樻"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.shippingStatus" placeholder="璇烽�夋嫨鍙戣揣鐘舵��" clearable>
- <el-option label="寰呭彂璐�" value="寰呭彂璐�"></el-option>
- <el-option label="宸插彂璐�" value="宸插彂璐�"></el-option>
- <el-option label="宸茬鏀�" value="宸茬鏀�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button style="float: right;" type="primary" @click="handleAdd">
- 鏂板璁板綍
- </el-button>
- </el-col>
- </el-row>
-
- <!-- 鏀粯涓庡彂璐у垪琛� -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="orderNo" label="璁㈠崟鍙�" />
- <el-table-column prop="customer" label="瀹㈡埛鍚嶇О" />
- <el-table-column prop="orderAmount" label="璁㈠崟閲戦" width="120">
- <template #default="scope">
- 楼{{ scope.row.orderAmount.toFixed(2) }}
- </template>
- </el-table-column>
- <el-table-column prop="paymentMethod" label="浠樻鏂瑰紡" width="120" />
- <el-table-column prop="paymentStatus" label="浠樻鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getPaymentStatusType(scope.row.paymentStatus)">
- {{ scope.row.paymentStatus }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="shippingStatus" label="鍙戣揣鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="getShippingStatusType(scope.row.shippingStatus)">
- {{ scope.row.shippingStatus }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="shippingDate" label="鍙戣揣鏃ユ湡" width="120" />
- <el-table-column label="鎿嶄綔" width="250" fixed="right" align="center">
- <template #default="scope">
- <el-button link type="primary" @click="handleView(scope.row)">鏌ョ湅</el-button>
- <el-button link type="primary" @click="handlePayment(scope.row)" v-if="scope.row.paymentStatus !== '宸蹭粯娆�'">浠樻</el-button>
- <el-button link type="primary" @click="handleShipping(scope.row)" v-if="scope.row.paymentStatus === '宸蹭粯娆�' && scope.row.shippingStatus === '寰呭彂璐�'">鍙戣揣</el-button>
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁㈠崟鍙�" prop="orderNo">
- <el-input v-model="form.orderNo" placeholder="璇疯緭鍏ヨ鍗曞彿"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О" prop="customer">
- <el-select v-model="form.customer" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%">
- <el-option label="涓婃捣绉戞妧鏈夐檺鍏徃" value="涓婃捣绉戞妧鏈夐檺鍏徃"></el-option>
- <el-option label="娣卞湷鐢靛瓙鏈夐檺鍏徃" value="娣卞湷鐢靛瓙鏈夐檺鍏徃"></el-option>
- <el-option label="鍖椾含璐告槗鍏徃" value="鍖椾含璐告槗鍏徃"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁㈠崟閲戦" prop="orderAmount">
- <el-input-number v-model="form.orderAmount" :precision="2" :min="0" style="width: 100%"></el-input-number>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
- <el-select v-model="form.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%">
- <el-option label="鍏ㄦ鍒颁粯" value="鍏ㄦ鍒颁粯"></el-option>
- <el-option label="鍒嗘湡浠樻" value="鍒嗘湡浠樻"></el-option>
- <el-option label="鏈堢粨" value="鏈堢粨"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浠樻鐘舵��" prop="paymentStatus">
- <el-select v-model="form.paymentStatus" placeholder="璇烽�夋嫨浠樻鐘舵��" style="width: 100%">
- <el-option label="鏈粯娆�" value="鏈粯娆�"></el-option>
- <el-option label="宸蹭粯娆�" value="宸蹭粯娆�"></el-option>
- <el-option label="閮ㄥ垎浠樻" value="閮ㄥ垎浠樻"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戣揣鐘舵��" prop="shippingStatus">
- <el-select v-model="form.shippingStatus" placeholder="璇烽�夋嫨鍙戣揣鐘舵��" style="width: 100%">
- <el-option label="寰呭彂璐�" value="寰呭彂璐�"></el-option>
- <el-option label="宸插彂璐�" value="宸插彂璐�"></el-option>
- <el-option label="宸茬鏀�" value="宸茬鏀�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍙戣揣鏃ユ湡" prop="shippingDate">
- <el-date-picker
- v-model="form.shippingDate"
- type="date"
- placeholder="閫夋嫨鍙戣揣鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐗╂祦鍗曞彿" prop="trackingNo">
- <el-input v-model="form.trackingNo" placeholder="璇疯緭鍏ョ墿娴佸崟鍙�"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" rows="3"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 浠樻瀵硅瘽妗� -->
- <el-dialog v-model="paymentDialogVisible" title="璁㈠崟浠樻" width="500px">
- <el-form label-width="100px">
- <el-form-item label="璁㈠崟鍙�">
- <span>{{ currentRecord.orderNo }}</span>
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚嶇О">
- <span>{{ currentRecord.customer }}</span>
- </el-form-item>
- <el-form-item label="璁㈠崟閲戦">
- <span>楼{{ currentRecord.orderAmount.toFixed(2) }}</span>
- </el-form-item>
- <el-form-item label="浠樻閲戦" prop="paymentAmount">
- <el-input-number v-model="paymentAmount" :precision="2" :min="0" :max="currentRecord.orderAmount" style="width: 100%"></el-input-number>
- </el-form-item>
- <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
- <el-select v-model="paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%">
- <el-option label="鐜伴噾" value="鐜伴噾"></el-option>
- <el-option label="閾惰杞处" value="閾惰杞处"></el-option>
- <el-option label="鏀粯瀹�" value="鏀粯瀹�"></el-option>
- <el-option label="寰俊鏀粯" value="寰俊鏀粯"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="浠樻澶囨敞" prop="paymentRemark">
- <el-input type="textarea" v-model="paymentRemark" rows="3" placeholder="璇疯緭鍏ヤ粯娆惧娉�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="paymentDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="savePayment">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鍙戣揣瀵硅瘽妗� -->
- <el-dialog v-model="shippingDialogVisible" title="璁㈠崟鍙戣揣" width="500px">
- <el-form label-width="100px">
- <el-form-item label="璁㈠崟鍙�">
- <span>{{ currentRecord.orderNo }}</span>
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚嶇О">
- <span>{{ currentRecord.customer }}</span>
- </el-form-item>
- <el-form-item label="鍙戣揣鏃ユ湡" prop="shippingDate">
- <el-date-picker
- v-model="shippingDate"
- type="date"
- placeholder="閫夋嫨鍙戣揣鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- <el-form-item label="鐗╂祦鍏徃" prop="logisticsCompany">
- <el-select v-model="logisticsCompany" placeholder="璇烽�夋嫨鐗╂祦鍏徃" style="width: 100%">
- <el-option label="椤轰赴閫熻繍" value="椤轰赴閫熻繍"></el-option>
- <el-option label="鍦嗛�氶�熼��" value="鍦嗛�氶�熼��"></el-option>
- <el-option label="涓�氬揩閫�" value="涓�氬揩閫�"></el-option>
- <el-option label="鐢抽�氬揩閫�" value="鐢抽�氬揩閫�"></el-option>
- <el-option label="闊佃揪閫熼��" value="闊佃揪閫熼��"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="鐗╂祦鍗曞彿" prop="trackingNo">
- <el-input v-model="trackingNo" placeholder="璇疯緭鍏ョ墿娴佸崟鍙�"></el-input>
- </el-form-item>
- <el-form-item label="鍙戣揣澶囨敞" prop="shippingRemark">
- <el-input type="textarea" v-model="shippingRemark" rows="3" placeholder="璇疯緭鍏ュ彂璐у娉�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="shippingDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="saveShipping">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- orderNo: '',
- paymentStatus: '',
- shippingStatus: ''
-})
-
-const recordList = ref([
- {
- id: 1,
- orderNo: 'ORD202312001',
- customer: '涓婃捣绉戞妧鏈夐檺鍏徃',
- orderAmount: 50000.00,
- paymentMethod: '鍏ㄦ鍒颁粯',
- paymentStatus: '宸蹭粯娆�',
- shippingStatus: '宸插彂璐�',
- shippingDate: '2023-12-05',
- trackingNo: 'SF1234567890',
- remark: '閲嶈瀹㈡埛璁㈠崟'
- },
- {
- id: 2,
- orderNo: 'ORD202312002',
- customer: '娣卞湷鐢靛瓙鏈夐檺鍏徃',
- orderAmount: 35000.00,
- paymentMethod: '鍒嗘湡浠樻',
- paymentStatus: '閮ㄥ垎浠樻',
- shippingStatus: '寰呭彂璐�',
- shippingDate: '',
- trackingNo: '',
- remark: '甯歌璁㈠崟'
- },
- {
- id: 3,
- orderNo: 'ORD202312003',
- customer: '鍖椾含璐告槗鍏徃',
- orderAmount: 28000.00,
- paymentMethod: '鏈堢粨',
- paymentStatus: '鏈粯娆�',
- shippingStatus: '寰呭彂璐�',
- shippingDate: '',
- trackingNo: '',
- remark: '鏂板鎴疯鍗�'
- }
-])
-
-const pagination = reactive({
- total: 3,
- currentPage: 1,
- pageSize: 10
-})
-
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板璁板綍')
-const form = reactive({
- orderNo: '',
- customer: '',
- orderAmount: 0,
- paymentMethod: '',
- paymentStatus: '鏈粯娆�',
- shippingStatus: '寰呭彂璐�',
- shippingDate: '',
- trackingNo: '',
- remark: ''
-})
-
-const rules = {
- orderNo: [{ required: true, message: '璇疯緭鍏ヨ鍗曞彿', trigger: 'blur' }],
- customer: [{ required: true, message: '璇烽�夋嫨瀹㈡埛', trigger: 'change' }],
- orderAmount: [{ required: true, message: '璇疯緭鍏ヨ鍗曢噾棰�', trigger: 'blur' }],
- paymentMethod: [{ required: true, message: '璇烽�夋嫨浠樻鏂瑰紡', trigger: 'change' }],
- paymentStatus: [{ required: true, message: '璇烽�夋嫨浠樻鐘舵��', trigger: 'change' }],
- shippingStatus: [{ required: true, message: '璇烽�夋嫨鍙戣揣鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const paymentDialogVisible = ref(false)
-const shippingDialogVisible = ref(false)
-const currentRecord = ref({})
-const paymentAmount = ref(0)
-const paymentMethod = ref('')
-const paymentRemark = ref('')
-const shippingDate = ref('')
-const logisticsCompany = ref('')
-const trackingNo = ref('')
-const shippingRemark = ref('')
-const formRef = ref()
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = recordList.value
- if (searchForm.orderNo) {
- list = list.filter(item => item.orderNo.includes(searchForm.orderNo))
- }
- if (searchForm.paymentStatus) {
- list = list.filter(item => item.paymentStatus === searchForm.paymentStatus)
- }
- if (searchForm.shippingStatus) {
- list = list.filter(item => item.shippingStatus === searchForm.shippingStatus)
- }
- return list
-})
-
-// 鏂规硶
-const getPaymentStatusType = (status) => {
- const statusMap = {
- '鏈粯娆�': 'danger',
- '宸蹭粯娆�': 'success',
- '閮ㄥ垎浠樻': 'warning'
- }
- return statusMap[status] || 'info'
-}
-
-const getShippingStatusType = (status) => {
- const statusMap = {
- '寰呭彂璐�': 'warning',
- '宸插彂璐�': 'primary',
- '宸茬鏀�': 'success'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.orderNo = ''
- searchForm.paymentStatus = ''
- searchForm.shippingStatus = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板璁板綍'
- isEdit.value = false
- form.orderNo = ''
- form.customer = ''
- form.orderAmount = 0
- form.paymentMethod = ''
- form.paymentStatus = '鏈粯娆�'
- form.shippingStatus = '寰呭彂璐�'
- form.shippingDate = ''
- form.trackingNo = ''
- form.remark = ''
- dialogVisible.value = true
-}
-
-const handleView = (row) => {
- // 鏌ョ湅璁板綍璇︽儏
- ElMessage.info('鏌ョ湅璁板綍璇︽儏鍔熻兘寰呭疄鐜�')
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫璁板綍'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handlePayment = (row) => {
- currentRecord.value = row
- paymentAmount.value = row.orderAmount
- paymentMethod.value = ''
- paymentRemark.value = ''
- paymentDialogVisible.value = true
-}
-
-const handleShipping = (row) => {
- currentRecord.value = row
- shippingDate.value = ''
- logisticsCompany.value = ''
- trackingNo.value = ''
- shippingRemark.value = ''
- shippingDialogVisible.value = true
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ヨ褰曞悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = recordList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- recordList.value.splice(index, 1)
- pagination.total--
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const savePayment = () => {
- if (!paymentMethod.value) {
- ElMessage.warning('璇烽�夋嫨浠樻鏂瑰紡')
- return
- }
-
- const index = recordList.value.findIndex(item => item.id === currentRecord.value.id)
- if (index > -1) {
- if (paymentAmount.value >= currentRecord.value.orderAmount) {
- recordList.value[index].paymentStatus = '宸蹭粯娆�'
- } else if (paymentAmount.value > 0) {
- recordList.value[index].paymentStatus = '閮ㄥ垎浠樻'
- }
- ElMessage.success('浠樻璁板綍宸蹭繚瀛�')
- paymentDialogVisible.value = false
- }
-}
-
-const saveShipping = () => {
- if (!shippingDate.value || !logisticsCompany.value || !trackingNo.value) {
- ElMessage.warning('璇峰~鍐欏畬鏁寸殑鍙戣揣淇℃伅')
- return
- }
-
- const index = recordList.value.findIndex(item => item.id === currentRecord.value.id)
- if (index > -1) {
- recordList.value[index].shippingStatus = '宸插彂璐�'
- recordList.value[index].shippingDate = shippingDate.value
- recordList.value[index].trackingNo = trackingNo.value
- ElMessage.success('鍙戣揣淇℃伅宸蹭繚瀛�')
- shippingDialogVisible.value = false
- }
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- const index = recordList.value.findIndex(item => item.id === editId.value)
- if (index > -1) {
- recordList.value[index] = { ...form, id: editId.value }
- ElMessage.success('缂栬緫鎴愬姛')
- }
- } else {
- // 鏂板
- const newId = Math.max(...recordList.value.map(item => item.id)) + 1
- recordList.value.push({
- ...form,
- id: newId
- })
- pagination.total++
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
- }
- })
-}
-
-const handleCurrentChange = (val) => {
- pagination.currentPage = val.page
- pagination.pageSize = val.limit
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
deleted file mode 100644
index 0799d8f..0000000
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ /dev/null
@@ -1,627 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm" style="width: 100%">
- <el-row justify="space-between">
- <el-col :span="24">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.customerName"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀哄緟鍥炴涓�0"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="openForm('add')">
- 鏂板鍥炴
- </el-button>
- <el-button icon="Download" @click="handleOut"> 瀵煎嚭 </el-button>
- </div>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- :expand-row-keys="expandedRowKeys"
- @expand-change="expandChange"
-
- height="calc(100vh - 21.5em)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="鍥炴鏃ユ湡" prop="receiptPaymentDate" width="130"/>
- <el-table-column label="鍥炴閲戦" prop="receiptPaymentAmount">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.receiptPaymentAmount"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </template>
- </el-table-column>
- <el-table-column label="鍥炴鏂瑰紡" prop="receiptPaymentType">
- <template #default="scope">
- <el-select
- v-model="scope.row.receiptPaymentType"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="!scope.row.editType"
- >
- <el-option
- v-for="item in receipt_payment_type"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="registrant" width="90"/>
- <el-table-column label="鐧昏鏃ユ湡" prop="createTime" width="130"/>
- <el-table-column label="鎿嶄綔" width="150" align="center">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >淇濆瓨</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="delReceiptRecord(scope.row)"
- :disabled="scope.row.registrant !== userStore.nickName"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column
- label="瀹㈡埛鍚堝悓鍙�"
- prop="customerContractNo"
- show-overflow-tooltip
- width="240"
-
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- width="340"
- />
- <el-table-column
- label="浜у搧澶х被"
- prop="productCategory"
- show-overflow-tooltip
- width="100"
- />
- <el-table-column
- label="鍙戠エ鍙�"
- prop="invoiceNo"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="鍙戠エ閲戦(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmountTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="寰呭洖娆鹃噾棰�(鍏�)"
- prop="noReceiptAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.noReceiptAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鏂板鍙戠エ鍙烽〉闈�"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
- <el-input
- v-model="form.invoiceNo"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
- <el-input
- type="number"
- v-model="form.invoiceTotal"
- placeholder="鑷姩濉厖"
- :step="0.01"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绋庣巼锛�" prop="taxRate">
- <el-input
- type="number"
- v-model="form.taxRate"
- placeholder="鑷姩濉厖"
- :step="0.01"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鍥炴閲戦锛�" prop="receiptPaymentAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="form.receiptPaymentAmount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍥炴褰㈠紡锛�" prop="receiptPaymentType">
- <el-select
- v-model="form.receiptPaymentType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in receipt_payment_type"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="registrant">
- <el-input
- v-model="form.registrant"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏉ユ鏃ユ湡锛�" prop="receiptPaymentDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.receiptPaymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import {
- receiptPaymentSaveOrUpdate,
- bindInvoiceNoRegPage,
- invoiceInfo,
- receiptPaymentHistoryListNoPage,
- receiptPaymentDel,
-} from "../../../api/salesManagement/receiptPayment.js";
-import useUserStore from "@/store/modules/user";
-import { ElMessage, ElMessageBox } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const expandedRowKeys = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- searchText: "",
- status: true,
- customerName: "",
- customerContractNo: "",
- projectName: "",
- },
- form: {
- salesContractNo: "",
- customerName: "",
- invoiceNo: "",
- invoiceTotal: "",
- taxRate: "",
- receiptPaymentAmount: "",
- receiptPaymentType: "",
- registrant: "",
- receiptPaymentDate: "",
- },
- rules: {
- salesContractNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- receiptPaymentAmount: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- receiptPaymentType: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- registrant: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- receiptPaymentDate: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- bindInvoiceNoRegPage({ ...searchForm, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- if (expandedRowKeys.value.length > 0) {
- const arr = []
- const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
- if (index > -1) {
- arr.push(tableData.value[index]);
- expandChange(tableData.value[index], arr)
- }
- }
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- receiptPaymentHistoryListNoPage({
- invoiceLedgerId: row.id,
- type: 1,
- }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- if (res?.length > 0) {
- res.forEach((item) => {
- item.editType = false;
- });
- }
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- console.log("selection", selection);
- selectedRows.value = selection.filter(
- (item) => item.customerContractNo !== null
- );
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceTotal", "receiptPaymentAmountTotal", "noReceiptAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, ["receiptPaymentAmount"]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
- form.value = {};
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].noReceiptAmount == 0) {
- proxy.$modal.msgWarning("鏃犻渶鍐嶅洖娆�");
- return;
- }
- invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
- form.value = { ...res.data };
- form.value.invoiceLedgerId = form.value.id;
- form.value.id = "";
- form.value.registrant = userStore.nickName;
- });
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- receiptPaymentSaveOrUpdate(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-// 鍒犻櫎鍥炴璁板綍
-const delReceiptRecord = (row) => {
- console.log("row", row);
- ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(async () => {
- try {
- let ids = [];
- ids.push(row.id);
- await receiptPaymentDel(ids);
- ElMessage.success("鍒犻櫎鎴愬姛");
- getList();
- } catch (error) {
- console.error("鍒犻櫎澶辫触:", error);
- ElMessage.error("鍒犻櫎澶辫触");
- }
- })
- .catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
- let updateData = {
- id: row.id,
- receiptPaymentType: row.receiptPaymentType,
- receiptPaymentAmount: row.receiptPaymentAmount,
- };
- receiptPaymentSaveOrUpdate(updateData).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- const ids = selectedRows.value.map((item) => item.id);
- proxy.download(
- `/receiptPayment/export`,
- { ids: `${ids}` },
- "鍥炴鐧昏妗f.xlsx"
- );
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
deleted file mode 100644
index ea373ea..0000000
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ /dev/null
@@ -1,221 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.searchText"
- placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="杈撳叆瀹㈡埛鍚堝悓鍙�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="杈撳叆椤圭洰鍚嶇О"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="鍥炴鏃ユ湡">
- <el-date-picker
- v-model="searchForm.receiptPaymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- style="width: 300px"
- @change="changeDateRange"
- @clear="clearRange"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- :tableLoading="tableLoading"
- :total="page.total"
- @pagination="pagination"
- @selection-change="handleSelectionChange"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableColumn = ref([
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width:240
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width:240
- },
- {
- label: "鍥炴鏃ユ湡",
- prop: "receiptPaymentDate",
- width:100
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width:240
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:200
- },
- {
- label: "鍥炴閲戦锛堝厓锛�",
- prop: "receiptPaymentAmount",
- width:200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "鍥炴鏂瑰紡",
- prop: "receiptPaymentType",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "鐢垫眹";
- } else if (params == 1) {
- return "鎵垮厬";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- return "info";
- },
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "createTime",
- width:100
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-
-const { form: searchForm } = useFormData({
- searchText: undefined,
- receiptPaymentDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- receiptPaymentDateStart: dayjs()
- .startOf("month")
- .format("YYYY-MM-DD 00:00:00"),
- receiptPaymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD 23:59:59"),
- customerContractNo: undefined,
- projectName: undefined,
-});
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-const isShowSummarySon = ref(true);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { receiptPaymentDate, ...rest } = searchForm;
- receiptPaymentHistoryListPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(param, ["receiptPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.receiptPaymentDateStart = dayjs(date[0]).format(
- "YYYY-MM-DD 00:00:00"
- );
- searchForm.receiptPaymentDateEnd = dayjs(date[1]).format(
- "YYYY-MM-DD 23:59:59"
- );
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.receiptPaymentDate = [];
- searchForm.receiptPaymentDateStart = undefined;
- searchForm.receiptPaymentDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
deleted file mode 100644
index 2cec625..0000000
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ /dev/null
@@ -1,271 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.searchText"
- style="width: 240px"
- placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div style="display: flex">
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @row-click="rowClickMethod"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="搴旀敹閲戦(鍏�)"
- prop="unReceiptPaymentAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <div class="table_list">
- <el-table
- :data="receiptRecord"
- border
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column
- label="鍙戠敓鏃ユ湡"
- prop="happenTime"
- show-overflow-tooltip
- width="110"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="搴旀敹閲戦(鍏�)"
- prop="unReceiptAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.unReceiptAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="recordTotal > 0"
- :total="recordTotal"
- layout="total, sizes, prev, pager, next, jumper"
- :page="recordPage.current"
- :limit="recordPage.size"
- @pagination="recordPaginationChange"
- />
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js";
-import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const receiptRecord = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const recordPage = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const recordTotal = ref(0);
-const data = reactive({
- searchForm: {
- searchText: "",
- invoiceDate: "",
- },
-});
-const customerId = ref("");
-const { searchForm } = toRefs(data);
-const originReceiptRecord = ref([]);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- console.log("paginationChange", current, limit);
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- if (tableData.value.length > 0) {
- recordPage.current = 1;
- customerId.value = tableData.value[0].id;
- receiptPaymentList(customerId.value);
- }
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- var summarizeTable = proxy.summarizeTable(
- param,
- ["invoiceAmount", "receiptAmount", "unReceiptAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
- // 鍙栨渶鍚庝竴琛屾暟鎹�;
- if (receiptRecord.value?.length > 0) {
- const index = tableData.value.findIndex(
- (item) => item.id == customerId.value
- );
- summarizeTable[summarizeTable.length - 1] =
- tableData.value[index].unReceiptPaymentAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
-};
-
-const receiptPaymentList = (id) => {
- const param = {
- customerId: id,
- };
- console.log("param", param);
- customerInteractions(param).then((res) => {
- originReceiptRecord.value = res.data;
- handlePagination({ page: 1, limit: recordPage.size });
- recordTotal.value = res.data.length;
- });
-};
-
-// 姹囨璁板綍鍒楄〃鍒嗛〉
-const recordPaginationChange = (pagination) => {
- handlePagination(pagination);
-};
-
-const rowClickMethod = (row) => {
- customerId.value = row.id;
- receiptPaymentList(customerId.value);
-};
-
-const handlePagination = ({ page, limit }) => {
- recordPage.current = page;
- recordPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- receiptRecord.value = originReceiptRecord.value.slice(start, end);
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- width: 50%;
-}
-</style>
diff --git a/src/views/salesManagement/salesLedger/fileList.vue b/src/views/salesManagement/salesLedger/fileList.vue
deleted file mode 100644
index da37db2..0000000
--- a/src/views/salesManagement/salesLedger/fileList.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="闄勪欢" width="40%" :before-close="handleClose">
- <el-table :data="tableData" border height="40vh">
- <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button>
- <el-button link type="primary" size="small" @click="lookFile(scope.row)">棰勮</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import filePreview from '@/components/filePreview/index.vue'
-
-const dialogVisible = ref(false)
-const tableData = ref([])
-const { proxy } = getCurrentInstance();
-const filePreviewRef = ref()
-const handleClose = () => {
- dialogVisible.value = false
-}
-const open = (list) => {
- dialogVisible.value = true
- tableData.value = list
-}
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-
-}
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-defineExpose({
- open
-})
-</script>
-
-<style></style>
\ No newline at end of file
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
deleted file mode 100644
index afe56b5..0000000
--- a/src/views/salesManagement/salesLedger/index.vue
+++ /dev/null
@@ -1,1004 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О锛�">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙凤細">
- <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡锛�">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="openForm('add')">
- 鏂板鍙拌处
- </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)">
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
- <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
- <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" width="180" show-overflow-tooltip />
- <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
- <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
- <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
- <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
- <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
- <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="140" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" :disabled="scope.row.invoiceTotal>0 || scope.row.entryPersonName !== userStore.nickName" @click="openForm('edit', scope.row)">缂栬緫</el-button>
-<!-- <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>-->
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" placeholder="鑷姩鐢熸垚" clearable disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓氬姟鍛橈細" prop="salesman">
- <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo">
- <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
- <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
- <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
- {{
- item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
- }}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
- <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
- <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
- <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">娣诲姞</el-button>
- <el-button v-if="operationType !== 'view'" plain type="danger" @click="deleteProduct" >鍒犻櫎</el-button>
- </el-form-item>
- </el-row>
- <el-table :data="productData" border @selection-change="productSelected" show-summary
- :summary-method="summarizeMainTable">
- <el-table-column align="center" type="selection" width="55" v-if="operationType !== 'view'" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
- <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center" v-if="operationType !== 'view'">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row,scope.$index)">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶囨敞路锛�" prop="remark">
- <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
- :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>
- <template #tip v-if="operationType !== 'view'">
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%"
- @close="closeProductDia">
- <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
- <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
- </el-select> -->
- <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable check-strictly
- @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
- <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
- <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
- <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="calculateFromTaxRate">
- <el-option label="1" value="1" />
- <el-option label="6" value="6" />
- <el-option label="13" value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
- <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%"
- :precision="2"
- placeholder="璇疯緭鍏�" clearable @change="calculateFromUnitPrice" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable
- :precision="2"
- @change="calculateFromQuantity" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
- <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromTotalPrice" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
- <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromExclusiveTotalPrice" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
- <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
- <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
- <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitProduct">纭</el-button>
- <el-button @click="closeProductDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <FileList ref="fileListRef" />
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import pagination from "@/components/PIMTable/Pagination.vue";
-import {onMounted, ref} from "vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user";
-import { userListNoPage } from "@/api/system/user.js";
-import FileList from "./fileList.vue";
-import {
- ledgerListPage,
- productList,
- customerList,
- addOrUpdateSalesLedger,
- getSalesLedgerWithProducts,
- delLedger,
- addOrUpdateSalesLedgerProduct,
- delProduct,
- delLedgerFile,
-} from "@/api/salesManagement/salesLedger.js";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
-import useFormData from "@/hooks/useFormData.js";
-import dayjs from "dayjs";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const userList = ref([]);
-const customerOption = ref([]);
-const productOptions = ref([]);
-const modelOptions = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- customerName: "", // 瀹㈡埛鍚嶇О
- customerContractNo: "", // 瀹㈡埛鍚堝悓缂栧彿
- salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
- projectName: "", // 椤圭洰鍚嶇О
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- form: {
- salesContractNo: "",
- salesman: "",
- customerContractNo: "",
- customerId: "",
- projectName: "",
- entryPerson: "",
- entryDate: "",
- maintenanceTime: "",
- productData: [],
- executionDate: "",
- paymentMethod: "",
- },
- rules: {
- salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerContractNo: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- customerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- entryPerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm } = useFormData(data.searchForm);
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const currentId = ref("");
-const productFormData = reactive({
- productForm: {
- productCategory: "",
- specificationModel: "",
- unit: "",
- quantity: "",
- taxInclusiveUnitPrice: "",
- taxRate: "",
- taxInclusiveTotalPrice: "",
- taxExclusiveTotalPrice: "",
- invoiceType: "",
- },
- productRules: {
- productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- specificationModel: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxInclusiveUnitPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- taxInclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxExclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { productForm, productRules } = toRefs(productFormData);
-// 闃叉寰幆璁$畻鐨勬爣蹇�
-const isCalculating = ref(false);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-const changeDaterange = (value) => {
- if (value) {
- searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
- }
- handleQuery();
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- expandedRowKeys.value = [];
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { entryDate, ...rest } = searchForm;
- ledgerListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 鑾峰彇浜у搧澶х被tree鏁版嵁
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 鑾峰彇tree瀛愭暟鎹�
-const getModels = (value) => {
- productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({ id: value }).then((res) => {
- modelOptions.value = res;
- });
-};
-const getProductModel = (value) => {
- console.log("value", value);
- const index = modelOptions.value.findIndex((item) => item.id === value);
- if (index !== -1) {
- productForm.value.specificationModel = modelOptions.value[index].model;
- productForm.value.unit = modelOptions.value[index].unit;
- } else {
- productForm.value.specificationModel = null;
- productForm.value.unit = null;
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter((item) => item.children !== undefined);
- console.log("selection", selectedRows.value);
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
- operationType.value = type;
- form.value = {};
- productData.value = [];
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- customerList().then((res) => {
- customerOption.value = res;
- });
- form.value.entryPerson = userStore.id;
- if (type !== "add") {
- currentId.value = row.id;
- getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
- form.value = { ...res };
- form.value.entryPerson = Number(res.entryPerson);
- productData.value = form.value.productData;
- fileList.value = form.value.salesLedgerFiles;
- });
- }
- // let userAll = await userStore.getInfo()
- // userList.value.forEach(element => {
- // if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
- // form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
- // }
- // });
- form.value.entryDate = getCurrentDate(); // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
- dialogFormVisible.value = true;
-};
-function changs(val) {
- console.log(val);
-}
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- // if (file.size > 1024 * 1024 * 10) {
- // proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- // return false;
- // }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- console.log('productData.value--', productData.value)
- if (productData.value !== null && productData.value.length > 0) {
- form.value.productData = proxy.HaveJson(productData.value);
- } else {
- proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
- return;
- }
- let tempFileIds = [];
- if (fileList.value !== null && fileList.value.length > 0) {
- tempFileIds = fileList.value.map((item) => item.tempId);
- }
- form.value.tempFileIds = tempFileIds;
- form.value.type = 1;
- addOrUpdateSalesLedger(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const productIndex = ref(0);
-// 鎵撳紑浜у搧寮规
-const openProductForm = (type, row,index) => {
- productOperationType.value = type;
- productForm.value = {};
- proxy.resetForm("productFormRef");
- if (type === "edit") {
- productForm.value = { ...row };
- productIndex.value = index;
- }
- productFormVisible.value = true;
- getProductOptions();
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitProduct = () => {
- proxy.$refs["productFormRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitProductEdit();
- } else {
- if(productOperationType.value === "add"){
- productData.value.push({ ...productForm.value });
- }else{
- productData.value[productIndex.value] = { ...productForm.value }
- }
- closeProductDia();
- }
- }
- });
-};
-const submitProductEdit = () => {
- productForm.value.salesLedgerId = currentId.value;
- productForm.value.type = 1
- addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then((res) => {
- productData.value = res.productData;
- });
- });
-};
-// 鍒犻櫎浜у搧
-const deleteProduct = () => {
- if (productSelectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- if (operationType.value === "add") {
- productSelectedRows.value.forEach((selectedRow) => {
- const index = productData.value.findIndex(
- (product) => product.id === selectedRow.id
- );
- if (index !== -1) {
- productData.value.splice(index, 1);
- }
- });
- } else {
- let ids = [];
- if (productSelectedRows.value.length > 0) {
- ids = productSelectedRows.value.map((item) => item.id);
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delProduct(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(
- (res) => {
- productData.value = res.productData;
- }
- );
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- }
-};
-// 鍏抽棴浜у搧寮规
-const closeProductDia = () => {
- proxy.resetForm("productFormRef");
- productFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delLedger(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-const mathNum = () => {
- console.log("productForm.value", productForm.value);
- if (!productForm.value.taxInclusiveUnitPrice) {
- return;
- }
- if (!productForm.value.quantity) {
- return;
- }
- // 鍚◣鎬讳环璁$畻
- productForm.value.taxInclusiveTotalPrice =
- proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
- );
- if (productForm.value.taxRate) {
- // 涓嶅惈绋庢�讳环璁$畻
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-};
-
-// 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-const calculateFromTotalPrice = () => {
- if (isCalculating.value) return;
-
- const totalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
- const quantity = parseFloat(productForm.value.quantity);
-
- if (!totalPrice || !quantity || quantity <= 0) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- totalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-const calculateFromExclusiveTotalPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const exclusiveTotalPrice = parseFloat(productForm.value.taxExclusiveTotalPrice);
- const quantity = parseFloat(productForm.value.quantity);
- const taxRate = parseFloat(productForm.value.taxRate);
-
- if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) {
- return;
- }
-
- isCalculating.value = true;
-
- // 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
- const taxRateDecimal = taxRate / 100;
- const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
- productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
-
- // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2);
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
-const calculateFromQuantity = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const quantity = parseFloat(productForm.value.quantity);
- const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
- if (!quantity || quantity <= 0 || !unitPrice) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
-const calculateFromUnitPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const quantity = parseFloat(productForm.value.quantity);
- const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
- if (!quantity || quantity <= 0 || !unitPrice) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
-const calculateFromTaxRate = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const inclusiveTotalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
- const taxRate = parseFloat(productForm.value.taxRate);
-
- if (!inclusiveTotalPrice || !taxRate) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻涓嶅惈绋庢�讳环
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- inclusiveTotalPrice,
- taxRate
- );
-
- isCalculating.value = false;
-};
-/**
- * 涓嬭浇鏂囦欢
- *
- * @param row 涓嬭浇鏂囦欢鐨勭浉鍏充俊鎭璞�
- */
-const fileListRef = ref(null)
-const downLoadFile = (row) => {
- getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
- fileListRef.value.open(res.salesLedgerFiles)
- });
-
-}
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.ml-10 {
- margin-left: 10px;
-}
-
-.table_list {
- margin-top: unset;
-}
-
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/salesManagement/salespersonManagement/index.vue b/src/views/salesManagement/salespersonManagement/index.vue
deleted file mode 100644
index 3169b79..0000000
--- a/src/views/salesManagement/salespersonManagement/index.vue
+++ /dev/null
@@ -1,392 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.name"
- placeholder="璇疯緭鍏ヤ笟鍔″憳濮撳悕"
- clearable
- @keyup.enter="handleSearch"
- >
- <template #prefix>
- <el-icon><Search /></el-icon>
- </template>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" clearable>
- <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option>
- <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option>
- <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option>
- <el-option label="绂昏亴" value="绂昏亴"></el-option>
- <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button type="primary" style="float: right;" @click="handleAdd">鏂板涓氬姟鍛�</el-button>
- </el-col>
- </el-row>
-
- <!-- 涓氬姟鍛樺垪琛� -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="name" label="濮撳悕" width="120" />
- <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="140" />
- <el-table-column prop="email" label="閭" width="200" />
- <el-table-column prop="department" label="閮ㄩ棬" width="100" />
- <el-table-column prop="position" label="鑱屼綅" width="100" />
- <el-table-column prop="hireDate" label="鍏ヨ亴鏃ユ湡" width="120" />
- <el-table-column prop="status" label="鐘舵��" width="80">
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="permissions" label="鏉冮檺">
- <template #default="scope">
- <el-tag v-for="perm in scope.row.permissions" :key="perm" size="small" style="margin-right: 5px;">
- {{ perm }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center">
- <template #default="scope">
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="primary" @click="handlePermissions(scope.row)">鏉冮檺</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="濮撳悕" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閭" prop="email">
- <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閮ㄩ棬" prop="department">
- <el-select v-model="form.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%">
- <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option>
- <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option>
- <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鑱屼綅" prop="position">
- <el-input v-model="form.position" placeholder="璇疯緭鍏ヨ亴浣�"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏ヨ亴鏃ユ湡" prop="hireDate">
- <el-date-picker
- v-model="form.hireDate"
- type="date"
- placeholder="閫夋嫨鍏ヨ亴鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option>
- <el-option label="绂昏亴" value="绂昏亴"></el-option>
- <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鏉冮檺璁剧疆瀵硅瘽妗� -->
- <el-dialog v-model="permissionDialogVisible" title="鏉冮檺璁剧疆" width="500px">
- <el-form label-width="100px">
- <el-form-item label="涓氬姟鍛樺鍚�">
- <span>{{ currentSalesperson.name }}</span>
- </el-form-item>
- <el-form-item label="鏉冮檺璁剧疆">
- <el-checkbox-group v-model="currentPermissions">
- <el-checkbox label="璁㈠崟绠$悊">璁㈠崟绠$悊</el-checkbox>
- <el-checkbox label="瀹㈡埛绠$悊">瀹㈡埛绠$悊</el-checkbox>
- <el-checkbox label="璐㈠姟绠$悊">璐㈠姟绠$悊</el-checkbox>
- <el-checkbox label="鍙戣揣绠$悊">鍙戣揣绠$悊</el-checkbox>
- <el-checkbox label="鎶ヨ〃鏌ョ湅">鎶ヨ〃鏌ョ湅</el-checkbox>
- <el-checkbox label="绯荤粺璁剧疆">绯荤粺璁剧疆</el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="permissionDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="savePermissions">纭� 瀹�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Search } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- name: '',
- department: '',
- status: ''
-})
-
-const salespersonList = ref([
- {
- id: 1,
- name: '闄堝織寮�',
- phone: '13800138001',
- email: 'chenzhiqiang@company.com',
- department: '閿�鍞儴',
- position: '閿�鍞粡鐞�',
- hireDate: '2023-01-15',
- status: '鍦ㄨ亴',
- permissions: ['璁㈠崟绠$悊', '瀹㈡埛绠$悊', '璐㈠姟绠$悊']
- },
- {
- id: 2,
- name: '鍒橀泤濠�',
- phone: '13800138002',
- email: 'liuyating@company.com',
- department: '甯傚満閮�',
- position: '甯傚満涓撳憳',
- hireDate: '2023-03-20',
- status: '鍦ㄨ亴',
- permissions: ['瀹㈡埛绠$悊', '鎶ヨ〃鏌ョ湅']
- },
- {
- id: 3,
- name: '鐜嬪缓鍥�',
- phone: '13800138003',
- email: 'wangjianguo@company.com',
- department: '瀹㈡湇閮�',
- position: '瀹㈡湇涓荤',
- hireDate: '2022-11-10',
- status: '鍦ㄨ亴',
- permissions: ['瀹㈡埛绠$悊', '鍙戣揣绠$悊']
- }
-])
-
-const pagination = ref({
- total: 3,
- currentPage: 1,
- pageSize: 10
-})
-
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板涓氬姟鍛�')
-const form = reactive({
- name: '',
- phone: '',
- email: '',
- department: '',
- position: '',
- hireDate: '',
- status: '鍦ㄨ亴'
-})
-
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }],
- phone: [{ required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' }],
- email: [{ required: true, message: '璇疯緭鍏ラ偖绠�', trigger: 'blur' }],
- department: [{ required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' }],
- position: [{ required: true, message: '璇疯緭鍏ヨ亴浣�', trigger: 'blur' }],
- hireDate: [{ required: true, message: '璇烽�夋嫨鍏ヨ亴鏃ユ湡', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const permissionDialogVisible = ref(false)
-const currentSalesperson = ref({})
-const currentPermissions = ref([])
-const formRef = ref()
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = salespersonList.value
- if (searchForm.name) {
- list = list.filter(item => item.name.includes(searchForm.name))
- }
- if (searchForm.department) {
- list = list.filter(item => item.department === searchForm.department)
- }
- if (searchForm.status) {
- list = list.filter(item => item.status === searchForm.status)
- }
- return list
-})
-
-// 鏂规硶
-const getStatusType = (status) => {
- const statusMap = {
- '鍦ㄨ亴': 'success',
- '绂昏亴': 'danger',
- '璇曠敤鏈�': 'warning'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.name = ''
- searchForm.department = ''
- searchForm.status = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板涓氬姟鍛�'
- isEdit.value = false
- form.name = ''
- form.phone = ''
- form.email = ''
- form.department = ''
- form.position = ''
- form.hireDate = ''
- form.status = '鍦ㄨ亴'
- dialogVisible.value = true
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫涓氬姟鍛�'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ヤ笟鍔″憳鍚楋紵', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = salespersonList.value.findIndex(item => item.id === row.id)
- if (index > -1) {
- salespersonList.value.splice(index, 1)
- pagination.value.total--
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-const handlePermissions = (row) => {
- currentSalesperson.value = row
- currentPermissions.value = [...row.permissions]
- permissionDialogVisible.value = true
-}
-
-const savePermissions = () => {
- const index = salespersonList.value.findIndex(item => item.id === currentSalesperson.value.id)
- if (index > -1) {
- salespersonList.value[index].permissions = [...currentPermissions.value]
- ElMessage.success('鏉冮檺璁剧疆鎴愬姛')
- permissionDialogVisible.value = false
- }
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- const index = salespersonList.value.findIndex(item => item.id === editId.value)
- if (index > -1) {
- salespersonList.value[index] = { ...form, id: editId.value }
- ElMessage.success('缂栬緫鎴愬姛')
- }
- } else {
- // 鏂板
- const newId = Math.max(...salespersonList.value.map(item => item.id)) + 1
- salespersonList.value.push({
- ...form,
- id: newId,
- permissions: []
- })
- pagination.value.total++
- ElMessage.success('鏂板鎴愬姛')
- }
- dialogVisible.value = false
- }
- })
-}
-
-const handleCurrentChange = (val) => {
- pagination.value.currentPage = val.page
- pagination.value.pageSize = val.limit
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue
deleted file mode 100644
index 77d9f5a..0000000
--- a/src/views/system/config/index.vue
+++ /dev/null
@@ -1,316 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="鍙傛暟鍚嶇О" prop="configName">
- <el-input
- v-model="queryParams.configName"
- placeholder="璇疯緭鍏ュ弬鏁板悕绉�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鍙傛暟閿悕" prop="configKey">
- <el-input
- v-model="queryParams.configKey"
- placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="绯荤粺鍐呯疆" prop="configType">
- <el-select v-model="queryParams.configType" placeholder="绯荤粺鍐呯疆" clearable style="width: 240px">
- <el-option
- v-for="dict in sys_yes_no"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px;">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:config:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:config:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:config:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:config:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Refresh"
- @click="handleRefreshCache"
- v-hasPermi="['system:config:remove']"
- >鍒锋柊缂撳瓨</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鍙傛暟涓婚敭" align="center" prop="configId" />
- <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="configName" :show-overflow-tooltip="true" />
- <el-table-column label="鍙傛暟閿悕" align="center" prop="configKey" :show-overflow-tooltip="true" />
- <el-table-column label="鍙傛暟閿��" align="center" prop="configValue" :show-overflow-tooltip="true" />
- <el-table-column label="绯荤粺鍐呯疆" align="center" prop="configType">
- <template #default="scope">
- <dict-tag :options="sys_yes_no" :value="scope.row.configType" />
- </template>
- </el-table-column>
- <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']" >淇敼</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
- <el-form ref="configRef" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="鍙傛暟鍚嶇О" prop="configName">
- <el-input v-model="form.configName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" />
- </el-form-item>
- <el-form-item label="鍙傛暟閿悕" prop="configKey">
- <el-input v-model="form.configKey" placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�" />
- </el-form-item>
- <el-form-item label="鍙傛暟閿��" prop="configValue">
- <el-input v-model="form.configValue" type="textarea" placeholder="璇疯緭鍏ュ弬鏁伴敭鍊�" />
- </el-form-item>
- <el-form-item label="绯荤粺鍐呯疆" prop="configType">
- <el-radio-group v-model="form.configType">
- <el-radio
- v-for="dict in sys_yes_no"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="澶囨敞" prop="remark">
- <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Config">
-import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config"
-
-const { proxy } = getCurrentInstance()
-const { sys_yes_no } = proxy.useDict("sys_yes_no")
-
-const configList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const dateRange = ref([])
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- configName: undefined,
- configKey: undefined,
- configType: undefined
- },
- rules: {
- configName: [{ required: true, message: "鍙傛暟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- configKey: [{ required: true, message: "鍙傛暟閿悕涓嶈兘涓虹┖", trigger: "blur" }],
- configValue: [{ required: true, message: "鍙傛暟閿�间笉鑳戒负绌�", trigger: "blur" }]
- }
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ鍙傛暟鍒楄〃 */
-function getList() {
- loading.value = true
- listConfig(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- configList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- configId: undefined,
- configName: undefined,
- configKey: undefined,
- configValue: undefined,
- configType: "Y",
- remark: undefined
- }
- proxy.resetForm("configRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.configId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞鍙傛暟"
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const configId = row.configId || ids.value
- getConfig(configId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼鍙傛暟"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["configRef"].validate(valid => {
- if (valid) {
- if (form.value.configId != undefined) {
- updateConfig(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addConfig(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const configIds = row.configId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎鍙傛暟缂栧彿涓�"' + configIds + '"鐨勬暟鎹」锛�').then(function () {
- return delConfig(configIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("system/config/export", {
- ...queryParams.value
- }, `config_${new Date().getTime()}.xlsx`)
-}
-
-/** 鍒锋柊缂撳瓨鎸夐挳鎿嶄綔 */
-function handleRefreshCache() {
- refreshCache().then(() => {
- proxy.$modal.msgSuccess("鍒锋柊缂撳瓨鎴愬姛")
- })
-}
-
-getList()
-</script>
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
deleted file mode 100644
index f68bbec..0000000
--- a/src/views/system/dept/index.vue
+++ /dev/null
@@ -1,290 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="鍏徃鍚嶇О" prop="deptName">
- <el-input
- v-model="queryParams.deptName"
- placeholder="璇疯緭鍏ュ叕鍙稿悕绉�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="鍏徃鐘舵��" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:dept:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="info"
- plain
- icon="Sort"
- @click="toggleExpandAll"
- >灞曞紑/鎶樺彔</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table
- v-if="refreshTable"
- v-loading="loading"
- :data="deptList"
- row-key="deptId"
- :default-expand-all="isExpandAll"
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- >
- <el-table-column prop="deptName" label="鍏徃鍚嶇О" width="260"></el-table-column>
- <el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">鏂板</el-button>
- <el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 娣诲姞鎴栦慨鏀瑰叕鍙稿璇濇 -->
- <el-dialog :title="title" v-model="open" width="600px" append-to-body>
- <el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
- <el-row>
- <el-col :span="24" v-if="form.parentId !== 0">
- <el-form-item label="涓婄骇鍏徃" prop="parentId">
- <el-tree-select
- v-model="form.parentId"
- :data="deptOptions"
- :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
- value-key="deptId"
- placeholder="閫夋嫨涓婄骇鍏徃"
- check-strictly
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鍚嶇О" prop="deptName">
- <el-input v-model="form.deptName" placeholder="璇疯緭鍏ュ叕鍙稿悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
- <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璐熻矗浜�" prop="leader">
- <el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閭" prop="email">
- <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃缂栧彿" prop="deptNick">
- <el-input v-model="form.deptNick" placeholder="璇疯緭鍏ュ叕鍙哥紪鍙�" maxlength="50" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Dept">
-import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"
-
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const deptList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const title = ref("")
-const deptOptions = ref([])
-const isExpandAll = ref(true)
-const refreshTable = ref(true)
-
-const data = reactive({
- form: {},
- queryParams: {
- deptName: undefined,
- status: undefined
- },
- rules: {
- parentId: [{ required: true, message: "涓婄骇鍏徃涓嶈兘涓虹┖", trigger: "blur" }],
- deptName: [{ required: true, message: "鍏徃鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- orderNum: [{ required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }],
- email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
- phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
- deptNick: [{ required: true, message: "鍏徃缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
- },
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ鍏徃鍒楄〃 */
-function getList() {
- loading.value = true
- listDept(queryParams.value).then(response => {
- deptList.value = proxy.handleTree(response.data, "deptId")
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- deptId: undefined,
- parentId: undefined,
- deptName: undefined,
- orderNum: 0,
- leader: undefined,
- phone: undefined,
- email: undefined,
- status: "0",
- deptNick: undefined,
- }
- proxy.resetForm("deptRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd(row) {
- reset()
- listDept().then(response => {
- deptOptions.value = proxy.handleTree(response.data, "deptId")
- })
- if (row != undefined) {
- form.value.parentId = row.deptId
- }
- open.value = true
- title.value = "娣诲姞鍏徃"
-}
-
-/** 灞曞紑/鎶樺彔鎿嶄綔 */
-function toggleExpandAll() {
- refreshTable.value = false
- isExpandAll.value = !isExpandAll.value
- nextTick(() => {
- refreshTable.value = true
- })
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- listDeptExcludeChild(row.deptId).then(response => {
- deptOptions.value = proxy.handleTree(response.data, "deptId")
- })
- getDept(row.deptId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼鍏徃"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["deptRef"].validate(valid => {
- if (valid) {
- if (form.value.deptId != undefined) {
- updateDept(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addDept(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- proxy.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?').then(function() {
- return delDept(row.deptId)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-getList()
-</script>
diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue
deleted file mode 100644
index f4e2c6f..0000000
--- a/src/views/system/dict/data.vue
+++ /dev/null
@@ -1,362 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="瀛楀吀鍚嶇О" prop="dictType">
- <el-select v-model="queryParams.dictType" style="width: 200px">
- <el-option
- v-for="item in typeOptions"
- :key="item.dictId"
- :label="item.dictName"
- :value="item.dictType"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="瀛楀吀鏍囩" prop="dictLabel">
- <el-input
- v-model="queryParams.dictLabel"
- placeholder="璇疯緭鍏ュ瓧鍏告爣绛�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="鏁版嵁鐘舵��" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:dict:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:dict:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:dict:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:dict:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Close"
- @click="handleClose"
- >鍏抽棴</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="瀛楀吀缂栫爜" align="center" prop="dictCode" />
- <el-table-column label="瀛楀吀鏍囩" align="center" prop="dictLabel">
- <template #default="scope">
- <span v-if="(scope.row.listClass == '' || scope.row.listClass == 'default') && (scope.row.cssClass == '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span>
- <el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass" :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="瀛楀吀閿��" align="center" prop="dictValue" />
- <el-table-column label="瀛楀吀鎺掑簭" align="center" prop="dictSort" />
- <el-table-column label="鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
- <el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="瀛楀吀绫诲瀷">
- <el-input v-model="form.dictType" :disabled="true" />
- </el-form-item>
- <el-form-item label="鏁版嵁鏍囩" prop="dictLabel">
- <el-input v-model="form.dictLabel" placeholder="璇疯緭鍏ユ暟鎹爣绛�" />
- </el-form-item>
- <el-form-item label="鏁版嵁閿��" prop="dictValue">
- <el-input v-model="form.dictValue" placeholder="璇疯緭鍏ユ暟鎹敭鍊�" />
- </el-form-item>
- <el-form-item label="鏍峰紡灞炴��" prop="cssClass">
- <el-input v-model="form.cssClass" placeholder="璇疯緭鍏ユ牱寮忓睘鎬�" />
- </el-form-item>
- <el-form-item label="鏄剧ず鎺掑簭" prop="dictSort">
- <el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
- </el-form-item>
- <el-form-item label="鍥炴樉鏍峰紡" prop="listClass">
- <el-select v-model="form.listClass">
- <el-option
- v-for="item in listClassOptions"
- :key="item.value"
- :label="item.label + '(' + item.value + ')'"
- :value="item.value"
- ></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="澶囨敞" prop="remark">
- <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Data">
-import useDictStore from '@/store/modules/dict'
-import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"
-import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"
-
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const dataList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const defaultDictType = ref("")
-const typeOptions = ref([])
-const route = useRoute()
-// 鏁版嵁鏍囩鍥炴樉鏍峰紡
-const listClassOptions = ref([
- { value: "default", label: "榛樿" },
- { value: "primary", label: "涓昏" },
- { value: "success", label: "鎴愬姛" },
- { value: "info", label: "淇℃伅" },
- { value: "warning", label: "璀﹀憡" },
- { value: "danger", label: "鍗遍櫓" }
-])
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- dictType: undefined,
- dictLabel: undefined,
- status: undefined
- },
- rules: {
- dictLabel: [{ required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }],
- dictValue: [{ required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }],
- dictSort: [{ required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }]
- }
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ瀛楀吀绫诲瀷璇︾粏 */
-function getTypes(dictId) {
- getType(dictId).then(response => {
- queryParams.value.dictType = response.data.dictType
- defaultDictType.value = response.data.dictType
- getList()
- })
-}
-
-/** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
-function getTypeList() {
- getDictOptionselect().then(response => {
- typeOptions.value = response.data
- })
-}
-
-/** 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 */
-function getList() {
- loading.value = true
- listData(queryParams.value).then(response => {
- dataList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- dictCode: undefined,
- dictLabel: undefined,
- dictValue: undefined,
- cssClass: undefined,
- listClass: "default",
- dictSort: 0,
- status: "0",
- remark: undefined
- }
- proxy.resetForm("dataRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 杩斿洖鎸夐挳鎿嶄綔 */
-function handleClose() {
- const obj = { path: "/system/dict" }
- proxy.$tab.closeOpenPage(obj)
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- queryParams.value.dictType = defaultDictType.value
- handleQuery()
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞瀛楀吀鏁版嵁"
- form.value.dictType = queryParams.value.dictType
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.dictCode)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const dictCode = row.dictCode || ids.value
- getData(dictCode).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼瀛楀吀鏁版嵁"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["dataRef"].validate(valid => {
- if (valid) {
- if (form.value.dictCode != undefined) {
- updateData(form.value).then(response => {
- useDictStore().removeDict(queryParams.value.dictType)
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addData(form.value).then(response => {
- useDictStore().removeDict(queryParams.value.dictType)
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const dictCodes = row.dictCode || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」锛�').then(function() {
- return delData(dictCodes)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- useDictStore().removeDict(queryParams.value.dictType)
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("system/dict/data/export", {
- ...queryParams.value
- }, `dict_data_${new Date().getTime()}.xlsx`)
-}
-
-getTypes(route.params && route.params.dictId)
-getTypeList()
-</script>
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
deleted file mode 100644
index 6c67e1b..0000000
--- a/src/views/system/dict/index.vue
+++ /dev/null
@@ -1,326 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
- <el-input
- v-model="queryParams.dictName"
- placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
- <el-input
- v-model="queryParams.dictType"
- placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="瀛楀吀鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:dict:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:dict:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:dict:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:dict:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Refresh"
- @click="handleRefreshCache"
- v-hasPermi="['system:dict:remove']"
- >鍒锋柊缂撳瓨</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="瀛楀吀缂栧彿" align="center" prop="dictId" />
- <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true"/>
- <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true">
- <template #default="scope">
- <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
- <span>{{ scope.row.dictType }}</span>
- </router-link>
- </template>
- </el-table-column>
- <el-table-column label="鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
- <el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
- <el-input v-model="form.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" />
- </el-form-item>
- <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
- <el-input v-model="form.dictType" placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�" />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="澶囨敞" prop="remark">
- <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Dict">
-import useDictStore from '@/store/modules/dict'
-import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"
-import {onMounted} from "vue";
-
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const typeList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const dateRange = ref([])
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- dictName: undefined,
- dictType: undefined,
- status: undefined
- },
- rules: {
- dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }]
- },
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
-function getList() {
- loading.value = true
- listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- typeList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- dictId: undefined,
- dictName: undefined,
- dictType: undefined,
- status: "0",
- remark: undefined
- }
- proxy.resetForm("dictRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞瀛楀吀绫诲瀷"
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.dictId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const dictId = row.dictId || ids.value
- getType(dictId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼瀛楀吀绫诲瀷"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["dictRef"].validate(valid => {
- if (valid) {
- if (form.value.dictId != undefined) {
- updateType(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addType(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const dictIds = row.dictId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栧彿涓�"' + dictIds + '"鐨勬暟鎹」锛�').then(function() {
- return delType(dictIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("system/dict/type/export", {
- ...queryParams.value
- }, `dict_${new Date().getTime()}.xlsx`)
-}
-
-/** 鍒锋柊缂撳瓨鎸夐挳鎿嶄綔 */
-function handleRefreshCache() {
- refreshCache().then(() => {
- proxy.$modal.msgSuccess("鍒锋柊鎴愬姛")
- useDictStore().cleanDict()
- })
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
deleted file mode 100644
index bccb9e9..0000000
--- a/src/views/system/menu/index.vue
+++ /dev/null
@@ -1,455 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="鑿滃崟鍚嶇О" prop="menuName">
- <el-input
- v-model="queryParams.menuName"
- placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="鑿滃崟鐘舵��" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:menu:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="info"
- plain
- icon="Sort"
- @click="toggleExpandAll"
- >灞曞紑/鎶樺彔</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table
- v-if="refreshTable"
- v-loading="loading"
- :data="menuList"
- row-key="menuId"
- :default-expand-all="isExpandAll"
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- >
- <el-table-column prop="menuName" label="鑿滃崟鍚嶇О" :show-overflow-tooltip="true" width="160"></el-table-column>
- <el-table-column prop="icon" label="鍥炬爣" align="center" width="100">
- <template #default="scope">
- <svg-icon :icon-class="scope.row.icon" />
- </template>
- </el-table-column>
- <el-table-column prop="orderNum" label="鎺掑簭" width="60"></el-table-column>
- <el-table-column prop="perms" label="鏉冮檺鏍囪瘑" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column prop="component" label="缁勪欢璺緞" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column prop="status" label="鐘舵��" width="80">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" width="160" prop="createTime">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="210" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:menu:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:menu:add']">鏂板</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:menu:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 娣诲姞鎴栦慨鏀硅彍鍗曞璇濇 -->
- <el-dialog :title="title" v-model="open" width="680px" append-to-body>
- <el-form ref="menuRef" :model="form" :rules="rules" label-width="100px">
- <el-row>
- <el-col :span="24">
- <el-form-item label="涓婄骇鑿滃崟">
- <el-tree-select
- v-model="form.parentId"
- :data="menuOptions"
- :props="{ value: 'menuId', label: 'menuName', children: 'children' }"
- value-key="menuId"
- placeholder="閫夋嫨涓婄骇鑿滃崟"
- check-strictly
- />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鑿滃崟绫诲瀷" prop="menuType">
- <el-radio-group v-model="form.menuType">
- <el-radio value="M">鐩綍</el-radio>
- <el-radio value="C">鑿滃崟</el-radio>
- <el-radio value="F">鎸夐挳</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType != 'F'">
- <el-form-item label="鑿滃崟鍥炬爣" prop="icon">
- <el-popover
- placement="bottom-start"
- :width="540"
- trigger="click"
- >
- <template #reference>
- <el-input v-model="form.icon" placeholder="鐐瑰嚮閫夋嫨鍥炬爣" @blur="showSelectIcon" readonly>
- <template #prefix>
- <svg-icon
- v-if="form.icon"
- :icon-class="form.icon"
- class="el-input__icon"
- style="height: 32px;width: 16px;"
- />
- <el-icon v-else style="height: 32px;width: 16px;"><search /></el-icon>
- </template>
- </el-input>
- </template>
- <icon-select ref="iconSelectRef" @selected="selected" :active-icon="form.icon" />
- </el-popover>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
- <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑿滃崟鍚嶇О" prop="menuName">
- <el-input v-model="form.menuName" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType == 'C'">
- <el-form-item prop="routeName">
- <template #label>
- <span>
- <el-tooltip content="榛樿涓嶅~鍒欏拰璺敱鍦板潃鐩稿悓锛氬鍦板潃涓猴細`user`锛屽垯鍚嶇О涓篳User`锛堟敞鎰忥細鍥犱负router浼氬垹闄ゅ悕绉扮浉鍚岃矾鐢憋紝涓洪伩鍏嶅悕瀛楃殑鍐茬獊锛岀壒娈婃儏鍐典笅璇疯嚜瀹氫箟锛屼繚璇佸敮涓�鎬э級" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 璺敱鍚嶇О
- </span>
- </template>
- <el-input v-model="form.routeName" placeholder="璇疯緭鍏ヨ矾鐢卞悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType != 'F'">
- <el-form-item>
- <template #label>
- <span>
- <el-tooltip content="閫夋嫨鏄閾惧垯璺敱鍦板潃闇�瑕佷互`http(s)://`寮�澶�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>鏄惁澶栭摼
- </span>
- </template>
- <el-radio-group v-model="form.isFrame">
- <el-radio value="0">鏄�</el-radio>
- <el-radio value="1">鍚�</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType != 'F'">
- <el-form-item prop="path">
- <template #label>
- <span>
- <el-tooltip content="璁块棶鐨勮矾鐢卞湴鍧�锛屽锛歚user`锛屽澶栫綉鍦板潃闇�鍐呴摼璁块棶鍒欎互`http(s)://`寮�澶�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 璺敱鍦板潃
- </span>
- </template>
- <el-input v-model="form.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�" />
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType == 'C'">
- <el-form-item prop="component">
- <template #label>
- <span>
- <el-tooltip content="璁块棶鐨勭粍浠惰矾寰勶紝濡傦細`system/user/index`锛岄粯璁ゅ湪`views`鐩綍涓�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 缁勪欢璺緞
- </span>
- </template>
- <el-input v-model="form.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�" />
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType != 'M'">
- <el-form-item>
- <el-input v-model="form.perms" placeholder="璇疯緭鍏ユ潈闄愭爣璇�" maxlength="100" />
- <template #label>
- <span>
- <el-tooltip content="鎺у埗鍣ㄤ腑瀹氫箟鐨勬潈闄愬瓧绗︼紝濡傦細@PreAuthorize(`@ss.hasPermi('system:user:list')`)" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 鏉冮檺瀛楃
- </span>
- </template>
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType == 'C'">
- <el-form-item>
- <el-input v-model="form.query" placeholder="璇疯緭鍏ヨ矾鐢卞弬鏁�" maxlength="255" />
- <template #label>
- <span>
- <el-tooltip content='璁块棶璺敱鐨勯粯璁や紶閫掑弬鏁帮紝濡傦細`{"id": 1, "name": "ry"}`' placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 璺敱鍙傛暟
- </span>
- </template>
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType == 'C'">
- <el-form-item>
- <template #label>
- <span>
- <el-tooltip content="閫夋嫨鏄垯浼氳`keep-alive`缂撳瓨锛岄渶瑕佸尮閰嶇粍浠剁殑`name`鍜屽湴鍧�淇濇寔涓�鑷�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 鏄惁缂撳瓨
- </span>
- </template>
- <el-radio-group v-model="form.isCache">
- <el-radio value="0">缂撳瓨</el-radio>
- <el-radio value="1">涓嶇紦瀛�</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12" v-if="form.menuType != 'F'">
- <el-form-item>
- <template #label>
- <span>
- <el-tooltip content="閫夋嫨闅愯棌鍒欒矾鐢卞皢涓嶄細鍑虹幇鍦ㄤ晶杈规爮锛屼絾浠嶇劧鍙互璁块棶" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 鏄剧ず鐘舵��
- </span>
- </template>
- <el-radio-group v-model="form.visible">
- <el-radio
- v-for="dict in sys_show_hide"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item>
- <template #label>
- <span>
- <el-tooltip content="閫夋嫨鍋滅敤鍒欒矾鐢卞皢涓嶄細鍑虹幇鍦ㄤ晶杈规爮锛屼篃涓嶈兘琚闂�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 鑿滃崟鐘舵��
- </span>
- </template>
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Menu">
-import { addMenu, delMenu, getMenu, listMenu, updateMenu } from "@/api/system/menu"
-import SvgIcon from "@/components/SvgIcon"
-import IconSelect from "@/components/IconSelect"
-import {onMounted} from "vue";
-
-const { proxy } = getCurrentInstance()
-const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable")
-
-const menuList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const title = ref("")
-const menuOptions = ref([])
-const isExpandAll = ref(false)
-const refreshTable = ref(true)
-const iconSelectRef = ref(null)
-
-const data = reactive({
- form: {},
- queryParams: {
- menuName: undefined,
- visible: undefined
- },
- rules: {
- menuName: [{ required: true, message: "鑿滃崟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- orderNum: [{ required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur" }],
- path: [{ required: true, message: "璺敱鍦板潃涓嶈兘涓虹┖", trigger: "blur" }]
- },
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ鑿滃崟鍒楄〃 */
-function getList() {
- loading.value = true
- listMenu(queryParams.value).then(response => {
- menuList.value = proxy.handleTree(response.data, "menuId")
- loading.value = false
- })
-}
-
-/** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */
-function getTreeselect() {
- menuOptions.value = []
- listMenu().then(response => {
- const menu = { menuId: 0, menuName: "涓荤被鐩�", children: [] }
- menu.children = proxy.handleTree(response.data, "menuId")
- menuOptions.value.push(menu)
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- menuId: undefined,
- parentId: 0,
- menuName: undefined,
- icon: undefined,
- menuType: "M",
- orderNum: undefined,
- isFrame: "1",
- isCache: "0",
- visible: "0",
- status: "0"
- }
- proxy.resetForm("menuRef")
-}
-
-/** 灞曠ず涓嬫媺鍥炬爣 */
-function showSelectIcon() {
- iconSelectRef.value.reset()
-}
-
-/** 閫夋嫨鍥炬爣 */
-function selected(name) {
- form.value.icon = name
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd(row) {
- reset()
- getTreeselect()
- if (row != null && row.menuId) {
- form.value.parentId = row.menuId
- } else {
- form.value.parentId = 0
- }
- open.value = true
- title.value = "娣诲姞鑿滃崟"
-}
-
-/** 灞曞紑/鎶樺彔鎿嶄綔 */
-function toggleExpandAll() {
- refreshTable.value = false
- isExpandAll.value = !isExpandAll.value
- nextTick(() => {
- refreshTable.value = true
- })
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-async function handleUpdate(row) {
- reset()
- await getTreeselect()
- getMenu(row.menuId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼鑿滃崟"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["menuRef"].validate(valid => {
- if (valid) {
- if (form.value.menuId != undefined) {
- updateMenu(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addMenu(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- proxy.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.menuName + '"鐨勬暟鎹」?').then(function() {
- return delMenu(row.menuId)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
deleted file mode 100644
index 8043db0..0000000
--- a/src/views/system/notice/index.vue
+++ /dev/null
@@ -1,295 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
- <el-input
- v-model="queryParams.noticeTitle"
- placeholder="璇疯緭鍏ュ叕鍛婃爣棰�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鎿嶄綔浜哄憳" prop="createBy">
- <el-input
- v-model="queryParams.createBy"
- placeholder="璇疯緭鍏ユ搷浣滀汉鍛�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="绫诲瀷" prop="noticeType">
- <el-select v-model="queryParams.noticeType" placeholder="鍏憡绫诲瀷" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_notice_type"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:notice:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:notice:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:notice:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="搴忓彿" align="center" prop="noticeId" width="100" />
- <el-table-column
- label="鍏憡鏍囬"
- align="center"
- prop="noticeTitle"
- :show-overflow-tooltip="true"
- />
- <el-table-column label="鍏憡绫诲瀷" align="center" prop="noticeType" width="100">
- <template #default="scope">
- <dict-tag :options="sys_notice_type" :value="scope.row.noticeType" />
- </template>
- </el-table-column>
- <el-table-column label="鐘舵��" align="center" prop="status" width="100">
- <template #default="scope">
- <dict-tag :options="sys_notice_status" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鑰�" align="center" prop="createBy" width="100" />
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="100">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']" >鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰叕鍛婂璇濇 -->
- <el-dialog :title="title" v-model="open" width="780px" append-to-body>
- <el-form ref="noticeRef" :model="form" :rules="rules" label-width="80px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
- <el-input v-model="form.noticeTitle" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏憡绫诲瀷" prop="noticeType">
- <el-select v-model="form.noticeType" placeholder="璇烽�夋嫨">
- <el-option
- v-for="dict in sys_notice_type"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_notice_status"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="鍐呭">
- <editor v-model="form.noticeContent" :min-height="192"/>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Notice">
-import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"
-import {onMounted} from "vue";
-
-const { proxy } = getCurrentInstance()
-const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type")
-
-const noticeList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- noticeTitle: undefined,
- createBy: undefined,
- status: undefined
- },
- rules: {
- noticeTitle: [{ required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur" }],
- noticeType: [{ required: true, message: "鍏憡绫诲瀷涓嶈兘涓虹┖", trigger: "change" }]
- },
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ鍏憡鍒楄〃 */
-function getList() {
- loading.value = true
- listNotice(queryParams.value).then(response => {
- noticeList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- noticeId: undefined,
- noticeTitle: undefined,
- noticeType: undefined,
- noticeContent: undefined,
- status: "0"
- }
- proxy.resetForm("noticeRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.noticeId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞鍏憡"
-}
-
-/**淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const noticeId = row.noticeId || ids.value
- getNotice(noticeId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼鍏憡"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["noticeRef"].validate(valid => {
- if (valid) {
- if (form.value.noticeId != undefined) {
- updateNotice(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addNotice(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const noticeIds = row.noticeId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎鍏憡缂栧彿涓�"' + noticeIds + '"鐨勬暟鎹」锛�').then(function() {
- return delNotice(noticeIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue
deleted file mode 100644
index 0e80652..0000000
--- a/src/views/system/post/index.vue
+++ /dev/null
@@ -1,290 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
- <el-form-item label="宀椾綅缂栫爜" prop="postCode">
- <el-input
- v-model="queryParams.postCode"
- placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="宀椾綅鍚嶇О" prop="postName">
- <el-input
- v-model="queryParams.postName"
- placeholder="璇疯緭鍏ュ矖浣嶅悕绉�"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable style="width: 200px">
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:post:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:post:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:post:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:post:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="宀椾綅缂栧彿" align="center" prop="postId" />
- <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" />
- <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" />
- <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort" />
- <el-table-column label="鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">淇敼</el-button>
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 -->
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
- <el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="宀椾綅鍚嶇О" prop="postName">
- <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" />
- </el-form-item>
- <el-form-item label="宀椾綅缂栫爜" prop="postCode">
- <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" />
- </el-form-item>
- <el-form-item label="宀椾綅椤哄簭" prop="postSort">
- <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
- </el-form-item>
- <el-form-item label="宀椾綅鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="澶囨敞" prop="remark">
- <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Post">
-import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"
-import {onMounted} from "vue";
-
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const postList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- postCode: undefined,
- postName: undefined,
- status: undefined
- },
- rules: {
- postName: [{ required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- postCode: [{ required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur" }],
- postSort: [{ required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur" }],
- }
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ宀椾綅鍒楄〃 */
-function getList() {
- loading.value = true
- listPost(queryParams.value).then(response => {
- postList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 琛ㄥ崟閲嶇疆 */
-function reset() {
- form.value = {
- postId: undefined,
- postCode: undefined,
- postName: undefined,
- postSort: 0,
- status: "0",
- remark: undefined
- }
- proxy.resetForm("postRef")
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.postId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset()
- open.value = true
- title.value = "娣诲姞宀椾綅"
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset()
- const postId = row.postId || ids.value
- getPost(postId).then(response => {
- form.value = response.data
- open.value = true
- title.value = "淇敼宀椾綅"
- })
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["postRef"].validate(valid => {
- if (valid) {
- if (form.value.postId != undefined) {
- updatePost(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- addPost(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const postIds = row.postId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎宀椾綅缂栧彿涓�"' + postIds + '"鐨勬暟鎹」锛�').then(function() {
- return delPost(postIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("system/post/export", {
- ...queryParams.value
- }, `post_${new Date().getTime()}.xlsx`)
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
deleted file mode 100644
index a460f3c..0000000
--- a/src/views/system/role/authUser.vue
+++ /dev/null
@@ -1,182 +0,0 @@
-
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true">
- <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
- <el-input
- v-model="queryParams.userName"
- placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
- <el-input
- v-model="queryParams.phonenumber"
- placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="openSelectUser"
- v-hasPermi="['system:role:add']"
- >娣诲姞鐢ㄦ埛</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="CircleClose"
- :disabled="multiple"
- @click="cancelAuthUserAll"
- v-hasPermi="['system:role:remove']"
- >鎵归噺鍙栨秷鎺堟潈</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Close"
- @click="handleClose"
- >鍏抽棴</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="鐢ㄦ埛鍚嶇О" prop="userName" :show-overflow-tooltip="true" />
- <el-table-column label="鐢ㄦ埛鏄电О" prop="nickName" :show-overflow-tooltip="true" />
- <el-table-column label="閭" prop="email" :show-overflow-tooltip="true" />
- <el-table-column label="鎵嬫満" prop="phonenumber" :show-overflow-tooltip="true" />
- <el-table-column label="鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-button link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role:remove']">鍙栨秷鎺堟潈</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" />
- </div>
-</template>
-
-<script setup name="AuthUser">
-import selectUser from "./selectUser"
-import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"
-import {onMounted} from "vue";
-
-const route = useRoute()
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const userList = ref([])
-const loading = ref(true)
-const showSearch = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const userIds = ref([])
-
-const queryParams = reactive({
- pageNum: 1,
- pageSize: 10,
- roleId: route.params.roleId,
- userName: undefined,
- phonenumber: undefined,
-})
-
-/** 鏌ヨ鎺堟潈鐢ㄦ埛鍒楄〃 */
-function getList() {
- loading.value = true
- allocatedUserList(queryParams).then(response => {
- userList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 杩斿洖鎸夐挳 */
-function handleClose() {
- const obj = { path: "/system/role" }
- proxy.$tab.closeOpenPage(obj)
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- userIds.value = selection.map(item => item.userId)
- multiple.value = !selection.length
-}
-
-/** 鎵撳紑鎺堟潈鐢ㄦ埛琛ㄥ脊绐� */
-function openSelectUser() {
- proxy.$refs["selectRef"].show()
-}
-
-/** 鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */
-function cancelAuthUser(row) {
- proxy.$modal.confirm('纭瑕佸彇娑堣鐢ㄦ埛"' + row.userName + '"瑙掕壊鍚楋紵').then(function () {
- return authUserCancel({ userId: row.userId, roleId: queryParams.roleId })
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛")
- }).catch(() => {})
-}
-
-/** 鎵归噺鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */
-function cancelAuthUserAll(row) {
- const roleId = queryParams.roleId
- const uIds = userIds.value.join(",")
- proxy.$modal.confirm("鏄惁鍙栨秷閫変腑鐢ㄦ埛鎺堟潈鏁版嵁椤�?").then(function () {
- return authUserCancelAll({ roleId: roleId, userIds: uIds })
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛")
- }).catch(() => {})
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
deleted file mode 100644
index d960674..0000000
--- a/src/views/system/role/index.vue
+++ /dev/null
@@ -1,587 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
- <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
- <el-input
- v-model="queryParams.roleName"
- placeholder="璇疯緭鍏ヨ鑹插悕绉�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鏉冮檺瀛楃" prop="roleKey">
- <el-input
- v-model="queryParams.roleKey"
- placeholder="璇疯緭鍏ユ潈闄愬瓧绗�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="瑙掕壊鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:role:add']"
- >鏂板</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:role:edit']"
- >淇敼</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:role:remove']"
- >鍒犻櫎</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:role:export']"
- >瀵煎嚭</el-button>
- </el-col>
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
-
- <!-- 琛ㄦ牸鏁版嵁 -->
- <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="瑙掕壊缂栧彿" prop="roleId" width="120" />
- <el-table-column label="瑙掕壊鍚嶇О" prop="roleName" :show-overflow-tooltip="true" width="150" />
- <el-table-column label="鏉冮檺瀛楃" prop="roleKey" :show-overflow-tooltip="true" width="150" />
- <el-table-column label="鏄剧ず椤哄簭" prop="roleSort" width="100" />
- <el-table-column label="鐘舵��" align="center" width="100">
- <template #default="scope">
- <el-switch
- v-model="scope.row.status"
- active-value="0"
- inactive-value="1"
- @change="handleStatusChange(scope.row)"
- ></el-switch>
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
- <template #default="scope">
- <el-tooltip content="淇敼" placement="top" v-if="scope.row.roleId !== 1">
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
- </el-tooltip>
- <el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.roleId !== 1">
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button>
- </el-tooltip>
- <el-tooltip content="鏁版嵁鏉冮檺" placement="top" v-if="scope.row.roleId !== 1">
- <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
- </el-tooltip>
- <el-tooltip content="鍒嗛厤鐢ㄦ埛" placement="top" v-if="scope.row.roleId !== 1">
- <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
- </el-tooltip>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
-
- <!-- 娣诲姞鎴栦慨鏀硅鑹查厤缃璇濇 -->
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
- <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
- <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
- <el-input v-model="form.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" />
- </el-form-item>
- <el-form-item prop="roleKey">
- <template #label>
- <span>
- <el-tooltip content="鎺у埗鍣ㄤ腑瀹氫箟鐨勬潈闄愬瓧绗︼紝濡傦細@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- 鏉冮檺瀛楃
- </span>
- </template>
- <el-input v-model="form.roleKey" placeholder="璇疯緭鍏ユ潈闄愬瓧绗�" />
- </el-form-item>
- <el-form-item label="瑙掕壊椤哄簭" prop="roleSort">
- <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
- </el-form-item>
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="鑿滃崟鏉冮檺">
- <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">灞曞紑/鎶樺彔</el-checkbox>
- <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">鍏ㄩ��/鍏ㄤ笉閫�</el-checkbox>
- <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">鐖跺瓙鑱斿姩</el-checkbox>
- <el-tree
- class="tree-border"
- :data="menuOptions"
- show-checkbox
- ref="menuRef"
- node-key="id"
- :check-strictly="!form.menuCheckStrictly"
- empty-text="鍔犺浇涓紝璇风◢鍊�"
- :props="{ label: 'label', children: 'children' }"
- ></el-tree>
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鍒嗛厤瑙掕壊鏁版嵁鏉冮檺瀵硅瘽妗� -->
- <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
- <el-form :model="form" label-width="80px">
- <el-form-item label="瑙掕壊鍚嶇О">
- <el-input v-model="form.roleName" :disabled="true" />
- </el-form-item>
- <el-form-item label="鏉冮檺瀛楃">
- <el-input v-model="form.roleKey" :disabled="true" />
- </el-form-item>
- <el-form-item label="鏉冮檺鑼冨洿">
- <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
- <el-option
- v-for="item in dataScopeOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- ></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="鏁版嵁鏉冮檺" v-show="form.dataScope == 2">
- <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">灞曞紑/鎶樺彔</el-checkbox>
- <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">鍏ㄩ��/鍏ㄤ笉閫�</el-checkbox>
- <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">鐖跺瓙鑱斿姩</el-checkbox>
- <el-tree
- class="tree-border"
- :data="deptOptions"
- show-checkbox
- default-expand-all
- ref="deptRef"
- node-key="id"
- :check-strictly="!form.deptCheckStrictly"
- empty-text="鍔犺浇涓紝璇风◢鍊�"
- :props="{ label: 'label', children: 'children' }"
- ></el-tree>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitDataScope">纭� 瀹�</el-button>
- <el-button @click="cancelDataScope">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="Role">
-import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"
-import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu"
-import {onMounted} from "vue";
-
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const roleList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const dateRange = ref([])
-const menuOptions = ref([])
-const menuExpand = ref(false)
-const menuNodeAll = ref(false)
-const deptExpand = ref(true)
-const deptNodeAll = ref(false)
-const deptOptions = ref([])
-const openDataScope = ref(false)
-const menuRef = ref(null)
-const deptRef = ref(null)
-
-/** 鏁版嵁鑼冨洿閫夐」*/
-const dataScopeOptions = ref([
- { value: "1", label: "鍏ㄩ儴鏁版嵁鏉冮檺" },
- { value: "2", label: "鑷畾鏁版嵁鏉冮檺" },
- { value: "3", label: "鏈儴闂ㄦ暟鎹潈闄�" },
- { value: "4", label: "鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺" },
- { value: "5", label: "浠呮湰浜烘暟鎹潈闄�" }
-])
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- roleName: undefined,
- roleKey: undefined,
- status: undefined
- },
- rules: {
- roleName: [{ required: true, message: "瑙掕壊鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
- roleKey: [{ required: true, message: "鏉冮檺瀛楃涓嶈兘涓虹┖", trigger: "blur" }],
- roleSort: [{ required: true, message: "瑙掕壊椤哄簭涓嶈兘涓虹┖", trigger: "blur" }]
- },
-})
-
-const { queryParams, form, rules } = toRefs(data)
-
-/** 鏌ヨ瑙掕壊鍒楄〃 */
-function getList() {
- loading.value = true
- listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
- roleList.value = response.rows
- total.value = response.total
- loading.value = false
- })
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = []
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const roleIds = row.roleId || ids.value
- proxy.$modal.confirm('鏄惁纭鍒犻櫎瑙掕壊缂栧彿涓�"' + roleIds + '"鐨勬暟鎹」?').then(function () {
- return delRole(roleIds)
- }).then(() => {
- getList()
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- }).catch(() => {})
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download("system/role/export", {
- ...queryParams.value,
- }, `role_${new Date().getTime()}.xlsx`)
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- ids.value = selection.map(item => item.roleId)
- single.value = selection.length != 1
- multiple.value = !selection.length
-}
-
-/** 瑙掕壊鐘舵�佷慨鏀� */
-function handleStatusChange(row) {
- let text = row.status === "0" ? "鍚敤" : "鍋滅敤"
- proxy.$modal.confirm('纭瑕�"' + text + '""' + row.roleName + '"瑙掕壊鍚�?').then(function () {
- return changeRoleStatus(row.roleId, row.status)
- }).then(() => {
- proxy.$modal.msgSuccess(text + "鎴愬姛")
- }).catch(function () {
- row.status = row.status === "0" ? "1" : "0"
- })
-}
-
-/** 鏇村鎿嶄綔 */
-function handleCommand(command, row) {
- switch (command) {
- case "handleDataScope":
- handleDataScope(row)
- break
- case "handleAuthUser":
- handleAuthUser(row)
- break
- default:
- break
- }
-}
-
-/** 鍒嗛厤鐢ㄦ埛 */
-function handleAuthUser(row) {
- router.push("/system/role-auth/user/" + row.roleId)
-}
-
-/** 鏌ヨ鑿滃崟鏍戠粨鏋� */
-function getMenuTreeselect() {
- menuTreeselect().then(response => {
- menuOptions.value = response.data
- })
-}
-
-/** 鎵�鏈夐儴闂ㄨ妭鐐规暟鎹� */
-function getDeptAllCheckedKeys() {
- // 鐩墠琚�変腑鐨勯儴闂ㄨ妭鐐�
- let checkedKeys = deptRef.value.getCheckedKeys()
- // 鍗婇�変腑鐨勯儴闂ㄨ妭鐐�
- let halfCheckedKeys = deptRef.value.getHalfCheckedKeys()
- checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
- return checkedKeys
-}
-
-/** 閲嶇疆鏂板鐨勮〃鍗曚互鍙婂叾浠栨暟鎹� */
-function reset() {
- if (menuRef.value != undefined) {
- menuRef.value.setCheckedKeys([])
- }
- menuExpand.value = false
- menuNodeAll.value = false
- deptExpand.value = true
- deptNodeAll.value = false
- form.value = {
- roleId: undefined,
- roleName: undefined,
- roleKey: undefined,
- roleSort: 0,
- status: "0",
- menuIds: [],
- deptIds: [],
- menuCheckStrictly: true,
- deptCheckStrictly: true,
- remark: undefined
- }
- proxy.resetForm("roleRef")
-}
-
-/** 娣诲姞瑙掕壊 */
-function handleAdd() {
- reset()
- getMenuTreeselect()
- open.value = true
- title.value = "娣诲姞瑙掕壊"
-}
-
-/** 淇敼瑙掕壊 */
-function handleUpdate(row) {
- reset()
- const roleId = row.roleId || ids.value
- const roleMenu = getRoleMenuTreeselect(roleId)
- getRole(roleId).then(response => {
- form.value = response.data
- form.value.roleSort = Number(form.value.roleSort)
- open.value = true
- nextTick(() => {
- roleMenu.then((res) => {
- let checkedKeys = res.checkedKeys
- checkedKeys.forEach((v) => {
- nextTick(() => {
- menuRef.value.setChecked(v, true, false)
- })
- })
- })
- })
- })
- title.value = "淇敼瑙掕壊"
-}
-
-/** 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戠粨鏋� */
-function getRoleMenuTreeselect(roleId) {
- return roleMenuTreeselect(roleId).then(response => {
- menuOptions.value = response.menus
- return response
- })
-}
-
-/** 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋� */
-function getDeptTree(roleId) {
- return deptTreeSelect(roleId).then(response => {
- deptOptions.value = response.depts
- return response
- })
-}
-
-/** 鏍戞潈闄愶紙灞曞紑/鎶樺彔锛�*/
-function handleCheckedTreeExpand(value, type) {
- if (type == "menu") {
- let treeList = menuOptions.value
- for (let i = 0; i < treeList.length; i++) {
- menuRef.value.store.nodesMap[treeList[i].id].expanded = value
- }
- } else if (type == "dept") {
- let treeList = deptOptions.value
- for (let i = 0; i < treeList.length; i++) {
- deptRef.value.store.nodesMap[treeList[i].id].expanded = value
- }
- }
-}
-
-/** 鏍戞潈闄愶紙鍏ㄩ��/鍏ㄤ笉閫夛級 */
-function handleCheckedTreeNodeAll(value, type) {
- if (type == "menu") {
- menuRef.value.setCheckedNodes(value ? menuOptions.value : [])
- } else if (type == "dept") {
- deptRef.value.setCheckedNodes(value ? deptOptions.value : [])
- }
-}
-
-/** 鏍戞潈闄愶紙鐖跺瓙鑱斿姩锛� */
-function handleCheckedTreeConnect(value, type) {
- if (type == "menu") {
- form.value.menuCheckStrictly = value ? true : false
- } else if (type == "dept") {
- form.value.deptCheckStrictly = value ? true : false
- }
-}
-
-/** 鎵�鏈夎彍鍗曡妭鐐规暟鎹� */
-function getMenuAllCheckedKeys() {
- // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐�
- let checkedKeys = menuRef.value.getCheckedKeys()
- // 鍗婇�変腑鐨勮彍鍗曡妭鐐�
- let halfCheckedKeys = menuRef.value.getHalfCheckedKeys()
- checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
- return checkedKeys
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["roleRef"].validate(valid => {
- if (valid) {
- if (form.value.roleId != undefined) {
- form.value.menuIds = getMenuAllCheckedKeys()
- updateRole(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- open.value = false
- getList()
- })
- } else {
- form.value.menuIds = getMenuAllCheckedKeys()
- addRole(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- open.value = false
- getList()
- })
- }
- }
- })
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false
- reset()
-}
-
-/** 閫夋嫨瑙掕壊鏉冮檺鑼冨洿瑙﹀彂 */
-function dataScopeSelectChange(value) {
- if (value !== "2") {
- deptRef.value.setCheckedKeys([])
- }
-}
-
-/** 鍒嗛厤鏁版嵁鏉冮檺鎿嶄綔 */
-function handleDataScope(row) {
- reset()
- const deptTreeSelect = getDeptTree(row.roleId)
- getRole(row.roleId).then(response => {
- form.value = response.data
- openDataScope.value = true
- nextTick(() => {
- deptTreeSelect.then(res => {
- nextTick(() => {
- if (deptRef.value) {
- deptRef.value.setCheckedKeys(res.checkedKeys)
- }
- })
- })
- })
- })
- title.value = "鍒嗛厤鏁版嵁鏉冮檺"
-}
-
-/** 鎻愪氦鎸夐挳锛堟暟鎹潈闄愶級 */
-function submitDataScope() {
- if (form.value.roleId != undefined) {
- form.value.deptIds = getDeptAllCheckedKeys()
- dataScope(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- openDataScope.value = false
- getList()
- })
- }
-}
-
-/** 鍙栨秷鎸夐挳锛堟暟鎹潈闄愶級*/
-function cancelDataScope() {
- openDataScope.value = false
- reset()
-}
-
-onMounted(() => {
- getList();
-});
-</script>
diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
deleted file mode 100644
index 3e3d8aa..0000000
--- a/src/views/system/role/selectUser.vue
+++ /dev/null
@@ -1,144 +0,0 @@
-<template>
- <!-- 鎺堟潈鐢ㄦ埛 -->
- <el-dialog title="閫夋嫨鐢ㄦ埛" v-model="visible" width="800px" top="5vh" append-to-body>
- <el-form :model="queryParams" ref="queryRef" :inline="true">
- <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
- <el-input
- v-model="queryParams.userName"
- placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
- clearable
- style="width: 180px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
- <el-input
- v-model="queryParams.phonenumber"
- placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
- clearable
- style="width: 180px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <el-row>
- <el-table @row-click="clickRow" ref="refTable" :data="userList" @selection-change="handleSelectionChange" height="260px">
- <el-table-column type="selection" width="55"></el-table-column>
- <el-table-column label="鐢ㄦ埛鍚嶇О" prop="userName" :show-overflow-tooltip="true" />
- <el-table-column label="鐢ㄦ埛鏄电О" prop="nickName" :show-overflow-tooltip="true" />
- <el-table-column label="閭" prop="email" :show-overflow-tooltip="true" />
- <el-table-column label="鎵嬫満" prop="phonenumber" :show-overflow-tooltip="true" />
- <el-table-column label="鐘舵��" align="center" prop="status">
- <template #default="scope">
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
- </template>
- </el-table-column>
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleSelectUser">纭� 瀹�</el-button>
- <el-button @click="visible = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup name="SelectUser">
-import { authUserSelectAll, unallocatedUserList } from "@/api/system/role"
-
-const props = defineProps({
- roleId: {
- type: [Number, String]
- }
-})
-
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
-
-const userList = ref([])
-const visible = ref(false)
-const total = ref(0)
-const userIds = ref([])
-
-const queryParams = reactive({
- pageNum: 1,
- pageSize: 10,
- roleId: undefined,
- userName: undefined,
- phonenumber: undefined
-})
-
-// 鏄剧ず寮规
-function show() {
- queryParams.roleId = props.roleId
- getList()
- visible.value = true
-}
-
-/**閫夋嫨琛� */
-function clickRow(row) {
- proxy.$refs["refTable"].toggleRowSelection(row)
-}
-
-// 澶氶�夋閫変腑鏁版嵁
-function handleSelectionChange(selection) {
- userIds.value = selection.map(item => item.userId)
-}
-
-// 鏌ヨ琛ㄦ暟鎹�
-function getList() {
- unallocatedUserList(queryParams).then(res => {
- userList.value = res.rows
- total.value = res.total
- })
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-const emit = defineEmits(["ok"])
-/** 閫夋嫨鎺堟潈鐢ㄦ埛鎿嶄綔 */
-function handleSelectUser() {
- const roleId = queryParams.roleId
- const uIds = userIds.value.join(",")
- if (uIds == "") {
- proxy.$modal.msgError("璇烽�夋嫨瑕佸垎閰嶇殑鐢ㄦ埛")
- return
- }
- authUserSelectAll({ roleId: roleId, userIds: uIds }).then(res => {
- proxy.$modal.msgSuccess(res.msg)
- visible.value = false
- emit("ok")
- })
-}
-
-defineExpose({
- show,
-})
-</script>
diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue
deleted file mode 100644
index 3935ab1..0000000
--- a/src/views/system/user/authRole.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
- <div class="app-container">
- <h4 class="form-header h4">鍩烘湰淇℃伅</h4>
- <el-form :model="form" label-width="80px">
- <el-row>
- <el-col :span="8" :offset="2">
- <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
- <el-input v-model="form.nickName" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="8" :offset="2">
- <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
- <el-input v-model="form.userName" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <h4 class="form-header h4">瑙掕壊淇℃伅</h4>
- <el-table v-loading="loading" :row-key="getRowKey" @row-click="clickRow" ref="roleRef" @selection-change="handleSelectionChange" :data="roles.slice((pageNum - 1) * pageSize, pageNum * pageSize)">
- <el-table-column label="搴忓彿" width="55" type="index" align="center">
- <template #default="scope">
- <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
- </template>
- </el-table-column>
- <el-table-column type="selection" :reserve-selection="true" :selectable="checkSelectable" width="55"></el-table-column>
- <el-table-column label="瑙掕壊缂栧彿" align="center" prop="roleId" />
- <el-table-column label="瑙掕壊鍚嶇О" align="center" prop="roleName" />
- <el-table-column label="鏉冮檺瀛楃" align="center" prop="roleKey" />
- <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- </el-table>
-
- <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" />
-
- <el-form label-width="100px">
- <div style="text-align: center;margin-left:-120px;margin-top:30px;">
- <el-button type="primary" @click="submitForm()">鎻愪氦</el-button>
- <el-button @click="close()">杩斿洖</el-button>
- </div>
- </el-form>
- </div>
-</template>
-
-<script setup name="AuthRole">
-import { getAuthRole, updateAuthRole } from "@/api/system/user"
-
-const route = useRoute()
-const { proxy } = getCurrentInstance()
-
-const loading = ref(true)
-const total = ref(0)
-const pageNum = ref(1)
-const pageSize = ref(10)
-const roleIds = ref([])
-const roles = ref([])
-const form = ref({
- nickName: undefined,
- userName: undefined,
- userId: undefined
-})
-
-/** 鍗曞嚮閫変腑琛屾暟鎹� */
-function clickRow(row) {
- if (checkSelectable(row)) {
- proxy.$refs["roleRef"].toggleRowSelection(row)
- }
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- roleIds.value = selection.map(item => item.roleId)
-}
-
-/** 淇濆瓨閫変腑鐨勬暟鎹紪鍙� */
-function getRowKey(row) {
- return row.roleId
-}
-
-// 妫�鏌ヨ鑹茬姸鎬�
-function checkSelectable(row) {
- return row.status === "0" ? true : false
-}
-
-/** 鍏抽棴鎸夐挳 */
-function close() {
- const obj = { path: "/system/user" }
- proxy.$tab.closeOpenPage(obj)
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- const userId = form.value.userId
- const rIds = roleIds.value.join(",")
- updateAuthRole({ userId: userId, roleIds: rIds }).then(response => {
- proxy.$modal.msgSuccess("鎺堟潈鎴愬姛")
- close()
- })
-}
-
-(() => {
- const userId = route.params && route.params.userId
- if (userId) {
- loading.value = true
- getAuthRole(userId).then(response => {
- form.value = response.user
- roles.value = response.roles
- total.value = roles.value.length
- nextTick(() => {
- roles.value.forEach(row => {
- if (row.flag) {
- proxy.$refs["roleRef"].toggleRowSelection(row)
- }
- })
- })
- loading.value = false
- })
- }
-})()
-</script>
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
deleted file mode 100644
index 40fb371..0000000
--- a/src/views/system/user/index.vue
+++ /dev/null
@@ -1,902 +0,0 @@
-<template>
- <div class="app-container">
- <el-row :gutter="20" style="height: calc(100vh - 8em)">
- <splitpanes
- :horizontal="appStore.device === 'mobile'"
- class="default-theme"
- >
- <!--閮ㄩ棬鏁版嵁-->
- <pane size="16">
- <el-col style="padding: 10px">
- <div class="head-container">
- <el-input
- v-model="deptName"
- placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
- clearable
- prefix-icon="Search"
- style="margin-bottom: 20px"
- />
- </div>
- <div class="head-container">
- <el-tree
- :data="deptOptions"
- :props="{ label: 'label', children: 'children' }"
- :expand-on-click-node="false"
- :filter-node-method="filterNode"
- ref="deptTreeRef"
- node-key="id"
- highlight-current
- default-expand-all
- @node-click="handleNodeClick"
- />
- </div>
- </el-col>
- </pane>
- <!--鐢ㄦ埛鏁版嵁-->
- <pane size="84">
- <el-col style="padding: 10px">
- <el-form
- :model="queryParams"
- ref="queryRef"
- :inline="true"
- v-show="showSearch"
- label-width="68px"
- >
- <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
- <el-input
- v-model="queryParams.userName"
- placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
- <el-input
- v-model="queryParams.phonenumber"
- placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
- clearable
- style="width: 240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-select
- v-model="queryParams.status"
- placeholder="鐢ㄦ埛鐘舵��"
- clearable
- style="width: 240px"
- >
- <el-option
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery"
- >鎼滅储</el-button
- >
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="handleAdd"
- v-hasPermi="['system:user:add']"
- >鏂板</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleUpdate"
- v-hasPermi="['system:user:edit']"
- >淇敼</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['system:user:remove']"
- >鍒犻櫎</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="info"
- plain
- icon="Upload"
- @click="handleImport"
- v-hasPermi="['system:user:import']"
- >瀵煎叆</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="warning"
- plain
- icon="Download"
- @click="handleExport"
- v-hasPermi="['system:user:export']"
- >瀵煎嚭</el-button
- >
- </el-col>
- <right-toolbar
- v-model:showSearch="showSearch"
- @queryTable="getList"
- :columns="columns"
- ></right-toolbar>
- </el-row>
-
- <el-table
- v-loading="loading"
- :data="userList"
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="50" align="center" />
- <el-table-column
- label="鐢ㄦ埛缂栧彿"
- align="center"
- key="userId"
- prop="userId"
- v-if="columns[0].visible"
- />
- <el-table-column
- label="鐧诲綍璐﹀彿"
- align="center"
- key="userName"
- prop="userName"
- v-if="columns[1].visible"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鐢ㄦ埛鏄电О"
- align="center"
- key="nickName"
- prop="nickName"
- v-if="columns[2].visible"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="閮ㄩ棬"
- align="center"
- key="deptNames"
- prop="deptNames"
- v-if="columns[3].visible"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鎵嬫満鍙风爜"
- align="center"
- key="phonenumber"
- prop="phonenumber"
- v-if="columns[4].visible"
- width="120"
- />
- <el-table-column
- label="鐘舵��"
- align="center"
- key="status"
- v-if="columns[5].visible"
- >
- <template #default="scope">
- <el-switch
- v-model="scope.row.status"
- active-value="0"
- inactive-value="1"
- @change="handleStatusChange(scope.row)"
- ></el-switch>
- </template>
- </el-table-column>
- <el-table-column
- label="鍒涘缓鏃堕棿"
- align="center"
- prop="createTime"
- v-if="columns[6].visible"
- width="160"
- >
- <template #default="scope">
- <span>{{ parseTime(scope.row.createTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="150"
- class-name="small-padding fixed-width"
- >
- <template #default="scope">
- <el-tooltip
- content="淇敼"
- placement="top"
- v-if="scope.row.userId !== 1"
- >
- <el-button
- link
- type="primary"
- icon="Edit"
- @click="handleUpdate(scope.row)"
- v-hasPermi="['system:user:edit']"
- ></el-button>
- </el-tooltip>
- <el-tooltip
- content="鍒犻櫎"
- placement="top"
- v-if="scope.row.userId !== 1"
- >
- <el-button
- link
- type="primary"
- icon="Delete"
- @click="handleDelete(scope.row)"
- v-hasPermi="['system:user:remove']"
- ></el-button>
- </el-tooltip>
- <el-tooltip
- content="閲嶇疆瀵嗙爜"
- placement="top"
- v-if="scope.row.userId !== 1"
- >
- <el-button
- link
- type="primary"
- icon="Key"
- @click="handleResetPwd(scope.row)"
- v-hasPermi="['system:user:resetPwd']"
- ></el-button>
- </el-tooltip>
- <el-tooltip
- content="鍒嗛厤瑙掕壊"
- placement="top"
- v-if="scope.row.userId !== 1"
- >
- <el-button
- link
- type="primary"
- icon="CircleCheck"
- @click="handleAuthRole(scope.row)"
- v-hasPermi="['system:user:edit']"
- ></el-button>
- </el-tooltip>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- </el-col>
- </pane>
- </splitpanes>
- </el-row>
-
- <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
- <el-dialog :title="title" v-model="open" width="600px" append-to-body>
- <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
- <el-input
- v-model="form.nickName"
- placeholder="璇疯緭鍏ョ敤鎴锋樀绉�"
- maxlength="30"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰掑睘鍏徃" prop="deptIds">
- <el-tree-select
- v-model="form.deptIds"
- :data="enabledDeptOptions"
- :render-after-expand="false"
- show-checkbox
- multiple
- placeholder="璇烽�夋嫨褰掑睘鍏徃"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
- <el-input
- v-model="form.phonenumber"
- placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
- maxlength="11"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閭" prop="email">
- <el-input
- v-model="form.email"
- placeholder="璇疯緭鍏ラ偖绠�"
- maxlength="50"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item
- v-if="form.userId == undefined"
- label="鐧诲綍璐﹀彿"
- prop="userName"
- >
- <el-input
- v-model="form.userName"
- placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
- maxlength="30"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- v-if="form.userId == undefined"
- label="鐢ㄦ埛瀵嗙爜"
- prop="password"
- >
- <el-input
- v-model="form.password"
- placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�"
- type="password"
- maxlength="20"
- show-password
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ埛鎬у埆">
- <el-select v-model="form.sex" placeholder="璇烽�夋嫨">
- <el-option
- v-for="dict in sys_user_sex"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio
- v-for="dict in sys_normal_disable"
- :key="dict.value"
- :value="dict.value"
- >{{ dict.label }}</el-radio
- >
- </el-radio-group>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="宀椾綅">
- <el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in postOptions"
- :key="item.postId"
- :label="item.postName"
- :value="item.postId"
- :disabled="item.status == 1"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙掕壊" prop="roleIds">
- <el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
- <el-option
- v-for="item in roleOptions"
- :key="item.roleId"
- :label="item.roleName"
- :value="item.roleId"
- :disabled="item.status == 1"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="澶囨敞">
- <el-input
- v-model="form.remark"
- type="textarea"
- placeholder="璇疯緭鍏ュ唴瀹�"
- ></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="cancel">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <div class="el-upload__tip">
- <el-checkbox
- v-model="upload.updateSupport"
- />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- </div>
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- >
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup name="User">
-import { getToken } from "@/utils/auth";
-import useAppStore from "@/store/modules/app";
-import {
- changeUserStatus,
- listUser,
- resetUserPwd,
- delUser,
- getUser,
- updateUser,
- addUser,
- deptTreeSelect,
-} from "@/api/system/user";
-import { Splitpanes, Pane } from "splitpanes";
-import "splitpanes/dist/splitpanes.css";
-import {onMounted} from "vue";
-
-const router = useRouter();
-const appStore = useAppStore();
-const { proxy } = getCurrentInstance();
-const { sys_normal_disable, sys_user_sex } = proxy.useDict(
- "sys_normal_disable",
- "sys_user_sex"
-);
-
-const userList = ref([]);
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-const dateRange = ref([]);
-const deptName = ref("");
-const deptOptions = ref(undefined);
-const enabledDeptOptions = ref(undefined);
-const initPassword = ref(undefined);
-const postOptions = ref([]);
-const roleOptions = ref([]);
-/*** 鐢ㄦ埛瀵煎叆鍙傛暟 */
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 0,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData",
-});
-// 鍒楁樉闅愪俊鎭�
-const columns = ref([
- { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
- { key: 1, label: `鐧诲綍璐﹀彿`, visible: true },
- { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
- { key: 3, label: `閮ㄩ棬`, visible: true },
- { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
- { key: 5, label: `鐘舵�乣, visible: true },
- { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
-]);
-
-const data = reactive({
- form: {},
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- userName: undefined,
- phonenumber: undefined,
- status: undefined,
- deptId: undefined,
- },
- rules: {
- userName: [
- { required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" },
- {
- min: 2,
- max: 20,
- message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
- trigger: "blur",
- },
- ],
- nickName: [
- { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
- ],
- deptIds: [{ required: true, message: "鍏徃涓嶈兘涓虹┖", trigger: "change" }],
- roleIds: [{ required: true, message: "瑙掕壊涓嶈兘涓虹┖", trigger: "change" }],
- password: [
- { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
- {
- min: 5,
- max: 20,
- message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
- trigger: "blur",
- },
- {
- pattern: /^[^<>"'|\\]+$/,
- message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |",
- trigger: "blur",
- },
- ],
- email: [
- {
- type: "email",
- message: "璇疯緭鍏ユ纭殑閭鍦板潃",
- trigger: ["blur", "change"],
- },
- ],
- phonenumber: [
- {
- pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
- message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
- trigger: "blur",
- },
- ],
- },
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 閫氳繃鏉′欢杩囨护鑺傜偣 */
-const filterNode = (value, data) => {
- if (!value) return true;
- return data.label.indexOf(value) !== -1;
-};
-
-/** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */
-watch(deptName, (val) => {
- proxy.$refs["deptTreeRef"].filter(val);
-});
-
-/** 鏌ヨ鐢ㄦ埛鍒楄〃 */
-function getList() {
- loading.value = true;
- listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(
- (res) => {
- loading.value = false;
- userList.value = res.rows;
- total.value = res.total;
- }
- );
-}
-
-/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
-function getDeptTree() {
- deptTreeSelect().then((response) => {
- deptOptions.value = response.data;
- enabledDeptOptions.value = filterDisabledDept(
- JSON.parse(JSON.stringify(response.data))
- );
- });
-}
-
-/** 杩囨护绂佺敤鐨勯儴闂� */
-function filterDisabledDept(deptList) {
- return deptList.filter((dept) => {
- if (dept.disabled) {
- return false;
- }
- if (dept.children && dept.children.length) {
- dept.children = filterDisabledDept(dept.children);
- }
- return true;
- });
-}
-
-/** 鑺傜偣鍗曞嚮浜嬩欢 */
-function handleNodeClick(data) {
- queryParams.value.deptId = data.id;
- handleQuery();
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1;
- getList();
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = [];
- proxy.resetForm("queryRef");
- queryParams.value.deptId = undefined;
- proxy.$refs.deptTreeRef.setCurrentKey(null);
- handleQuery();
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const userIds = row.userId || ids.value;
- proxy.$modal
- .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
- .then(function () {
- return delUser(userIds);
- })
- .then(() => {
- getList();
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- })
- .catch(() => {});
-}
-
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
- proxy.download(
- "system/user/export",
- {
- ...queryParams.value,
- },
- `user_${new Date().getTime()}.xlsx`
- );
-}
-
-/** 鐢ㄦ埛鐘舵�佷慨鏀� */
-function handleStatusChange(row) {
- let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
- proxy.$modal
- .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?')
- .then(function () {
- return changeUserStatus(row.userId, row.status);
- })
- .then(() => {
- proxy.$modal.msgSuccess(text + "鎴愬姛");
- })
- .catch(function () {
- row.status = row.status === "0" ? "1" : "0";
- });
-}
-
-/** 鏇村鎿嶄綔 */
-function handleCommand(command, row) {
- switch (command) {
- case "handleResetPwd":
- handleResetPwd(row);
- break;
- case "handleAuthRole":
- handleAuthRole(row);
- break;
- default:
- break;
- }
-}
-
-/** 璺宠浆瑙掕壊鍒嗛厤 */
-function handleAuthRole(row) {
- const userId = row.userId;
- router.push("/system/user-auth/role/" + userId);
-}
-
-/** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
-function handleResetPwd(row) {
- proxy
- .$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- closeOnClickModal: false,
- inputPattern: /^.{5,20}$/,
- inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
- inputValidator: (value) => {
- if (/<|>|"|'|\||\\/.test(value)) {
- return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |";
- }
- },
- })
- .then(({ value }) => {
- resetUserPwd(row.userId, value).then((response) => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
- });
- })
- .catch(() => {});
-}
-
-/** 閫夋嫨鏉℃暟 */
-function handleSelectionChange(selection) {
- ids.value = selection.map((item) => item.userId);
- single.value = selection.length != 1;
- multiple.value = !selection.length;
-}
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鐢ㄦ埛瀵煎叆";
- upload.open = true;
-}
-
-/** 涓嬭浇妯℃澘鎿嶄綔 */
-function importTemplate() {
- proxy.download(
- "system/user/importTemplate",
- {},
- `user_template_${new Date().getTime()}.xlsx`
- );
-}
-
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- proxy.$alert(
- "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
- response.msg +
- "</div>",
- "瀵煎叆缁撴灉",
- { dangerouslyUseHTMLString: true }
- );
- getList();
-};
-
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 閲嶇疆鎿嶄綔琛ㄥ崟 */
-function reset() {
- form.value = {
- userId: undefined,
- deptId: undefined,
- userName: undefined,
- nickName: undefined,
- password: undefined,
- phonenumber: undefined,
- email: undefined,
- sex: undefined,
- status: "0",
- remark: undefined,
- postIds: [],
- roleIds: [],
- };
- proxy.resetForm("userRef");
-}
-
-/** 鍙栨秷鎸夐挳 */
-function cancel() {
- open.value = false;
- reset();
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
- reset();
- getUser().then((response) => {
- postOptions.value = response.posts;
- roleOptions.value = response.roles;
- open.value = true;
- title.value = "娣诲姞鐢ㄦ埛";
- form.value.password = initPassword.value;
- });
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
- reset();
- const userId = row.userId || ids.value;
- getUser(userId).then((response) => {
- form.value = response.data;
- postOptions.value = response.posts;
- roleOptions.value = response.roles;
- form.value.postIds = response.postIds;
- form.value.roleIds = response.roleIds;
- form.value.deptIds = response.deptIds;
- open.value = true;
- title.value = "淇敼鐢ㄦ埛";
- form.password = "";
- });
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- proxy.$refs["userRef"].validate((valid) => {
- if (valid) {
- if (form.value.userId != undefined) {
- updateUser(form.value).then((response) => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛");
- open.value = false;
- getList();
- });
- } else {
- addUser(form.value).then((response) => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛");
- open.value = false;
- getList();
- });
- }
- }
- });
-}
-onMounted(() => {
- getDeptTree();
- getList();
-});
-</script>
diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
deleted file mode 100644
index d27c25b..0000000
--- a/src/views/system/user/profile/index.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<template>
- <div class="app-container">
- <el-row :gutter="20">
- <el-col :span="6" :xs="24">
- <el-card class="box-card">
- <template v-slot:header>
- <div class="clearfix">
- <span>涓汉淇℃伅</span>
- </div>
- </template>
- <div>
- <div class="text-center">
- <userAvatar />
- </div>
- <ul class="list-group list-group-striped">
- <li class="list-group-item">
- <svg-icon icon-class="user" />鐢ㄦ埛鍚嶇О
- <div class="pull-right">{{ state.user.userName }}</div>
- </li>
- <li class="list-group-item">
- <svg-icon icon-class="phone" />鎵嬫満鍙风爜
- <div class="pull-right">{{ state.user.phonenumber }}</div>
- </li>
- <li class="list-group-item">
- <svg-icon icon-class="email" />鐢ㄦ埛閭
- <div class="pull-right">{{ state.user.email }}</div>
- </li>
- <li class="list-group-item">
- <svg-icon icon-class="tree" />鎵�灞為儴闂�
- <div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
- </li>
- <li class="list-group-item">
- <svg-icon icon-class="peoples" />鎵�灞炶鑹�
- <div class="pull-right">{{ state.roleGroup }}</div>
- </li>
- <li class="list-group-item">
- <svg-icon icon-class="date" />鍒涘缓鏃ユ湡
- <div class="pull-right">{{ state.user.createTime }}</div>
- </li>
- </ul>
- </div>
- </el-card>
- </el-col>
- <el-col :span="18" :xs="24">
- <el-card>
- <template v-slot:header>
- <div class="clearfix">
- <span>鍩烘湰璧勬枡</span>
- </div>
- </template>
- <el-tabs v-model="activeTab">
- <el-tab-pane label="鍩烘湰璧勬枡" name="userinfo">
- <userInfo :user="state.user" />
- </el-tab-pane>
- <el-tab-pane label="淇敼瀵嗙爜" name="resetPwd">
- <resetPwd />
- </el-tab-pane>
- </el-tabs>
- </el-card>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup name="Profile">
-import userAvatar from "./userAvatar"
-import userInfo from "./userInfo"
-import resetPwd from "./resetPwd"
-import { getUserProfile } from "@/api/system/user"
-
-const activeTab = ref("userinfo")
-const state = reactive({
- user: {},
- roleGroup: {},
- postGroup: {}
-})
-
-function getUser() {
- getUserProfile().then(response => {
- state.user = response.data
- state.roleGroup = response.roleGroup
- state.postGroup = response.postGroup
- })
-}
-
-getUser()
-</script>
diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
deleted file mode 100644
index 308229a..0000000
--- a/src/views/system/user/profile/resetPwd.vue
+++ /dev/null
@@ -1,59 +0,0 @@
-<template>
- <el-form ref="pwdRef" :model="user" :rules="rules" label-width="80px">
- <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
- <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" show-password />
- </el-form-item>
- <el-form-item label="鏂板瘑鐮�" prop="newPassword">
- <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" show-password />
- </el-form-item>
- <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
- <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゆ柊瀵嗙爜" type="password" show-password/>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="submit">淇濆瓨</el-button>
- <el-button type="danger" @click="close">鍏抽棴</el-button>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import { updateUserPwd } from "@/api/system/user"
-
-const { proxy } = getCurrentInstance()
-
-const user = reactive({
- oldPassword: undefined,
- newPassword: undefined,
- confirmPassword: undefined
-})
-
-const equalToPassword = (rule, value, callback) => {
- if (user.newPassword !== value) {
- callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"))
- } else {
- callback()
- }
-}
-
-const rules = ref({
- oldPassword: [{ required: true, message: "鏃у瘑鐮佷笉鑳戒负绌�", trigger: "blur" }],
- newPassword: [{ required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" }, { min: 6, max: 20, message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
- confirmPassword: [{ required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { required: true, validator: equalToPassword, trigger: "blur" }]
-})
-
-/** 鎻愪氦鎸夐挳 */
-function submit() {
- proxy.$refs.pwdRef.validate(valid => {
- if (valid) {
- updateUserPwd(user.oldPassword, user.newPassword).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- })
- }
- })
-}
-
-/** 鍏抽棴鎸夐挳 */
-function close() {
- proxy.$tab.closePage()
-}
-</script>
diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue
deleted file mode 100644
index ff1c9ef..0000000
--- a/src/views/system/user/profile/userAvatar.vue
+++ /dev/null
@@ -1,168 +0,0 @@
-<template>
- <div class="user-info-head" @click="editCropper()">
- <img :src="options.img" title="鐐瑰嚮涓婁紶澶村儚" class="img-circle img-lg" />
- <el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
- <el-row>
- <el-col :xs="24" :md="12" :style="{ height: '350px' }">
- <vue-cropper ref="cropper" :img="options.img" :info="true" :autoCrop="options.autoCrop"
- :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :fixedBox="options.fixedBox"
- :outputType="options.outputType" @realTime="realTime" v-if="visible" />
- </el-col>
- <el-col :xs="24" :md="12" :style="{ height: '350px' }">
- <div class="avatar-upload-preview">
- <img :src="options.previews.url" :style="options.previews.img" />
- </div>
- </el-col>
- </el-row>
- <br />
- <el-row>
- <el-col :lg="2" :md="2">
- <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
- <el-button>
- 閫夋嫨
- <el-icon class="el-icon--right">
- <Upload />
- </el-icon>
- </el-button>
- </el-upload>
- </el-col>
- <el-col :lg="{ span: 1, offset: 2 }" :md="2">
- <el-button icon="Plus" @click="changeScale(1)"></el-button>
- </el-col>
- <el-col :lg="{ span: 1, offset: 1 }" :md="2">
- <el-button icon="Minus" @click="changeScale(-1)"></el-button>
- </el-col>
- <el-col :lg="{ span: 1, offset: 1 }" :md="2">
- <el-button icon="RefreshLeft" @click="rotateLeft()"></el-button>
- </el-col>
- <el-col :lg="{ span: 1, offset: 1 }" :md="2">
- <el-button icon="RefreshRight" @click="rotateRight()"></el-button>
- </el-col>
- <el-col :lg="{ span: 2, offset: 6 }" :md="2">
- <el-button type="primary" @click="uploadImg()">鎻� 浜�</el-button>
- </el-col>
- </el-row>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import "vue-cropper/dist/index.css"
-import { VueCropper } from "vue-cropper"
-import { uploadAvatar } from "@/api/system/user"
-import useUserStore from "@/store/modules/user"
-
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-
-const open = ref(false)
-const visible = ref(false)
-const title = ref("淇敼澶村儚")
-
-//鍥剧墖瑁佸壀鏁版嵁
-const options = reactive({
- img: userStore.avatar, // 瑁佸壀鍥剧墖鐨勫湴鍧�
- autoCrop: true, // 鏄惁榛樿鐢熸垚鎴浘妗�
- autoCropWidth: 200, // 榛樿鐢熸垚鎴浘妗嗗搴�
- autoCropHeight: 200, // 榛樿鐢熸垚鎴浘妗嗛珮搴�
- fixedBox: true, // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙�
- outputType: "png", // 榛樿鐢熸垚鎴浘涓篜NG鏍煎紡
- filename: 'avatar', // 鏂囦欢鍚嶇О
- previews: {} //棰勮鏁版嵁
-})
-
-/** 缂栬緫澶村儚 */
-function editCropper() {
- open.value = true
-}
-
-/** 鎵撳紑寮瑰嚭灞傜粨鏉熸椂鐨勫洖璋� */
-function modalOpened() {
- visible.value = true
-}
-
-/** 瑕嗙洊榛樿涓婁紶琛屼负 */
-function requestUpload() { }
-
-/** 鍚戝乏鏃嬭浆 */
-function rotateLeft() {
- proxy.$refs.cropper.rotateLeft()
-}
-
-/** 鍚戝彸鏃嬭浆 */
-function rotateRight() {
- proxy.$refs.cropper.rotateRight()
-}
-
-/** 鍥剧墖缂╂斁 */
-function changeScale(num) {
- num = num || 1
- proxy.$refs.cropper.changeScale(num)
-}
-
-/** 涓婁紶棰勫鐞� */
-function beforeUpload(file) {
- if (file.type.indexOf("image/") == -1) {
- proxy.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��")
- } else {
- const reader = new FileReader()
- reader.readAsDataURL(file)
- reader.onload = () => {
- options.img = reader.result
- options.filename = file.name
- }
- }
-}
-
-/** 涓婁紶鍥剧墖 */
-function uploadImg() {
- proxy.$refs.cropper.getCropBlob(data => {
- let formData = new FormData()
- formData.append("avatarfile", data, options.filename)
- uploadAvatar(formData).then(response => {
- open.value = false
- options.img = import.meta.env.VITE_APP_BASE_API + '/profile/' + response.imgUrl
- userStore.avatar = options.img
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- visible.value = false
- })
- })
-}
-
-/** 瀹炴椂棰勮 */
-function realTime(data) {
- options.previews = data
-}
-
-/** 鍏抽棴绐楀彛 */
-function closeDialog() {
- options.img = userStore.avatar
- options.visible = false
-}
-</script>
-
-<style lang='scss' scoped>
-.user-info-head {
- position: relative;
- display: inline-block;
- height: 120px;
-}
-
-.user-info-head:hover:after {
- content: "+";
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- color: #eee;
- background: rgba(0, 0, 0, 0.5);
- font-size: 24px;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- cursor: pointer;
- line-height: 110px;
- border-radius: 50%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
deleted file mode 100644
index 77f6924..0000000
--- a/src/views/system/user/profile/userInfo.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-<template>
- <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
- <el-input v-model="form.nickName" maxlength="30" />
- </el-form-item>
- <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
- <el-input v-model="form.phonenumber" maxlength="11" />
- </el-form-item>
- <el-form-item label="閭" prop="email">
- <el-input v-model="form.email" maxlength="50" />
- </el-form-item>
- <el-form-item label="鎬у埆">
- <el-radio-group v-model="form.sex">
- <el-radio value="0">鐢�</el-radio>
- <el-radio value="1">濂�</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="submit">淇濆瓨</el-button>
- <el-button type="danger" @click="close">鍏抽棴</el-button>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import { updateUserProfile } from "@/api/system/user"
-
-const props = defineProps({
- user: {
- type: Object
- }
-})
-
-const { proxy } = getCurrentInstance()
-
-const form = ref({})
-const rules = ref({
- nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
- email: [{ required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" }, { type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
- phonenumber: [{ required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
-})
-
-/** 鎻愪氦鎸夐挳 */
-function submit() {
- proxy.$refs.userRef.validate(valid => {
- if (valid) {
- updateUserProfile(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- props.user.phonenumber = form.value.phonenumber
- props.user.email = form.value.email
- })
- }
- })
-}
-
-/** 鍏抽棴鎸夐挳 */
-function close() {
- proxy.$tab.closePage()
-}
-
-// 鍥炴樉褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
-watch(() => props.user, user => {
- if (user) {
- form.value = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
- }
-},{ immediate: true })
-</script>
diff --git a/src/views/tideLogin.vue b/src/views/tideLogin.vue
deleted file mode 100644
index e4a82f7..0000000
--- a/src/views/tideLogin.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-<template>
- <div></div>
-</template>
-<script setup>
-import useUserStore from '@/store/modules/user'
-const userStore = useUserStore()
-let { proxy } = getCurrentInstance()
-function goLogin() {
- userStore.TideLogin({code : proxy.$route.query.code}).then(() => {
- proxy.$router.push({ path: redirect || "/" }).catch(() => { });
- })
-}
-goLogin()
-</script>
-<style scoped></style>
diff --git a/src/views/tool/build/CodeTypeDialog.vue b/src/views/tool/build/CodeTypeDialog.vue
deleted file mode 100644
index de0beb7..0000000
--- a/src/views/tool/build/CodeTypeDialog.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<template>
- <el-dialog v-model="open" width="500px" title="閫夋嫨鐢熸垚绫诲瀷" @open="onOpen" @close="onClose">
- <el-form ref="codeTypeForm" :model="formData" :rules="rules" label-width="100px">
- <el-form-item label="鐢熸垚绫诲瀷" prop="type">
- <el-radio-group v-model="formData.type">
- <el-radio-button v-for="(item, index) in typeOptions" :key="index" :label="item.value">
- {{ item.label }}
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="showFileName" label="鏂囦欢鍚�" prop="fileName">
- <el-input v-model="formData.fileName" placeholder="璇疯緭鍏ユ枃浠跺悕" clearable />
- </el-form-item>
- </el-form>
-
- <template #footer>
- <el-button @click="onClose">鍙栨秷</el-button>
- <el-button type="primary" @click="handelConfirm">纭畾</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-const open = defineModel()
-const props = defineProps({
- showFileName: Boolean
-})
-const emit = defineEmits(['confirm'])
-const formData = ref({
- fileName: undefined,
- type: 'file'
-})
-const codeTypeForm = ref()
-const rules = {
- fileName: [{
- required: true,
- message: '璇疯緭鍏ユ枃浠跺悕',
- trigger: 'blur'
- }],
- type: [{
- required: true,
- message: '鐢熸垚绫诲瀷涓嶈兘涓虹┖',
- trigger: 'change'
- }]
-}
-const typeOptions = ref([
- {
- label: '椤甸潰',
- value: 'file'
- },
- {
- label: '寮圭獥',
- value: 'dialog'
- }
-])
-function onOpen() {
- if (props.showFileName) {
- formData.value.fileName = `${+new Date()}.vue`
- }
-}
-function onClose() {
- open.value = false
-}
-function handelConfirm() {
- codeTypeForm.value.validate(valid => {
- if (!valid) return
- emit('confirm', { ...formData.value })
- onClose()
- })
-}
-</script>
\ No newline at end of file
diff --git a/src/views/tool/build/DraggableItem.vue b/src/views/tool/build/DraggableItem.vue
deleted file mode 100644
index 9ae2354..0000000
--- a/src/views/tool/build/DraggableItem.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<template>
- <el-col :span="element.span" :class="className" @click.stop="activeItem(element)">
- <el-form-item :label="element.label" :label-width="element.labelWidth ? element.labelWidth + 'px' : null"
- :required="element.required" v-if="element.layout === 'colFormItem'">
- <render :key="element.tag" :conf="element" v-model="element.defaultValue" />
- </el-form-item>
- <el-row :gutter="element.gutter" :class="element.class" @click.stop="activeItem(element)" v-else>
- <span class="component-name"> {{ element.componentName }} </span>
- <draggable group="componentsGroup" :animation="340" :list="element.children" class="drag-wrapper" item-key="label"
- ref="draggableItemRef" :component-data="getComponentData()">
- <template #item="scoped">
- <draggable-item :key="scoped.element.renderKey" :drawing-list="element.children" :element="scoped.element"
- :index="index" :active-id="activeId" :form-conf="formConf" @activeItem="activeItem(scoped.element)"
- @copyItem="copyItem(scoped.element, element.children)"
- @deleteItem="deleteItem(scoped.index, element.children)" />
- </template>
- </draggable>
- </el-row>
- <span class="drawing-item-copy" title="澶嶅埗" @click.stop="copyItem(element)">
- <el-icon><CopyDocument /></el-icon>
- </span>
- <span class="drawing-item-delete" title="鍒犻櫎" @click.stop="deleteItem(index)">
- <el-icon><Delete /></el-icon>
- </span>
- </el-col>
-</template>
-<script setup name="DraggableItem">
-import draggable from "vuedraggable/dist/vuedraggable.common"
-import render from '@/utils/generator/render'
-
-const props = defineProps({
- element: Object,
- index: Number,
- drawingList: Array,
- activeId: {
- type: [String, Number]
- },
- formConf: Object
-})
-const className = ref('')
-const draggableItemRef = ref(null)
-const emits = defineEmits(['activeItem', 'copyItem', 'deleteItem'])
-
-function activeItem(item) {
- emits('activeItem', item)
-}
-function copyItem(item, parent) {
- emits('copyItem', item, parent ?? props.drawingList)
-}
-function deleteItem(item, parent) {
- emits('deleteItem', item, parent ?? props.drawingList)
-}
-
-function getComponentData() {
- return {
- gutter: props.element.gutter,
- justify: props.element.justify,
- align: props.element.align
- }
-}
-
-watch(() => props.activeId, (val) => {
- className.value = (props.element.layout === 'rowFormItem' ? 'drawing-row-item' : 'drawing-item') + (val === props.element.formId ? ' active-from-item' : '')
- if (props.formConf.unFocusedComponentBorder) {
- className.value += ' unfocus-bordered'
- }
-}, { immediate: true })
-</script>
\ No newline at end of file
diff --git a/src/views/tool/build/IconsDialog.vue b/src/views/tool/build/IconsDialog.vue
deleted file mode 100644
index 98d9c13..0000000
--- a/src/views/tool/build/IconsDialog.vue
+++ /dev/null
@@ -1,115 +0,0 @@
-<template>
- <div class="icon-dialog">
- <el-dialog v-model="value" width="980px" :close-on-click-modal="false" :modal-append-to-body="false" @open="onOpen"
- @close="onClose">
- <template #header="{ close, titleId, titleClass }">
- 閫夋嫨鍥炬爣
- <el-input v-model="key" size="small" :style="{ width: '260px' }" placeholder="璇疯緭鍏ュ浘鏍囧悕绉�" prefix-icon="Search"
- clearable />
- </template>
- <ul class="icon-ul">
- <li v-for="icon in iconList" :key="icon" :class="active === icon ? 'active-item' : ''" @click="onSelect(icon)">
- <div>
- <el-icon :size="30">
- <component :is="icon" />
- </el-icon>
- <div>{{ icon }}</div>
- </div>
- </li>
- </ul>
- </el-dialog>
- </div>
-</template>
-<script setup>
-import * as ElementPlusIconsVue from '@element-plus/icons-vue'
-import { watch } from 'vue'
-
-const iconList = ref([])
-const originList = []
-const key = ref('')
-const active = ref('')
-const emit = defineEmits(['select'])
-const value = defineModel()
-for (const [key] of Object.entries(ElementPlusIconsVue)) {
- iconList.value.push(key)
- originList.push(key)
-}
-
-function onOpen() { }
-function onClose() { }
-function onSelect(icon) {
- active.value = icon
- emit('select', icon)
- value.value = false
-}
-
-watch(key, (val) => {
- if (val) {
- iconList.value = originList.filter(name => name.indexOf(val) > -1)
- } else {
- iconList.value = originList
- }
-})
-</script>
-<style lang="scss" scoped>
-.icon-ul {
- margin: 0;
- padding: 0;
- font-size: 0;
-
- li {
- list-style-type: none;
- text-align: center;
- font-size: 14px;
- display: inline-flex;
- width: 16.66%;
- box-sizing: border-box;
- height: 108px;
- padding: 6px 6px 6px 6px;
- cursor: pointer;
- overflow: hidden;
- align-items: center;
- justify-content: center;
-
- &:hover {
- background: #f2f2f2;
- }
-
- &.active-item {
- background: #e1f3fb;
- color: #7a6df0
- }
-
- i {
- font-size: 30px;
- line-height: 50px;
- margin-bottom: 10px;
- }
- }
-}
-
-.icon-dialog {
- :deep() {
- .el-dialog {
- border-radius: 8px;
- margin-bottom: 0;
- margin-top: 4vh !important;
- display: flex;
- flex-direction: column;
- max-height: 92vh;
- overflow: hidden;
- box-sizing: border-box;
-
- .el-dialog__header {
- padding-top: 14px;
- }
-
- .el-dialog__body {
- margin: 0 20px 20px 20px;
- padding: 0;
- overflow: auto;
- }
- }
- }
-}
-</style>
diff --git a/src/views/tool/build/RightPanel.vue b/src/views/tool/build/RightPanel.vue
deleted file mode 100644
index 5fe80fb..0000000
--- a/src/views/tool/build/RightPanel.vue
+++ /dev/null
@@ -1,906 +0,0 @@
-<template>
- <div class="right-board">
- <el-tabs v-model="currentTab" stretch class="center-tabs">
- <el-tab-pane label="缁勪欢灞炴��" name="field" />
- <el-tab-pane label="琛ㄥ崟灞炴��" name="form" />
- </el-tabs>
- <div class="field-box">
- <a class="document-link" target="_blank" :href="documentLink" title="鏌ョ湅缁勪欢鏂囨。">
- <el-icon>
- <Link />
- </el-icon>
- </a>
- <el-scrollbar class="right-scrollbar">
- <!-- 缁勪欢灞炴�� -->
- <el-form v-show="currentTab === 'field' && showField" size="default" label-width="90px" label-position="top"
- style="">
- <el-form-item v-if="activeData.changeTag" label="缁勪欢绫诲瀷">
- <el-select v-model="activeData.tagIcon" placeholder="璇烽�夋嫨缁勪欢绫诲瀷" :style="{ width: '100%' }" @change="tagChange">
- <el-option-group v-for="group in tagList" :key="group.label" :label="group.label">
- <el-option v-for="item in group.options" :key="item.label" :label="item.label" :value="item.tagIcon">
- <svg-icon class="node-icon" :icon-class="item.tagIcon" style="margin-right: 10px;" />
- <span> {{ item.label }}</span>
- </el-option>
- </el-option-group>
- </el-select>
- </el-form-item>
- <el-form-item v-if="activeData.vModel !== undefined" label="瀛楁鍚�">
- <el-input v-model="activeData.vModel" placeholder="璇疯緭鍏ュ瓧娈靛悕锛坴-model锛�" />
- </el-form-item>
- <el-form-item v-if="activeData.componentName !== undefined" label="缁勪欢鍚�">
- {{ activeData.componentName }}
- </el-form-item>
- <el-form-item v-if="activeData.label !== undefined" label="鏍囬">
- <el-input v-model="activeData.label" placeholder="璇疯緭鍏ユ爣棰�" />
- </el-form-item>
- <el-form-item v-if="activeData.placeholder !== undefined" label="鍗犱綅鎻愮ず">
- <el-input v-model="activeData.placeholder" placeholder="璇疯緭鍏ュ崰浣嶆彁绀�" />
- </el-form-item>
- <el-form-item v-if="activeData['start-placeholder'] !== undefined" label="寮�濮嬪崰浣�">
- <el-input v-model="activeData['start-placeholder']" placeholder="璇疯緭鍏ュ崰浣嶆彁绀�" />
- </el-form-item>
- <el-form-item v-if="activeData['end-placeholder'] !== undefined" label="缁撴潫鍗犱綅">
- <el-input v-model="activeData['end-placeholder']" placeholder="璇疯緭鍏ュ崰浣嶆彁绀�" />
- </el-form-item>
- <el-form-item v-if="activeData.span !== undefined" label="琛ㄥ崟鏍呮牸">
- <el-slider v-model="activeData.span" :max="24" :min="1" :marks="{ 12: '' }" @change="spanChange" />
- </el-form-item>
- <el-form-item v-if="activeData.layout === 'rowFormItem'" label="鏍呮牸闂撮殧">
- <el-input-number v-model="activeData.gutter" :min="0" placeholder="鏍呮牸闂撮殧" />
- </el-form-item>
-
- <el-form-item v-if="activeData.justify !== undefined" label="姘村钩鎺掑垪">
- <el-select v-model="activeData.justify" placeholder="璇烽�夋嫨姘村钩鎺掑垪" :style="{ width: '100%' }">
- <el-option v-for="(item, index) in justifyOptions" :key="index" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item v-if="activeData.align !== undefined" label="鍨傜洿鎺掑垪">
- <el-radio-group v-model="activeData.align">
- <el-radio-button label="top" />
- <el-radio-button label="middle" />
- <el-radio-button label="bottom" />
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="activeData.labelWidth !== undefined" label="鏍囩瀹藉害">
- <el-input v-model.number="activeData.labelWidth" type="number" placeholder="璇疯緭鍏ユ爣绛惧搴�" />
- </el-form-item>
- <el-form-item v-if="activeData.style && activeData.style.width !== undefined" label="缁勪欢瀹藉害">
- <el-input v-model="activeData.style.width" placeholder="璇疯緭鍏ョ粍浠跺搴�" clearable />
- </el-form-item>
- <el-form-item v-if="activeData.vModel !== undefined" label="榛樿鍊�">
- <el-input :value="setDefaultValue(activeData.defaultValue)" placeholder="璇疯緭鍏ラ粯璁ゅ��"
- @input="onDefaultValueInput" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-checkbox-group'" label="鑷冲皯搴旈��">
- <el-input-number :value="activeData.min" :min="0" placeholder="鑷冲皯搴旈��"
- @input="$set(activeData, 'min', $event ? $event : undefined)" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-checkbox-group'" label="鏈�澶氬彲閫�">
- <el-input-number :value="activeData.max" :min="0" placeholder="鏈�澶氬彲閫�"
- @input="$set(activeData, 'max', $event ? $event : undefined)" />
- </el-form-item>
- <el-form-item v-if="activeData.prepend !== undefined" label="鍓嶇紑">
- <el-input v-model="activeData.prepend" placeholder="璇疯緭鍏ュ墠缂�" />
- </el-form-item>
- <el-form-item v-if="activeData.append !== undefined" label="鍚庣紑">
- <el-input v-model="activeData.append" placeholder="璇疯緭鍏ュ悗缂�" />
- </el-form-item>
- <el-form-item v-if="activeData['prefix-icon'] !== undefined" label="鍓嶅浘鏍�">
- <el-input v-model="activeData['prefix-icon']" placeholder="璇疯緭鍏ュ墠鍥炬爣鍚嶇О">
- <template #append>
- <el-button icon="Pointer" @click="openIconsDialog('prefix-icon')">
- 閫夋嫨
- </el-button>
- </template>
- </el-input>
- </el-form-item>
- <el-form-item v-if="activeData['suffix-icon'] !== undefined" label="鍚庡浘鏍�">
- <el-input v-model="activeData['suffix-icon']" placeholder="璇疯緭鍏ュ悗鍥炬爣鍚嶇О">
- <template #append>
- <el-button icon="Pointer" @click="openIconsDialog('suffix-icon')">
- 閫夋嫨
- </el-button>
- </template>
- </el-input>
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-cascader'" label="閫夐」鍒嗛殧绗�">
- <el-input v-model="activeData.separator" placeholder="璇疯緭鍏ラ�夐」鍒嗛殧绗�" />
- </el-form-item>
- <el-form-item v-if="activeData.autosize !== undefined" label="鏈�灏忚鏁�">
- <el-input-number v-model="activeData.autosize.minRows" :min="1" placeholder="鏈�灏忚鏁�" />
- </el-form-item>
- <el-form-item v-if="activeData.autosize !== undefined" label="鏈�澶ц鏁�">
- <el-input-number v-model="activeData.autosize.maxRows" :min="1" placeholder="鏈�澶ц鏁�" />
- </el-form-item>
- <el-form-item v-if="activeData.min !== undefined" label="鏈�灏忓��">
- <el-input-number v-model="activeData.min" placeholder="鏈�灏忓��" />
- </el-form-item>
- <el-form-item v-if="activeData.max !== undefined" label="鏈�澶у��">
- <el-input-number v-model="activeData.max" placeholder="鏈�澶у��" />
- </el-form-item>
- <el-form-item v-if="activeData.step !== undefined" label="姝ラ暱">
- <el-input-number v-model="activeData.step" placeholder="姝ユ暟" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-input-number'" label="绮惧害">
- <el-input-number v-model="activeData.precision" :min="0" placeholder="绮惧害" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-input-number'" label="鎸夐挳浣嶇疆">
- <el-radio-group v-model="activeData['controls-position']">
- <el-radio-button label="">
- 榛樿
- </el-radio-button>
- <el-radio-button label="right">
- 鍙充晶
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="activeData.maxlength !== undefined" label="鏈�澶氳緭鍏�">
- <el-input v-model="activeData.maxlength" placeholder="璇疯緭鍏ュ瓧绗﹂暱搴�">
- <template slot="append">
- 涓瓧绗�
- </template>
- </el-input>
- </el-form-item>
- <el-form-item v-if="activeData['active-text'] !== undefined" label="寮�鍚彁绀�">
- <el-input v-model="activeData['active-text']" placeholder="璇疯緭鍏ュ紑鍚彁绀�" />
- </el-form-item>
- <el-form-item v-if="activeData['inactive-text'] !== undefined" label="鍏抽棴鎻愮ず">
- <el-input v-model="activeData['inactive-text']" placeholder="璇疯緭鍏ュ叧闂彁绀�" />
- </el-form-item>
- <el-form-item v-if="activeData['active-value'] !== undefined" label="寮�鍚��">
- <el-input :value="setDefaultValue(activeData['active-value'])" placeholder="璇疯緭鍏ュ紑鍚��"
- @input="onSwitchValueInput($event, 'active-value')" />
- </el-form-item>
- <el-form-item v-if="activeData['inactive-value'] !== undefined" label="鍏抽棴鍊�">
- <el-input :value="setDefaultValue(activeData['inactive-value'])" placeholder="璇疯緭鍏ュ叧闂��"
- @input="onSwitchValueInput($event, 'inactive-value')" />
- </el-form-item>
- <el-form-item v-if="activeData.type !== undefined && 'el-date-picker' === activeData.tag" label="鏃堕棿绫诲瀷">
- <el-select v-model="activeData.type" placeholder="璇烽�夋嫨鏃堕棿绫诲瀷" :style="{ width: '100%' }"
- @change="dateTypeChange">
- <el-option v-for="(item, index) in dateOptions" :key="index" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item v-if="activeData.name !== undefined" label="鏂囦欢瀛楁鍚�">
- <el-input v-model="activeData.name" placeholder="璇疯緭鍏ヤ笂浼犳枃浠跺瓧娈靛悕" />
- </el-form-item>
- <el-form-item v-if="activeData.accept !== undefined" label="鏂囦欢绫诲瀷">
- <el-select v-model="activeData.accept" placeholder="璇烽�夋嫨鏂囦欢绫诲瀷" :style="{ width: '100%' }" clearable>
- <el-option label="鍥剧墖" value="image/*" />
- <el-option label="瑙嗛" value="video/*" />
- <el-option label="闊抽" value="audio/*" />
- <el-option label="excel" value=".xls,.xlsx" />
- <el-option label="word" value=".doc,.docx" />
- <el-option label="pdf" value=".pdf" />
- <el-option label="txt" value=".txt" />
- </el-select>
- </el-form-item>
- <el-form-item v-if="activeData.fileSize !== undefined" label="鏂囦欢澶у皬">
- <el-input v-model.number="activeData.fileSize" placeholder="璇疯緭鍏ユ枃浠跺ぇ灏�">
- <el-select slot="append" v-model="activeData.sizeUnit" :style="{ width: '66px' }">
- <el-option label="KB" value="KB" />
- <el-option label="MB" value="MB" />
- <el-option label="GB" value="GB" />
- </el-select>
- </el-input>
- </el-form-item>
- <el-form-item v-if="activeData.action !== undefined" label="涓婁紶鍦板潃">
- <el-input v-model="activeData.action" placeholder="璇疯緭鍏ヤ笂浼犲湴鍧�" clearable />
- </el-form-item>
- <el-form-item v-if="activeData['list-type'] !== undefined" label="鍒楄〃绫诲瀷">
- <el-radio-group v-model="activeData['list-type']" size="small">
- <el-radio-button label="text">
- text
- </el-radio-button>
- <el-radio-button label="picture">
- picture
- </el-radio-button>
- <el-radio-button label="picture-card">
- picture-card
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="activeData.buttonText !== undefined" v-show="'picture-card' !== activeData['list-type']"
- label="鎸夐挳鏂囧瓧">
- <el-input v-model="activeData.buttonText" placeholder="璇疯緭鍏ユ寜閽枃瀛�" />
- </el-form-item>
- <el-form-item v-if="activeData['range-separator'] !== undefined" label="鍒嗛殧绗�">
- <el-input v-model="activeData['range-separator']" placeholder="璇疯緭鍏ュ垎闅旂" />
- </el-form-item>
- <el-form-item v-if="activeData['picker-options'] !== undefined" label="鏃堕棿娈�">
- <el-input v-model="activeData['picker-options'].selectableRange" placeholder="璇疯緭鍏ユ椂闂存" />
- </el-form-item>
- <el-form-item v-if="activeData.format !== undefined" label="鏃堕棿鏍煎紡">
- <el-input :value="activeData.format" placeholder="璇疯緭鍏ユ椂闂存牸寮�" @input="setTimeValue($event)" />
- </el-form-item>
- <template v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.tag) > -1">
- <el-divider>閫夐」</el-divider>
- <draggable :list="activeData.options" :animation="340" group="selectItem" handle=".option-drag"
- item-key="label">
- <template #item="{ element, index }">
- <div :key="index" class="select-item">
- <div class="select-line-icon option-drag">
- <i class="el-icon-s-operation" />
- </div>
- <el-input v-model="element.label" placeholder="閫夐」鍚�" size="small" />
- <el-input placeholder="閫夐」鍊�" size="small" :value="element.value"
- @input="setOptionValue(element, $event)" />
- <div class="close-btn select-line-icon" @click="activeData.options.splice(index, 1)">
- <el-icon>
- <Remove />
- </el-icon>
- </div>
- </div>
- </template>
- </draggable>
- <div>
- <el-button icon="CirclePlus" style="margin-left: 8px; margin-top: 10px;" text bg type="primary"
- @click="addSelectItem">
- 娣诲姞閫夐」
- </el-button>
- </div>
- <el-divider />
- </template>
-
- <template v-if="['el-cascader'].indexOf(activeData.tag) > -1">
- <el-divider>閫夐」</el-divider>
- <el-form-item label="鏁版嵁绫诲瀷">
- <el-radio-group v-model="activeData.dataType" size="small">
- <el-radio-button label="dynamic">
- 鍔ㄦ�佹暟鎹�
- </el-radio-button>
- <el-radio-button label="static">
- 闈欐�佹暟鎹�
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
-
- <template v-if="activeData.dataType === 'dynamic'">
- <el-form-item label="鏍囩閿悕">
- <el-input v-model="activeData.labelKey" placeholder="璇疯緭鍏ユ爣绛鹃敭鍚�" />
- </el-form-item>
- <el-form-item label="鍊奸敭鍚�">
- <el-input v-model="activeData.valueKey" placeholder="璇疯緭鍏ュ�奸敭鍚�" />
- </el-form-item>
- <el-form-item label="瀛愮骇閿悕">
- <el-input v-model="activeData.childrenKey" placeholder="璇疯緭鍏ュ瓙绾ч敭鍚�" />
- </el-form-item>
- </template>
-
- <el-tree v-if="activeData.dataType === 'static'" draggable :data="activeData.options" node-key="id"
- :expand-on-click-node="false" :render-content="renderContent" />
- <div v-if="activeData.dataType === 'static'">
- <el-button icon="CirclePlus" style="margin-left: 0; margin-top: 10px;" type="primary" text bg
- @click="addTreeItem">
- 娣诲姞鐖剁骇
- </el-button>
- </div>
- <el-divider />
- </template>
-
- <el-form-item v-if="activeData.optionType !== undefined" label="閫夐」鏍峰紡">
- <el-radio-group v-model="activeData.optionType">
- <el-radio-button label="default">
- 榛樿
- </el-radio-button>
- <el-radio-button label="button">
- 鎸夐挳
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="activeData['active-color'] !== undefined" label="寮�鍚鑹�">
- <el-color-picker v-model="activeData['active-color']" />
- </el-form-item>
- <el-form-item v-if="activeData['inactive-color'] !== undefined" label="鍏抽棴棰滆壊">
- <el-color-picker v-model="activeData['inactive-color']" />
- </el-form-item>
-
- <el-form-item v-if="activeData['allow-half'] !== undefined" label="鍏佽鍗婇��">
- <el-switch v-model="activeData['allow-half']" />
- </el-form-item>
- <el-form-item v-if="activeData['show-text'] !== undefined" label="杈呭姪鏂囧瓧">
- <el-switch v-model="activeData['show-text']" @change="rateTextChange" />
- </el-form-item>
- <el-form-item v-if="activeData['show-score'] !== undefined" label="鏄剧ず鍒嗘暟">
- <el-switch v-model="activeData['show-score']" @change="rateScoreChange" />
- </el-form-item>
- <el-form-item v-if="activeData['show-stops'] !== undefined" label="鏄剧ず闂存柇鐐�">
- <el-switch v-model="activeData['show-stops']" />
- </el-form-item>
- <el-form-item v-if="activeData.range !== undefined" label="鑼冨洿閫夋嫨">
- <el-switch v-model="activeData.range" @change="rangeChange" />
- </el-form-item>
- <el-form-item v-if="activeData.border !== undefined && activeData.optionType === 'default'" label="鏄惁甯﹁竟妗�">
- <el-switch v-model="activeData.border" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-color-picker'" label="棰滆壊鏍煎紡">
- <el-select v-model="activeData['color-format']" placeholder="璇烽�夋嫨棰滆壊鏍煎紡" :style="{ width: '100%' }"
- @change="colorFormatChange">
- <el-option v-for="(item, index) in colorFormatOptions" :key="index" :label="item.label"
- :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item v-if="activeData.size !== undefined &&
- (activeData.optionType === 'button' ||
- activeData.border ||
- activeData.tag === 'el-color-picker')" label="閫夐」灏哄">
- <el-radio-group v-model="activeData.size">
- <el-radio-button label="large">
- 杈冨ぇ
- </el-radio-button>
- <el-radio-button label="default">
- 榛樿
- </el-radio-button>
- <el-radio-button label="small">
- 杈冨皬
- </el-radio-button>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="activeData['show-word-limit'] !== undefined" label="杈撳叆缁熻">
- <el-switch v-model="activeData['show-word-limit']" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-input-number'" label="涓ユ牸姝ユ暟">
- <el-switch v-model="activeData['step-strictly']" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-cascader'" label="鏄惁澶氶��">
- <el-switch v-model="activeData.props.props.multiple" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-cascader'" label="灞曠ず鍏ㄨ矾寰�">
- <el-switch v-model="activeData['show-all-levels']" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-cascader'" label="鍙惁绛涢��">
- <el-switch v-model="activeData.filterable" />
- </el-form-item>
- <el-form-item v-if="activeData.clearable !== undefined" label="鑳藉惁娓呯┖">
- <el-switch v-model="activeData.clearable" />
- </el-form-item>
- <el-form-item v-if="activeData.showTip !== undefined" label="鏄剧ず鎻愮ず">
- <el-switch v-model="activeData.showTip" />
- </el-form-item>
- <el-form-item v-if="activeData.multiple !== undefined" label="澶氶�夋枃浠�">
- <el-switch v-model="activeData.multiple" />
- </el-form-item>
- <el-form-item v-if="activeData['auto-upload'] !== undefined" label="鑷姩涓婁紶">
- <el-switch v-model="activeData['auto-upload']" />
- </el-form-item>
- <el-form-item v-if="activeData.readonly !== undefined" label="鏄惁鍙">
- <el-switch v-model="activeData.readonly" />
- </el-form-item>
- <el-form-item v-if="activeData.disabled !== undefined" label="鏄惁绂佺敤">
- <el-switch v-model="activeData.disabled" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-select'" label="鏄惁鍙悳绱�">
- <el-switch v-model="activeData.filterable" />
- </el-form-item>
- <el-form-item v-if="activeData.tag === 'el-select'" label="鏄惁澶氶��">
- <el-switch v-model="activeData.multiple" @change="multipleChange" />
- </el-form-item>
- <el-form-item v-if="activeData.required !== undefined" label="鏄惁蹇呭~">
- <el-switch v-model="activeData.required" />
- </el-form-item>
-
- <template v-if="activeData.layoutTree">
- <el-divider>甯冨眬缁撴瀯鏍�</el-divider>
- <el-tree :data="[activeData]" :props="layoutTreeProps" node-key="renderKey" default-expand-all draggable>
- <template #default="{ node, data }">
- <span class="node-label">
- <svg-icon class="node-icon" :icon-class="data.tagIcon" style="margin-right: 5px;" />
- {{ node.label }}
- </span>
- </template>
- </el-tree>
- </template>
-
- <template v-if="activeData.layout === 'colFormItem'">
- <el-divider>姝e垯鏍¢獙</el-divider>
- <div v-for="(item, index) in activeData.regList" :key="index" class="reg-item">
- <span class="close-btn" @click="activeData.regList.splice(index, 1)">
- <el-icon>
- <Close />
- </el-icon>
- </span>
- <el-form-item label="琛ㄨ揪寮�">
- <el-input v-model="item.pattern" placeholder="璇疯緭鍏ユ鍒�" />
- </el-form-item>
- <el-form-item label="閿欒鎻愮ず" style="margin-bottom:0">
- <el-input v-model="item.message" placeholder="璇疯緭鍏ラ敊璇彁绀�" />
- </el-form-item>
- </div>
- <div>
- <el-button icon="CirclePlus" style="margin-left: 0; margin-top: 10px;" type="primary" text bg
- @click="addReg">
- 娣诲姞瑙勫垯
- </el-button>
- </div>
- </template>
- </el-form>
- <!-- 琛ㄥ崟灞炴�� -->
- <el-form v-show="currentTab === 'form'" label-width="90px" label-position="top">
- <el-form-item label="琛ㄥ崟鍚�">
- <el-input v-model="formConf.formRef" placeholder="璇疯緭鍏ヨ〃鍗曞悕锛坮ef锛�" />
- </el-form-item>
- <el-form-item label="琛ㄥ崟妯″瀷">
- <el-input v-model="formConf.formModel" placeholder="璇疯緭鍏ユ暟鎹ā鍨�" />
- </el-form-item>
- <el-form-item label="鏍¢獙妯″瀷">
- <el-input v-model="formConf.formRules" placeholder="璇疯緭鍏ユ牎楠屾ā鍨�" />
- </el-form-item>
- <el-form-item label="琛ㄥ崟灏哄">
- <el-radio-group v-model="formConf.size">
- <el-radio-button label="large" value="杈冨ぇ" />
- <el-radio-button label="default" value="榛樿" />
- <el-radio-button label="small" value="杈冨皬" />
- </el-radio-group>
- </el-form-item>
- <el-form-item label="鏍囩瀵归綈">
- <el-radio-group v-model="formConf.labelPosition">
- <el-radio-button label="left" value="宸﹀榻�" />
- <el-radio-button label="right" value="鍙冲榻�" />
- <el-radio-button label="top" value="椤堕儴瀵归綈" />
- </el-radio-group>
- </el-form-item>
- <el-form-item label="鏍囩瀹藉害">
- <el-input-number v-model="formConf.labelWidth" placeholder="鏍囩瀹藉害" />
- </el-form-item>
- <el-form-item label="鏍呮牸闂撮殧">
- <el-input-number v-model="formConf.gutter" :min="0" placeholder="鏍呮牸闂撮殧" />
- </el-form-item>
- <el-form-item label="绂佺敤琛ㄥ崟">
- <el-switch v-model="formConf.disabled" />
- </el-form-item>
- <el-form-item label="琛ㄥ崟鎸夐挳">
- <el-switch v-model="formConf.formBtns" />
- </el-form-item>
- <el-form-item label="鏄剧ず鏈�変腑缁勪欢杈规">
- <el-switch v-model="formConf.unFocusedComponentBorder" />
- </el-form-item>
- </el-form>
- </el-scrollbar>
- </div>
- <icons-dialog v-model="iconsVisible" :current="activeData[currentIconModel]" @select="setIcon" />
- <treeNode-dialog v-model="dialogVisible" @commit="addNode" />
-
- </div>
-</template>
-
-<script setup>
-import draggable from "vuedraggable/dist/vuedraggable.common"
-import { isNumberStr } from '@/utils/index'
-import IconsDialog from './IconsDialog'
-import TreeNodeDialog from './TreeNodeDialog'
-import { inputComponents, selectComponents } from '@/utils/generator/config'
-
-const { proxy } = getCurrentInstance()
-const dateTimeFormat = {
- date: 'YYYY-MM-DD',
- week: 'YYYY 绗� ww 鍛�',
- month: 'YYYY-MM',
- year: 'YYYY',
- datetime: 'YYYY-MM-DD HH:mm:ss',
- daterange: 'YYYY-MM-DD',
- monthrange: 'YYYY-MM',
- datetimerange: 'YYYY-MM-DD HH:mm:ss'
-}
-const props = defineProps({
- showField: Boolean,
- activeData: Object,
- formConf: Object
-})
-
-const data = reactive({
- currentTab: 'field',
- currentNode: null,
- dialogVisible: false,
- iconsVisible: false,
- currentIconModel: null,
- dateTypeOptions: [
- {
- label: '鏃�(date)',
- value: 'date'
- },
- {
- label: '鍛�(week)',
- value: 'week'
- },
- {
- label: '鏈�(month)',
- value: 'month'
- },
- {
- label: '骞�(year)',
- value: 'year'
- },
- {
- label: '鏃ユ湡鏃堕棿(datetime)',
- value: 'datetime'
- }
- ],
- dateRangeTypeOptions: [
- {
- label: '鏃ユ湡鑼冨洿(daterange)',
- value: 'daterange'
- },
- {
- label: '鏈堣寖鍥�(monthrange)',
- value: 'monthrange'
- },
- {
- label: '鏃ユ湡鏃堕棿鑼冨洿(datetimerange)',
- value: 'datetimerange'
- }
- ],
- colorFormatOptions: [
- {
- label: 'hex',
- value: 'hex'
- },
- {
- label: 'rgb',
- value: 'rgb'
- },
- {
- label: 'rgba',
- value: 'rgba'
- },
- {
- label: 'hsv',
- value: 'hsv'
- },
- {
- label: 'hsl',
- value: 'hsl'
- }
- ],
- justifyOptions: [
- {
- label: 'start',
- value: 'start'
- },
- {
- label: 'end',
- value: 'end'
- },
- {
- label: 'center',
- value: 'center'
- },
- {
- label: 'space-around',
- value: 'space-around'
- },
- {
- label: 'space-between',
- value: 'space-between'
- }
- ],
- layoutTreeProps: {
- label(data, node) {
- return data.componentName || `${data.label}: ${data.vModel}`
- }
- }
-})
-
-const { currentTab, currentNode, dialogVisible, iconsVisible, currentIconModel, dateTypeOptions, dateRangeTypeOptions, colorFormatOptions, justifyOptions, layoutTreeProps } = toRefs(data)
-
-const documentLink = computed(() => props.activeData.document || 'https://element-plus.org/zh-CN/guide/installation')
-
-const dateOptions = computed(() => {
- if (props.activeData.type !== undefined && props.activeData.tag === 'el-date-picker') {
- if (props.activeData['start-placeholder'] === undefined) {
- return dateTypeOptions.value
- }
- return dateRangeTypeOptions.value
- }
- return []
-})
-
-const tagList = ref([
- {
- label: '杈撳叆鍨嬬粍浠�',
- options: inputComponents
- },
- {
- label: '閫夋嫨鍨嬬粍浠�',
- options: selectComponents
- }
-])
-
-const emit = defineEmits(['tag-change'])
-
-function addReg() {
- props.activeData.regList.push({
- pattern: '',
- message: ''
- })
-}
-function addSelectItem() {
- props.activeData.options.push({
- label: '',
- value: ''
- })
-}
-
-function addTreeItem() {
- ++proxy.idGlobal
- dialogVisible.value = true
- currentNode.value = props.activeData.options
-}
-
-function renderContent(h, { node, data, store }) {
- return h('div', {
- class: "custom-tree-node"
- }, [
- h('span', node.label),
- h('span', {
- class: "node-operation"
- }, [
- h(resolveComponent('el-link'), {
- type: "primary",
- icon: "Plus",
- underline: false,
- onClick: () => {
- append(data)
-
- }
- }),
- h(resolveComponent('el-link'), {
- type: "danger",
- icon: "Delete",
- underline: false,
- style: "margin-left: 5px;",
- onClick: () => {
- remove(node, data)
- }
- })
- ])
- ])
-}
-function append(data) {
- if (!data.children) {
- data.children = []
- }
- dialogVisible.value = true
- currentNode.value = data.children
-}
-function remove(node, data) {
- const { parent } = node
- const children = parent.data.children || parent.data
- const index = children.findIndex(d => d.id === data.id)
- children.splice(index, 1)
-}
-function addNode(data) {
- currentNode.value.push(data)
-}
-
-function setOptionValue(item, val) {
- item.value = isNumberStr(val) ? +val : val
-}
-function setDefaultValue(val) {
- if (Array.isArray(val)) {
- return val.join(',')
- }
- if (['string', 'number'].indexOf(val) > -1) {
- return val
- }
- if (typeof val === 'boolean') {
- return `${val}`
- }
- return val
-}
-
-function onDefaultValueInput(str) {
- if (Array.isArray(props.activeData.defaultValue)) {
- // 鏁扮粍
- props.activeData.defaultValue = str.split(',').map(val => (isNumberStr(val) ? +val : val))
- } else if (['true', 'false'].indexOf(str) > -1) {
- // 甯冨皵
- props.activeData.defaultValue = JSON.parse(str)
- } else {
- // 瀛楃涓插拰鏁板瓧
- props.activeData.defaultValue = isNumberStr(str) ? +str : str
- }
-}
-
-function onSwitchValueInput(val, name) {
- if (['true', 'false'].indexOf(val) > -1) {
- props.activeData[name] = JSON.parse(val)
- } else {
- props.activeData[name] = isNumberStr(val) ? +val : val
- }
-}
-
-function setTimeValue(val, type) {
- const valueFormat = type === 'week' ? dateTimeFormat.date : val
- props.activeData.defaultValue = null
- props.activeData['value-format'] = valueFormat
- props.activeData.format = val
-}
-
-function spanChange(val) {
- props.formConf.span = val
-}
-
-function multipleChange(val) {
- props.activeData.defaultValue = val ? [] : ''
-}
-
-function dateTypeChange(val) {
- setTimeValue(dateTimeFormat[val], val)
-}
-
-function rangeChange(val) {
- props.activeData.defaultValue = val ? [props.activeData.min, props.activeData.max] : props.activeData.min
-}
-
-function rateTextChange(val) {
- if (val) props.activeData['show-score'] = false
-}
-
-function rateScoreChange(val) {
- if (val) props.activeData['show-text'] = false
-}
-
-function colorFormatChange(val) {
- props.activeData.defaultValue = null
- props.activeData['show-alpha'] = val.indexOf('a') > -1
- props.activeData.renderKey = +new Date() // 鏇存柊renderKey,閲嶆柊娓叉煋璇ョ粍浠�
-}
-
-function openIconsDialog(model) {
- iconsVisible.value = true
- currentIconModel.value = model
-}
-
-function setIcon(val) {
- props.activeData[currentIconModel.value] = val
-}
-
-function tagChange(tagIcon) {
- let target = inputComponents.find(item => item.tagIcon === tagIcon)
- if (!target) target = selectComponents.find(item => item.tagIcon === tagIcon)
- emit('tag-change', target)
-}
-</script>
-
-<style lang="scss" scoped>
-.right-board {
- width: 350px;
- position: absolute;
- right: 0;
- top: 0;
- padding-top: 3px;
-
- &:deep() {
- .el-tabs__header {
- margin: 0;
- }
-
- .el-input-group__append .el-button {
- display: inline-flex;
- }
- }
-
- .field-box {
- position: relative;
- height: calc(100vh - 50px - 40px - 42px);
- box-sizing: border-box;
- overflow: hidden;
- }
-
- .el-scrollbar {
- height: 100%;
-
- &:deep() {
- .el-scrollbar__view {
- padding: 30px 20px;
- }
-
- }
- }
-}
-
-.reg-item {
- padding: 12px 6px;
- background: var(--el-border-color-extra-light);
- position: relative;
- border-radius: 4px;
-
- .close-btn {
- position: absolute;
- right: -6px;
- top: -6px;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 16px;
- height: 16px;
- line-height: 16px;
- background: rgba(0, 0, 0, .2);
- border-radius: 50%;
- color: #fff;
- z-index: 1;
- cursor: pointer;
- font-size: 12px;
- }
-}
-
-.select-item {
- display: flex;
- border: 1px dashed #fff;
- box-sizing: border-box;
-
- & .close-btn {
- cursor: pointer;
- color: #f56c6c;
- }
-
- & .el-input+.el-input {
- margin-left: 4px;
- }
-}
-
-.select-item+.select-item {
- margin-top: 4px;
-}
-
-.select-item.sortable-chosen {
- border: 1px dashed #409eff;
-}
-
-.select-line-icon {
- line-height: 32px;
- font-size: 22px;
- padding: 0 4px;
- color: #777;
-}
-
-.option-drag {
- cursor: move;
-}
-
-.time-range {
- .el-date-editor {
- width: 227px;
- }
-
- :deep() {
- .el-icon-time {
- display: none;
- }
- }
-}
-
-.document-link {
- position: absolute;
- display: flex;
- width: 26px;
- height: 26px;
- top: 0;
- left: 0;
- cursor: pointer;
- background: #409eff;
- z-index: 1;
- border-radius: 0 0 6px 0;
- justify-content: center;
- align-items: center;
- color: #fff;
- font-size: 18px;
-}
-
-.node-label {
- font-size: 14px;
-}
-
-.node-icon {
- color: #bebfc3;
-}
-
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/tool/build/TreeNodeDialog.vue b/src/views/tool/build/TreeNodeDialog.vue
deleted file mode 100644
index 372d3af..0000000
--- a/src/views/tool/build/TreeNodeDialog.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-<template>
- <div>
- <el-dialog title="娣诲姞閫夐」" v-model="open" width="800px" :close-on-click-modal="false" :modal-append-to-body="false"
- @open="onOpen" @close="onClose">
- <el-form ref="treeNodeForm" :model="formData" :rules="rules" label-width="100px">
- <el-col :span="24">
- <el-form-item label="閫夐」鍚�" prop="label">
- <el-input v-model="formData.label" placeholder="璇疯緭鍏ラ�夐」鍚�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="閫夐」鍊�" prop="value">
- <el-input v-model="formData.value" placeholder="璇疯緭鍏ラ�夐」鍊�" clearable>
- <template #append>
- <el-select v-model="dataType" :style="{ width: '100px' }">
- <el-option v-for="(item, index) in dataTypeOptions" :key="index" :label="item.label" :value="item.value"
- :disabled="item.disabled" />
- </el-select>
- </template>
-
- </el-input>
- </el-form-item>
- </el-col>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handelConfirm">纭� 瀹�</el-button>
- <el-button @click="onClose">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-<script setup>
-const open = defineModel()
-const emit = defineEmits(['confirm'])
-const formData = ref({
- label: undefined,
- value: undefined
-})
-const rules = {
- label: [
- {
- required: true,
- message: '璇疯緭鍏ラ�夐」鍚�',
- trigger: 'blur'
- }
- ],
- value: [
- {
- required: true,
- message: '璇疯緭鍏ラ�夐」鍊�',
- trigger: 'blur'
- }
- ]
-}
-const dataType = ref('string')
-const dataTypeOptions = ref([
- {
- label: '瀛楃涓�',
- value: 'string'
- },
- {
- label: '鏁板瓧',
- value: 'number'
- }
-])
-const id = ref(100)
-const treeNodeForm = ref()
-
-function onOpen() {
- formData.value = {
- label: undefined,
- value: undefined
- }
-}
-
-function onClose() {
- open.value = false
-}
-
-function handelConfirm() {
- treeNodeForm.value.validate(valid => {
- if (!valid) return
- if (dataType.value === 'number') {
- formData.value.value = parseFloat(formData.value.value)
- }
- formData.value.id = id.value++
- emit('commit', formData.value)
- onClose()
- })
-}
-</script>
diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue
deleted file mode 100644
index 0895955..0000000
--- a/src/views/tool/build/index.vue
+++ /dev/null
@@ -1,653 +0,0 @@
-<template>
- <div class="container">
- <div class="left-board">
- <div class="logo-wrapper">
- <div class="logo">
- <img :src="logo" alt="logo"> Form Generator
- </div>
- </div>
- <el-scrollbar class="left-scrollbar">
- <div class="components-list">
- <div class="components-title">
- <svg-icon icon-class="component" />杈撳叆鍨嬬粍浠�
- </div>
- <draggable class="components-draggable" :list="inputComponents"
- :group="{ name: 'componentsGroup', pull: 'clone', put: false }" :clone="cloneComponent"
- draggable=".components-item" :sort="false" @end="onEnd" item-key="label">
- <template #item="{ element, index }">
- <div :key="index" class="components-item" @click="addComponent(element)">
- <div class="components-body">
- <svg-icon :icon-class="element.tagIcon" />
- {{ element.label }}
- </div>
- </div>
- </template>
- </draggable>
- <div class="components-title">
- <svg-icon icon-class="component" />閫夋嫨鍨嬬粍浠�
- </div>
- <draggable class="components-draggable" :list="selectComponents"
- :group="{ name: 'componentsGroup', pull: 'clone', put: false }" :clone="cloneComponent"
- draggable=".components-item" :sort="false" @end="onEnd" item-key="label">
- <template #item="{ element, index }">
- <div :key="index" class="components-item" @click="addComponent(element)">
- <div class="components-body">
- <svg-icon :icon-class="element.tagIcon" />
- {{ element.label }}
- </div>
- </div>
- </template>
- </draggable>
- <div class="components-title">
- <svg-icon icon-class="component" /> 甯冨眬鍨嬬粍浠�
- </div>
- <draggable class="components-draggable" :list="layoutComponents"
- :group="{ name: 'componentsGroup', pull: 'clone', put: false }" :clone="cloneComponent"
- draggable=".components-item" :sort="false" @end="onEnd" item-key="label">
- <template #item="{ element, index }">
- <div :key="index" class="components-item" @click="addComponent(element)">
- <div class="components-body">
- <svg-icon :icon-class="element.tagIcon" />
- {{ element.label }}
- </div>
- </div>
- </template>
- </draggable>
- </div>
- </el-scrollbar>
- </div>
- <div class="center-board">
- <div class="action-bar">
- <el-button icon="Download" type="primary" text @click="download">
- 瀵煎嚭vue鏂囦欢
- </el-button>
- <el-button class="copy-btn-main" icon="DocumentCopy" type="primary" text @click="copy">
- 澶嶅埗浠g爜
- </el-button>
- <el-button class="delete-btn" icon="Delete" text @click="empty" type="danger">
- 娓呯┖
- </el-button>
- </div>
- <el-scrollbar class="center-scrollbar">
- <el-row class="center-board-row" :gutter="formConf.gutter">
- <el-form :size="formConf.size" :label-position="formConf.labelPosition" :disabled="formConf.disabled"
- :label-width="formConf.labelWidth + 'px'">
- <draggable class="drawing-board" :list="drawingList" :animation="340" group="componentsGroup"
- item-key="label">
- <template #item="{ element, index }">
- <draggable-item :key="element.renderKey" :drawing-list="drawingList" :element="element" :index="index"
- :active-id="activeId" :form-conf="formConf" @activeItem="activeFormItem" @copyItem="drawingItemCopy"
- @deleteItem="drawingItemDelete" />
- </template>
- </draggable>
- <div v-show="!drawingList.length" class="empty-info">
- 浠庡乏渚ф嫋鍏ユ垨鐐归�夌粍浠惰繘琛岃〃鍗曡璁�
- </div>
- </el-form>
- </el-row>
- </el-scrollbar>
- </div>
- <right-panel :active-data="activeData" :form-conf="formConf" :show-field="!!drawingList.length"
- @tag-change="tagChange" />
-
- <code-type-dialog v-model="dialogVisible" title="閫夋嫨鐢熸垚绫诲瀷" :showFileName="showFileName" @confirm="generate" />
- <input id="copyNode" type="hidden">
- </div>
-</template>
-
-<script setup>
-import draggable from "vuedraggable/dist/vuedraggable.common"
-import ClipboardJS from 'clipboard'
-import beautifier from 'js-beautify'
-import logo from '@/assets/logo/logo.png'
-import { inputComponents, selectComponents, layoutComponents, formConf as formConfData } from '@/utils/generator/config'
-import { beautifierConf } from '@/utils/index'
-import drawingDefalut from '@/utils/generator/drawingDefalut'
-import { makeUpHtml, vueTemplate, vueScript, cssStyle } from '@/utils/generator/html'
-import { makeUpJs } from '@/utils/generator/js'
-import { makeUpCss } from '@/utils/generator/css'
-import Download from '@/plugins/download'
-import { ElNotification } from 'element-plus'
-import DraggableItem from './DraggableItem'
-import RightPanel from './RightPanel'
-import CodeTypeDialog from './CodeTypeDialog'
-import { onMounted, watch } from 'vue'
-
-const drawingList = ref(drawingDefalut)
-const { proxy } = getCurrentInstance()
-const dialogVisible = ref(false)
-const showFileName = ref(false)
-const operationType = ref('')
-const idGlobal = ref(100)
-const activeData = ref(drawingDefalut[0])
-const activeId = ref(drawingDefalut[0].formId)
-const generateConf = ref(null)
-const formData = ref({})
-const formConf = ref(formConfData)
-let oldActiveId
-let tempActiveData
-
-function activeFormItem(element) {
- activeData.value = element
- activeId.value = element.formId
-}
-function copy() {
- dialogVisible.value = true
- showFileName.value = false
- operationType.value = 'copy'
-}
-function download() {
- dialogVisible.value = true
- showFileName.value = true
- operationType.value = 'download'
-}
-function empty() {
- proxy.$modal.confirm('纭畾瑕佹竻绌烘墍鏈夌粍浠跺悧锛�', '鎻愮ず', { type: 'warning' }).then(() => {
- idGlobal.value = 100
- drawingList.value = []
- }
- )
-}
-
-function onEnd(obj, a) {
- if (obj.from !== obj.to) {
- activeData.value = tempActiveData
- activeId.value = idGlobal.value
- }
-}
-
-function addComponent(item) {
- const clone = cloneComponent(item)
- drawingList.value.push(clone)
- activeFormItem(clone)
-}
-
-function cloneComponent(origin) {
- const clone = JSON.parse(JSON.stringify(origin))
- clone.formId = ++idGlobal.value
- clone.span = formConf.value.span
- clone.renderKey = +new Date() // 鏀瑰彉renderKey鍚庡彲浠ュ疄鐜板己鍒舵洿鏂扮粍浠�
- if (!clone.layout) clone.layout = 'colFormItem'
- if (clone.layout === 'colFormItem') {
- clone.vModel = `field${idGlobal.value}`
- clone.placeholder !== undefined && (clone.placeholder += clone.label)
- tempActiveData = clone
- } else if (clone.layout === 'rowFormItem') {
- delete clone.label
- clone.componentName = `row${idGlobal.value}`
- clone.gutter = formConf.value.gutter
- tempActiveData = clone
- }
- return tempActiveData
-}
-
-function drawingItemCopy(item, parent) {
- let clone = JSON.parse(JSON.stringify(item))
- clone = createIdAndKey(clone)
- parent.push(clone)
- activeFormItem(clone)
-}
-
-
-function createIdAndKey(item) {
- item.formId = ++idGlobal.value
- item.renderKey = +new Date()
- if (item.layout === 'colFormItem') {
- item.vModel = `field${idGlobal.value}`
- } else if (item.layout === 'rowFormItem') {
- item.componentName = `row${idGlobal.value}`
- }
- if (Array.isArray(item.children)) {
- item.children = item.children.map(childItem => createIdAndKey(childItem))
- }
- return item
-}
-
-function drawingItemDelete(index, parent) {
- parent.splice(index, 1)
- nextTick(() => {
- const len = drawingList.value.length
- if (len) {
- activeFormItem(drawingList.value[len - 1])
- }
- })
-}
-
-function tagChange(newTag) {
- newTag = cloneComponent(newTag)
- newTag.vModel = activeData.value.vModel
- newTag.formId = activeId.value
- newTag.span = activeData.value.span
- delete activeData.value.tag
- delete activeData.value.tagIcon
- delete activeData.value.document
- Object.keys(newTag).forEach(key => {
- if (activeData.value[key] !== undefined
- && typeof activeData.value[key] === typeof newTag[key]) {
- newTag[key] = activeData.value[key]
- }
- })
- activeData.value = newTag
- updateDrawingList(newTag, drawingList.value)
-}
-
-
-function updateDrawingList(newTag, list) {
- const index = list.findIndex(item => item.formId === activeId.value)
- if (index > -1) {
- list.splice(index, 1, newTag)
- } else {
- list.forEach(item => {
- if (Array.isArray(item.children)) updateDrawingList(newTag, item.children)
- })
- }
-}
-function generate(data) {
- generateConf.value = data
- nextTick(() => {
- switch (operationType.value) {
- case 'copy':
- execCopy(data)
- break
- case 'download':
- execDownload(data)
- break
- default:
- break
- }
- })
-}
-
-function execDownload(data) {
- const codeStr = generateCode()
- const blob = new Blob([codeStr], { type: 'text/plain;charset=utf-8' })
- Download.saveAs(blob, data.fileName)
-}
-
-function execCopy(data) {
- document.getElementById('copyNode').click()
-}
-function AssembleFormData() {
- formData.value = { fields: JSON.parse(JSON.stringify(drawingList.value)), ...formConf.value }
-}
-function generateCode() {
- const { type } = generateConf.value
- AssembleFormData()
- const script = vueScript(makeUpJs(formData.value, type))
- const html = vueTemplate(makeUpHtml(formData.value, type))
- const css = cssStyle(makeUpCss(formData.value))
- return beautifier.html(html + script + css, beautifierConf.html)
-}
-watch(() => activeData.value.label, (val, oldVal) => {
- if (
- activeData.value.placeholder === undefined
- || !activeData.value.tag
- || oldActiveId !== activeId.value
- ) {
- return
- }
- activeData.value.placeholder = activeData.value.placeholder.replace(oldVal, '') + val
-})
-watch(activeId, (val) => {
- oldActiveId = val
-}, { immediate: true })
-
-onMounted(() => {
- const clipboard = new ClipboardJS('#copyNode', {
- text: trigger => {
- const codeStr = generateCode()
- ElNotification({ title: '鎴愬姛', message: '浠g爜宸插鍒跺埌鍓垏鏉匡紝鍙矘璐淬��', type: 'success' })
- return codeStr
- }
- })
- clipboard.on('error', e => {
- proxy.$modal.msgError('浠g爜澶嶅埗澶辫触')
- })
-})
-</script>
-
-<style lang='scss'>
-$lighterBlue: #2C51D9;
-
-.container {
- position: relative;
- width: 100%;
- background-color: var(--el-bg-color-overlay);
- height: calc(100vh - 50px - 40px);
- overflow: hidden;
-
- .left-board {
- width: 260px;
- position: absolute;
- left: 0;
- top: 0;
- height: calc(100vh - 50px - 40px);
-
- .logo-wrapper {
- position: relative;
- height: 42px;
- border-bottom: 1px solid var(--el-border-color-extra-light);
- box-sizing: border-box;
-
- .logo {
- position: absolute;
- left: 12px;
- top: 6px;
- line-height: 30px;
- color: #00afff;
- font-weight: 600;
- font-size: 17px;
- white-space: nowrap;
-
- >img {
- width: 30px;
- height: 30px;
- vertical-align: top;
- }
-
- .github {
- display: inline-block;
- vertical-align: sub;
- margin-left: 15px;
-
- >img {
- height: 22px;
- }
- }
- }
- }
-
- .left-scrollbar {
- .el-scrollbar__wrap {
- box-sizing: border-box;
- overflow-x: hidden !important;
- margin-bottom: 0 !important;
-
- .components-list {
- padding: 8px;
- box-sizing: border-box;
- height: 100%;
-
- .components-title {
- font-size: 14px;
- // color: #222;
- margin: 6px 2px;
-
- .svg-icon {
- // color: #666;
- font-size: 18px;
- margin-right: 5px;
- }
- }
-
- .components-draggable {
- padding-bottom: 20px;
-
- .components-item {
- display: inline-block;
- width: 48%;
- margin: 1%;
- transition: transform 0ms !important;
-
- .components-body {
- padding: 8px 10px;
- background: var(--el-border-color-extra-light);
- font-size: 12px;
- cursor: move;
- border: 1px dashed var(--el-border-color-extra-light);
- border-radius: 3px;
-
- .svg-icon {
- // color: #777;
- font-size: 15px;
- margin-right: 5px;
- }
-
- &:hover {
- border: 1px dashed #787be8;
- color: #787be8;
-
- .svg-icon {
- color: #787be8;
- }
- }
- }
- }
- }
-
-
- }
- }
- }
- }
-
- .center-board {
- height: calc(100vh - 50px - 40px);
- width: auto;
- margin: 0 350px 0 260px;
- box-sizing: border-box;
-
- .action-bar {
- position: relative;
- height: 42px;
- padding: 0 15px;
- box-sizing: border-box;
- ;
- border: 1px solid var(--el-border-color-extra-light);
- border-top: none;
- border-left: none;
- display: flex;
- align-items: center;
- justify-content: flex-end;
-
- u .delete-btn {
- color: #F56C6C;
- }
- }
-
- .center-scrollbar {
- height: calc(100vh - 50px - 40px - 42px);
- overflow: hidden;
- border-left: 1px solid var(--el-border-color-extra-light);
- border-right: 1px solid var(--el-border-color-extra-light);
- box-sizing: border-box;
-
- .el-scrollbar__view {
- overflow-x: hidden;
- }
-
- .center-board-row {
- padding: 12px 12px 15px 12px;
- box-sizing: border-box;
-
- &>.el-form {
- // 69 = 12+15+42
- height: calc(100vh - 50px - 40px - 69px);
- flex: 1;
-
- .drawing-board {
- height: 100%;
- position: relative;
-
- .components-body {
- padding: 0;
- margin: 0;
- font-size: 0;
- }
-
- .sortable-ghost {
- position: relative;
- display: block;
- overflow: hidden;
-
- &::before {
- content: " ";
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- height: 3px;
- background: rgb(89, 89, 223);
- z-index: 2;
- }
- }
-
- .components-item.sortable-ghost {
- width: 100%;
- height: 60px;
- background: var(--el-border-color-extra-light);
- }
-
- .active-from-item {
- &>.el-form-item {
- background: var(--el-border-color-extra-light);
- border-radius: 6px;
- }
-
- &>.drawing-item-copy,
- &>.drawing-item-delete {
- display: initial;
- }
-
- &>.component-name {
- color: $lighterBlue;
- }
-
- .el-input__wrapper {
- box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset;
- }
- }
-
- .el-form-item {
- margin-bottom: 15px;
- }
- }
-
- .drawing-item {
- position: relative;
- cursor: move;
-
- &.unfocus-bordered:not(.activeFromItem)>div:first-child {
- border: 1px dashed #ccc;
- }
-
- .el-form-item {
- padding: 12px 10px;
- }
- }
-
- .drawing-row-item {
- position: relative;
- cursor: move;
- box-sizing: border-box;
- border: 1px dashed #ccc;
- border-radius: 3px;
- padding: 0 2px;
- margin-bottom: 15px;
-
- .drawing-row-item {
- margin-bottom: 2px;
- }
-
- .el-col {
- margin-top: 22px;
- }
-
- .el-form-item {
- margin-bottom: 0;
- }
-
- .drag-wrapper {
- min-height: 80px;
- flex: 1;
- display: flex;
- flex-wrap: wrap;
- }
-
- &.active-from-item {
- border: 1px dashed $lighterBlue;
- }
-
- .component-name {
- position: absolute;
- top: 0;
- left: 0;
- font-size: 12px;
- color: #bbb;
- display: inline-block;
- padding: 0 6px;
- }
- }
-
- .drawing-item,
- .drawing-row-item {
- &:hover {
- &>.el-form-item {
- background: var(--el-border-color-extra-light);
- border-radius: 6px;
- }
-
- &>.drawing-item-copy,
- &>.drawing-item-delete {
- display: initial;
- }
- }
-
- &>.drawing-item-copy,
- &>.drawing-item-delete {
- display: none;
- position: absolute;
- top: -10px;
- width: 22px;
- height: 22px;
- line-height: 22px;
- text-align: center;
- border-radius: 50%;
- font-size: 12px;
- border: 1px solid;
- cursor: pointer;
- z-index: 1;
- }
-
- &>.drawing-item-copy {
- right: 56px;
- border-color: $lighterBlue;
- color: $lighterBlue;
- background: #fff;
-
- &:hover {
- background: $lighterBlue;
- color: #fff;
- }
- }
-
- &>.drawing-item-delete {
- right: 24px;
- border-color: #F56C6C;
- color: #F56C6C;
- background: #fff;
-
- &:hover {
- background: #F56C6C;
- color: #fff;
- }
- }
- }
-
- .empty-info {
- position: absolute;
- top: 46%;
- left: 0;
- right: 0;
- text-align: center;
- font-size: 18px;
- color: #ccb1ea;
- letter-spacing: 4px;
- }
-
- }
- }
- }
- }
-}
-</style>
diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue
deleted file mode 100644
index 8bfc373..0000000
--- a/src/views/tool/gen/basicInfoForm.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
- <el-form ref="basicInfoForm" :model="info" :rules="rules" label-width="150px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="琛ㄥ悕绉�" prop="tableName">
- <el-input placeholder="璇疯緭鍏ヤ粨搴撳悕绉�" v-model="info.tableName" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
- <el-input placeholder="璇疯緭鍏�" v-model="info.tableComment" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹炰綋绫诲悕绉�" prop="className">
- <el-input placeholder="璇疯緭鍏�" v-model="info.className" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浣滆��" prop="functionAuthor">
- <el-input placeholder="璇疯緭鍏�" v-model="info.functionAuthor" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input type="textarea" :rows="3" v-model="info.remark"></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-defineProps({
- info: {
- type: Object,
- default: null
- }
-})
-
-// 琛ㄥ崟鏍¢獙
-const rules = ref({
- tableName: [{ required: true, message: "璇疯緭鍏ヨ〃鍚嶇О", trigger: "blur" }],
- tableComment: [{ required: true, message: "璇疯緭鍏ヨ〃鎻忚堪", trigger: "blur" }],
- className: [{ required: true, message: "璇疯緭鍏ュ疄浣撶被鍚嶇О", trigger: "blur" }],
- functionAuthor: [{ required: true, message: "璇疯緭鍏ヤ綔鑰�", trigger: "blur" }]
-})
-</script>
diff --git a/src/views/tool/gen/createTable.vue b/src/views/tool/gen/createTable.vue
deleted file mode 100644
index ef6f8f3..0000000
--- a/src/views/tool/gen/createTable.vue
+++ /dev/null
@@ -1,46 +0,0 @@
-<template>
- <!-- 鍒涘缓琛� -->
- <el-dialog title="鍒涘缓琛�" v-model="visible" width="800px" top="5vh" append-to-body>
- <span>鍒涘缓琛ㄨ鍙�(鏀寔澶氫釜寤鸿〃璇彞)锛�</span>
- <el-input type="textarea" :rows="10" placeholder="璇疯緭鍏ユ枃鏈�" v-model="content"></el-input>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleImportTable">纭� 瀹�</el-button>
- <el-button @click="visible = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { createTable } from "@/api/tool/gen"
-
-const visible = ref(false)
-const content = ref("")
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(["ok"])
-
-/** 鏄剧ず寮规 */
-function show() {
- visible.value = true
-}
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImportTable() {
- if (content.value === "") {
- proxy.$modal.msgError("璇疯緭鍏ュ缓琛ㄨ鍙�")
- return
- }
- createTable({ sql: content.value }).then(res => {
- proxy.$modal.msgSuccess(res.msg)
- if (res.code === 200) {
- visible.value = false
- emit("ok")
- }
- })
-}
-
-defineExpose({
- show,
-})
-</script>
diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue
deleted file mode 100644
index 874fc94..0000000
--- a/src/views/tool/gen/editTable.vue
+++ /dev/null
@@ -1,200 +0,0 @@
-<template>
- <el-card>
- <el-tabs v-model="activeName">
- <el-tab-pane label="鍩烘湰淇℃伅" name="basic">
- <basic-info-form ref="basicInfo" :info="info" />
- </el-tab-pane>
- <el-tab-pane label="瀛楁淇℃伅" name="columnInfo">
- <el-table ref="dragTable" :data="columns" row-key="columnId" :max-height="tableHeight">
- <el-table-column label="搴忓彿" type="index" min-width="5%"/>
- <el-table-column
- label="瀛楁鍒楀悕"
- prop="columnName"
- min-width="10%"
- :show-overflow-tooltip="true"
- />
- <el-table-column label="瀛楁鎻忚堪" min-width="10%">
- <template #default="scope">
- <el-input v-model="scope.row.columnComment"></el-input>
- </template>
- </el-table-column>
- <el-table-column
- label="鐗╃悊绫诲瀷"
- prop="columnType"
- min-width="10%"
- :show-overflow-tooltip="true"
- />
- <el-table-column label="Java绫诲瀷" min-width="11%">
- <template #default="scope">
- <el-select v-model="scope.row.javaType">
- <el-option label="Long" value="Long" />
- <el-option label="String" value="String" />
- <el-option label="Integer" value="Integer" />
- <el-option label="Double" value="Double" />
- <el-option label="BigDecimal" value="BigDecimal" />
- <el-option label="Date" value="Date" />
- <el-option label="Boolean" value="Boolean" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="java灞炴��" min-width="10%">
- <template #default="scope">
- <el-input v-model="scope.row.javaField"></el-input>
- </template>
- </el-table-column>
-
- <el-table-column label="鎻掑叆" min-width="5%">
- <template #default="scope">
- <el-checkbox true-label="1" false-label="0" v-model="scope.row.isInsert"></el-checkbox>
- </template>
- </el-table-column>
- <el-table-column label="缂栬緫" min-width="5%">
- <template #default="scope">
- <el-checkbox true-label="1" false-label="0" v-model="scope.row.isEdit"></el-checkbox>
- </template>
- </el-table-column>
- <el-table-column label="鍒楄〃" min-width="5%">
- <template #default="scope">
- <el-checkbox true-label="1" false-label="0" v-model="scope.row.isList"></el-checkbox>
- </template>
- </el-table-column>
- <el-table-column label="鏌ヨ" min-width="5%">
- <template #default="scope">
- <el-checkbox true-label="1" false-label="0" v-model="scope.row.isQuery"></el-checkbox>
- </template>
- </el-table-column>
- <el-table-column label="鏌ヨ鏂瑰紡" min-width="10%">
- <template #default="scope">
- <el-select v-model="scope.row.queryType">
- <el-option label="=" value="EQ" />
- <el-option label="!=" value="NE" />
- <el-option label=">" value="GT" />
- <el-option label=">=" value="GTE" />
- <el-option label="<" value="LT" />
- <el-option label="<=" value="LTE" />
- <el-option label="LIKE" value="LIKE" />
- <el-option label="BETWEEN" value="BETWEEN" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="蹇呭~" min-width="5%">
- <template #default="scope">
- <el-checkbox true-label="1" false-label="0" v-model="scope.row.isRequired"></el-checkbox>
- </template>
- </el-table-column>
- <el-table-column label="鏄剧ず绫诲瀷" min-width="12%">
- <template #default="scope">
- <el-select v-model="scope.row.htmlType">
- <el-option label="鏂囨湰妗�" value="input" />
- <el-option label="鏂囨湰鍩�" value="textarea" />
- <el-option label="涓嬫媺妗�" value="select" />
- <el-option label="鍗曢�夋" value="radio" />
- <el-option label="澶嶉�夋" value="checkbox" />
- <el-option label="鏃ユ湡鎺т欢" value="datetime" />
- <el-option label="鍥剧墖涓婁紶" value="imageUpload" />
- <el-option label="鏂囦欢涓婁紶" value="fileUpload" />
- <el-option label="瀵屾枃鏈帶浠�" value="editor" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="瀛楀吀绫诲瀷" min-width="12%">
- <template #default="scope">
- <el-select v-model="scope.row.dictType" clearable filterable placeholder="璇烽�夋嫨">
- <el-option
- v-for="dict in dictOptions"
- :key="dict.dictType"
- :label="dict.dictName"
- :value="dict.dictType">
- <span style="float: left">{{ dict.dictName }}</span>
- <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
- </el-option>
- </el-select>
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- <el-tab-pane label="鐢熸垚淇℃伅" name="genInfo">
- <gen-info-form ref="genInfo" :info="info" :tables="tables" />
- </el-tab-pane>
- </el-tabs>
- <el-form label-width="100px">
- <div style="text-align: center;margin-left:-100px;margin-top:10px;">
- <el-button type="primary" @click="submitForm()">鎻愪氦</el-button>
- <el-button @click="close()">杩斿洖</el-button>
- </div>
- </el-form>
- </el-card>
-</template>
-
-<script setup name="GenEdit">
-import { getGenTable, updateGenTable } from "@/api/tool/gen"
-import { optionselect as getDictOptionselect } from "@/api/system/dict/type"
-import basicInfoForm from "./basicInfoForm"
-import genInfoForm from "./genInfoForm"
-
-const route = useRoute()
-const { proxy } = getCurrentInstance()
-
-const activeName = ref("columnInfo")
-const tableHeight = ref(document.documentElement.scrollHeight - 245 + "px")
-const tables = ref([])
-const columns = ref([])
-const dictOptions = ref([])
-const info = ref({})
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
- const basicForm = proxy.$refs.basicInfo.$refs.basicInfoForm
- const genForm = proxy.$refs.genInfo.$refs.genInfoForm
- Promise.all([basicForm, genForm].map(getFormPromise)).then(res => {
- const validateResult = res.every(item => !!item)
- if (validateResult) {
- const genTable = Object.assign({}, info.value)
- genTable.columns = columns.value
- genTable.params = {
- treeCode: info.value.treeCode,
- treeName: info.value.treeName,
- treeParentCode: info.value.treeParentCode,
- parentMenuId: info.value.parentMenuId
- }
- updateGenTable(genTable).then(res => {
- proxy.$modal.msgSuccess(res.msg)
- if (res.code === 200) {
- close()
- }
- })
- } else {
- proxy.$modal.msgError("琛ㄥ崟鏍¢獙鏈�氳繃锛岃閲嶆柊妫�鏌ユ彁浜ゅ唴瀹�")
- }
- })
-}
-
-function getFormPromise(form) {
- return new Promise(resolve => {
- form.validate(res => {
- resolve(res)
- })
- })
-}
-
-function close() {
- const obj = { path: "/tool/gen", query: { t: Date.now(), pageNum: route.query.pageNum } }
- proxy.$tab.closeOpenPage(obj)
-}
-
-(() => {
- const tableId = route.params && route.params.tableId
- if (tableId) {
- // 鑾峰彇琛ㄨ缁嗕俊鎭�
- getGenTable(tableId).then(res => {
- columns.value = res.data.rows
- info.value = res.data.info
- tables.value = res.data.tables
- })
- /** 鏌ヨ瀛楀吀涓嬫媺鍒楄〃 */
- getDictOptionselect().then(response => {
- dictOptions.value = response.data
- })
- }
-})()
-</script>
diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue
deleted file mode 100644
index b416a89..0000000
--- a/src/views/tool/gen/genInfoForm.vue
+++ /dev/null
@@ -1,305 +0,0 @@
-<template>
- <el-form ref="genInfoForm" :model="info" :rules="rules" label-width="150px">
- <el-row>
- <el-col :span="12">
- <el-form-item prop="tplCategory">
- <template #label>鐢熸垚妯℃澘</template>
- <el-select v-model="info.tplCategory" @change="tplSelectChange">
- <el-option label="鍗曡〃锛堝鍒犳敼鏌ワ級" value="crud" />
- <el-option label="鏍戣〃锛堝鍒犳敼鏌ワ級" value="tree" />
- <el-option label="涓诲瓙琛紙澧炲垹鏀规煡锛�" value="sub" />
- </el-select>
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="tplWebType">
- <template #label>鍓嶇绫诲瀷</template>
- <el-select v-model="info.tplWebType">
- <el-option label="Vue2 Element UI 妯$増" value="element-ui" />
- <el-option label="Vue3 Element Plus 妯$増" value="element-plus" />
- </el-select>
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="packageName">
- <template #label>
- 鐢熸垚鍖呰矾寰�
- <el-tooltip content="鐢熸垚鍦ㄥ摢涓猨ava鍖呬笅锛屼緥濡� com.ruoyi.system" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-input v-model="info.packageName" />
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="moduleName">
- <template #label>
- 鐢熸垚妯″潡鍚�
- <el-tooltip content="鍙悊瑙d负瀛愮郴缁熷悕锛屼緥濡� system" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-input v-model="info.moduleName" />
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="businessName">
- <template #label>
- 鐢熸垚涓氬姟鍚�
- <el-tooltip content="鍙悊瑙d负鍔熻兘鑻辨枃鍚嶏紝渚嬪 user" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-input v-model="info.businessName" />
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="functionName">
- <template #label>
- 鐢熸垚鍔熻兘鍚�
- <el-tooltip content="鐢ㄤ綔绫绘弿杩帮紝渚嬪 鐢ㄦ埛" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-input v-model="info.functionName" />
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item prop="genType">
- <template #label>
- 鐢熸垚浠g爜鏂瑰紡
- <el-tooltip content="榛樿涓簔ip鍘嬬缉鍖呬笅杞斤紝涔熷彲浠ヨ嚜瀹氫箟鐢熸垚璺緞" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-radio v-model="info.genType" value="0">zip鍘嬬缉鍖�</el-radio>
- <el-radio v-model="info.genType" value="1">鑷畾涔夎矾寰�</el-radio>
- </el-form-item>
- </el-col>
-
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 涓婄骇鑿滃崟
- <el-tooltip content="鍒嗛厤鍒版寚瀹氳彍鍗曚笅锛屼緥濡� 绯荤粺绠$悊" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-tree-select
- v-model="info.parentMenuId"
- :data="menuOptions"
- :props="{ value: 'menuId', label: 'menuName', children: 'children' }"
- value-key="menuId"
- placeholder="璇烽�夋嫨绯荤粺鑿滃崟"
- check-strictly
- />
- </el-form-item>
- </el-col>
-
- <el-col :span="24" v-if="info.genType == '1'">
- <el-form-item prop="genPath">
- <template #label>
- 鑷畾涔夎矾寰�
- <el-tooltip content="濉啓纾佺洏缁濆璺緞锛岃嫢涓嶅~鍐欙紝鍒欑敓鎴愬埌褰撳墠Web椤圭洰涓�" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-input v-model="info.genPath">
- <template #append>
- <el-dropdown>
- <el-button type="primary">
- 鏈�杩戣矾寰勫揩閫熼�夋嫨
- <i class="el-icon-arrow-down el-icon--right"></i>
- </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item @click="info.genPath = '/'">鎭㈠榛樿鐨勭敓鎴愬熀纭�璺緞</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </template>
- </el-input>
- </el-form-item>
- </el-col>
- </el-row>
-
- <template v-if="info.tplCategory == 'tree'">
- <h4 class="form-header">鍏朵粬淇℃伅</h4>
- <el-row v-show="info.tplCategory == 'tree'">
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 鏍戠紪鐮佸瓧娈�
- <el-tooltip content="鏍戞樉绀虹殑缂栫爜瀛楁鍚嶏紝 濡傦細dept_id" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-select v-model="info.treeCode" placeholder="璇烽�夋嫨">
- <el-option
- v-for="(column, index) in info.columns"
- :key="index"
- :label="column.columnName + '锛�' + column.columnComment"
- :value="column.columnName"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 鏍戠埗缂栫爜瀛楁
- <el-tooltip content="鏍戞樉绀虹殑鐖剁紪鐮佸瓧娈靛悕锛� 濡傦細parent_Id" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-select v-model="info.treeParentCode" placeholder="璇烽�夋嫨">
- <el-option
- v-for="(column, index) in info.columns"
- :key="index"
- :label="column.columnName + '锛�' + column.columnComment"
- :value="column.columnName"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 鏍戝悕绉板瓧娈�
- <el-tooltip content="鏍戣妭鐐圭殑鏄剧ず鍚嶇О瀛楁鍚嶏紝 濡傦細dept_name" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-select v-model="info.treeName" placeholder="璇烽�夋嫨">
- <el-option
- v-for="(column, index) in info.columns"
- :key="index"
- :label="column.columnName + '锛�' + column.columnComment"
- :value="column.columnName"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </template>
-
- <template v-if="info.tplCategory == 'sub'">
- <h4 class="form-header">鍏宠仈淇℃伅</h4>
- <el-row>
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 鍏宠仈瀛愯〃鐨勮〃鍚�
- <el-tooltip content="鍏宠仈瀛愯〃鐨勮〃鍚嶏紝 濡傦細sys_user" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-select v-model="info.subTableName" placeholder="璇烽�夋嫨" @change="subSelectChange">
- <el-option
- v-for="(table, index) in tables"
- :key="index"
- :label="table.tableName + '锛�' + table.tableComment"
- :value="table.tableName"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item>
- <template #label>
- 瀛愯〃鍏宠仈鐨勫閿悕
- <el-tooltip content="瀛愯〃鍏宠仈鐨勫閿悕锛� 濡傦細user_id" placement="top">
- <el-icon><question-filled /></el-icon>
- </el-tooltip>
- </template>
- <el-select v-model="info.subTableFkName" placeholder="璇烽�夋嫨">
- <el-option
- v-for="(column, index) in subColumns"
- :key="index"
- :label="column.columnName + '锛�' + column.columnComment"
- :value="column.columnName"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </template>
-
- </el-form>
-</template>
-
-<script setup>
-import { listMenu } from "@/api/system/menu"
-
-const subColumns = ref([])
-const menuOptions = ref([])
-const { proxy } = getCurrentInstance()
-
-const props = defineProps({
- info: {
- type: Object,
- default: null
- },
- tables: {
- type: Array,
- default: null
- }
-})
-
-// 琛ㄥ崟鏍¢獙
-const rules = ref({
- tplCategory: [{ required: true, message: "璇烽�夋嫨鐢熸垚妯℃澘", trigger: "blur" }],
- packageName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愬寘璺緞", trigger: "blur" }],
- moduleName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愭ā鍧楀悕", trigger: "blur" }],
- businessName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愪笟鍔″悕", trigger: "blur" }],
- functionName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愬姛鑳藉悕", trigger: "blur" }]
-})
-
-function subSelectChange(value) {
- props.info.subTableFkName = ""
-}
-
-function tplSelectChange(value) {
- if (value !== "sub") {
- props.info.subTableName = ""
- props.info.subTableFkName = ""
- }
-}
-
-function setSubTableColumns(value) {
- for (var item in props.tables) {
- const name = props.tables[item].tableName
- if (value === name) {
- subColumns.value = props.tables[item].columns
- break
- }
- }
-}
-
-/** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */
-function getMenuTreeselect() {
- listMenu().then(response => {
- menuOptions.value = proxy.handleTree(response.data, "menuId")
- })
-}
-
-onMounted(() => {
- getMenuTreeselect()
-})
-
-watch(() => props.info.subTableName, val => {
- setSubTableColumns(val)
-})
-
-watch(() => props.info.tplWebType, val => {
- if (val === '') {
- props.info.tplWebType = "element-plus"
- }
-})
-</script>
diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue
deleted file mode 100644
index 23dbf28..0000000
--- a/src/views/tool/gen/importTable.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-<template>
- <!-- 瀵煎叆琛� -->
- <el-dialog title="瀵煎叆琛�" v-model="visible" width="800px" top="5vh" append-to-body>
- <el-form :model="queryParams" ref="queryRef" :inline="true">
- <el-form-item label="琛ㄥ悕绉�" prop="tableName">
- <el-input
- v-model="queryParams.tableName"
- placeholder="璇疯緭鍏ヨ〃鍚嶇О"
- clearable
- style="width: 180px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
- <el-input
- v-model="queryParams.tableComment"
- placeholder="璇疯緭鍏ヨ〃鎻忚堪"
- clearable
- style="width: 180px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <el-row>
- <el-table @row-click="clickRow" ref="table" :data="dbTableList" @selection-change="handleSelectionChange" height="260px">
- <el-table-column type="selection" width="55"></el-table-column>
- <el-table-column prop="tableName" label="琛ㄥ悕绉�" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column prop="tableComment" label="琛ㄦ弿杩�" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column prop="createTime" label="鍒涘缓鏃堕棿"></el-table-column>
- <el-table-column prop="updateTime" label="鏇存柊鏃堕棿"></el-table-column>
- </el-table>
- <pagination
- v-show="total>0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleImportTable">纭� 瀹�</el-button>
- <el-button @click="visible = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { listDbTable, importTable } from "@/api/tool/gen"
-
-const total = ref(0)
-const visible = ref(false)
-const tables = ref([])
-const dbTableList = ref([])
-const { proxy } = getCurrentInstance()
-
-const queryParams = reactive({
- pageNum: 1,
- pageSize: 10,
- tableName: undefined,
- tableComment: undefined
-})
-
-const emit = defineEmits(["ok"])
-
-/** 鏌ヨ鍙傛暟鍒楄〃 */
-function show() {
- getList()
- visible.value = true
-}
-
-/** 鍗曞嚮閫夋嫨琛� */
-function clickRow(row) {
- proxy.$refs.table.toggleRowSelection(row)
-}
-
-/** 澶氶�夋閫変腑鏁版嵁 */
-function handleSelectionChange(selection) {
- tables.value = selection.map(item => item.tableName)
-}
-
-/** 鏌ヨ琛ㄦ暟鎹� */
-function getList() {
- listDbTable(queryParams).then(res => {
- dbTableList.value = res.rows
- total.value = res.total
- })
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.pageNum = 1
- getList()
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- proxy.resetForm("queryRef")
- handleQuery()
-}
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImportTable() {
- const tableNames = tables.value.join(",")
- if (tableNames == "") {
- proxy.$modal.msgError("璇烽�夋嫨瑕佸鍏ョ殑琛�")
- return
- }
- importTable({ tables: tableNames }).then(res => {
- proxy.$modal.msgSuccess(res.msg)
- if (res.code === 200) {
- visible.value = false
- emit("ok")
- }
- })
-}
-
-defineExpose({
- show,
-})
-</script>
diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue
deleted file mode 100644
index aaddeb6..0000000
--- a/src/views/tool/gen/index.vue
+++ /dev/null
@@ -1,437 +0,0 @@
-<template>
- <div class="app-container">
- <el-form
- :model="queryParams"
- ref="queryRef"
- :inline="true"
- v-show="showSearch"
- >
- <el-form-item label="琛ㄥ悕绉�" prop="tableName">
- <el-input
- v-model="queryParams.tableName"
- placeholder="璇疯緭鍏ヨ〃鍚嶇О"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
- <el-input
- v-model="queryParams.tableComment"
- placeholder="璇疯緭鍏ヨ〃鎻忚堪"
- clearable
- style="width: 200px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
- <el-date-picker
- v-model="dateRange"
- value-format="YYYY-MM-DD"
- type="daterange"
- range-separator="-"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- ></el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery"
- >鎼滅储</el-button
- >
- <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
-
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Download"
- :disabled="multiple"
- @click="handleGenTable"
- v-hasPermi="['tool:gen:code']"
- >鐢熸垚</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="Plus"
- @click="openCreateTable"
- v-hasRole="['admin']"
- >鍒涘缓</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="info"
- plain
- icon="Upload"
- @click="openImportTable"
- v-hasPermi="['tool:gen:import']"
- >瀵煎叆</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="success"
- plain
- icon="Edit"
- :disabled="single"
- @click="handleEditTable"
- v-hasPermi="['tool:gen:edit']"
- >淇敼</el-button
- >
- </el-col>
- <el-col :span="1.5">
- <el-button
- type="danger"
- plain
- icon="Delete"
- :disabled="multiple"
- @click="handleDelete"
- v-hasPermi="['tool:gen:remove']"
- >鍒犻櫎</el-button
- >
- </el-col>
- <right-toolbar
- v-model:showSearch="showSearch"
- @queryTable="getList"
- ></right-toolbar>
- </el-row>
-
- <el-table
- ref="genRef"
- v-loading="loading"
- :data="tableList"
- @selection-change="handleSelectionChange"
- :default-sort="defaultSort"
- @sort-change="handleSortChange"
- >
- <el-table-column
- type="selection"
- align="center"
- width="55"
- ></el-table-column>
- <el-table-column label="搴忓彿" type="index" width="50" align="center">
- <template #default="scope">
- <span>{{
- (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1
- }}</span>
- </template>
- </el-table-column>
- <el-table-column
- label="琛ㄥ悕绉�"
- align="center"
- prop="tableName"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="琛ㄦ弿杩�"
- align="center"
- prop="tableComment"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="瀹炰綋"
- align="center"
- prop="className"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鍒涘缓鏃堕棿"
- align="center"
- prop="createTime"
- width="160"
- sortable="custom"
- :sort-orders="['descending', 'ascending']"
- />
- <el-table-column
- label="鏇存柊鏃堕棿"
- align="center"
- prop="updateTime"
- width="160"
- sortable="custom"
- :sort-orders="['descending', 'ascending']"
- />
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="330"
- class-name="small-padding fixed-width"
- >
- <template #default="scope">
- <el-tooltip content="棰勮" placement="top">
- <el-button
- link
- type="primary"
- icon="View"
- @click="handlePreview(scope.row)"
- v-hasPermi="['tool:gen:preview']"
- ></el-button>
- </el-tooltip>
- <el-tooltip content="缂栬緫" placement="top">
- <el-button
- link
- type="primary"
- icon="Edit"
- @click="handleEditTable(scope.row)"
- v-hasPermi="['tool:gen:edit']"
- ></el-button>
- </el-tooltip>
- <el-tooltip content="鍒犻櫎" placement="top">
- <el-button
- link
- type="primary"
- icon="Delete"
- @click="handleDelete(scope.row)"
- v-hasPermi="['tool:gen:remove']"
- ></el-button>
- </el-tooltip>
- <el-tooltip content="鍚屾" placement="top">
- <el-button
- link
- type="primary"
- icon="Refresh"
- @click="handleSynchDb(scope.row)"
- v-hasPermi="['tool:gen:edit']"
- ></el-button>
- </el-tooltip>
- <el-tooltip content="鐢熸垚浠g爜" placement="top">
- <el-button
- link
- type="primary"
- icon="Download"
- @click="handleGenTable(scope.row)"
- v-hasPermi="['tool:gen:code']"
- ></el-button>
- </el-tooltip>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- <!-- 棰勮鐣岄潰 -->
- <el-dialog
- :title="preview.title"
- v-model="preview.open"
- width="80%"
- top="5vh"
- append-to-body
- class="scrollbar"
- >
- <el-tabs v-model="preview.activeName">
- <el-tab-pane
- v-for="(value, key) in preview.data"
- :label="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))"
- :name="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))"
- :key="value"
- >
- <el-link
- :underline="false"
- icon="DocumentCopy"
- v-copyText="value"
- v-copyText:callback="copyTextSuccess"
- style="float: right"
- > 澶嶅埗</el-link
- >
- <pre>{{ value }}</pre>
- </el-tab-pane>
- </el-tabs>
- </el-dialog>
- <import-table ref="importRef" @ok="handleQuery" />
- <create-table ref="createRef" @ok="handleQuery" />
- </div>
-</template>
-
-<script setup name="Gen">
-import {
- listTable,
- previewTable,
- delTable,
- genCode,
- synchDb,
-} from "@/api/tool/gen";
-import router from "@/router";
-import importTable from "./importTable";
-import createTable from "./createTable";
-
-const route = useRoute();
-const { proxy } = getCurrentInstance();
-
-const tableList = ref([]);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const tableNames = ref([]);
-const dateRange = ref([]);
-const uniqueId = ref("");
-const defaultSort = ref({ prop: "createTime", order: "descending" });
-
-const data = reactive({
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- tableName: undefined,
- tableComment: undefined,
- orderByColumn: defaultSort.value.prop,
- isAsc: defaultSort.value.order,
- },
- preview: {
- open: false,
- title: "浠g爜棰勮",
- data: {},
- activeName: "domain.java",
- },
-});
-
-const { queryParams, preview } = toRefs(data);
-
-onActivated(() => {
- const time = route.query.t;
- if (time != null && time != uniqueId.value) {
- uniqueId.value = time;
- queryParams.value.pageNum = Number(route.query.pageNum);
- dateRange.value = [];
- proxy.resetForm("queryForm");
- getList();
- }
-});
-
-/** 鏌ヨ琛ㄩ泦鍚� */
-function getList() {
- loading.value = true;
- listTable(proxy.addDateRange(queryParams.value, dateRange.value)).then(
- (response) => {
- tableList.value = response.rows;
- total.value = response.total;
- loading.value = false;
- }
- );
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
- queryParams.value.pageNum = 1;
- getList();
-}
-
-/** 鐢熸垚浠g爜鎿嶄綔 */
-function handleGenTable(row) {
- const tbNames = row.tableName || tableNames.value;
- if (tbNames == "") {
- proxy.$modal.msgError("璇烽�夋嫨瑕佺敓鎴愮殑鏁版嵁");
- return;
- }
- if (row.genType === "1") {
- genCode(row.tableName).then((response) => {
- proxy.$modal.msgSuccess("鎴愬姛鐢熸垚鍒拌嚜瀹氫箟璺緞锛�" + row.genPath);
- });
- } else {
- proxy.$download.zip(
- "/tool/gen/batchGenCode?tables=" + tbNames,
- "ruoyi.zip"
- );
- }
-}
-
-/** 鍚屾鏁版嵁搴撴搷浣� */
-function handleSynchDb(row) {
- const tableName = row.tableName;
- proxy.$modal
- .confirm('纭瑕佸己鍒跺悓姝�"' + tableName + '"琛ㄧ粨鏋勫悧锛�')
- .then(function () {
- return synchDb(tableName);
- })
- .then(() => {
- proxy.$modal.msgSuccess("鍚屾鎴愬姛");
- })
- .catch(() => {});
-}
-
-/** 鎵撳紑瀵煎叆琛ㄥ脊绐� */
-function openImportTable() {
- proxy.$refs["importRef"].show();
-}
-
-/** 鎵撳紑鍒涘缓琛ㄥ脊绐� */
-function openCreateTable() {
- proxy.$refs["createRef"].show();
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
- dateRange.value = [];
- proxy.resetForm("queryRef");
- queryParams.value.pageNum = 1;
- proxy.$refs["genRef"].sort(defaultSort.value.prop, defaultSort.value.order);
-}
-
-/** 棰勮鎸夐挳 */
-function handlePreview(row) {
- previewTable(row.tableId).then((response) => {
- preview.value.data = response.data;
- preview.value.open = true;
- preview.value.activeName = "domain.java";
- });
-}
-
-/** 澶嶅埗浠g爜鎴愬姛 */
-function copyTextSuccess() {
- proxy.$modal.msgSuccess("澶嶅埗鎴愬姛");
-}
-
-// 澶氶�夋閫変腑鏁版嵁
-function handleSelectionChange(selection) {
- ids.value = selection.map((item) => item.tableId);
- tableNames.value = selection.map((item) => item.tableName);
- single.value = selection.length != 1;
- multiple.value = !selection.length;
-}
-
-/** 鎺掑簭瑙﹀彂浜嬩欢 */
-function handleSortChange(column, prop, order) {
- queryParams.value.orderByColumn = column.prop;
- queryParams.value.isAsc = column.order;
- getList();
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleEditTable(row) {
- const tableId = row.tableId || ids.value[0];
- const tableName = row.tableName || tableNames.value[0];
- const params = { pageNum: queryParams.value.pageNum };
- proxy.$tab.openPage(
- "淇敼[" + tableName + "]鐢熸垚閰嶇疆",
- "/tool/gen-edit/index/" + tableId,
- params
- );
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
- const tableIds = row.tableId || ids.value;
- proxy.$modal
- .confirm('鏄惁纭鍒犻櫎琛ㄧ紪鍙蜂负"' + tableIds + '"鐨勬暟鎹」锛�')
- .then(function () {
- return delTable(tableIds);
- })
- .then(() => {
- getList();
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- })
- .catch(() => {});
-}
-
-getList();
-</script>
diff --git a/src/views/tool/swagger/index.vue b/src/views/tool/swagger/index.vue
deleted file mode 100644
index f29c40f..0000000
--- a/src/views/tool/swagger/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <i-frame v-model:src="url"></i-frame>
-</template>
-
-<script setup>
-import iFrame from '@/components/iFrame'
-
-const url = ref(import.meta.env.VITE_APP_BASE_API + "/swagger-ui/index.html")
-</script>
diff --git a/vite.config.js b/vite.config.js
index 061360c..ec1d22f 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,82 +1,20 @@
-import { defineConfig, loadEnv } from "vite";
-import path from "path";
-import createVitePlugins from "./vite/plugins";
-
-// https://vitejs.dev/config/
-export default defineConfig(({ mode, command }) => {
- const env = loadEnv(mode, process.cwd());
- const { VITE_APP_ENV } = env;
- const baseUrl =
- VITE_APP_ENV == "development"
- ? "http://114.132.189.42:8089" // 寮�鍙戠幆澧冨悗绔帴鍙�
- : "http://114.132.189.42:9032"; // 鐢熶骇鐜鍚庣鎺ュ彛
-
- return {
- // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
- // 榛樿鎯呭喌涓嬶紝vite 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂
- // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
- base: VITE_APP_ENV === "production" ? "/" : "/",
- plugins: createVitePlugins(env, command === "build"),
- resolve: {
- // https://cn.vitejs.dev/config/#resolve-alias
- alias: {
- // 璁剧疆璺緞
- "~": path.resolve(__dirname, "./"),
- // 璁剧疆鍒悕
- "@": path.resolve(__dirname, "./src"),
- },
- // https://cn.vitejs.dev/config/#resolve-extensions
- extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
- },
- // 鎵撳寘閰嶇疆
- build: {
- // https://vite.dev/config/build-options.html
- sourcemap: command === "build" ? false : "inline",
- outDir: "dist",
- assetsDir: "assets",
- chunkSizeWarningLimit: 2000,
- rollupOptions: {
- output: {
- chunkFileNames: "static/js/[name]-[hash].js",
- entryFileNames: "static/js/[name]-[hash].js",
- assetFileNames: "static/[ext]/[name]-[hash].[ext]",
- },
- },
- },
- // vite 鐩稿叧閰嶇疆
- server: {
- port: 8001,
- host: true,
- open: true,
- proxy: {
- // https://cn.vitejs.dev/config/#server-proxy
- "/dev-api": {
- target: baseUrl,
- changeOrigin: true,
- rewrite: (p) => p.replace(/^\/dev-api/, ""),
- },
- // springdoc proxy
- "^/v3/api-docs/(.*)": {
- target: baseUrl,
- changeOrigin: true,
- },
- },
- },
- css: {
- postcss: {
- plugins: [
- {
- postcssPlugin: "internal:charset-removal",
- AtRule: {
- charset: (atRule) => {
- if (atRule.name === "charset") {
- atRule.remove();
- }
- },
- },
- },
- ],
- },
- },
- };
-});
+import { defineConfig } from 'vite'
+import uni from '@dcloudio/vite-plugin-uni'
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ uni(),
+ ],
+ // 浠呭奖鍝嶅紑鍙戞湇鍔″櫒锛坉ev:h5锛夛紝涓嶅奖鍝� npm run build 浜х墿銆�
+ // 瀛︾敓绔� baseUrl 鍥哄畾涓� /prod-api锛堝搴� nginx 鍙嶄唬锛夛紝鏈湴寮�鍙戞病鏈� nginx锛�
+ // 鏁呭湪姝ゆ妸 /prod-api 杞彂鍒版湰鏈哄悗绔苟鍘绘帀鍓嶇紑銆�
+ server: {
+ proxy: {
+ '/prod-api': {
+ target: 'http://localhost:18080',
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/prod-api/, ''),
+ },
+ },
+ },
+})
diff --git a/vite/plugins/auto-import.js b/vite/plugins/auto-import.js
deleted file mode 100644
index ba51689..0000000
--- a/vite/plugins/auto-import.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import autoImport from 'unplugin-auto-import/vite'
-
-export default function createAutoImport() {
- return autoImport({
- imports: [
- 'vue',
- 'vue-router',
- 'pinia'
- ],
- dts: false
- })
-}
diff --git a/vite/plugins/compression.js b/vite/plugins/compression.js
deleted file mode 100644
index 9767308..0000000
--- a/vite/plugins/compression.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import compression from 'vite-plugin-compression'
-
-export default function createCompression(env) {
- const { VITE_BUILD_COMPRESS } = env
- const plugin = []
- if (VITE_BUILD_COMPRESS) {
- const compressList = VITE_BUILD_COMPRESS.split(',')
- if (compressList.includes('gzip')) {
- // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#浣跨敤gzip瑙e帇缂╅潤鎬佹枃浠�
- plugin.push(
- compression({
- ext: '.gz',
- deleteOriginFile: false
- })
- )
- }
- if (compressList.includes('brotli')) {
- plugin.push(
- compression({
- ext: '.br',
- algorithm: 'brotliCompress',
- deleteOriginFile: false
- })
- )
- }
- }
- return plugin
-}
diff --git a/vite/plugins/index.js b/vite/plugins/index.js
deleted file mode 100644
index 7715adc..0000000
--- a/vite/plugins/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import vue from '@vitejs/plugin-vue'
-
-import createAutoImport from './auto-import'
-import createSvgIcon from './svg-icon'
-import createCompression from './compression'
-import createSetupExtend from './setup-extend'
-
-export default function createVitePlugins(viteEnv, isBuild = false) {
- const vitePlugins = [vue()]
- vitePlugins.push(createAutoImport())
- vitePlugins.push(createSetupExtend())
- vitePlugins.push(createSvgIcon(isBuild))
- isBuild && vitePlugins.push(...createCompression(viteEnv))
- return vitePlugins
-}
diff --git a/vite/plugins/setup-extend.js b/vite/plugins/setup-extend.js
deleted file mode 100644
index eac072c..0000000
--- a/vite/plugins/setup-extend.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import setupExtend from 'unplugin-vue-setup-extend-plus/vite'
-
-export default function createSetupExtend() {
- return setupExtend({})
-}
diff --git a/vite/plugins/svg-icon.js b/vite/plugins/svg-icon.js
deleted file mode 100644
index f23beff..0000000
--- a/vite/plugins/svg-icon.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
-import path from 'path'
-
-export default function createSvgIcon(isBuild) {
- return createSvgIconsPlugin({
- iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
- symbolId: 'icon-[dir]-[name]',
- svgoOptions: isBuild
- })
-}
--
Gitblit v1.9.3