Commit 8368ce32 authored by 张俊's avatar 张俊
parents 98028892 3fbbf1d9
lockfileVersion: '6.0'
dependencies:
'@element-plus/icons-vue':
specifier: ^2.0.6
version: 2.0.6(vue@3.2.31)
'@wangeditor/editor':
specifier: ^5.1.14
version: 5.1.14
'@wangeditor/editor-for-vue':
specifier: ^5.1.12
version: 5.1.12(@wangeditor/editor@5.1.14)(vue@3.2.31)
ace-builds:
specifier: ^1.9.6
version: 1.9.6
axios:
specifier: ^0.21.1
version: 0.21.1
clipboard:
specifier: ^2.0.11
version: 2.0.11
crypto-js:
specifier: ^4.1.1
version: 4.1.1
echarts:
specifier: ^5.3.3
version: 5.3.3
element-plus:
specifier: ^2.2.19
version: 2.3.6(vue@3.2.31)
github-markdown-css:
specifier: ^5.1.0
version: 5.2.0
html2canvas:
specifier: ^1.4.1
version: 1.4.1
lodash:
specifier: ^4.17.21
version: 4.17.21
markdown-it:
specifier: ^13.0.1
version: 13.0.1
mavon-editor:
specifier: ^3.0.1
version: 3.0.1
sass:
specifier: ^1.35.1
version: 1.35.1
string-format:
specifier: ^2.0.0
version: 2.0.0
uuid:
specifier: ^8.3.2
version: 8.3.2
vue:
specifier: ^3.2.31
version: 3.2.31
vue-demi:
specifier: ^0.14.5
version: 0.14.5(vue@3.2.31)
vue-i18n:
specifier: ^9.1.7
version: 9.1.7(vue@3.2.31)
vue-router:
specifier: ^4.0.10
version: 4.0.10(vue@3.2.31)
vue3-ace-editor:
specifier: ^2.2.2
version: 2.2.2
vuex:
specifier: ^4.0.2
version: 4.0.2(vue@3.2.31)
devDependencies:
'@vitejs/plugin-vue':
specifier: ^3.0.0
version: 3.0.0(vite@3.0.0)(vue@3.2.31)
'@vue/compiler-sfc':
specifier: ^3.2.31
version: 3.2.31
vite:
specifier: ^3.0.0
version: 3.0.0(sass@1.35.1)
packages:
/@babel/helper-string-parser@7.22.5:
resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
engines: {node: '>=6.9.0'}
/@babel/helper-validator-identifier@7.22.5:
resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
engines: {node: '>=6.9.0'}
/@babel/parser@7.22.5:
resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.22.5
/@babel/runtime@7.22.5:
resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
dev: false
/@babel/types@7.22.5:
resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-string-parser': 7.22.5
'@babel/helper-validator-identifier': 7.22.5
to-fast-properties: 2.0.0
/@ctrl/tinycolor@3.6.0:
resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==}
engines: {node: '>=10'}
dev: false
/@element-plus/icons-vue@2.0.6(vue@3.2.31):
resolution: {integrity: sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==}
peerDependencies:
vue: ^3.2.0
dependencies:
vue: 3.2.31
dev: false
/@esbuild/linux-loong64@0.14.54:
resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@floating-ui/core@1.3.1:
resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==}
dev: false
/@floating-ui/dom@1.4.1:
resolution: {integrity: sha512-loCXUOLzIC3jp50RFOKXZ/kQjjz26ryr/23M+FWG9jrmAv8lRf3DUfC2AiVZ3+K316GOhB08CR+Povwz8e9mDw==}
dependencies:
'@floating-ui/core': 1.3.1
dev: false
/@intlify/core-base@9.1.7:
resolution: {integrity: sha512-q1W2j81xbHyfKrNcca/CeJyf0Bcx4u9UDu05l7AaiJbqOseTme2o2I3wp1hDDCtmC7k7HgX0sAygyHNJH9swuQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/devtools-if': 9.1.7
'@intlify/message-compiler': 9.1.7
'@intlify/message-resolver': 9.1.7
'@intlify/runtime': 9.1.7
'@intlify/shared': 9.1.7
'@intlify/vue-devtools': 9.1.7
dev: false
/@intlify/devtools-if@9.1.7:
resolution: {integrity: sha512-/DcN5FUySSkQhDqx5y1RvxfuCXO3Ot/dUEIOs472qbM7Hyb2qif+eXCnwHBzlI4+wEfQVT6L0PiM1a7Er/ro9g==}
engines: {node: '>= 10'}
dependencies:
'@intlify/shared': 9.1.7
dev: false
/@intlify/message-compiler@9.1.7:
resolution: {integrity: sha512-JZNkAhr3O7tnbdbRBcpYfqr/Ai26WTzX0K/lV8Y1KVdOIj/dGiamaffdWUdFiDXUnbJRNbPiOaKxy7Pwip3KxQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-resolver': 9.1.7
'@intlify/shared': 9.1.7
source-map: 0.6.1
dev: false
/@intlify/message-resolver@9.1.7:
resolution: {integrity: sha512-WTK+OaXJYjyquLGhuCyDvU2WHkG+kXzXeHagmVFHn+s118Jf2143zzkLLUrapP5CtZ/csuyjmYg7b3xQRQAmvw==}
engines: {node: '>= 10'}
dev: false
/@intlify/runtime@9.1.7:
resolution: {integrity: sha512-QURPSlzhOVnRwS2XMGpCDsDkP42kfVBh94aAORxh/gVGzdgJip2vagrIFij/J69aEqdB476WJkMhVjP8VSHmiA==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-compiler': 9.1.7
'@intlify/message-resolver': 9.1.7
'@intlify/shared': 9.1.7
dev: false
/@intlify/shared@9.1.7:
resolution: {integrity: sha512-zt0zlUdalumvT9AjQNxPXA36UgOndUyvBMplh8uRZU0fhWHAwhnJTcf0NaG9Qvr8I1n3HPSs96+kLb/YdwTavQ==}
engines: {node: '>= 10'}
dev: false
/@intlify/vue-devtools@9.1.7:
resolution: {integrity: sha512-DI5Wc0aOiohtBUGUkKAcryCWbbuaO4/PK4Pa/LaNCsFNxbtgR5qkIDmhBv9xVPYGTUhySXxaDDAMvOpBjhPJjw==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-resolver': 9.1.7
'@intlify/runtime': 9.1.7
'@intlify/shared': 9.1.7
dev: false
/@sxzz/popperjs-es@2.11.7:
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
dev: false
/@transloadit/prettier-bytes@0.0.7:
resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
dev: false
/@types/event-emitter@0.3.3:
resolution: {integrity: sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==}
dev: false
/@types/lodash-es@4.17.7:
resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==}
dependencies:
'@types/lodash': 4.14.195
dev: false
/@types/lodash@4.14.195:
resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==}
dev: false
/@types/web-bluetooth@0.0.16:
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
dev: false
/@uppy/companion-client@2.2.2:
resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==}
dependencies:
'@uppy/utils': 4.1.3
namespace-emitter: 2.0.1
dev: false
/@uppy/core@2.3.4:
resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==}
dependencies:
'@transloadit/prettier-bytes': 0.0.7
'@uppy/store-default': 2.1.1
'@uppy/utils': 4.1.3
lodash.throttle: 4.1.1
mime-match: 1.0.2
namespace-emitter: 2.0.1
nanoid: 3.3.6
preact: 10.15.1
dev: false
/@uppy/store-default@2.1.1:
resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==}
dev: false
/@uppy/utils@4.1.3:
resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==}
dependencies:
lodash.throttle: 4.1.1
dev: false
/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4):
resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==}
peerDependencies:
'@uppy/core': ^2.3.3
dependencies:
'@uppy/companion-client': 2.2.2
'@uppy/core': 2.3.4
'@uppy/utils': 4.1.3
nanoid: 3.3.6
dev: false
/@vitejs/plugin-vue@3.0.0(vite@3.0.0)(vue@3.2.31):
resolution: {integrity: sha512-yWP34ArFh/jAeNUDkkLz/kVRLjf5ppJiq4L36f64Cp6dIrMQeYZGDP9xxdemlXfZR9ylN9JgHUl3GzfqOtgYDg==}
engines: {node: '>=14.18.0'}
peerDependencies:
vite: ^3.0.0
vue: ^3.2.25
dependencies:
vite: 3.0.0(sass@1.35.1)
vue: 3.2.31
dev: true
/@vue/compiler-core@3.2.31:
resolution: {integrity: sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==}
dependencies:
'@babel/parser': 7.22.5
'@vue/shared': 3.2.31
estree-walker: 2.0.2
source-map: 0.6.1
/@vue/compiler-dom@3.2.31:
resolution: {integrity: sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==}
dependencies:
'@vue/compiler-core': 3.2.31
'@vue/shared': 3.2.31
/@vue/compiler-sfc@3.2.31:
resolution: {integrity: sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==}
dependencies:
'@babel/parser': 7.22.5
'@vue/compiler-core': 3.2.31
'@vue/compiler-dom': 3.2.31
'@vue/compiler-ssr': 3.2.31
'@vue/reactivity-transform': 3.2.31
'@vue/shared': 3.2.31
estree-walker: 2.0.2
magic-string: 0.25.9
postcss: 8.4.24
source-map: 0.6.1
/@vue/compiler-ssr@3.2.31:
resolution: {integrity: sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==}
dependencies:
'@vue/compiler-dom': 3.2.31
'@vue/shared': 3.2.31
/@vue/devtools-api@6.5.0:
resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
dev: false
/@vue/reactivity-transform@3.2.31:
resolution: {integrity: sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==}
dependencies:
'@babel/parser': 7.22.5
'@vue/compiler-core': 3.2.31
'@vue/shared': 3.2.31
estree-walker: 2.0.2
magic-string: 0.25.9
/@vue/reactivity@3.2.31:
resolution: {integrity: sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==}
dependencies:
'@vue/shared': 3.2.31
/@vue/runtime-core@3.2.31:
resolution: {integrity: sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==}
dependencies:
'@vue/reactivity': 3.2.31
'@vue/shared': 3.2.31
/@vue/runtime-dom@3.2.31:
resolution: {integrity: sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==}
dependencies:
'@vue/runtime-core': 3.2.31
'@vue/shared': 3.2.31
csstype: 2.6.21
/@vue/server-renderer@3.2.31(vue@3.2.31):
resolution: {integrity: sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==}
peerDependencies:
vue: 3.2.31
dependencies:
'@vue/compiler-ssr': 3.2.31
'@vue/shared': 3.2.31
vue: 3.2.31
/@vue/shared@3.2.31:
resolution: {integrity: sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==}
/@vueuse/core@9.13.0(vue@3.2.31):
resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
'@vueuse/shared': 9.13.0(vue@3.2.31)
vue-demi: 0.14.5(vue@3.2.31)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/metadata@9.13.0:
resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
dev: false
/@vueuse/shared@9.13.0(vue@3.2.31):
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
dependencies:
vue-demi: 0.14.5(vue@3.2.31)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
peerDependencies:
'@wangeditor/core': 1.x
dom7: ^3.0.0
lodash.throttle: ^4.1.1
nanoid: ^3.2.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
is-url: 1.2.4
lodash.throttle: 4.1.1
nanoid: 3.3.6
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==}
peerDependencies:
'@wangeditor/core': 1.x
dom7: ^3.0.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
prismjs: 1.29.0
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==}
peerDependencies:
'@uppy/core': ^2.1.1
'@uppy/xhr-upload': ^2.0.3
dom7: ^3.0.0
is-hotkey: ^0.2.0
lodash.camelcase: ^4.3.0
lodash.clonedeep: ^4.5.0
lodash.debounce: ^4.0.8
lodash.foreach: ^4.5.0
lodash.isequal: ^4.5.0
lodash.throttle: ^4.1.1
lodash.toarray: ^4.4.0
nanoid: ^3.2.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@types/event-emitter': 0.3.3
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
dom7: 3.0.0
event-emitter: 0.3.5
html-void-elements: 2.0.1
i18next: 20.6.1
is-hotkey: 0.2.0
lodash.camelcase: 4.3.0
lodash.clonedeep: 4.5.0
lodash.debounce: 4.0.8
lodash.foreach: 4.5.0
lodash.isequal: 4.5.0
lodash.throttle: 4.1.1
lodash.toarray: 4.4.0
nanoid: 3.3.6
scroll-into-view-if-needed: 2.2.31
slate: 0.72.8
slate-history: 0.66.0(slate@0.72.8)
snabbdom: 3.5.1
dev: false
/@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.14)(vue@3.2.31):
resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==}
peerDependencies:
'@wangeditor/editor': '>=5.1.0'
vue: ^3.0.5
dependencies:
'@wangeditor/editor': 5.1.14
vue: 3.2.31
dev: false
/@wangeditor/editor@5.1.14:
resolution: {integrity: sha512-erILPAkpKldyGi4cEwrOW65v12GhZy2qj2A8kPlypU46lE72Y3XowZxWogN1TI/mqMDR84AHr0QWOvygOV1xwQ==}
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
is-hotkey: 0.2.0
lodash.camelcase: 4.3.0
lodash.clonedeep: 4.5.0
lodash.debounce: 4.0.8
lodash.foreach: 4.5.0
lodash.isequal: 4.5.0
lodash.throttle: 4.1.1
lodash.toarray: 4.4.0
nanoid: 3.3.6
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==}
peerDependencies:
'@wangeditor/core': 1.x
dom7: ^3.0.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==}
peerDependencies:
'@wangeditor/core': 1.x
dom7: ^3.0.0
lodash.isequal: ^4.5.0
lodash.throttle: ^4.1.1
nanoid: ^3.2.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
lodash.isequal: 4.5.0
lodash.throttle: 4.1.1
nanoid: 3.3.6
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==}
peerDependencies:
'@uppy/core': ^2.0.3
'@uppy/xhr-upload': ^2.0.3
'@wangeditor/basic-modules': 1.x
'@wangeditor/core': 1.x
dom7: ^3.0.0
lodash.foreach: ^4.5.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
lodash.foreach: 4.5.0
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==}
peerDependencies:
'@uppy/core': ^2.1.4
'@uppy/xhr-upload': ^2.0.7
'@wangeditor/core': 1.x
dom7: ^3.0.0
nanoid: ^3.2.0
slate: ^0.72.0
snabbdom: ^3.1.0
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
dom7: 3.0.0
nanoid: 3.3.6
slate: 0.72.8
snabbdom: 3.5.1
dev: false
/ace-builds@1.9.6:
resolution: {integrity: sha512-M/Li4hPruMSbkkg35LgdbsIBq0WuwrV4ztP2pKaww47rC/MvDc1bOrYxwJrfgxdlzyLKrja5bn+9KwwuzqB2xQ==}
dev: false
/anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
/argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: false
/async-validator@4.2.5:
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
dev: false
/axios@0.21.1:
resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==}
dependencies:
follow-redirects: 1.15.2
transitivePeerDependencies:
- debug
dev: false
/base64-arraybuffer@1.0.2:
resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
engines: {node: '>= 0.6.0'}
dev: false
/binary-extensions@2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
/braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'}
dependencies:
fill-range: 7.0.1
/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
dependencies:
anymatch: 3.1.3
braces: 3.0.2
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.2
/clipboard@2.0.11:
resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
dependencies:
good-listener: 1.2.2
select: 1.1.2
tiny-emitter: 2.1.0
dev: false
/commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: false
/compute-scroll-into-view@1.0.20:
resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
dev: false
/crypto-js@4.1.1:
resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==}
dev: false
/css-line-break@2.1.0:
resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==}
dependencies:
utrie: 1.0.2
dev: false
/cssfilter@0.0.10:
resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==}
dev: false
/csstype@2.6.21:
resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
/d@1.0.1:
resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
dependencies:
es5-ext: 0.10.62
type: 1.2.0
dev: false
/dayjs@1.11.8:
resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==}
dev: false
/delegate@3.2.0:
resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
dev: false
/dom7@3.0.0:
resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
dependencies:
ssr-window: 3.0.0
dev: false
/echarts@5.3.3:
resolution: {integrity: sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==}
dependencies:
tslib: 2.3.0
zrender: 5.3.2
dev: false
/element-plus@2.3.6(vue@3.2.31):
resolution: {integrity: sha512-GLz0pXUYI2zRfIgyI6W7SWmHk6dSEikP9yR++hsQUyy63+WjutoiGpA3SZD4cGPSXUzRFeKfVr8CnYhK5LqXZw==}
peerDependencies:
vue: ^3.2.0
dependencies:
'@ctrl/tinycolor': 3.6.0
'@element-plus/icons-vue': 2.0.6(vue@3.2.31)
'@floating-ui/dom': 1.4.1
'@popperjs/core': /@sxzz/popperjs-es@2.11.7
'@types/lodash': 4.14.195
'@types/lodash-es': 4.17.7
'@vueuse/core': 9.13.0(vue@3.2.31)
async-validator: 4.2.5
dayjs: 1.11.8
escape-html: 1.0.3
lodash: 4.17.21
lodash-es: 4.17.21
lodash-unified: 1.0.3(@types/lodash-es@4.17.7)(lodash-es@4.17.21)(lodash@4.17.21)
memoize-one: 6.0.0
normalize-wheel-es: 1.2.0
vue: 3.2.31
transitivePeerDependencies:
- '@vue/composition-api'
dev: false
/entities@3.0.1:
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
engines: {node: '>=0.12'}
dev: false
/es5-ext@0.10.62:
resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
engines: {node: '>=0.10'}
requiresBuild: true
dependencies:
es6-iterator: 2.0.3
es6-symbol: 3.1.3
next-tick: 1.1.0
dev: false
/es6-iterator@2.0.3:
resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
dependencies:
d: 1.0.1
es5-ext: 0.10.62
es6-symbol: 3.1.3
dev: false
/es6-symbol@3.1.3:
resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
dependencies:
d: 1.0.1
ext: 1.7.0
dev: false
/esbuild-android-64@0.14.54:
resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/esbuild-android-arm64@0.14.54:
resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/esbuild-darwin-64@0.14.54:
resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/esbuild-darwin-arm64@0.14.54:
resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/esbuild-freebsd-64@0.14.54:
resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/esbuild-freebsd-arm64@0.14.54:
resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-32@0.14.54:
resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-64@0.14.54:
resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-arm64@0.14.54:
resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-arm@0.14.54:
resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-mips64le@0.14.54:
resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-ppc64le@0.14.54:
resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-riscv64@0.14.54:
resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-s390x@0.14.54:
resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-netbsd-64@0.14.54:
resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/esbuild-openbsd-64@0.14.54:
resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/esbuild-sunos-64@0.14.54:
resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-32@0.14.54:
resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-64@0.14.54:
resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-arm64@0.14.54:
resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild@0.14.54:
resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/linux-loong64': 0.14.54
esbuild-android-64: 0.14.54
esbuild-android-arm64: 0.14.54
esbuild-darwin-64: 0.14.54
esbuild-darwin-arm64: 0.14.54
esbuild-freebsd-64: 0.14.54
esbuild-freebsd-arm64: 0.14.54
esbuild-linux-32: 0.14.54
esbuild-linux-64: 0.14.54
esbuild-linux-arm: 0.14.54
esbuild-linux-arm64: 0.14.54
esbuild-linux-mips64le: 0.14.54
esbuild-linux-ppc64le: 0.14.54
esbuild-linux-riscv64: 0.14.54
esbuild-linux-s390x: 0.14.54
esbuild-netbsd-64: 0.14.54
esbuild-openbsd-64: 0.14.54
esbuild-sunos-64: 0.14.54
esbuild-windows-32: 0.14.54
esbuild-windows-64: 0.14.54
esbuild-windows-arm64: 0.14.54
dev: true
/escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
dev: false
/estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
/event-emitter@0.3.5:
resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
dependencies:
d: 1.0.1
es5-ext: 0.10.62
dev: false
/ext@1.7.0:
resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
dependencies:
type: 2.7.2
dev: false
/fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
/follow-redirects@1.15.2:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
optional: true
/function-bind@1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
/github-markdown-css@5.2.0:
resolution: {integrity: sha512-hq5RaCInSUZ48bImOZpkppW2/MT44StRgsbsZ8YA4vJFwLKB/Vo3k7R2t+pUGqO+ThG0QDMi96TewV/B3vyItg==}
dev: false
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
dependencies:
is-glob: 4.0.3
/good-listener@1.2.2:
resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
dependencies:
delegate: 3.2.0
dev: false
/has@1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
dev: true
/html-void-elements@2.0.1:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
dev: false
/html2canvas@1.4.1:
resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==}
engines: {node: '>=8.0.0'}
dependencies:
css-line-break: 2.1.0
text-segmentation: 1.0.3
dev: false
/i18next@20.6.1:
resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==}
dependencies:
'@babel/runtime': 7.22.5
dev: false
/immer@9.0.21:
resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
dev: false
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
/is-core-module@2.12.1:
resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
dependencies:
has: 1.0.3
dev: true
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
/is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
dependencies:
is-extglob: 2.1.1
/is-hotkey@0.2.0:
resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
dev: false
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
/is-plain-object@5.0.0:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
dev: false
/is-url@1.2.4:
resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
dev: false
/linkify-it@4.0.1:
resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
dependencies:
uc.micro: 1.0.6
dev: false
/lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
dev: false
/lodash-unified@1.0.3(@types/lodash-es@4.17.7)(lodash-es@4.17.21)(lodash@4.17.21):
resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
peerDependencies:
'@types/lodash-es': '*'
lodash: '*'
lodash-es: '*'
dependencies:
'@types/lodash-es': 4.17.7
lodash: 4.17.21
lodash-es: 4.17.21
dev: false
/lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
dev: false
/lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
dev: false
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
dev: false
/lodash.foreach@4.5.0:
resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
dev: false
/lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
dev: false
/lodash.throttle@4.1.1:
resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
dev: false
/lodash.toarray@4.4.0:
resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==}
dev: false
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: false
/magic-string@0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
dependencies:
sourcemap-codec: 1.4.8
/markdown-it@13.0.1:
resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==}
hasBin: true
dependencies:
argparse: 2.0.1
entities: 3.0.1
linkify-it: 4.0.1
mdurl: 1.0.1
uc.micro: 1.0.6
dev: false
/mavon-editor@3.0.1:
resolution: {integrity: sha512-973cYCwv+AB+fcecsU6Ua6UXATxDMaY0Q7QzKQ/GmRW1sg+3DolZDnCGXth7XHDgrmqKTO57N42fVYujt0wfFw==}
dependencies:
xss: 1.0.14
dev: false
/mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
dev: false
/memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
dev: false
/mime-match@1.0.2:
resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==}
dependencies:
wildcard: 1.1.2
dev: false
/namespace-emitter@2.0.1:
resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
dev: false
/nanoid@3.3.6:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
/next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
dev: false
/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==}
dev: false
/path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
/postcss@8.4.24:
resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.6
picocolors: 1.0.0
source-map-js: 1.0.2
/preact@10.15.1:
resolution: {integrity: sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==}
dev: false
/prismjs@1.29.0:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
dev: false
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.1
/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
dev: false
/resize-observer-polyfill@1.5.1:
resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
dev: false
/resolve@1.22.2:
resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
hasBin: true
dependencies:
is-core-module: 2.12.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/rollup@2.79.1:
resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
engines: {node: '>=10.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.2
dev: true
/sass@1.35.1:
resolution: {integrity: sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==}
engines: {node: '>=8.9.0'}
hasBin: true
dependencies:
chokidar: 3.5.3
/scroll-into-view-if-needed@2.2.31:
resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
dependencies:
compute-scroll-into-view: 1.0.20
dev: false
/select@1.1.2:
resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
dev: false
/slate-history@0.66.0(slate@0.72.8):
resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==}
peerDependencies:
slate: '>=0.65.3'
dependencies:
is-plain-object: 5.0.0
slate: 0.72.8
dev: false
/slate@0.72.8:
resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==}
dependencies:
immer: 9.0.21
is-plain-object: 5.0.0
tiny-warning: 1.0.3
dev: false
/snabbdom@3.5.1:
resolution: {integrity: sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==}
engines: {node: '>=8.3.0'}
dev: false
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
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
/ssr-window@3.0.0:
resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==}
dev: false
/string-format@2.0.0:
resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==}
dev: false
/supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
dev: true
/text-segmentation@1.0.3:
resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
dependencies:
utrie: 1.0.2
dev: false
/tiny-emitter@2.1.0:
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
dev: false
/tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
dev: false
/to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
/tslib@2.3.0:
resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
dev: false
/type@1.2.0:
resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
dev: false
/type@2.7.2:
resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
dev: false
/uc.micro@1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: false
/utrie@1.0.2:
resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
dependencies:
base64-arraybuffer: 1.0.2
dev: false
/uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
dev: false
/vite@3.0.0(sass@1.35.1):
resolution: {integrity: sha512-M7phQhY3+fRZa0H+1WzI6N+/onruwPTBTMvaj7TzgZ0v2TE+N2sdLKxJOfOv9CckDWt5C4HmyQP81xB4dwRKzA==}
engines: {node: '>=14.18.0'}
hasBin: true
peerDependencies:
less: '*'
sass: '*'
stylus: '*'
terser: ^5.4.0
peerDependenciesMeta:
less:
optional: true
sass:
optional: true
stylus:
optional: true
terser:
optional: true
dependencies:
esbuild: 0.14.54
postcss: 8.4.24
resolve: 1.22.2
rollup: 2.79.1
sass: 1.35.1
optionalDependencies:
fsevents: 2.3.2
dev: true
/vue-demi@0.14.5(vue@3.2.31):
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.2.31
dev: false
/vue-i18n@9.1.7(vue@3.2.31):
resolution: {integrity: sha512-ujuuDanoHqtEd4GejWrbG/fXE9nrP51ElsEGxp0WBHfv+/ki0/wyUqkO+4fLikki2obGtXdviTPH0VNpas5K6g==}
engines: {node: '>= 10'}
peerDependencies:
vue: ^3.0.0
dependencies:
'@intlify/core-base': 9.1.7
'@intlify/shared': 9.1.7
'@intlify/vue-devtools': 9.1.7
'@vue/devtools-api': 6.5.0
vue: 3.2.31
dev: false
/vue-router@4.0.10(vue@3.2.31):
resolution: {integrity: sha512-YbPf6QnZpyyWfnk7CUt2Bme+vo7TLfg1nGZNkvYqKYh4vLaFw6Gn8bPGdmt5m4qrGnKoXLqc4htAsd3dIukICA==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@vue/devtools-api': 6.5.0
vue: 3.2.31
dev: false
/vue3-ace-editor@2.2.2:
resolution: {integrity: sha512-fZ6OWosbU+odLrtrcGC/536QjCigujYJB0Hf6/tBp+ef/ohTadwQAqyBlVzOmvrmzZyubphpV9zkaZcx5Fuivw==}
dependencies:
ace-builds: 1.9.6
resize-observer-polyfill: 1.5.1
vue: 3.2.31
dev: false
/vue@3.2.31:
resolution: {integrity: sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==}
dependencies:
'@vue/compiler-dom': 3.2.31
'@vue/compiler-sfc': 3.2.31
'@vue/runtime-dom': 3.2.31
'@vue/server-renderer': 3.2.31(vue@3.2.31)
'@vue/shared': 3.2.31
/vuex@4.0.2(vue@3.2.31):
resolution: {integrity: sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==}
peerDependencies:
vue: ^3.0.2
dependencies:
'@vue/devtools-api': 6.5.0
vue: 3.2.31
dev: false
/wildcard@1.1.2:
resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==}
dev: false
/xss@1.0.14:
resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==}
engines: {node: '>= 0.10.0'}
hasBin: true
dependencies:
commander: 2.20.3
cssfilter: 0.0.10
dev: false
/zrender@5.3.2:
resolution: {integrity: sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==}
dependencies:
tslib: 2.3.0
dev: false
:root {
--font-color: #404a62;
/* --el-color-primary-light-9: #f7f7f9; */
--el-color-white: #ffffff;
--el-color-black: #1a1a1a;
--el-color-primary: #2b4695;
--el-color-primary-light-3: #6b7eb5;
--el-color-primary-light-5: #95a3ca;
--el-color-primary-light-7: #c0c8df;
--el-color-primary-light-8: #d5daea;
--el-color-primary-light-9: #eaedf5;
--el-color-primary-dark-2: #223877;
--el-color-success: #429e8a;
--el-color-success-light-3: #7bbbad;
--el-color-success-light-5: #a1cfc5;
--el-color-success-light-7: #c7e2dc;
--el-color-success-light-8: #e1f3d8;
--el-color-success-light-9: #ecf5f4;
--el-color-success-dark-2: #357e6e;
--el-color-warning: #e56600;
--el-color-warning-light-3: #ed944d;
--el-color-warning-light-5: #f2b380;
--el-color-warning-light-7: #f7d1b3;
--el-color-warning-light-8: #fae0cc;
--el-color-warning-light-9: #fcf0e6;
--el-color-warning-dark-2: #b75200;
--el-color-danger: #d75138;
--el-color-danger-light-3: #e38674;
--el-color-danger-light-5: #eba89c;
--el-color-danger-light-7: #f3cbc4;
--el-color-danger-light-8: #f7dcd7;
--el-color-danger-light-9: #fbeeeb;
--el-color-danger-dark-2: #ac412d;
--el-color-error: #d75138;
--el-color-error-light-3: #e38674;
--el-color-error-light-5: #eba89c;
--el-color-error-light-7: #f3cbc4;
--el-color-error-light-8: #f7dcd7;
--el-color-error-light-9: #fbeeeb;
--el-color-error-dark-2: #ac412d;
--el-color-info: #404a62;
--el-color-info-light-3: #7a8191;
--el-color-info-light-5: #a0a5b1;
--el-color-info-light-7: #c6c9d0;
--el-color-info-light-8: #d9dbe0;
--el-color-info-light-9: #ecedf0;
--el-color-info-dark-2: #333b4e;
--el-bg-color: #ffffff;
--el-bg-color-page: #f2f3f5;
--el-bg-color-overlay: #ffffff;
--el-text-color-primary: #202531;
--el-text-color-regular: #404a62;
--el-text-color-secondary: #909bb6;
--el-text-color-placeholder: #a9b1c7;
--el-text-color-disabled: #a9b1c7;
--el-border-color: #dadee7;
--el-border-color-light: #e3e5eb;
--el-border-color-lighter: #e6e9ef;
--el-border-color-extra-light: #edf0f5;
--el-border-color-dark: #d1d5de;
--el-border-color-darker: #cbced7;
--el-fill-color: #f0f2f5;
--el-fill-color-light: #f5f7fa;
--el-fill-color-lighter: #fafafa;
--el-fill-color-extra-light: #fafcff;
--el-fill-color-dark: #ebedf0;
--el-fill-color-darker: #e6e8eb;
--el-fill-color-blank: #ffffff;
}
[v-cloak] {
display: none;
}
/* 新增按钮颜色 */
.form-group .el-button--primary {
background-color: #264dd9 !important;
border-color: #264dd9 !important;
}
/* 返回按钮颜色 */
.from_return>.el-button--primary {
background-color: #edf0ff !important;
border-color: #edf0ff !important;
color: #264dd9 !important;
}
/* 取消按钮颜色 */
.form_c {
background-color: #dde4ff !important;
border-color: #dde4ff !important;
color: #264dd9 !important;
}
/* 确定按钮颜色 */
.form_t {
background-color: #264dd9 !important;
border-color: #264dd9 !important;
color: #f4f7fc !important;
}
/* 搜索框颜色 */
.form-group .el-input__inner {
border-radius: 28px !important;
border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important;
color: #8890a7 !important;
}
.drawer_return .el-input__inner {
border-radius: 28px !important;
border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important;
color: #8890a7 !important;
}
/* 多行文本框样式 */
.jbxx_desc textarea {
height: 150px !important;
border-radius: 8px !important;
border-color: #bcc1d0 !important;
outline: none !important;
resize: none !important;
}
/* 面包屑文字大小 */
.el-breadcrumb {
font-size: 14px;
color: #898d9e;
}
/* 编辑颜色*/
.primary-edit {
color: #264dd9;
cursor: pointer;
}
/* 删除颜色 */
.primary-del {
color: #264dd9;
cursor: pointer;
}
.space_bet {}
/* reset */
html {}
html,
body {
margin: 0;
font-family: Microsoft YaHei, sans-serif;
/* font-size: 17px; */
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
p {
margin: 0;
}
h1,
h2,
h3,
h4,
h5 {
margin: 0;
font-weight: normal;
}
h1 {
font-size: 32px;
}
h2 {
font-size: 24px;
}
h3 {
font-size: 18.7px;
}
h4 {
font-size: 16px;
}
div {
box-sizing: border-box;
}
/* reset end */
/* common */
/* #app {
height: 100%;
overflow: hidden;
} */
.text_clip {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
.text_clip_2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
line-clamp: 2;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.map_container {
background-color: #eee;
}
.ss_card {
padding: 1.2rem;
display: flex;
justify-content: flex-start;
align-items: flex-start;
}
.ss_card>.sc_left_container {
width: 6rem;
height: 6rem;
flex-shrink: 0;
border-radius: 0.5rem;
overflow: hidden;
font-size: 0;
}
.ss_card>.sc_right_container {
width: calc(100% - 7rem);
flex-grow: 1;
margin-left: 1.2rem;
}
.ss_card>.sc_right_container>.sc_title {
font-size: 1.6rem;
font-weight: bold;
line-height: 2.6rem;
}
.ss_card>.sc_right_container>.sc_info {
display: flex;
justify-content: space-between;
}
.form-group {
padding: 20px 20px 15px;
box-sizing: border-box;
border-bottom: 1px solid #edf0ff;
}
.padding_table {
padding: 0 20px;
}
/* 设置抽屉的样式 */
.el-drawer__header {
display: none;
}
.from_return {
text-align: center;
padding: 18px 20px 10px;
border-bottom: 1px solid #edf0ff;
position: relative;
}
.from_return>.el-button--primary {
position: absolute;
top: 15px;
left: 20px;
}
.from_return>span {
color: #1a2236;
font-size: 16px;
}
.demo-drawer__content .el-form-item__label {
color: #242c43;
}
.demo-drawer__content .el-input__inner {
border: 1px solid #bcc1d0;
border-radius: 17px;
color: #58617a;
background: #fff;
}
.demo-drawer__footer {
text-align: right;
padding-right: 40px;
margin-top: 40px;
}
.el-form-item__error {
font-size: 11px;
}
/* 设置提示弹窗的样式 */
.el-dialog {
border-radius: 6px;
}
.el-dialog__header {
border-bottom: 1px solid #edf0ff;
padding: 16px;
}
.el-dialog__title {
font-size: 18px;
font-weight: 700;
color: #1d1e20;
padding-left: 12px;
position: relative;
}
.el-dialog__title::before {
content: "";
position: absolute;
width: 4px;
height: 16px;
border-radius: 2px;
background-color: #515fe7;
left: 0;
top: 5px;
}
.el-dialog__headerbtn .el-dialog__close {
color: #8890a7;
}
.el-dialog__headerbtn:focus .el-dialog__close,
.el-dialog__headerbtn:hover .el-dialog__close {
color: #515fe7;
}
.el-dialog__body {
font-size: 18px;
color: #242c43;
text-align: center;
padding: 0 16px;
}
.dialog_box .el-dialog__body {
padding: 24px;
}
.dialog_box .el-dialog__footer {
padding: 16px;
}
.result_box .el-dialog__body {
padding: 0px;
}
.sold_up_dialog .el-dialog__body {
padding: 24px 24px 4px;
}
/* 设置tab切换的样式 */
.el-tabs__item.is-disabled {
color: #8890a7 !important;
}
.el-tabs__item {
font-size: 14px;
color: #404a62;
line-height: 14px !important;
}
/* .el-tabs__nav-scroll {
height: 35px;
} */
.el-tabs__nav-scroll .el-tabs__nav {
height: 40px;
}
.el-tabs__nav-scroll .el-tabs__item {
line-height: 14px !important;
height: 40px !important;
}
.el-tabs__item:hover {
color: #404a62;
}
.el-tabs__item.is-active {
color: #3759be !important;
}
.el-tabs__active-bar {
height: 3px;
border-radius: 1px;
background-color: #2b4695 !important;
}
.el-tabs__nav-wrap::after {
height: 1px;
background-color: #edf0ff;
}
/* 设置tree的样式 */
.el-tree-node__content {
height: 36px;
}
/* .usrrole .el-tree-node:focus>.el-tree-node__content{
background: rgb(248, 249, 253) !important;
}
.usrrole .el-tree-node__content:hover{
background: rgb(248, 249, 253) !important;
}
.usrrole .el-tree-node__content{
position: relative;
}
.usrrole .el-tree-node__expand-icon{
position: absolute;
right: 10px;
}
.usrrole .cdqx_ztree .el-tree{
color: #242c43;
border-radius:8px;
}
.usrrole .cdqx_ztree .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner{
background-color: #264dd9;
border-color: #264dd9;
}
.usrrole .demo-drawer .el-drawer__body{
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.usrrole .demo-drawer .el-drawer__body::-webkit-scrollbar{
display: none;
}
.usrrole .el-tree-node__expand-icon{
color: #264dd9!important;
}
.usrrole .el-tree-node.is-focusable>.el-tree-node__content{
border-radius:8px;
}
.usrrole .el-tree-node.is-expanded.is-focusable>.el-tree-node__content{
border-top-left-radius:8px;
border-top-right-radius:8px;
border-bottom-left-radius:0;
border-bottom-right-radius:0;
} */
/* 左右布局 */
.flex {
height: 100%;
display: -webkit-box;
/* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */
display: -moz-box;
/* Firefox 17- */
display: -webkit-flex;
/* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */
display: -moz-flex;
/* Firefox 18+ */
display: -ms-flexbox;
/* IE 10 */
display: flex;
/* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */
}
.flex-left {
width: 178px;
background-color: #1a2236;
height: 100%;
}
.flex-right {
padding: 0 20px 20px;
box-sizing: border-box;
-webkit-box-flex: auto;
-ms-flex: auto;
-webkit-flex: auto;
flex: 1;
overflow-y: auto;
}
.flex-right-box {
width: 100%;
height: 100%;
position: relative;
}
.ces-main {
position: absolute;
width: 100%;
}
.v-modal {
background: #000a2b !important;
}
.drawer600 {
width: 600px !important;
}
.drawer620 {
width: 620px !important;
}
.drawer1202 {
width: 1202px !important;
}
/* .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,
.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before {
content: "";
} */
/* 设置switch的样式 */
.switchStyle1 .el-switch__label {
position: absolute;
display: none;
color: #fff;
}
/*打开时文字位置设置*/
.switchStyle1 .el-switch__label--right {
z-index: 1;
right: -10px;
top: 1px;
}
/*关闭时文字位置设置*/
.switchStyle1 .el-switch__label--left {
z-index: 1;
left: 28px;
top: 1px;
}
.switchStyle1 .el-switch__label.is-active {
display: block;
}
.switchStyle1.el-switch .el-switch__core,
.switchStyle1.el-switch .el-switch__label {
width: 62px !important;
height: 28px !important;
border-radius: 28px !important;
}
.switchStyle1 .el-switch__core {
background: #f8f9fd !important;
border: 1px solid #8890a7 !important;
}
.switchStyle1 .el-switch__core:after {
background: #8890a7 !important;
width: 22px;
height: 22px;
left: 2px;
top: 2.1px;
}
.switchStyle1.el-switch.is-checked .el-switch__core {
background: #f8f9fd !important;
border: 1px solid #5c82ff !important;
}
.switchStyle1.el-switch.is-checked .el-switch__core:after {
background: #5c82ff !important;
width: 22px;
height: 22px;
right: 0;
top: 2.1px;
}
.switchStyle1.el-switch.is-checked .el-switch__core::after {
margin-left: -25px;
}
.switchStyle1 .el-switch__label * {
font-size: 14px !important;
font-weight: 800;
}
.switchStyle1.el-switch .el-switch__label {
color: #8890a7 !important;
}
.switchStyle1.el-switch.is-checked .el-switch__label {
color: #5c82ff !important;
}
.switchStyle1.el-switch:hover {
opacity: 0.8;
}
/* 自定义图表提示框小三角 */
/* .div-tip-warp {
position: relative;
line-height: 22px;
padding: 3px 10px;
font-size: 12px;
}
.triangle-down {
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #242c43;
position: absolute;
bottom: -12px;
left: 50%;
transform: translate(-50%,0);
}
.triangle-position {
margin-left: 35px;
} */
.el-input__inner {
border-radius: 6px;
}
.el-input-group__append,
.el-input-group__prepend {
border-radius: 8px;
}
.el-button {
border-radius: 4px;
height: 36px;
line-height: 36px;
}
.el-select-dropdown {
z-index: 20000 !important;
}
/*
下拉选样式
此处勿删,apaasV3下拉选择样式统一用这个
*/
.el-select-dropdown {
border-radius: 8px;
}
.el-select-dropdown__empty {
color: #f4f7fc;
border-radius: 8px;
}
.el-select-dropdown__list {
padding: 0;
top: 10px;
border-radius: 4px;
}
.el-select-dropdown__item {
font-size: 12px;
padding: 0 20px;
height: 34px;
line-height: 34px;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
background-color: transparent;
color: #2b4695;
}
.el-scrollbar {
border-radius: 8px;
}
.el-popper[x-placement^="bottom"] .popper__arrow::after {
border-bottom-color: transparent;
}
.el-popper[x-placement^="top"] .popper__arrow::after {
border-top-color: transparent;
}
/* 单选激活样式 */
.el-radio__input .el-radio__inner {
border-color: #dadee7;
background-color: #fff;
width: 16px;
height: 16px;
}
.el-radio__input.is-checked .el-radio__inner {
border-color: #dadee7;
background-color: #fff;
}
.el-radio__input.is-checked+.el-radio__label {
color: #1a2236;
font-weight: 700;
}
.el-radio__inner::after {
width: 8px;
height: 8px;
}
.el-radio__input.is-checked .el-radio__inner::after {
background-color: #2b4695;
}
.el-radio__inner:hover {
border-color: #2b4695;
}
/* 面包屑样式 */
.bread_crumb {
margin: 20px;
font-size: 14px;
}
.bread_crumb .el-breadcrumb__inner {
color: #b4c0f5 !important;
}
.bread_crumb .is-link {
color: #626de9 !important;
}
.bread_crumb1 {
margin: 20px;
font-size: 14px;
}
.bread_crumb1 .el-breadcrumb__inner {
color: #242c43 !important;
}
.bread_crumb1 .is-link {
color: #898d9e !important;
}
/* 应用超市详情页公共样式 */
.sevice_detail {
max-width: 1340px;
padding-top: 1px;
margin: 0 auto;
}
/* common */
.apass_breadcrumb>.el-breadcrumb {
padding: 10px 0;
}
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__inner {
font-size: 14px;
font-weight: 400;
color: #898d9e;
line-height: 23px;
}
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: #242c43;
font-weight: normal;
}
.apaas_button .el-button {
/* min-width: 90px; */
color: #404a62;
}
.apaas_button .el-button--mini,
.apaas_button .el-button--mini.is-round {
padding: 10px 15px;
}
.apaas_button .el-button--primary {
color: #fff;
background-color: #2b4695;
border-color: #2b4695;
}
.apaas_button .el-button--primary.is-plain {
color: #2b4695;
background-color: #e1e4fb;
border-color: #e1e4fb;
}
.apaas_button .el-button--danger {
color: #fff;
background-color: #ad3a4a;
border-color: #ad3a4a;
}
.apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover {
cursor: not-allowed;
}
.apaas_button .el-button--warning.is-plain {
background-color: #fcefd6;
border-color: #fac266;
color: #e56600;
}
.apaas_button .el-button--warning {
background-color: #e56600;
border-color: #e56600;
color: #fcefd6;
}
.apaas_button .el-button--success {
background-color: #429e8a;
border-color: #429e8a;
color: #fff;
}
.apaas_button .gray-button {
color: #fff;
background-color: #404a62;
border-color: #404a62;
}
.apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.apass_table .el-table th>.cell {
color: #1a2236;
}
.apass_table .el-table td,
.apass_table .el-table th.is-leaf {
border: none !important;
line-height: 23px;
}
.apass_table .el-table::before {
display: none;
}
.apass_table .el-table {
width: 100%;
}
.apass_table .el-table__row:nth-child(odd) td {
background-color: #f7f7f9;
}
.apass_table .table_html a {
font-size: 14px;
color: #2b4695;
cursor: pointer;
}
.apass_table .row_action {
user-select: none;
}
.apass_table .row_action .btn {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
.apass_table .row_action .btn.warn {
color: #830f53;
}
.apass_table .row_action .btn.disabled {
color: #999;
cursor: not-allowed;
}
.apass_table .row_action .disabled.hide {
opacity: 0;
cursor: auto;
}
.apass_table .row_action .interval_line {
font-size: 14px;
color: #c1c7d7;
margin: 0 20px;
}
.apass_table .border-active td {
padding: 10px 0;
background-color: #e6ebfe;
border-top: 2px solid #515fe7 !important;
border-bottom: 2px solid #515fe7 !important;
}
.apass_table .border-active td:first-child {
border-left: 2px solid #515fe7 !important;
}
.apass_table .border-active td:last-child {
border-right: 2px solid #515fe7 !important;
}
.apass_checkbox .el-checkbox__input.is-checked .el-checkbox__inner,
.apass_checkbox .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be;
border-color: #515fe7;
}
.apass_checkbox .el-checkbox__input.is-checked+.el-checkbox__label {
color: #58617a;
}
.apaas_scroll::-webkit-scrollbar {
width: 16px;
height: 1px;
}
.apaas_scroll::-webkit-scrollbar-thumb {
border-radius: 8px;
/* background: #dde4ff; */
box-shadow: 8px 0 0 #a5adb7 inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll::-webkit-scrollbar-track {
border-radius: 8px;
/* background: #f4f4f4; */
box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll_nor::-webkit-scrollbar {
width: 0px;
height: 0px;
}
.apaas_scroll_min::-webkit-scrollbar {
width: 6px;
height: 1px;
}
.apaas_scroll_min::-webkit-scrollbar-thumb {
border-radius: 3px;
background: #e6e9ef;
box-shadow: 8px 0 0 #e6e9ef inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll_min::-webkit-scrollbar-track {
border-radius: 3px;
background: #fff;
box-shadow: 8px 0 0 #fff inset;
border: 4px solid rgba(0, 0, 0, 0);
}
/* 详情页公共样式 by xuyiming */
.apaas_detail_container {
padding: 0 20px;
}
.apaas_detail_container .main_contaner {
min-height: calc(100vh - 32px - 83px);
flex-grow: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
padding: 30px;
background-color: #fff;
border-radius: 10px;
margin-bottom: 14px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.apaas_detail_container .main_contaner.locked_height {
height: calc(100vh - 58px - 83px);
min-height: 400px;
}
.apaas_detail_container .main_contaner.locked_height_900 {
height: calc(100vh - 58px - 83px);
min-height: 900px;
}
.apaas_detail_container .detail_action {
text-align: right;
margin-top: 50px;
}
.apaas_detail_container .detail_action .el-button+.el-button {
margin-left: 30px;
}
.apaas_detail_form {
max-width: 970px;
}
.apaas_detail_form .el-input__inner,
.apaas_detail_form .el-textarea__inner {
width: 100%;
background-color: #f7f8f9;
}
.apaas_detail_form .el-select {
width: 100%;
}
.apaas_detail_form.el-form--label-top .el-form-item__label {
padding: 0 0 15px;
font-size: 14px;
line-height: 1;
color: #58617a;
}
.apaas_detail_form .el-form-item {
margin-bottom: 30px;
}
.apaas_detail_form .textarea_count {
font-size: 14px;
line-height: 1;
color: #a9aec0;
text-align: right;
margin-top: 10px;
}
.apaas_steps {
height: 100%;
}
.apaas_steps .apaas_step {
height: 100%;
position: relative;
}
.apaas_steps .apaas_step .apaas_step_content {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: calc(100% - 64px);
border-bottom: 1px solid #f4f7fc;
/* overflow: hidden; */
}
.apaas_steps .apaas_step .apaas_step_action {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.apaas_steps .apaas_step .apaas_step_action .el-button {
height: 44px;
width: 124px;
}
.apaas_steps .apaas_step .apaas_step_action .el-button+.el-button {
margin-left: 20px;
}
.top_fliter {
display: flex;
}
.top_fliter .filter_list {
flex-grow: 1;
min-width: 550px;
font-size: 0;
padding-left: 16px;
}
.filter_list>.filter_item {
display: inline-block;
vertical-align: middle;
margin-top: 16px;
}
.filter_list>.filter_item {
margin-right: 34px;
}
.filter_list>.filter_item>* {
display: inline-block;
vertical-align: middle;
}
.filter_list>.filter_item>.filter_title {
min-width: 56px;
text-align: right;
font-size: 14px;
font-weight: 700;
color: #242c43;
margin-right: 10px;
white-space: nowrap;
}
.filter_list>.filter_item>.filter_title+* {
width: 300px;
}
.filter_list>.filter_item>.date-time-range {
width: 460px !important;
}
.filter_list>.filter_item .el-date-editor .el-range__close-icon {
position: absolute;
right: 5px;
top: 1px;
}
.top_fliter .filter_action {
flex-shrink: 0;
margin-left: 25px;
text-align: right;
}
.filter_action>.el-button {
/* min-width: 90px; */
height: 36px;
margin-top: 16px;
padding: 12px 17px;
}
.filter_action>.el-button+.el-button {
margin-left: 10px;
}
.meassage_detail_dialog {
display: flex;
flex-wrap: wrap;
text-align: left;
}
.meassage_detail_dialog .detail_item {
flex: 1 1 auto;
width: 50%;
margin-top: 20px;
}
.meassage_detail_dialog .detail_item.full_line {
width: 100%;
}
.meassage_detail_dialog .detail_item p {
padding: 0 15px;
font-size: 14px;
line-height: 22px;
color: #8890a7;
}
.meassage_detail_dialog .detail_item .item_content {
color: #000;
margin-top: 10px;
}
.meassage_detail_dialog .detail_item .full_content {
padding: 10px 0;
border-radius: 8px;
background-color: #f8f9fd;
margin-top: 5px;
}
.meassage_detail_dialog .detail_item .full_content>.apaas_scroll {
height: 176px;
overflow: auto;
}
.meassage_detail_dialog .detail_item .full_content .item_content {
margin: 0;
}
.no_wrap .apass_table td .cell {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
/* 详情页公共样式 by xuyiming ~~~end */
/*
form_content
*/
.from_content1 {
width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1);
overflow: hidden;
margin: 0 20px 20px;
position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px;
padding-top: 20px;
}
.from_content {
width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1);
/* flex: 1 0 auto; */
position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px;
margin: 0 20px;
padding: 20px 20px 30px;
}
.from_content_table {
height: calc(100% - 90px);
}
.from_content_table_app {
height: calc(100% - 170px);
}
.from_content_table_auth {
height: calc(100% - 100px);
}
.from_content_btn {
height: 40px;
margin-bottom: 20px;
}
/* 时间控件样式 */
.el-picker-panel {
background-color: #fff !important;
border-radius: 8px !important;
font-size: 12px !important;
color: #202531 !important;
box-shadow: 0 !important;
border: none !important;
}
.el-date-editor.el-input__wrapper {
background-color: #fff;
}
.el-picker-panel__icon-btn {
color: #202531;
}
.el-date-table th {
border-bottom: 1px solid #e6e9ef !important;
color: #202531 !important;
}
.el-date-table td.current:not(.disabled) span {
color: #e3e5ef !important;
background-color: #315efc !important;
}
.el-date-table td.next-month,
.el-date-table td.prev-month {
color: #a9b1c7 !important;
}
.el-date-picker__time-header {
border-bottom: 1px solid #3f4864 !important;
}
.el-picker-panel__body .el-input__inner {
height: 24px !important;
line-height: 24px !important;
border-radius: 12px !important;
font-size: 12px;
}
.el-picker-panel__footer .el-button {
background-color: #264dd9;
padding: 5px 12px;
color: #f4f7fc;
font-size: 12px;
border: none !important;
}
.el-picker-panel__footer .el-button--text {
background-color: #dde4ff;
border-radius: 12px;
padding: 5px 12px;
color: #264dd9;
font-size: 12px;
}
.el-button.is-plain:focus,
.el-button.is-plain:hover {
background-color: #264dd9;
color: #f4f7fc;
}
.el-button--text:focus,
.el-button--text:hover {
color: #264dd9;
}
.el-time-panel {
border-radius: 8px !important;
border: 1px solid #3f4864 !important;
background-color: #242c43 !important;
}
.el-time-panel__footer {
border: 1px solid #3f4864 !important;
}
.el-time-panel__btn.confirm {
background-color: #264dd9;
border-radius: 12px !important;
padding: 0px 12px;
color: #f4f7fc !important;
font-size: 12px !important;
}
.el-time-panel__btn {
line-height: 22px !important;
height: 22px !important;
}
.el-time-spinner__item:hover:not(.disabled):not(.active) {
background-color: #264dd9 !important;
border-radius: 12px !important;
color: #f4f7fc;
}
.el-time-spinner__item {
color: #58617a !important;
}
.el-date-table td.in-range div,
.el-date-table td.in-range div:hover,
.el-date-table.is-week-mode .el-date-table__row.current div,
.el-date-table.is-week-mode .el-date-table__row:hover div {
background-color: #eff2fa!important;
}
.el-date-table td.end-date .el-date-table-cell__text,
.el-date-table td.start-date .el-date-table-cell__text {
background-color: #3759be!important;
}
.el-date-table td.end-date span,
.el-date-table td.start-date span {
background-color: #264dd9;
}
.el-date-table td.today span {
color: #0c3ff7;
}
.el-date-editor .el-range-separator {
width: 15%;
line-height: 28px;
color: #202531;
}
/* table select window */
.el-checkbox__input.is-checked .el-checkbox__inner,
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be;
border-color: #2b4695;
}
.el-checkbox__input.is-focus .el-checkbox__inner {
border-color: #2b4695;
}
.el-checkbox__input:hover .el-checkbox__inner {
border-color: #2b4695;
}
.el-date-editor .el-range-input {
width: 36%;
}
.el-input__inner:focus {
border-color: #515fe7;
}
.el-textarea__inner:focus {
border-color: #515fe7;
}
.el-select .el-input .el-select__caret {
color: #515fe7;
}
.el-input-number__decrease,
.el-input-number__increase {
color: #515fe7;
}
.el-input__inner::-webkit-input-placeholder,
.el-textarea__inner::-webkit-input-placeholder {
color: #a9aec0;
}
.el-input__inner:-moz-placeholder,
.el-textarea__inner:-moz-placeholder {
/* Firefox 18- */
color: #a9aec0;
}
.el-input__inner::-moz-placeholder,
.el-textarea__inner::-moz-placeholder {
/* Firefox 19+ */
color: #a9aec0;
}
.el-input__inner:-ms-input-placeholder,
.el-textarea__inner:-ms-input-placeholder {
color: #a9aec0;
}
[class*=" el-icon-"],
[class^="el-icon-"] {
font-weight: 700;
}
.el-rate__item .el-rate__icon {
font-size: 18px;
margin-right: 0;
}
.detai_form .el-input__inner,
.detai_form .el-textarea__inner {
background-color: #f7f7f9;
border-radius: 4px;
border: solid 1px #dadee7;
}
.detai_form .el-input.is-disabled .el-input__inner {
background-color: #e6e9ef;
}
.tip-box-popper {
background: #242c43 !important;
}
.p-1 {
padding: 5px;
}
.source_table .el-table thead tr {
background-color: #dfe5f6 !important;
}
.source_table .el-table th {
background-color: transparent;
}
.source_table .el-table td {
border-bottom: 1px solid #dadee7 !important;
}
.source_table .el-table__header {
border: 1px solid #b0bee8;
}
.source_table .el-table__body-wrapper {
border-left: 1px solid #dadee7 !important;
border-right: 1px solid #dadee7 !important;
}
.source_table .el-table__empty-block {
border-bottom: 1px solid #dadee7 !important;
}
.source_footer {
margin-top: 15px;
text-align: center;
}
.source_title {
font-size: 14px;
padding: 10px 0;
text-align: left;
}
.headerBox {
font-size: 18px;
line-height: 18px;
font-weight: 700;
font-stretch: normal;
letter-spacing: 0px;
color: #1a1a1a;
}
.headerBox span:first-child {
display: inline-block;
width: 4px;
height: 16px;
background-color: #3759be;
border-radius: 2px;
margin-right: 10px;
vertical-align: bottom;
}
.row_text {
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
.close_reason {
padding: 2px 5px;
background-color: #dedede;
display: inline-block;
margin-top: 10px;
}
.pointer {
cursor: pointer;
}
.pr-1 {
padding-right: 10px;
}
/* test */
\ No newline at end of file
[v-cloak] { [v-cloak] {
display: none; display: none;
} }
/* 新增按钮颜色 */ /* 新增按钮颜色 */
.form-group .el-button--primary { .form-group .el-button--primary {
background-color: #264dd9 !important; background-color: #264dd9 !important;
border-color: #264dd9 !important; border-color: #264dd9 !important;
} }
/* 返回按钮颜色 */ /* 返回按钮颜色 */
.from_return > .el-button--primary {
background-color: #edf0ff !important; .from_return>.el-button--primary {
border-color: #edf0ff !important; background-color: #edf0ff !important;
color: #264dd9 !important; border-color: #edf0ff !important;
color: #264dd9 !important;
} }
/* 取消按钮颜色 */ /* 取消按钮颜色 */
.form_c { .form_c {
background-color: #dde4ff !important; background-color: #dde4ff !important;
border-color: #dde4ff !important; border-color: #dde4ff !important;
color: #264dd9 !important; color: #264dd9 !important;
} }
/* 确定按钮颜色 */ /* 确定按钮颜色 */
.form_t { .form_t {
background-color: #264dd9 !important; background-color: #264dd9 !important;
border-color: #264dd9 !important; border-color: #264dd9 !important;
color: #f4f7fc !important; color: #f4f7fc !important;
} }
/* 搜索框颜色 */ /* 搜索框颜色 */
.form-group .el-input__inner { .form-group .el-input__inner {
border-radius: 28px !important; border-radius: 28px !important;
border: 1px solid #bcc1d0 !important; border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important; background: #f4f7fc !important;
color: #8890a7 !important; color: #8890a7 !important;
} }
.drawer_return .el-input__inner { .drawer_return .el-input__inner {
border-radius: 28px !important; border-radius: 28px !important;
border: 1px solid #bcc1d0 !important; border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important; background: #f4f7fc !important;
color: #8890a7 !important; color: #8890a7 !important;
} }
/* 多行文本框样式 */ /* 多行文本框样式 */
.jbxx_desc textarea { .jbxx_desc textarea {
height: 150px !important; height: 150px !important;
border-radius: 8px !important; border-radius: 8px !important;
border-color: #bcc1d0 !important; border-color: #bcc1d0 !important;
outline: none !important; outline: none !important;
resize: none !important; resize: none !important;
} }
/* 面包屑文字大小 */ /* 面包屑文字大小 */
.el-breadcrumb { .el-breadcrumb {
font-size: 14px; font-size: 14px;
color: #898d9e; color: #898d9e;
} }
/* 编辑颜色*/ /* 编辑颜色*/
.primary-edit { .primary-edit {
color: #264dd9; color: #264dd9;
cursor: pointer; cursor: pointer;
} }
/* 删除颜色 */ /* 删除颜色 */
.primary-del { .primary-del {
color: #264dd9; color: #264dd9;
cursor: pointer; cursor: pointer;
} }
.space_bet { .space_bet {}
}
/* reset */ /* reset */
html {
} html {}
html, html,
body { body {
margin: 0; margin: 0;
font-family: Microsoft YaHei, sans-serif; font-family: Microsoft YaHei, sans-serif;
/* font-size: 17px; */ /* font-size: 17px; */
} }
ul { ul {
list-style: none; list-style: none;
padding: 0; padding: 0;
margin: 0; margin: 0;
} }
p { p {
margin: 0; margin: 0;
} }
h1, h1,
...@@ -100,240 +118,264 @@ h2, ...@@ -100,240 +118,264 @@ h2,
h3, h3,
h4, h4,
h5 { h5 {
margin: 0; margin: 0;
font-weight: normal; font-weight: normal;
} }
h1 { h1 {
font-size: 32px; font-size: 32px;
} }
h2 { h2 {
font-size: 24px; font-size: 24px;
} }
h3 { h3 {
font-size: 18.7px; font-size: 18.7px;
} }
h4 { h4 {
font-size: 16px; font-size: 16px;
} }
div { div {
box-sizing: border-box; box-sizing: border-box;
} }
/* reset end */ /* reset end */
/* common */ /* common */
/* #app { /* #app {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
} */ } */
.text_clip { .text_clip {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
word-break: break-all; word-break: break-all;
white-space: nowrap; white-space: nowrap;
} }
.text_clip_2 { .text_clip_2 {
text-overflow: -o-ellipsis-lastline; text-overflow: -o-ellipsis-lastline;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
display: -webkit-box; display: -webkit-box;
line-clamp: 2; line-clamp: 2;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
.map_container { .map_container {
background-color: #eee; background-color: #eee;
} }
.ss_card { .ss_card {
padding: 1.2rem; padding: 1.2rem;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
} }
.ss_card > .sc_left_container { .ss_card>.sc_left_container {
width: 6rem; width: 6rem;
height: 6rem; height: 6rem;
flex-shrink: 0; flex-shrink: 0;
border-radius: 0.5rem; border-radius: 0.5rem;
overflow: hidden; overflow: hidden;
font-size: 0; font-size: 0;
} }
.ss_card > .sc_right_container { .ss_card>.sc_right_container {
width: calc(100% - 7rem); width: calc(100% - 7rem);
flex-grow: 1; flex-grow: 1;
margin-left: 1.2rem; margin-left: 1.2rem;
} }
.ss_card > .sc_right_container > .sc_title { .ss_card>.sc_right_container>.sc_title {
font-size: 1.6rem; font-size: 1.6rem;
font-weight: bold; font-weight: bold;
line-height: 2.6rem; line-height: 2.6rem;
} }
.ss_card > .sc_right_container > .sc_info { .ss_card>.sc_right_container>.sc_info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.form-group { .form-group {
padding: 20px 20px 15px; padding: 20px 20px 15px;
box-sizing: border-box; box-sizing: border-box;
border-bottom: 1px solid #edf0ff; border-bottom: 1px solid #edf0ff;
} }
.padding_table { .padding_table {
padding: 0 20px; padding: 0 20px;
} }
/* 设置抽屉的样式 */ /* 设置抽屉的样式 */
.el-drawer__header { .el-drawer__header {
display: none; display: none;
} }
.from_return { .from_return {
text-align: center; text-align: center;
padding: 18px 20px 10px; padding: 18px 20px 10px;
border-bottom: 1px solid #edf0ff; border-bottom: 1px solid #edf0ff;
position: relative; position: relative;
} }
.from_return > .el-button--primary { .from_return>.el-button--primary {
position: absolute; position: absolute;
top: 15px; top: 15px;
left: 20px; left: 20px;
} }
.from_return > span { .from_return>span {
color: #1a2236; color: #1a2236;
font-size: 16px; font-size: 16px;
} }
.demo-drawer__content .el-form-item__label { .demo-drawer__content .el-form-item__label {
color: #242c43; color: #242c43;
} }
.demo-drawer__content .el-input__inner { .demo-drawer__content .el-input__inner {
border: 1px solid #bcc1d0; border: 1px solid #bcc1d0;
border-radius: 17px; border-radius: 17px;
color: #58617a; color: #58617a;
background: #fff; background: #fff;
} }
.demo-drawer__footer { .demo-drawer__footer {
text-align: right; text-align: right;
padding-right: 40px; padding-right: 40px;
margin-top: 40px; margin-top: 40px;
} }
.el-form-item__error { .el-form-item__error {
font-size: 11px; font-size: 11px;
} }
/* 设置提示弹窗的样式 */ /* 设置提示弹窗的样式 */
.el-dialog { .el-dialog {
border-radius: 6px; border-radius: 6px;
margin-top: 240px; margin-top: 240px;
} }
.el-dialog__header { .el-dialog__header {
border-bottom: 1px solid #edf0ff; border-bottom: 1px solid #edf0ff;
padding: 16px; padding: 16px;
margin-right: 0; margin-right: 0;
} }
.el-dialog__title { .el-dialog__title {
font-size: 18px; font-size: 18px;
font-weight: 700; font-weight: 700;
color: #1d1e20; color: #1d1e20;
padding-left: 12px; padding-left: 12px;
position: relative; position: relative;
} }
.el-dialog__title::before { .el-dialog__title::before {
content: ""; content: "";
position: absolute; position: absolute;
width: 4px; width: 4px;
height: 16px; height: 16px;
border-radius: 2px; border-radius: 2px;
background-color: #515fe7; background-color: #515fe7;
left: 0; left: 0;
top: 5px; top: 5px;
} }
.el-dialog__headerbtn .el-dialog__close { .el-dialog__headerbtn .el-dialog__close {
color: #8890a7; color: #8890a7;
} }
.el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:focus .el-dialog__close,
.el-dialog__headerbtn:hover .el-dialog__close { .el-dialog__headerbtn:hover .el-dialog__close {
color: #515fe7; color: #515fe7;
} }
.el-dialog__body { .el-dialog__body {
font-size: 16px; font-size: 16px;
color: #404a62; color: #404a62;
text-align: center; text-align: center;
padding: 0 16px; padding: 0 16px;
line-height: 1; line-height: 1;
} }
.dialog_box .el-dialog__body { .dialog_box .el-dialog__body {
padding: 24px; padding: 24px;
} }
.dialog_box .el-dialog__footer { .dialog_box .el-dialog__footer {
padding: 16px; padding: 16px;
} }
.dialog_box1 .el-dialog__body { .dialog_box1 .el-dialog__body {
padding: 16px; padding: 16px;
} }
/* 设置tab切换的样式 */ /* 设置tab切换的样式 */
.el-tabs__item.is-disabled { .el-tabs__item.is-disabled {
color: #8890a7 !important; color: #8890a7 !important;
} }
.el-tabs__item { .el-tabs__item {
font-size: 14px; font-size: 14px;
color: #404a62; color: #404a62;
line-height: 14px !important; line-height: 14px !important;
} }
/* .el-tabs__nav-scroll { /* .el-tabs__nav-scroll {
height: 35px; height: 35px;
} */ } */
.el-tabs__nav-scroll .el-tabs__nav { .el-tabs__nav-scroll .el-tabs__nav {
height: 40px; height: 40px;
} }
.el-tabs__nav-scroll .el-tabs__item { .el-tabs__nav-scroll .el-tabs__item {
line-height: 14px !important; line-height: 14px !important;
height: 40px !important; height: 40px !important;
} }
.el-tabs__item:hover { .el-tabs__item:hover {
color: #404a62; color: #404a62;
} }
.el-tabs__item.is-active { .el-tabs__item.is-active {
color: #3759be !important; color: #3759be !important;
} }
.el-tabs__active-bar { .el-tabs__active-bar {
height: 3px; height: 3px;
border-radius: 1px; border-radius: 1px;
background-color: #2b4695 !important; background-color: #2b4695 !important;
} }
.el-tabs__nav-wrap::after { .el-tabs__nav-wrap::after {
height: 1px; height: 1px;
background-color: #edf0ff; background-color: #edf0ff;
} }
/* 设置tree的样式 */ /* 设置tree的样式 */
/* .el-tree { /* .el-tree {
position: static!important; position: static!important;
} }
...@@ -345,6 +387,8 @@ div { ...@@ -345,6 +387,8 @@ div {
rgba(255, 255, 255, 0.05) 83%, rgba(255, 255, 255, 0.05) 83%,
rgba(0, 0, 0, 0.05) 86%); rgba(0, 0, 0, 0.05) 86%);
} */ } */
/* .usrrole .el-tree-node:focus>.el-tree-node__content{ /* .usrrole .el-tree-node:focus>.el-tree-node__content{
background: rgb(248, 249, 253) !important; background: rgb(248, 249, 253) !important;
} }
...@@ -386,151 +430,164 @@ border-radius:8px; ...@@ -386,151 +430,164 @@ border-radius:8px;
border-bottom-left-radius:0; border-bottom-left-radius:0;
border-bottom-right-radius:0; border-bottom-right-radius:0;
} */ } */
/* 左右布局 */ /* 左右布局 */
.flex { .flex {
height: 100%; height: 100%;
display: -webkit-box; display: -webkit-box;
/* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */ /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */
display: -moz-box; display: -moz-box;
/* Firefox 17- */ /* Firefox 17- */
display: -webkit-flex; display: -webkit-flex;
/* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */ /* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */
display: -moz-flex; display: -moz-flex;
/* Firefox 18+ */ /* Firefox 18+ */
display: -ms-flexbox; display: -ms-flexbox;
/* IE 10 */ /* IE 10 */
display: flex; display: flex;
/* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */ /* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */
} }
.flex-left { .flex-left {
width: 178px; width: 178px;
background-color: #1a2236; background-color: #1a2236;
height: 100%; height: 100%;
} }
.flex-right { .flex-right {
padding: 0 20px 20px; padding: 0 20px 20px;
box-sizing: border-box; box-sizing: border-box;
-webkit-box-flex: auto; -webkit-box-flex: auto;
-ms-flex: auto; -ms-flex: auto;
-webkit-flex: auto; -webkit-flex: auto;
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
} }
.flex-right-box { .flex-right-box {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
} }
.ces-main { .ces-main {
position: absolute; position: absolute;
width: 100%; width: 100%;
} }
.v-modal { .v-modal {
background: #000a2b !important; background: #000a2b !important;
} }
.drawer600 { .drawer600 {
width: 600px !important; width: 600px !important;
} }
.drawer620 { .drawer620 {
width: 620px !important; width: 620px !important;
} }
.drawer1202 { .drawer1202 {
width: 1202px !important; width: 1202px !important;
} }
/* .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before, /* .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,
.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before { .el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before {
content: ""; content: "";
} */ } */
/* 设置switch的样式 */ /* 设置switch的样式 */
.switchStyle1 .el-switch__label { .switchStyle1 .el-switch__label {
position: absolute; position: absolute;
display: none; display: none;
color: #fff; color: #fff;
} }
/*打开时文字位置设置*/ /*打开时文字位置设置*/
.switchStyle1 .el-switch__label--right { .switchStyle1 .el-switch__label--right {
z-index: 1; z-index: 1;
right: -10px; right: -10px;
top: 1px; top: 1px;
} }
/*关闭时文字位置设置*/ /*关闭时文字位置设置*/
.switchStyle1 .el-switch__label--left { .switchStyle1 .el-switch__label--left {
z-index: 1; z-index: 1;
left: 28px; left: 28px;
top: 1px; top: 1px;
} }
.switchStyle1 .el-switch__label.is-active { .switchStyle1 .el-switch__label.is-active {
display: block; display: block;
} }
.switchStyle1.el-switch .el-switch__core, .switchStyle1.el-switch .el-switch__core,
.switchStyle1.el-switch .el-switch__label { .switchStyle1.el-switch .el-switch__label {
width: 62px !important; width: 62px !important;
height: 28px !important; height: 28px !important;
border-radius: 28px !important; border-radius: 28px !important;
} }
.switchStyle1 .el-switch__core { .switchStyle1 .el-switch__core {
background: #f8f9fd !important; background: #f8f9fd !important;
border: 1px solid #8890a7 !important; border: 1px solid #8890a7 !important;
} }
.switchStyle1 .el-switch__core:after { .switchStyle1 .el-switch__core:after {
background: #8890a7 !important; background: #8890a7 !important;
width: 22px; width: 22px;
height: 22px; height: 22px;
left: 2px; left: 2px;
top: 2.1px; top: 2.1px;
} }
.switchStyle1.el-switch.is-checked .el-switch__core { .switchStyle1.el-switch.is-checked .el-switch__core {
background: #f8f9fd !important; background: #f8f9fd !important;
border: 1px solid #5c82ff !important; border: 1px solid #5c82ff !important;
} }
.switchStyle1.el-switch.is-checked .el-switch__core:after { .switchStyle1.el-switch.is-checked .el-switch__core:after {
background: #5c82ff !important; background: #5c82ff !important;
width: 22px; width: 22px;
height: 22px; height: 22px;
right: 0; right: 0;
top: 2.1px; top: 2.1px;
} }
.switchStyle1.el-switch.is-checked .el-switch__core::after { .switchStyle1.el-switch.is-checked .el-switch__core::after {
margin-left: -25px; margin-left: -25px;
} }
.switchStyle1 .el-switch__label * { .switchStyle1 .el-switch__label * {
font-size: 14px !important; font-size: 14px !important;
font-weight: 800; font-weight: 800;
} }
.switchStyle1.el-switch .el-switch__label { .switchStyle1.el-switch .el-switch__label {
color: #8890a7 !important; color: #8890a7 !important;
} }
.switchStyle1.el-switch.is-checked .el-switch__label { .switchStyle1.el-switch.is-checked .el-switch__label {
color: #5c82ff !important; color: #5c82ff !important;
} }
.switchStyle1.el-switch:hover { .switchStyle1.el-switch:hover {
opacity: 0.8; opacity: 0.8;
} }
/* 自定义图表提示框小三角 */ /* 自定义图表提示框小三角 */
/* .div-tip-warp { /* .div-tip-warp {
position: relative; position: relative;
line-height: 22px; line-height: 22px;
...@@ -551,496 +608,516 @@ border-radius:8px; ...@@ -551,496 +608,516 @@ border-radius:8px;
.triangle-position { .triangle-position {
margin-left: 35px; margin-left: 35px;
} */ } */
.el-input__inner { .el-input__inner {
border-radius: 6px; border-radius: 6px;
} }
.el-input-group__append, .el-input-group__append,
.el-input-group__prepend { .el-input-group__prepend {
border-radius: 8px; border-radius: 8px;
} }
.el-button { .el-button {
border-radius: 4px; border-radius: 4px;
height: 36px; height: 36px;
line-height: 36px; line-height: 36px;
} }
.el-select-dropdown { .el-select-dropdown {
z-index: 20000 !important; z-index: 20000 !important;
} }
/* /*
下拉选样式 下拉选样式
此处勿删,apaasV3下拉选择样式统一用这个 此处勿删,apaasV3下拉选择样式统一用这个
*/ */
.el-select-dropdown { .el-select-dropdown {
border-radius: 8px; border-radius: 8px;
} }
.el-select-dropdown__empty { .el-select-dropdown__empty {
color: #f4f7fc; color: #f4f7fc;
border-radius: 8px; border-radius: 8px;
} }
.el-select-dropdown__list { .el-select-dropdown__list {
padding: 0; padding: 0;
top: 10px; top: 10px;
border-radius: 4px; border-radius: 4px;
} }
.el-select-dropdown__item { .el-select-dropdown__item {
font-size: 12px; font-size: 12px;
padding: 0 20px; padding: 0 20px;
height: 34px; height: 34px;
line-height: 34px; line-height: 34px;
} }
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected { .el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
background-color: transparent; background-color: transparent;
color: #2b4695; color: #2b4695;
} }
.el-scrollbar { .el-scrollbar {
border-radius: 8px; border-radius: 8px;
} }
.el-popper[x-placement^="bottom"] .popper__arrow::after { .el-popper[x-placement^="bottom"] .popper__arrow::after {
border-bottom-color: transparent; border-bottom-color: transparent;
} }
.el-popper[x-placement^="top"] .popper__arrow::after { .el-popper[x-placement^="top"] .popper__arrow::after {
border-top-color: transparent; border-top-color: transparent;
} }
/* 单选激活样式 */ /* 单选激活样式 */
.el-radio__input .el-radio__inner { .el-radio__input .el-radio__inner {
border-color: #dadee7; border-color: #dadee7;
background-color: #fff; background-color: #fff;
width: 16px; width: 16px;
height: 16px; height: 16px;
} }
.el-radio__input.is-checked .el-radio__inner { .el-radio__input.is-checked .el-radio__inner {
border-color: #dadee7; border-color: #dadee7;
background-color: #fff; background-color: #fff;
} }
.el-radio__input.is-checked + .el-radio__label { .el-radio__input.is-checked+.el-radio__label {
color: #1a2236; color: #1a2236;
font-weight: 700; font-weight: 700;
} }
.el-radio__inner::after { .el-radio__inner::after {
width: 8px; width: 8px;
height: 8px; height: 8px;
} }
.el-radio__input.is-checked .el-radio__inner::after { .el-radio__input.is-checked .el-radio__inner::after {
background-color: #2b4695; background-color: #2b4695;
} }
.el-radio__inner:hover { .el-radio__inner:hover {
border-color: #2b4695; border-color: #2b4695;
} }
/* 面包屑样式 */ /* 面包屑样式 */
.bread_crumb { .bread_crumb {
margin: 20px; margin: 20px;
font-size: 14px; font-size: 14px;
} }
.bread_crumb .el-breadcrumb__inner { .bread_crumb .el-breadcrumb__inner {
color: #b4c0f5 !important; color: #b4c0f5 !important;
} }
.bread_crumb .is-link { .bread_crumb .is-link {
color: #626de9 !important; color: #626de9 !important;
} }
.bread_crumb1 { .bread_crumb1 {
margin: 20px; margin: 20px;
font-size: 14px; font-size: 14px;
} }
.bread_crumb1 .el-breadcrumb__inner { .bread_crumb1 .el-breadcrumb__inner {
color: #242c43 !important; color: #242c43 !important;
} }
.bread_crumb1 .is-link { .bread_crumb1 .is-link {
color: #898d9e !important; color: #898d9e !important;
} }
/* 应用超市详情页公共样式 */ /* 应用超市详情页公共样式 */
.sevice_detail { .sevice_detail {
max-width: 1340px; max-width: 1340px;
padding-top: 1px; padding-top: 1px;
margin: 0 auto; margin: 0 auto;
} }
/* common */ /* common */
.apass_breadcrumb > .el-breadcrumb {
padding: 10px 0; .apass_breadcrumb>.el-breadcrumb {
padding: 10px 0;
} }
.apass_breadcrumb > .el-breadcrumb .el-breadcrumb__inner { .apass_breadcrumb>.el-breadcrumb .el-breadcrumb__inner {
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
color: #898d9e; color: #898d9e;
line-height: 23px; line-height: 23px;
} }
.apass_breadcrumb > .el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner { .apass_breadcrumb>.el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: #242c43; color: #242c43;
font-weight: normal; font-weight: normal;
} }
.apaas_button .el-button { .apaas_button .el-button {
/* min-width: 90px; */ /* min-width: 90px; */
color: #404a62; color: #404a62;
} }
.apaas_button .el-button--mini, .apaas_button .el-button--mini,
.apaas_button .el-button--mini.is-round { .apaas_button .el-button--mini.is-round {
padding: 10px 15px; padding: 10px 15px;
} }
.apaas_button .el-button--primary { .apaas_button .el-button--primary {
color: #fff; color: #fff;
background-color: #2b4695; background-color: #2b4695;
border-color: #2b4695; border-color: #2b4695;
} }
.apaas_button .el-button--primary.is-plain { .apaas_button .el-button--primary.is-plain {
color: #2b4695; color: #2b4695;
background-color: #e1e4fb; background-color: #e1e4fb;
border-color: #e1e4fb; border-color: #e1e4fb;
} }
.apaas_button .el-button--info { .apaas_button .el-button--info {
color: #fff; color: #fff;
background-color: #404a62; background-color: #404a62;
border-color: #404a62; border-color: #404a62;
} }
.apaas_button .el-button--info:hover{
background-color: #5c6579; .apaas_button .el-button--info:hover {
border-color: #5c6579; background-color: #5c6579;
border-color: #5c6579;
} }
.apaas_button .el-button--info:active{
background-color: #363f53; .apaas_button .el-button--info:active {
border-color: #363f53; background-color: #363f53;
border-color: #363f53;
} }
.apaas_button .el-button--danger { .apaas_button .el-button--danger {
color: #fff; color: #fff;
background-color: #ad3a4a; background-color: #ad3a4a;
border-color: #ad3a4a; border-color: #ad3a4a;
} }
.apaas_button .el-button.is-disabled, .apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus, .apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover { .apaas_button .el-button.is-disabled:hover {
cursor: not-allowed; cursor: not-allowed;
} }
.apaas_button .el-button--warning.is-plain { .apaas_button .el-button--warning.is-plain {
background-color: #fcefd6; background-color: #fcefd6;
border-color: #fac266; border-color: #fac266;
color: #e56600; color: #e56600;
} }
.apaas_button .el-button--warning { .apaas_button .el-button--warning {
background-color: #e56600; background-color: #e56600;
border-color: #e56600; border-color: #e56600;
color: #fcefd6; color: #fcefd6;
} }
.apaas_button .el-button--success { .apaas_button .el-button--success {
background-color: #429e8a; background-color: #429e8a;
border-color: #429e8a; border-color: #429e8a;
color: #fff; color: #fff;
} }
.apaas_button .gray-button { .apaas_button .gray-button {
color: #fff; color: #fff;
background-color: #404a62; background-color: #404a62;
border-color: #404a62; border-color: #404a62;
} }
.apaas_button .el-button.is-disabled, .apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus, .apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover { .apaas_button .el-button.is-disabled:hover {
color: #c0c4cc; color: #c0c4cc;
cursor: not-allowed; cursor: not-allowed;
background-image: none; background-image: none;
background-color: #fff; background-color: #fff;
border-color: #ebeef5; border-color: #ebeef5;
} }
.apass_table .el-table th > .cell { .apass_table .el-table th>.cell {
color: #1a2236; color: #1a2236;
} }
.apass_table .el-table td, .apass_table .el-table td,
.apass_table .el-table th.is-leaf { .apass_table .el-table th.is-leaf {
border: none !important; border: none !important;
line-height: 23px; line-height: 23px;
} }
.apass_table .el-table::before { .apass_table .el-table::before {
display: none; display: none;
} }
.apass_table .el-table { .apass_table .el-table {
width: 100%; width: 100%;
} }
.apass_table .el-table__row:nth-child(odd) td { .apass_table .el-table__row:nth-child(odd) td {
background-color: #f7f7f9; background-color: #f7f7f9;
} }
.apass_table .table_html a { .apass_table .table_html a {
font-size: 14px; font-size: 14px;
color: #2b4695; color: #2b4695;
cursor: pointer; cursor: pointer;
} }
.apass_table .row_action { .apass_table .row_action {
user-select: none; user-select: none;
} }
.apass_table .row_action .btn { .apass_table .row_action .btn {
font-size: 14px; font-size: 14px;
color: #3759be; color: #3759be;
cursor: pointer; cursor: pointer;
} }
.apass_table .row_action .btn.warn { .apass_table .row_action .btn.warn {
color: #830f53; color: #830f53;
} }
.apass_table .row_action .btn.disabled { .apass_table .row_action .btn.disabled {
color: #999; color: #999;
cursor: not-allowed; cursor: not-allowed;
} }
.apass_table .row_action .disabled.hide { .apass_table .row_action .disabled.hide {
opacity: 0; opacity: 0;
cursor: auto; cursor: auto;
} }
.apass_table .row_action .interval_line { .apass_table .row_action .interval_line {
font-size: 14px; font-size: 14px;
color: #c1c7d7; color: #c1c7d7;
margin: 0 20px; margin: 0 20px;
} }
.apass_table .border-active td { .apass_table .border-active td {
padding: 10px 0; padding: 10px 0;
background-color: #e6ebfe; background-color: #e6ebfe;
border-top: 2px solid #515fe7 !important; border-top: 2px solid #515fe7 !important;
border-bottom: 2px solid #515fe7 !important; border-bottom: 2px solid #515fe7 !important;
} }
.apass_table .border-active td:first-child { .apass_table .border-active td:first-child {
border-left: 2px solid #515fe7 !important; border-left: 2px solid #515fe7 !important;
} }
.apass_table .border-active td:last-child { .apass_table .border-active td:last-child {
border-right: 2px solid #515fe7 !important; border-right: 2px solid #515fe7 !important;
} }
.apass_checkbox .el-checkbox__input.is-checked .el-checkbox__inner, .apass_checkbox .el-checkbox__input.is-checked .el-checkbox__inner,
.apass_checkbox .el-checkbox__input.is-indeterminate .el-checkbox__inner { .apass_checkbox .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be; background-color: #3759be;
border-color: #515fe7; border-color: #515fe7;
} }
.apass_checkbox .el-checkbox__input.is-checked + .el-checkbox__label { .apass_checkbox .el-checkbox__input.is-checked+.el-checkbox__label {
color: #58617a; color: #58617a;
} }
.apaas_scroll::-webkit-scrollbar { .apaas_scroll::-webkit-scrollbar {
width: 16px; width: 16px;
height: 1px; height: 1px;
} }
.apaas_scroll::-webkit-scrollbar-thumb { .apaas_scroll::-webkit-scrollbar-thumb {
border-radius: 8px; border-radius: 8px;
/* background: #dde4ff; */ /* background: #dde4ff; */
box-shadow: 8px 0 0 #a5adb7 inset; box-shadow: 8px 0 0 #a5adb7 inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} }
.apaas_scroll::-webkit-scrollbar-track { .apaas_scroll::-webkit-scrollbar-track {
border-radius: 8px; border-radius: 8px;
/* background: #f4f4f4; */ /* background: #f4f4f4; */
box-shadow: 8px 0 0 #f4f4f4 inset; box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} }
.apaas_scroll_nor::-webkit-scrollbar { .apaas_scroll_nor::-webkit-scrollbar {
width: 0px; width: 0px;
height: 0px; height: 0px;
} }
.apaas_scroll_min::-webkit-scrollbar { .apaas_scroll_min::-webkit-scrollbar {
width: 6px; width: 6px;
height: 1px; height: 1px;
} }
.apaas_scroll_min::-webkit-scrollbar-thumb { .apaas_scroll_min::-webkit-scrollbar-thumb {
border-radius: 3px; border-radius: 3px;
background: #e6e9ef; background: #e6e9ef;
box-shadow: 8px 0 0 #e6e9ef inset; box-shadow: 8px 0 0 #e6e9ef inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} }
.apaas_scroll_min::-webkit-scrollbar-track { .apaas_scroll_min::-webkit-scrollbar-track {
border-radius: 3px; border-radius: 3px;
background: #fff; background: #fff;
box-shadow: 8px 0 0 #fff inset; box-shadow: 8px 0 0 #fff inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} }
/* 详情页公共样式 by xuyiming */ /* 详情页公共样式 by xuyiming */
.apaas_detail_container { .apaas_detail_container {
padding: 0 20px; padding: 0 20px;
} }
.apaas_detail_container .main_contaner { .apaas_detail_container .main_contaner {
min-height: calc(100vh - 32px - 83px); min-height: calc(100vh - 32px - 83px);
flex-grow: 1; flex-grow: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
padding: 30px; padding: 30px;
background-color: #fff; background-color: #fff;
border-radius: 10px; border-radius: 10px;
margin-bottom: 14px; margin-bottom: 14px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
} }
.apaas_detail_container .main_contaner.locked_height { .apaas_detail_container .main_contaner.locked_height {
height: calc(100vh - 58px - 83px); height: calc(100vh - 58px - 83px);
min-height: 400px; min-height: 400px;
} }
.apaas_detail_container .main_contaner.locked_height_900 { .apaas_detail_container .main_contaner.locked_height_900 {
height: calc(100vh - 58px - 83px); height: calc(100vh - 58px - 83px);
min-height: 900px; min-height: 900px;
} }
.apaas_detail_container .detail_action { .apaas_detail_container .detail_action {
text-align: right; text-align: right;
margin-top: 50px; margin-top: 50px;
} }
.apaas_detail_container .detail_action .el-button + .el-button { .apaas_detail_container .detail_action .el-button+.el-button {
margin-left: 30px; margin-left: 30px;
} }
.apaas_detail_form { .apaas_detail_form {
max-width: 970px; max-width: 970px;
} }
.apaas_detail_form .el-input__inner, .apaas_detail_form .el-input__inner,
.apaas_detail_form .el-textarea__inner { .apaas_detail_form .el-textarea__inner {
width: 100%; width: 100%;
background-color: #f7f8f9; background-color: #f7f8f9;
} }
.apaas_detail_form .el-select { .apaas_detail_form .el-select {
width: 100%; width: 100%;
} }
.apaas_detail_form.el-form--label-top .el-form-item__label { .apaas_detail_form.el-form--label-top .el-form-item__label {
padding: 0 0 15px; padding: 0 0 15px;
font-size: 14px; font-size: 14px;
line-height: 1; line-height: 1;
color: #58617a; color: #58617a;
} }
.apaas_detail_form .el-form-item { .apaas_detail_form .el-form-item {
margin-bottom: 30px; margin-bottom: 30px;
} }
.apaas_detail_form .textarea_count { .apaas_detail_form .textarea_count {
font-size: 14px; font-size: 14px;
line-height: 1; line-height: 1;
color: #a9aec0; color: #a9aec0;
text-align: right; text-align: right;
margin-top: 10px; margin-top: 10px;
} }
.apaas_steps { .apaas_steps {
height: 100%; height: 100%;
} }
.apaas_steps .apaas_step { .apaas_steps .apaas_step {
height: 100%; height: 100%;
position: relative; position: relative;
} }
.apaas_steps .apaas_step .apaas_step_content { .apaas_steps .apaas_step .apaas_step_content {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: calc(100% - 64px); height: calc(100% - 64px);
border-bottom: 1px solid #f4f7fc; border-bottom: 1px solid #f4f7fc;
/* overflow: hidden; */ /* overflow: hidden; */
} }
.apaas_steps .apaas_step .apaas_step_action { .apaas_steps .apaas_step .apaas_step_action {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-start; align-items: flex-start;
} }
.apaas_steps .apaas_step .apaas_step_action .el-button { .apaas_steps .apaas_step .apaas_step_action .el-button {
height: 44px; height: 44px;
width: 124px; width: 124px;
} }
.apaas_steps .apaas_step .apaas_step_action .el-button + .el-button { .apaas_steps .apaas_step .apaas_step_action .el-button+.el-button {
margin-left: 20px; margin-left: 20px;
} }
.top_fliter { .top_fliter {
display: flex; display: flex;
} }
.filter_list { .filter_list {
flex-grow: 1; flex-grow: 1;
font-size: 0; font-size: 0;
} }
.filter_list > .filter_item {
display: flex; .filter_list>.filter_item {
align-items: center; display: flex;
margin: 0 34px 16px 0; align-items: center;
margin: 0 34px 16px 0;
} }
/* .filter_list>.filter_item>* { /* .filter_list>.filter_item>* {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
} */ } */
.filter_list > .filter_item > .filter_title { .filter_list>.filter_item>.filter_title {
text-align: right; text-align: right;
font-size: 14px; font-size: 14px;
color: #242c43; color: #242c43;
margin-right: 10px; margin-right: 10px;
width: 84px; width: 84px;
white-space: pre-wrap; white-space: pre-wrap;
font-weight: normal; font-weight: normal;
} }
/* .filter_list>.filter_item>.filter_title+* { /* .filter_list>.filter_item>.filter_title+* {
width: 300px; width: 300px;
} }
...@@ -1056,553 +1133,443 @@ border-radius:8px; ...@@ -1056,553 +1133,443 @@ border-radius:8px;
} */ } */
.top_fliter .filter_action { .top_fliter .filter_action {
flex-shrink: 0; flex-shrink: 0;
margin-left: 25px; margin-left: 25px;
text-align: right; text-align: right;
} }
.filter_action > .el-button { .filter_action>.el-button {
/* min-width: 90px; */ /* min-width: 90px; */
height: 36px; height: 36px;
margin-top: 16px; margin-top: 16px;
padding: 12px 17px; padding: 12px 17px;
} }
.filter_action > .el-button + .el-button { .filter_action>.el-button+.el-button {
margin-left: 10px; margin-left: 10px;
} }
.meassage_detail_dialog { .meassage_detail_dialog {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
text-align: left; text-align: left;
} }
.meassage_detail_dialog .detail_item { .meassage_detail_dialog .detail_item {
flex: 1 1 auto; flex: 1 1 auto;
width: 50%; width: 50%;
margin-top: 20px; margin-top: 20px;
} }
.meassage_detail_dialog .detail_item.full_line { .meassage_detail_dialog .detail_item.full_line {
width: 100%; width: 100%;
} }
.meassage_detail_dialog .detail_item p { .meassage_detail_dialog .detail_item p {
padding: 0 15px; padding: 0 15px;
font-size: 14px; font-size: 14px;
line-height: 22px; line-height: 22px;
color: #8890a7; color: #8890a7;
} }
.meassage_detail_dialog .detail_item .item_content { .meassage_detail_dialog .detail_item .item_content {
color: #000; color: #000;
margin-top: 10px; margin-top: 10px;
} }
.meassage_detail_dialog .detail_item .full_content { .meassage_detail_dialog .detail_item .full_content {
padding: 10px 0; padding: 10px 0;
border-radius: 8px; border-radius: 8px;
background-color: #f8f9fd; background-color: #f8f9fd;
margin-top: 5px; margin-top: 5px;
} }
.meassage_detail_dialog .detail_item .full_content > .apaas_scroll { .meassage_detail_dialog .detail_item .full_content>.apaas_scroll {
height: 176px; height: 176px;
overflow: auto; overflow: auto;
} }
.meassage_detail_dialog .detail_item .full_content .item_content { .meassage_detail_dialog .detail_item .full_content .item_content {
margin: 0; margin: 0;
} }
.no_wrap .apass_table td .cell { .no_wrap .apass_table td .cell {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
word-break: break-all; word-break: break-all;
white-space: nowrap; white-space: nowrap;
} }
/* 详情页公共样式 by xuyiming ~~~end */ /* 详情页公共样式 by xuyiming ~~~end */
/* /*
form_content form_content
*/ */
.from_content1 { .from_content1 {
width: calc(100% - 40px); width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
overflow: hidden; overflow: hidden;
margin: 0 20px 20px; margin: 0 20px 20px;
position: relative; position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05); box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px; border-radius: 12px;
padding-top: 20px; padding-top: 20px;
} }
.from_content { .from_content {
width: calc(100% - 40px); width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
/* flex: 1 0 auto; */ /* flex: 1 0 auto; */
position: relative; position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05); box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px; border-radius: 12px;
margin: 0 20px; margin: 0 20px;
padding: 20px 20px 30px; padding: 20px 20px 30px;
} }
.from_content_table { .from_content_table {
height: calc(100% - 90px); height: calc(100% - 90px);
} }
.from_content_table_app { .from_content_table_app {
height: calc(100% - 170px); height: calc(100% - 170px);
} }
.from_content_table_auth { .from_content_table_auth {
height: calc(100% - 100px); height: calc(100% - 100px);
} }
.from_content_btn { .from_content_btn {
height: 40px; height: 40px;
margin-bottom: 20px; margin-bottom: 20px;
} }
/* 时间控件样式 */ /* 时间控件样式 */
.el-picker-panel { .el-picker-panel {
background-color: #fff !important; background-color: #fff !important;
border-radius: 8px !important; border-radius: 8px !important;
font-size: 12px !important; font-size: 12px !important;
color: #202531 !important; color: #202531 !important;
box-shadow: 0 !important; box-shadow: 0 !important;
border: none !important; border: none !important;
} }
.el-date-editor.el-input__wrapper { .el-date-editor.el-input__wrapper {
background-color: #fff; background-color: #fff;
} }
/*
.el-picker-panel__footer { .el-picker-panel__footer {
border-top: 1px solid #3f4864 !important; border-top: 1px solid #3f4864 !important;
background-color: #242c43 !important; background-color: #242c43 !important;
} } */
.el-picker-panel__icon-btn { .el-picker-panel__icon-btn {
color: #202531; color: #202531;
} }
.el-date-table th { .el-date-table th {
border-bottom: 1px solid #e6e9ef !important; border-bottom: 1px solid #e6e9ef !important;
color: #202531 !important; color: #202531 !important;
} }
.el-date-table td.current:not(.disabled) span { .el-date-table td.current:not(.disabled) span {
color: #e3e5ef !important; color: #e3e5ef !important;
background-color: #315efc !important; background-color: #315efc !important;
} }
.el-date-table td.next-month, .el-date-table td.next-month,
.el-date-table td.prev-month { .el-date-table td.prev-month {
color: #a9b1c7 !important; color: #a9b1c7 !important;
} }
.el-date-picker__time-header { .el-date-picker__time-header {
border-bottom: 1px solid #3f4864 !important; border-bottom: 1px solid #3f4864 !important;
} }
.el-picker-panel__body .el-input__inner { .el-picker-panel__body .el-input__inner {
height: 24px !important; height: 24px !important;
line-height: 24px !important; line-height: 24px !important;
background-color: #1a2236 !important; border-radius: 12px !important;
border-radius: 12px !important; font-size: 12px;
border: solid 1px #3f4864 !important;
color: #e3e5ef !important;
font-size: 12px;
} }
.el-picker-panel__footer .el-button { .el-picker-panel__footer .el-button {
background-color: #264dd9; background-color: #264dd9;
border-radius: 12px; border-radius: 12px;
padding: 5px 12px; padding: 5px 12px;
color: #f4f7fc; color: #f4f7fc;
font-size: 12px; font-size: 12px;
border: none !important; border: none !important;
} }
.el-picker-panel__footer .el-button--text { .el-picker-panel__footer .el-button--text {
background-color: #dde4ff; background-color: #dde4ff;
border-radius: 12px; border-radius: 12px;
padding: 5px 12px; padding: 5px 12px;
color: #264dd9; color: #264dd9;
font-size: 12px; font-size: 12px;
} }
.el-button.is-plain:focus, .el-button.is-plain:focus,
.el-button.is-plain:hover { .el-button.is-plain:hover {
background-color: #264dd9; background-color: #264dd9;
color: #f4f7fc; color: #f4f7fc;
} }
.el-button--text:focus, .el-button--text:focus,
.el-button--text:hover { .el-button--text:hover {
color: #264dd9; color: #264dd9;
} }
.el-time-panel { .el-time-panel {
border-radius: 8px !important; border-radius: 8px !important;
border: 1px solid #3f4864 !important; /* border: 1px solid #3f4864 !important;
background-color: #242c43 !important; background-color: #242c43 !important; */
} }
.el-time-panel__footer { .el-time-panel__footer {
border: 1px solid #3f4864 !important; /* border: 1px solid #3f4864 !important; */
} }
.el-time-panel__btn.confirm { .el-time-panel__btn.confirm {
background-color: #264dd9; background-color: #264dd9;
border-radius: 12px !important; border-radius: 12px !important;
padding: 0px 12px; padding: 0px 12px;
color: #f4f7fc !important; color: #f4f7fc !important;
font-size: 12px !important; font-size: 12px !important;
} }
.el-time-panel__btn { .el-time-panel__btn {
line-height: 22px !important; line-height: 22px !important;
height: 22px !important; height: 22px !important;
} }
.el-time-spinner__item:hover:not(.disabled):not(.active) { .el-time-spinner__item:hover:not(.disabled):not(.active) {
background-color: #264dd9 !important; /* background-color: #264dd9 !important; */
border-radius: 12px !important; /* border-radius: 12px !important; */
color: #f4f7fc; color: #f4f7fc;
} }
.el-time-spinner__item { .el-time-spinner__item {
color: #58617a !important; color: #58617a !important;
} }
.el-date-table td.in-range div, .el-date-table td.in-range div,
.el-date-table td.in-range div:hover, .el-date-table td.in-range div:hover,
.el-date-table.is-week-mode .el-date-table__row.current div, .el-date-table.is-week-mode .el-date-table__row.current div,
.el-date-table.is-week-mode .el-date-table__row:hover div { .el-date-table.is-week-mode .el-date-table__row:hover div {
background-color: #eff2fa !important; background-color: #eff2fa !important;
} }
.el-date-table td.end-date .el-date-table-cell__text, .el-date-table td.end-date .el-date-table-cell__text,
.el-date-table td.start-date .el-date-table-cell__text { .el-date-table td.start-date .el-date-table-cell__text {
background-color: #3759be !important; background-color: #3759be !important;
} }
.el-date-table td.end-date span, .el-date-table td.end-date span,
.el-date-table td.start-date span { .el-date-table td.start-date span {
background-color: #264dd9; background-color: #264dd9;
} }
.el-date-table td.today span { .el-date-table td.today span {
color: #0c3ff7; color: #0c3ff7;
} }
.el-date-editor .el-range-separator { .el-date-editor .el-range-separator {
width: 15%; width: 15%;
line-height: 28px; line-height: 28px;
color: #202531; color: #202531;
} }
/* table select window */ /* table select window */
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-checked .el-checkbox__inner,
.el-checkbox__input.is-indeterminate .el-checkbox__inner { .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be; background-color: #3759be;
border-color: #2b4695; border-color: #2b4695;
} }
.el-checkbox__input.is-focus .el-checkbox__inner { .el-checkbox__input.is-focus .el-checkbox__inner {
border-color: #2b4695; border-color: #2b4695;
} }
.el-checkbox__input:hover .el-checkbox__inner { .el-checkbox__input:hover .el-checkbox__inner {
border-color: #2b4695; border-color: #2b4695;
} }
.el-date-editor .el-range-input { .el-date-editor .el-range-input {
width: 36%; width: 36%;
} }
.el-input__inner:focus { .el-input__inner:focus {
border-color: #515fe7; border-color: #515fe7;
} }
.el-textarea__inner:focus { .el-textarea__inner:focus {
border-color: #515fe7; border-color: #515fe7;
} }
.el-select .el-input .el-select__caret { .el-select .el-input .el-select__caret {
color: #515fe7; color: #515fe7;
} }
.el-input-number__decrease, .el-input-number__decrease,
.el-input-number__increase { .el-input-number__increase {
color: #515fe7; color: #515fe7;
} }
.el-input__inner::-webkit-input-placeholder, .el-input__inner::-webkit-input-placeholder,
.el-textarea__inner::-webkit-input-placeholder { .el-textarea__inner::-webkit-input-placeholder {
color: #a9aec0; color: #a9aec0;
} }
.el-input__inner:-moz-placeholder, .el-input__inner:-moz-placeholder,
.el-textarea__inner:-moz-placeholder { .el-textarea__inner:-moz-placeholder {
/* Firefox 18- */ /* Firefox 18- */
color: #a9aec0; color: #a9aec0;
} }
.el-input__inner::-moz-placeholder, .el-input__inner::-moz-placeholder,
.el-textarea__inner::-moz-placeholder { .el-textarea__inner::-moz-placeholder {
/* Firefox 19+ */ /* Firefox 19+ */
color: #a9aec0; color: #a9aec0;
} }
.el-input__inner:-ms-input-placeholder, .el-input__inner:-ms-input-placeholder,
.el-textarea__inner:-ms-input-placeholder { .el-textarea__inner:-ms-input-placeholder {
color: #a9aec0; color: #a9aec0;
} }
[class*=" el-icon-"], [class*=" el-icon-"],
[class^="el-icon-"] { [class^="el-icon-"] {
font-weight: 700; font-weight: 700;
} }
.el-rate__item .el-rate__icon { .el-rate__item .el-rate__icon {
font-size: 18px; font-size: 18px;
margin-right: 0; margin-right: 0;
} }
.detai_form .el-input__inner, .detai_form .el-input__inner,
.detai_form .el-textarea__inner { .detai_form .el-textarea__inner {
background-color: #f7f7f9; background-color: #f7f7f9;
border-radius: 4px; border-radius: 4px;
border: solid 1px #dadee7; border: solid 1px #dadee7;
} }
.detai_form .el-input.is-disabled .el-input__inner { .detai_form .el-input.is-disabled .el-input__inner {
background-color: #e6e9ef; background-color: #e6e9ef;
} }
.tip-box-popper { .tip-box-popper {
background: #242c43 !important; background: #242c43 !important;
} }
.p-1 { .p-1 {
padding: 5px; padding: 5px;
} }
.source_table .el-table thead tr { .source_table .el-table thead tr {
background-color: #dfe5f6 !important; background-color: #dfe5f6 !important;
} }
.source_table .el-table th { .source_table .el-table th {
background-color: transparent; background-color: transparent;
} }
.source_table .el-table td { .source_table .el-table td {
border-bottom: 1px solid #dadee7 !important; border-bottom: 1px solid #dadee7 !important;
} }
.source_table .el-table__header { .source_table .el-table__header {
border: 1px solid #b0bee8; border: 1px solid #b0bee8;
} }
.source_table .el-table__body-wrapper { .source_table .el-table__body-wrapper {
border-left: 1px solid #dadee7 !important; border-left: 1px solid #dadee7 !important;
border-right: 1px solid #dadee7 !important; border-right: 1px solid #dadee7 !important;
} }
.source_table .el-table__empty-block { .source_table .el-table__empty-block {
border-bottom: 1px solid #dadee7 !important; border-bottom: 1px solid #dadee7 !important;
} }
.source_footer { .source_footer {
margin-top: 15px; margin-top: 15px;
text-align: center; text-align: center;
} }
.source_title { .source_title {
font-size: 14px; font-size: 14px;
padding: 10px 0; padding: 10px 0;
text-align: left; text-align: left;
} }
.headerBox { .headerBox {
font-size: 18px; font-size: 18px;
line-height: 18px; line-height: 18px;
font-weight: 700; font-weight: 700;
font-stretch: normal; font-stretch: normal;
letter-spacing: 0px; letter-spacing: 0px;
color: #1a1a1a; color: #1a1a1a;
} }
.headerBox span:first-child { .headerBox span:first-child {
display: inline-block; display: inline-block;
width: 4px; width: 4px;
height: 16px; height: 16px;
background-color: #3759be; background-color: #3759be;
border-radius: 2px; border-radius: 2px;
margin-right: 10px; margin-right: 10px;
vertical-align: bottom; vertical-align: bottom;
} }
.row_text { .row_text {
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
word-break: break-all; word-break: break-all;
} }
.close_reason { .close_reason {
padding: 2px 5px; padding: 2px 5px;
background-color: #dedede; background-color: #dedede;
display: inline-block; display: inline-block;
margin-top: 10px; margin-top: 10px;
} }
.pointer { .pointer {
cursor: pointer; cursor: pointer;
} }
.pr-1 { .pr-1 {
padding-right: 10px; padding-right: 10px;
} }
.page_container { .page_container {
width: 100%; width: 100%;
padding: 0 24px; padding: 0 24px;
/* min-height: 100%; */ /* min-height: 100%; */
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
}
.page_content {
background-color: #fff;
height: calc(100% - 46px - 20px);
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
}
.flex_row {
display: flex;
height: 100%;
overflow: hidden;
} }
.flex_left { .page_content {
height: calc(100% - 16px); background-color: #fff;
width: 320px; height: calc(100% - 46px - 20px);
margin-right: 10px; box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
overflow: hidden; border-radius: 6px;
} }
.flex_right { \ No newline at end of file
height: calc(100% - 16px);
flex: 1;
overflow: hidden;
}
.bgc_white {
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
background-color: #fff;
}
.tree::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.tree::-webkit-scrollbar-thumb {
background: #bcc1d0;
border-radius: 10px;
height: 6px;
}
.tree::-webkit-scrollbar-track {
background: transparent;
border-radius: 2px;
}
.font_bold {
font-size: 18px;
color: #202531;
font-weight: bold;
margin-bottom: 20px;
}
.header_info {
font-size: 14px;
color: #404a62;
padding-left: 20px;
}
.fr {
float: right;
}
.pl-1 {
padding-left: 1rem;
}
.label-text {
font-size: 14px;
color: #404a62;
}
.icon_eye {
font-size: 12px;
color: #a9b1c7;
margin-right: 8px;
vertical-align: baseline;
cursor: pointer;
}
/* 可点击文字颜色、指针样式 */
.can_click_text {
cursor: pointer;
color: #3759be;
}
.can_click_text:hover {
color: #738bd2;
}
.can_click_text:active {
color: #2c4798;
}
.warning_info {
background-color: #f7f7f9;
font-size: 14px;
color: #404a62;
padding: 5px;
text-align: left;
margin: 20px 0;
}
.danger_info {
color: #d75138;
}
.register_btn {
display: flex;
align-items: center;
background-color: #eff2fa;
border-radius: 4px;
border: solid 1px #b0bee8;
color: #3759be;
}
.register_btn .icon-arrow-right {
margin-left: 39px;
}
.forget_psd {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
.select-empty {
color: #616f94;
text-align: center;
padding: 20px;
}
.tip-image {
position: absolute;
right: -24px;
bottom: 9px;
width: 16px;
height: 16px;
margin-left: 8px;
background-image: url("../imgs/ic_tips.png");
background-size: contain;
}
...@@ -19,7 +19,6 @@ a { ...@@ -19,7 +19,6 @@ a {
.clearfix { .clearfix {
zoom: 1; zoom: 1;
&::after { &::after {
content: ""; content: "";
display: block; display: block;
...@@ -65,7 +64,6 @@ a { ...@@ -65,7 +64,6 @@ a {
max-width: 750px; max-width: 750px;
margin: 0 auto; margin: 0 auto;
} }
.el-form-item { .el-form-item {
.el-form-item__label { .el-form-item__label {
float: unset; float: unset;
...@@ -75,11 +73,9 @@ a { ...@@ -75,11 +73,9 @@ a {
color: #202531; color: #202531;
line-height: 36px; line-height: 36px;
} }
.el-form-item__content { .el-form-item__content {
line-height: 36px; line-height: 36px;
// margin-top: 40px; // margin-top: 40px;
.el-select, .el-select,
.img_crop, .img_crop,
.el-cascader, .el-cascader,
...@@ -87,13 +83,11 @@ a { ...@@ -87,13 +83,11 @@ a {
.el-date-editor { .el-date-editor {
width: 100%; width: 100%;
} }
.wangeditor_class { .wangeditor_class {
min-height: 553px; min-height: 553px;
border: 1px solid #dadee7; border: 1px solid #dadee7;
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
.toolbar { .toolbar {
.w-e-toolbar { .w-e-toolbar {
.w-e-menu { .w-e-menu {
...@@ -103,12 +97,10 @@ a { ...@@ -103,12 +97,10 @@ a {
} }
} }
} }
&.inline { &.inline {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
.el-form-item__label { .el-form-item__label {
width: 6em; width: 6em;
padding: 0; padding: 0;
...@@ -116,30 +108,25 @@ a { ...@@ -116,30 +108,25 @@ a {
color: #616f94; color: #616f94;
text-align: right; text-align: right;
margin-right: 1em; margin-right: 1em;
&:before { &:before {
display: inline; display: inline;
margin-left: -1em; margin-left: -1em;
} }
} }
.el-form-item__content { .el-form-item__content {
width: calc(100% - 7em); width: calc(100% - 7em);
flex-grow: 1; flex-grow: 1;
} }
} }
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
} }
.el-button { .el-button {
min-width: 64px; min-width: 64px;
height: 36px; height: 36px;
padding: 0 10px; padding: 0 10px;
line-height: 36px; line-height: 36px;
&.el-button--default { &.el-button--default {
background-color: #fff; background-color: #fff;
color: #404a62; color: #404a62;
...@@ -174,7 +161,6 @@ a { ...@@ -174,7 +161,6 @@ a {
border-color: #404a62; border-color: #404a62;
color: #fff; color: #fff;
} }
&.is-disabled, &.is-disabled,
&.is-disabled:focus, &.is-disabled:focus,
&.is-disabled:hover { &.is-disabled:hover {
...@@ -185,35 +171,29 @@ a { ...@@ -185,35 +171,29 @@ a {
cursor: not-allowed; cursor: not-allowed;
opacity: 0.5; opacity: 0.5;
} }
+ .el-button { + .el-button {
margin-left: 16px; margin-left: 16px;
} }
} }
.el-input .el-input__inner, .el-input .el-input__inner,
.el-textarea .el-textarea__inner { .el-textarea .el-textarea__inner {
background-color: #f7f7f9; background-color: #f7f7f9;
border: solid 1px #dadee7; border: solid 1px #dadee7;
border-radius: 4px; border-radius: 4px;
} }
.el-input { .el-input {
.el-input__inner { .el-input__inner {
height: 36px; height: 36px;
} }
&.el-input-group { &.el-input-group {
> .el-input__inner { > .el-input__inner {
border-top-right-radius: 0; border-top-right-radius: 0;
border-bottom-right-radius: 0; border-bottom-right-radius: 0;
} }
> .el-input-group__append { > .el-input-group__append {
background-color: transparent; background-color: transparent;
padding: 0; padding: 0;
border: none; border: none;
.input-append { .input-append {
display: block; display: block;
min-width: 120px; min-width: 120px;
...@@ -228,7 +208,6 @@ a { ...@@ -228,7 +208,6 @@ a {
color: #f4f7fc; color: #f4f7fc;
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
&.disabled { &.disabled {
background-color: #a9b1c7; background-color: #a9b1c7;
cursor: not-allowed; cursor: not-allowed;
...@@ -236,7 +215,6 @@ a { ...@@ -236,7 +215,6 @@ a {
} }
} }
} }
&.is-disabled { &.is-disabled {
.el-input__inner { .el-input__inner {
background-color: #e6e9ef; background-color: #e6e9ef;
...@@ -244,7 +222,6 @@ a { ...@@ -244,7 +222,6 @@ a {
} }
} }
} }
.el-textarea { .el-textarea {
.el-input__count { .el-input__count {
background: #fff; background: #fff;
...@@ -256,14 +233,11 @@ a { ...@@ -256,14 +233,11 @@ a {
right: 10px; right: 10px;
} }
} }
.el-range-editor.el-input__inner { .el-range-editor.el-input__inner {
height: 36px; height: 36px;
} }
.el-pagination { .el-pagination {
padding: 0 10px; padding: 0 10px;
> * { > * {
height: 36px !important; height: 36px !important;
background-color: transparent !important; background-color: transparent !important;
...@@ -271,23 +245,19 @@ a { ...@@ -271,23 +245,19 @@ a {
line-height: 36px !important; line-height: 36px !important;
color: #404a62; color: #404a62;
} }
> .el-pager > li { > .el-pager > li {
height: 36px !important; height: 36px !important;
background-color: transparent !important; background-color: transparent !important;
line-height: 36px !important; line-height: 36px !important;
color: #404a62 !important; color: #404a62 !important;
&.active { &.active {
color: #3759be !important; color: #3759be !important;
} }
} }
.el-input__inner { .el-input__inner {
background-color: #f7f7f9; background-color: #f7f7f9;
} }
} }
.el-checkbox { .el-checkbox {
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-checked .el-checkbox__inner,
.el-checkbox__input.is-indeterminate .el-checkbox__inner { .el-checkbox__input.is-indeterminate .el-checkbox__inner {
...@@ -295,7 +265,6 @@ a { ...@@ -295,7 +265,6 @@ a {
border-color: #0c74a7; border-color: #0c74a7;
} }
} }
.el-select { .el-select {
.el-input { .el-input {
.el-input__icon { .el-input__icon {
...@@ -306,17 +275,14 @@ a { ...@@ -306,17 +275,14 @@ a {
} }
} }
} }
.el-tree { .el-tree {
.el-tree-node__content { .el-tree-node__content {
height: 32px; height: 32px;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
.el-tree-node__expand-icon { .el-tree-node__expand-icon {
color: #2b4695; color: #2b4695;
&.el-icon-caret-right { &.el-icon-caret-right {
width: 16px; width: 16px;
height: 16px; height: 16px;
...@@ -326,7 +292,6 @@ a { ...@@ -326,7 +292,6 @@ a {
box-sizing: border-box; box-sizing: border-box;
margin-right: 8px; margin-right: 8px;
text-align: center; text-align: center;
&:before { &:before {
content: "\e6d9"; content: "\e6d9";
font-size: 12px; font-size: 12px;
...@@ -334,34 +299,28 @@ a { ...@@ -334,34 +299,28 @@ a {
line-height: 14px; line-height: 14px;
color: #3759be; color: #3759be;
} }
&.expanded { &.expanded {
transform: rotate(0deg); transform: rotate(0deg);
&:before { &:before {
content: "\e6d8"; content: "\e6d8";
} }
} }
&.is-leaf { &.is-leaf {
opacity: 0; opacity: 0;
} }
} }
} }
.el-tree-node__label { .el-tree-node__label {
font-size: 14px; font-size: 14px;
color: #404a62; color: #404a62;
line-height: 32px; line-height: 32px;
} }
} }
&.el-tree--highlight-current { &.el-tree--highlight-current {
.el-tree-node { .el-tree-node {
&.is-current { &.is-current {
> .el-tree-node__content { > .el-tree-node__content {
background-color: #dfe5f6; background-color: #dfe5f6;
.el-tree-node__label { .el-tree-node__label {
color: #3759be; color: #3759be;
} }
...@@ -370,7 +329,6 @@ a { ...@@ -370,7 +329,6 @@ a {
} }
} }
} }
&.float-label { &.float-label {
.el-form-item { .el-form-item {
.el-form-item__label { .el-form-item__label {
...@@ -378,7 +336,6 @@ a { ...@@ -378,7 +336,6 @@ a {
} }
} }
} }
&.width-1340 { &.width-1340 {
.el-input, .el-input,
.el-textarea, .el-textarea,
...@@ -392,35 +349,29 @@ a { ...@@ -392,35 +349,29 @@ a {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
> .el-breadcrumb { > .el-breadcrumb {
flex-shrink: 0; flex-shrink: 0;
white-space: nowrap; white-space: nowrap;
height: 46px; height: 46px;
padding: 16px 0; padding: 16px 0;
box-sizing: border-box; box-sizing: border-box;
.el-breadcrumb__item { .el-breadcrumb__item {
> span { > span {
font-size: 14px; font-size: 14px;
font-weight: normal; font-weight: normal;
// line-height: 24px; // line-height: 24px;
color: #909bb6; color: #909bb6;
&:hover {
&:hover{
color: #5170cd; color: #5170cd;
cursor: pointer; cursor: pointer;
} }
} }
&:last-child { &:last-child {
> span { > span {
color: #202531; color: #202531;
} }
} }
} }
& + * { & + * {
width: 429px; width: 429px;
flex-grow: 0; flex-grow: 0;
...@@ -429,7 +380,6 @@ a { ...@@ -429,7 +380,6 @@ a {
margin: 7px 0 7px 14px; margin: 7px 0 7px 14px;
} }
} }
&.deep-bg { &.deep-bg {
> .el-breadcrumb { > .el-breadcrumb {
.el-breadcrumb__item { .el-breadcrumb__item {
...@@ -446,10 +396,8 @@ a { ...@@ -446,10 +396,8 @@ a {
.bg-dialog { .bg-dialog {
.el-dialog { .el-dialog {
border-radius: 4px; border-radius: 4px;
.el-dialog__header { .el-dialog__header {
padding: 10px 16px; padding: 10px 16px;
.el-dialog__title { .el-dialog__title {
padding-left: 1em; padding-left: 1em;
position: relative; position: relative;
...@@ -457,7 +405,6 @@ a { ...@@ -457,7 +405,6 @@ a {
font-weight: bolder; font-weight: bolder;
color: #1d1e20; color: #1d1e20;
line-height: 30px; line-height: 30px;
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -470,32 +417,25 @@ a { ...@@ -470,32 +417,25 @@ a {
} }
} }
} }
.el-dialog__body { .el-dialog__body {
padding: 24px 16px; padding: 24px 16px;
} }
.el-dialog__footer { .el-dialog__footer {
padding: 8px 16px 16px; padding: 8px 16px 16px;
} }
.dialog-msg { .dialog-msg {
text-align: left; text-align: left;
> p { > p {
font-size: 14px; font-size: 14px;
line-height: 1.5; line-height: 1.5;
&:nth-child(1) { &:nth-child(1) {
font-size: 18px; font-size: 18px;
} }
& + p { & + p {
margin-top: 14px; margin-top: 14px;
} }
} }
} }
.dialog-rich-text-content { .dialog-rich-text-content {
min-height: 650px; min-height: 650px;
font-size: 14px; font-size: 14px;
...@@ -509,10 +449,8 @@ a { ...@@ -509,10 +449,8 @@ a {
user-select: none; user-select: none;
height: 100%; height: 100%;
padding-top: 9px; padding-top: 9px;
.bg-nav-title { .bg-nav-title {
padding: 0 0 12px 24px; padding: 0 0 12px 24px;
> h3 { > h3 {
font-size: 18px; font-size: 18px;
font-weight: bolder; font-weight: bolder;
...@@ -520,18 +458,14 @@ a { ...@@ -520,18 +458,14 @@ a {
line-height: 30px; line-height: 30px;
} }
} }
> .bg-nav-list { > .bg-nav-list {
height: calc(100% - 10px); height: calc(100% - 10px);
box-sizing: border-box; box-sizing: border-box;
ul.nav-list { ul.nav-list {
height: 100%; height: 100%;
overflow: auto; overflow: auto;
> li { > li {
position: relative; position: relative;
> .nav-item { > .nav-item {
position: relative; position: relative;
display: block; display: block;
...@@ -542,11 +476,9 @@ a { ...@@ -542,11 +476,9 @@ a {
text-decoration: none; text-decoration: none;
color: #fff; color: #fff;
cursor: pointer; cursor: pointer;
&:hover:not(.nav-more), &:hover:not(.nav-more),
&.current { &.current {
color: #fff; color: #fff;
&::before { &::before {
content: ""; content: "";
width: 100%; width: 100%;
...@@ -557,7 +489,6 @@ a { ...@@ -557,7 +489,6 @@ a {
background-color: #2a4aa7; background-color: #2a4aa7;
z-index: -1; z-index: -1;
} }
&::after { &::after {
content: ""; content: "";
width: 3px; width: 3px;
...@@ -570,7 +501,6 @@ a { ...@@ -570,7 +501,6 @@ a {
} }
} }
} }
> ul.nav-list { > ul.nav-list {
background-color: #202531; background-color: #202531;
} }
...@@ -583,7 +513,6 @@ a { ...@@ -583,7 +513,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
> .bg-filtrate-text { > .bg-filtrate-text {
width: 7em; width: 7em;
flex-shrink: 0; flex-shrink: 0;
...@@ -594,7 +523,6 @@ a { ...@@ -594,7 +523,6 @@ a {
margin: 8px 0; margin: 8px 0;
text-align: right; text-align: right;
} }
> .bg-filtrate-list { > .bg-filtrate-list {
padding: 0; padding: 0;
margin: 0 0 0 10px; margin: 0 0 0 10px;
...@@ -602,7 +530,6 @@ a { ...@@ -602,7 +530,6 @@ a {
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> li { > li {
height: 24px; height: 24px;
padding: 0 5px; padding: 0 5px;
...@@ -611,11 +538,9 @@ a { ...@@ -611,11 +538,9 @@ a {
color: #202531; color: #202531;
cursor: pointer; cursor: pointer;
margin: 8px 0; margin: 8px 0;
&:not(:last-child) { &:not(:last-child) {
margin-right: 20px; margin-right: 20px;
} }
&.current { &.current {
border-radius: 3px; border-radius: 3px;
background-color: #2b4695; background-color: #2b4695;
...@@ -623,7 +548,6 @@ a { ...@@ -623,7 +548,6 @@ a {
} }
} }
} }
> .bg-filtrate-title { > .bg-filtrate-title {
width: 7em; width: 7em;
height: 36px; height: 36px;
...@@ -633,7 +557,6 @@ a { ...@@ -633,7 +557,6 @@ a {
margin: 8px 0; margin: 8px 0;
text-align: right; text-align: right;
} }
> .bg-filtrate-content { > .bg-filtrate-content {
flex-shrink: 0; flex-shrink: 0;
margin: 8px 0 8px 10px; margin: 8px 0 8px 10px;
...@@ -645,7 +568,7 @@ a { ...@@ -645,7 +568,7 @@ a {
display: none; display: none;
} }
.el-table__empty-block { .el-table__empty-block {
height: 500px!important; height: 500px !important;
.empty_container { .empty_container {
height: 500px; height: 500px;
padding-top: 247px; padding-top: 247px;
...@@ -662,20 +585,17 @@ a { ...@@ -662,20 +585,17 @@ a {
} }
th, th,
td { td {
padding: 11px 0!important; padding: 11px 0 !important;
> .cell { > .cell {
padding: 0 10px !important; padding: 0 10px !important;
color: #404a62; color: #404a62;
line-height: 16px; line-height: 16px;
} }
} }
&.el-table--border { &.el-table--border {
border-top-color: #b0bee8; border-top-color: #b0bee8;
.el-table__header-wrapper { .el-table__header-wrapper {
position: relative; position: relative;
&::before { &::before {
content: ""; content: "";
width: 1px; width: 1px;
...@@ -686,7 +606,6 @@ a { ...@@ -686,7 +606,6 @@ a {
left: 0; left: 0;
z-index: 1; z-index: 1;
} }
&::after { &::after {
content: ""; content: "";
width: 0px; width: 0px;
...@@ -697,21 +616,19 @@ a { ...@@ -697,21 +616,19 @@ a {
bottom: 0; bottom: 0;
z-index: 2; z-index: 2;
} }
table { table {
th { th {
border-color: #b0bee8; border-color: #dadee7;
background-color: #dfe5f6; background-color: #f5f6f9;
} }
} }
} }
} }
.stripe-row td { .stripe-row td {
background-color: #fff!important; background-color: #fff !important;
} }
.white-row td { .white-row td {
background-color: #f7f7f9!important; background-color: #f7f7f9 !important;
} }
.el-table--striped .el-table__body tr.el-table__row--striped td { .el-table--striped .el-table__body tr.el-table__row--striped td {
background-color: #f7f7f9; background-color: #f7f7f9;
...@@ -723,24 +640,20 @@ a { ...@@ -723,24 +640,20 @@ a {
th { th {
background-color: #e6e9ef; background-color: #e6e9ef;
} }
tr { tr {
&.has-children { &.has-children {
background-color: #f7f7f9; background-color: #f7f7f9;
} }
} }
} }
.el-form-item { .el-form-item {
margin: 0 !important; margin: 0 !important;
.el-form-item__error { .el-form-item__error {
top: unset; top: unset;
bottom: -12px; bottom: -12px;
transform: scale(0.8); transform: scale(0.8);
transform-origin: 0 0; transform-origin: 0 0;
} }
.el-form-item__content { .el-form-item__content {
margin: 0 !important; margin: 0 !important;
} }
...@@ -749,17 +662,15 @@ a { ...@@ -749,17 +662,15 @@ a {
max-width: 388px; max-width: 388px;
padding: 15px 12px; padding: 15px 12px;
color: #202531; color: #202531;
box-shadow: 0px 4px 12px 0px box-shadow: 0px 4px 12px 0px rgba(18, 30, 63, 0.1);
rgba(18, 30, 63, 0.1); border: solid 1px #e6e9ef;
border: solid 1px #e6e9ef;
font-size: 14px; font-size: 14px;
} }
} }
.bg-table-pro{ .bg-table-pro {
th, th,
td { td {
> .cell { > .cell {
padding: 0 10px !important; padding: 0 10px !important;
overflow: unset; overflow: unset;
...@@ -768,14 +679,9 @@ a { ...@@ -768,14 +679,9 @@ a {
align-items: center; align-items: center;
} }
} }
&.el-table--border { &.el-table--border {
.el-table__header-wrapper { .el-table__header-wrapper {
table { table {
th { th {
border-color: #dadee7; border-color: #dadee7;
background-color: #f5f6f9; background-color: #f5f6f9;
...@@ -786,19 +692,15 @@ a { ...@@ -786,19 +692,15 @@ a {
} }
.bg-table-tree { .bg-table-tree {
.th, .th,
.td { .td {
> .cell {
>.cell {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> .el-input {
>.el-input {
flex: 1 1 auto; flex: 1 1 auto;
} }
} }
} }
} }
...@@ -808,7 +710,7 @@ a { ...@@ -808,7 +710,7 @@ a {
color: #3759be; color: #3759be;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: #738bd2 color: #738bd2;
} }
&:active { &:active {
color: #2c4798; color: #2c4798;
...@@ -821,11 +723,9 @@ a { ...@@ -821,11 +723,9 @@ a {
color: #a9b1c7; color: #a9b1c7;
} }
} }
& + .bg-table-btn { & + .bg-table-btn {
position: relative; position: relative;
margin-left: 33px; margin-left: 33px;
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -843,10 +743,8 @@ a { ...@@ -843,10 +743,8 @@ a {
box-shadow: 0px 4px 16px 0px rgba(18, 30, 0.03, 0.08); box-shadow: 0px 4px 16px 0px rgba(18, 30, 0.03, 0.08);
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
> .bg-tabs-nav { > .bg-tabs-nav {
background-color: #fff; background-color: #fff;
> ul { > ul {
height: 64px; height: 64px;
padding: 0; padding: 0;
...@@ -855,7 +753,6 @@ a { ...@@ -855,7 +753,6 @@ a {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: stretch; align-items: stretch;
> li { > li {
flex-grow: 0; flex-grow: 0;
width: 320px; width: 320px;
...@@ -870,7 +767,6 @@ a { ...@@ -870,7 +767,6 @@ a {
color: #616f94; color: #616f94;
background: #f7f7f9; background: #f7f7f9;
cursor: pointer; cursor: pointer;
&.current { &.current {
position: relative; position: relative;
border-top-right-radius: 6px; border-top-right-radius: 6px;
...@@ -881,7 +777,6 @@ a { ...@@ -881,7 +777,6 @@ a {
color: #3759be; color: #3759be;
background-color: #fff; background-color: #fff;
overflow: hidden; overflow: hidden;
// &::before { // &::before {
// content: ""; // content: "";
// position: absolute; // position: absolute;
...@@ -892,11 +787,9 @@ a { ...@@ -892,11 +787,9 @@ a {
// background-color: #e56600; // background-color: #e56600;
// } // }
} }
&:first-child { &:first-child {
border-left: none; border-left: none;
} }
&:last-child { &:last-child {
flex-grow: 1; flex-grow: 1;
flex-shrink: 1; flex-shrink: 1;
...@@ -905,31 +798,25 @@ a { ...@@ -905,31 +798,25 @@ a {
} }
} }
} }
> .bg-tabs-content { > .bg-tabs-content {
padding: 30px 16px; padding: 30px 16px;
} }
&.nice-tabs { &.nice-tabs {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
> .bg-tabs-nav { > .bg-tabs-nav {
flex-shrink: 0; flex-shrink: 0;
flex-grow: 0; flex-grow: 0;
} }
> .bg-tabs-content { > .bg-tabs-content {
padding: 30px 0; padding: 30px 0;
flex-shrink: 1; flex-shrink: 1;
flex-grow: 1; flex-grow: 1;
> .bg-tab { > .bg-tab {
padding: 0; padding: 0;
margin: 0; margin: 0;
.el-input, .el-input,
.el-textarea, .el-textarea,
.bg-tags { .bg-tags {
...@@ -937,7 +824,6 @@ a { ...@@ -937,7 +824,6 @@ a {
} }
} }
} }
> .bg-tabs-action { > .bg-tabs-action {
flex-shrink: 0; flex-shrink: 0;
flex-grow: 0; flex-grow: 0;
...@@ -951,7 +837,6 @@ a { ...@@ -951,7 +837,6 @@ a {
.bg-tab { .bg-tab {
> .tab-title { > .tab-title {
margin-bottom: 16px; margin-bottom: 16px;
> h3 { > h3 {
position: relative; position: relative;
padding-left: 16px; padding-left: 16px;
...@@ -960,7 +845,6 @@ a { ...@@ -960,7 +845,6 @@ a {
font-weight: bolder; font-weight: bolder;
line-height: 32px; line-height: 32px;
color: #202531; color: #202531;
&::before { &::before {
content: ""; content: "";
width: 4px; width: 4px;
...@@ -972,11 +856,9 @@ a { ...@@ -972,11 +856,9 @@ a {
} }
} }
} }
> .tab-content { > .tab-content {
padding: 0px 40px; padding: 0px 40px;
} }
& + .bg-tab { & + .bg-tab {
margin-top: 30px; margin-top: 30px;
} }
...@@ -990,7 +872,6 @@ a { ...@@ -990,7 +872,6 @@ a {
z-index: 1998; z-index: 1998;
background-color: #eef0f5; background-color: #eef0f5;
padding: 16px 16px 0; padding: 16px 16px 0;
> ul { > ul {
background-color: #fff; background-color: #fff;
height: 64px; height: 64px;
...@@ -1001,7 +882,6 @@ a { ...@@ -1001,7 +882,6 @@ a {
justify-content: space-between; justify-content: space-between;
align-items: stretch; align-items: stretch;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
> li { > li {
flex-grow: 0; flex-grow: 0;
width: 320px; width: 320px;
...@@ -1015,10 +895,8 @@ a { ...@@ -1015,10 +895,8 @@ a {
line-height: 25px; line-height: 25px;
color: #404a62; color: #404a62;
cursor: pointer; cursor: pointer;
&.current { &.current {
position: relative; position: relative;
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -1029,7 +907,6 @@ a { ...@@ -1029,7 +907,6 @@ a {
background-color: #275a9d; background-color: #275a9d;
} }
} }
&:last-child { &:last-child {
flex-grow: 1; flex-grow: 1;
flex-shrink: 1; flex-shrink: 1;
...@@ -1044,43 +921,35 @@ a { ...@@ -1044,43 +921,35 @@ a {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-content: stretch; align-content: stretch;
> .bg-list-header { > .bg-list-header {
margin-bottom: 16px; margin-bottom: 16px;
> .bg { > .bg {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px; border-radius: 6px;
padding: 10px 16px; padding: 10px 16px;
} }
> .header-content { > .header-content {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px; border-radius: 6px;
> .header-action { > .header-action {
padding: 16px; padding: 16px;
border-bottom: solid 1px #e6e9ef; border-bottom: solid 1px #e6e9ef;
} }
> .header-main { > .header-main {
padding: 16px; padding: 16px;
} }
} }
} }
> .bg-list-filter { > .bg-list-filter {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px; border-radius: 6px;
margin-bottom: 16px; margin-bottom: 16px;
} }
> .bg-list-top { > .bg-list-top {
margin-bottom: 16px; margin-bottom: 16px;
> .bg { > .bg {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
...@@ -1088,7 +957,6 @@ a { ...@@ -1088,7 +957,6 @@ a {
padding: 10px 16px; padding: 10px 16px;
} }
} }
> .bg-list-main { > .bg-list-main {
flex-grow: 1; flex-grow: 1;
height: 205px; height: 205px;
...@@ -1098,13 +966,11 @@ a { ...@@ -1098,13 +966,11 @@ a {
padding: 10px 16px 0; padding: 10px 16px 0;
box-sizing: border-box; box-sizing: border-box;
margin-bottom: 16px; margin-bottom: 16px;
> .main-action { > .main-action {
padding-bottom: 16px; padding-bottom: 16px;
margin: 4px 0 10px; margin: 4px 0 10px;
zoom: 1; zoom: 1;
position: relative; position: relative;
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -1113,7 +979,6 @@ a { ...@@ -1113,7 +979,6 @@ a {
left: -16px; left: -16px;
border-bottom: 1px solid #e6e9ef; border-bottom: 1px solid #e6e9ef;
} }
&::after { &::after {
content: ""; content: "";
display: block; display: block;
...@@ -1121,17 +986,14 @@ a { ...@@ -1121,17 +986,14 @@ a {
clear: both; clear: both;
} }
} }
> .main-table { > .main-table {
height: calc(100% - 36px - 16px * 2); height: calc(100% - 36px - 16px * 2);
} }
> .main-pagination { > .main-pagination {
height: 36px; height: 36px;
margin-top: 16px; margin-top: 16px;
text-align: center; text-align: center;
} }
&.has-action { &.has-action {
> .main-table { > .main-table {
height: calc(100% - 36px - 16px * 2 - 67px); height: calc(100% - 36px - 16px * 2 - 67px);
...@@ -1142,28 +1004,23 @@ a { ...@@ -1142,28 +1004,23 @@ a {
.bg-list-filter { .bg-list-filter {
overflow: hidden; overflow: hidden;
> .fiter-header { > .fiter-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 14px; padding: 14px;
border-bottom: 1px solid #e6e9ef; border-bottom: 1px solid #e6e9ef;
> .el-button { > .el-button {
width: 103px; width: 103px;
+ .el-button { + .el-button {
margin-left: 18px; margin-left: 18px;
} }
} }
> .filter-header-right { > .filter-header-right {
width: 320px; width: 320px;
text-align: right; text-align: right;
} }
} }
> .filter-content { > .filter-content {
// height: 136px; // height: 136px;
padding: 8px 14px; padding: 8px 14px;
...@@ -1171,68 +1028,53 @@ a { ...@@ -1171,68 +1028,53 @@ a {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-start; align-items: flex-start;
> .filter-action { > .filter-action {
flex-shrink: 0; flex-shrink: 0;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
.filters-right { .filters-right {
width: 240px; width: 240px;
margin-right: 10px; margin-right: 10px;
} }
> .el-button { > .el-button {
margin-top: 8px; margin-top: 8px;
margin-bottom: 8px; margin-bottom: 8px;
} }
} }
&.inline-filters { &.inline-filters {
min-height: unset !important; min-height: unset !important;
height: unset !important; height: unset !important;
> .filter-list { > .filter-list {
margin-left: 1em; margin-left: 1em;
> .bg-btns { > .bg-btns {
margin-right: 30px; margin-right: 30px;
} }
> .bg-filtrate { > .bg-filtrate {
display: inline-flex; display: inline-flex;
margin-right: 30px; margin-right: 30px;
> .bg-filtrate-text, > .bg-filtrate-text,
> .bg-filtrate-title { > .bg-filtrate-title {
width: unset; width: unset;
flex-shrink: 0; flex-shrink: 0;
} }
> .bg-filtrate-content { > .bg-filtrate-content {
flex-grow: 1; flex-grow: 1;
flex-shrink: 1; flex-shrink: 1;
> .el-input { > .el-input {
width: 160px; width: 160px;
} }
> .el-select { > .el-select {
width: 160px; width: 160px;
} }
> .el-date-editor { > .el-date-editor {
width: 260px; width: 260px;
&.el-date-editor--datetimerange { &.el-date-editor--datetimerange {
width: 400px; width: 400px;
} }
} }
> .el-radio-group { > .el-radio-group {
height: 36px; height: 36px;
> label { > label {
line-height: 36px; line-height: 36px;
} }
...@@ -1241,7 +1083,6 @@ a { ...@@ -1241,7 +1083,6 @@ a {
} }
} }
} }
&.show-more { &.show-more {
// min-height: 136px; // min-height: 136px;
height: unset; height: unset;
...@@ -1251,11 +1092,9 @@ a { ...@@ -1251,11 +1092,9 @@ a {
.bg-detail { .bg-detail {
padding: 0 16px; padding: 0 16px;
> .bg-detail-info { > .bg-detail-info {
margin-bottom: 16px; margin-bottom: 16px;
} }
> .bg-detail-tabs { > .bg-detail-tabs {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
...@@ -1266,7 +1105,6 @@ a { ...@@ -1266,7 +1105,6 @@ a {
.bg-edit { .bg-edit {
padding: 0 16px; padding: 0 16px;
.bg-edit-main { .bg-edit-main {
min-height: calc(100vh - 58px - 44px - 16px); min-height: calc(100vh - 58px - 44px - 16px);
background-color: #ffffff; background-color: #ffffff;
...@@ -1274,13 +1112,11 @@ a { ...@@ -1274,13 +1112,11 @@ a {
border-radius: 6px; border-radius: 6px;
padding: 16px; padding: 16px;
margin-bottom: 16px; margin-bottom: 16px;
> .main-action { > .main-action {
padding-bottom: 17px; padding-bottom: 17px;
margin-bottom: 16px; margin-bottom: 16px;
position: relative; position: relative;
zoom: 1; zoom: 1;
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -1289,7 +1125,6 @@ a { ...@@ -1289,7 +1125,6 @@ a {
left: -16px; left: -16px;
border-bottom: 1px solid #e6e9ef; border-bottom: 1px solid #e6e9ef;
} }
&::after { &::after {
content: ""; content: "";
display: block; display: block;
...@@ -1307,26 +1142,22 @@ a { ...@@ -1307,26 +1142,22 @@ a {
border: 1px solid #e3e5ef; border: 1px solid #e3e5ef;
border-radius: 6px; border-radius: 6px;
overflow: hidden; overflow: hidden;
> .el-input-number { > .el-input-number {
height: 36px; height: 36px;
flex-grow: 1; flex-grow: 1;
line-height: 36px; line-height: 36px;
.el-input__inner { .el-input__inner {
border: none; border: none;
border-radius: 0; border-radius: 0;
background-color: #f7f8f9; background-color: #f7f8f9;
text-align: left; text-align: left;
} }
.el-input-number__decrease, .el-input-number__decrease,
.el-input-number__increase { .el-input-number__increase {
border: none; border: none;
color: #515fe7; color: #515fe7;
} }
} }
> .bg-input-number__text { > .bg-input-number__text {
min-width: 50px; min-width: 50px;
padding: 0 15px; padding: 0 15px;
...@@ -1344,22 +1175,14 @@ a { ...@@ -1344,22 +1175,14 @@ a {
border-radius: 4px; border-radius: 4px;
margin: 10px; margin: 10px;
overflow: hidden; overflow: hidden;
> .card-title { > .card-title {
height: 48px; height: 48px;
padding: 0 15px; padding: 0 15px;
background-image: linear-gradient( background-image: linear-gradient(270deg, #ffffff 0%, #fef6f2 58%, #fcede4 100%), linear-gradient(#fcede4, #fcede4);
270deg,
#ffffff 0%,
#fef6f2 58%,
#fcede4 100%
),
linear-gradient(#fcede4, #fcede4);
background-blend-mode: normal, normal; background-blend-mode: normal, normal;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.title-text { .title-text {
flex-grow: 1; flex-grow: 1;
font-size: 18px; font-size: 18px;
...@@ -1368,7 +1191,6 @@ a { ...@@ -1368,7 +1191,6 @@ a {
color: #202531; color: #202531;
position: relative; position: relative;
padding-left: 15px; padding-left: 15px;
&::before { &::before {
content: ""; content: "";
width: 4px; width: 4px;
...@@ -1379,7 +1201,6 @@ a { ...@@ -1379,7 +1201,6 @@ a {
left: 0; left: 0;
} }
} }
.filter-list { .filter-list {
flex-shrink: 0; flex-shrink: 0;
display: flex; display: flex;
...@@ -1389,7 +1210,6 @@ a { ...@@ -1389,7 +1210,6 @@ a {
padding: 2px; padding: 2px;
border-radius: 5px; border-radius: 5px;
margin-left: 10px; margin-left: 10px;
> li { > li {
min-width: 50px; min-width: 50px;
height: 20px; height: 20px;
...@@ -1401,38 +1221,31 @@ a { ...@@ -1401,38 +1221,31 @@ a {
color: #909bb6; color: #909bb6;
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
&.current { &.current {
background-color: #ff6a00; background-color: #ff6a00;
color: #f8f9fd; color: #f8f9fd;
} }
} }
} }
.download-btn { .download-btn {
flex-shrink: 0; flex-shrink: 0;
margin-left: 10px; margin-left: 10px;
cursor: pointer; cursor: pointer;
> img { > img {
display: block; display: block;
} }
> .el-loading-mask { > .el-loading-mask {
cursor: not-allowed; cursor: not-allowed;
.el-loading-spinner { .el-loading-spinner {
margin-top: -10px; margin-top: -10px;
} }
} }
} }
} }
> .card-content { > .card-content {
height: calc(100% - 48px); height: calc(100% - 48px);
padding: 10px 15px; padding: 10px 15px;
box-sizing: border-box; box-sizing: border-box;
> * { > * {
width: 100% !important; width: 100% !important;
height: 100% !important; height: 100% !important;
...@@ -1442,19 +1255,15 @@ a { ...@@ -1442,19 +1255,15 @@ a {
.bg-pinboard-container { .bg-pinboard-container {
padding: 0 14px 10px; padding: 0 14px 10px;
> .bg-pinboard-content { > .bg-pinboard-content {
zoom: 1; zoom: 1;
margin: -10px -10px 0; margin: -10px -10px 0;
> .bg-layout-card { > .bg-layout-card {
float: left; float: left;
&.fr { &.fr {
float: right; float: right;
} }
} }
&:after { &:after {
content: ""; content: "";
display: block; display: block;
...@@ -1474,7 +1283,6 @@ a { ...@@ -1474,7 +1283,6 @@ a {
border-top: 1px solid #e3e5ef; border-top: 1px solid #e3e5ef;
border-left: 1px solid #e3e5ef; border-left: 1px solid #e3e5ef;
box-sizing: border-box; box-sizing: border-box;
> li { > li {
border-right: 1px solid #e3e5ef; border-right: 1px solid #e3e5ef;
border-bottom: 1px solid #e3e5ef; border-bottom: 1px solid #e3e5ef;
...@@ -1483,7 +1291,6 @@ a { ...@@ -1483,7 +1291,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
> span { > span {
flex: 0 0 auto; flex: 0 0 auto;
padding: 10px 16px; padding: 10px 16px;
...@@ -1491,21 +1298,18 @@ a { ...@@ -1491,21 +1298,18 @@ a {
font-size: 14px; font-size: 14px;
line-height: 24px; line-height: 24px;
color: #404a62; color: #404a62;
&:nth-child(1) { &:nth-child(1) {
flex-shrink: 0; flex-shrink: 0;
width: 240px; width: 240px;
background-color: #f7f8f9; background-color: #f7f8f9;
color: #616f94; color: #616f94;
} }
&:nth-child(2) { &:nth-child(2) {
flex-grow: 1; flex-grow: 1;
width: calc(100% - 240px); width: calc(100% - 240px);
border-left: 1px solid #e3e5ef; border-left: 1px solid #e3e5ef;
color: #404a62; color: #404a62;
position: relative; position: relative;
> .copy-btn { > .copy-btn {
position: absolute; position: absolute;
top: 50%; top: 50%;
...@@ -1526,7 +1330,6 @@ a { ...@@ -1526,7 +1330,6 @@ a {
} }
} }
} }
&:last-child { &:last-child {
flex-grow: 1; flex-grow: 1;
} }
...@@ -1536,7 +1339,6 @@ a { ...@@ -1536,7 +1339,6 @@ a {
.bg-btns { .bg-btns {
display: inline-block; display: inline-block;
> ul { > ul {
padding: 2px; padding: 2px;
background-color: #edeef0; background-color: #edeef0;
...@@ -1544,7 +1346,6 @@ a { ...@@ -1544,7 +1346,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> li { > li {
height: 24px; height: 24px;
padding: 0 16px; padding: 0 16px;
...@@ -1552,7 +1353,6 @@ a { ...@@ -1552,7 +1353,6 @@ a {
line-height: 24px; line-height: 24px;
color: #8890a7; color: #8890a7;
cursor: pointer; cursor: pointer;
&.is-active { &.is-active {
background-color: #2b4695; background-color: #2b4695;
border-radius: 4px; border-radius: 4px;
...@@ -1572,7 +1372,6 @@ a { ...@@ -1572,7 +1372,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
&::before { &::before {
content: ""; content: "";
width: 4px; width: 4px;
...@@ -1582,7 +1381,6 @@ a { ...@@ -1582,7 +1381,6 @@ a {
left: 0; left: 0;
background-color: #275a9d; background-color: #275a9d;
} }
> span { > span {
+ img { + img {
margin-left: 10px; margin-left: 10px;
...@@ -1597,7 +1395,6 @@ a { ...@@ -1597,7 +1395,6 @@ a {
color: #404a62; color: #404a62;
padding-left: 16px; padding-left: 16px;
position: relative; position: relative;
&::before { &::before {
content: ""; content: "";
width: 4px; width: 4px;
...@@ -1607,7 +1404,6 @@ a { ...@@ -1607,7 +1404,6 @@ a {
left: 0; left: 0;
background-color: #275a9d; background-color: #275a9d;
} }
> span { > span {
color: #e56600; color: #e56600;
} }
...@@ -1615,7 +1411,6 @@ a { ...@@ -1615,7 +1411,6 @@ a {
.bg-upload { .bg-upload {
text-align: left; text-align: left;
.trigger-content { .trigger-content {
width: 360px; width: 360px;
height: 180px; height: 180px;
...@@ -1627,14 +1422,12 @@ a { ...@@ -1627,14 +1422,12 @@ a {
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: stretch; align-items: stretch;
> .trigger-icon { > .trigger-icon {
font-size: 0; font-size: 0;
line-height: 1; line-height: 1;
text-align: center; text-align: center;
margin-bottom: 16px; margin-bottom: 16px;
} }
> .trigger-tip { > .trigger-tip {
font-size: 14px; font-size: 14px;
line-height: 21px; line-height: 21px;
...@@ -1643,7 +1436,6 @@ a { ...@@ -1643,7 +1436,6 @@ a {
margin: 0; margin: 0;
} }
} }
&.is-disabled { &.is-disabled {
.el-upload, .el-upload,
.el-upload__tip { .el-upload__tip {
...@@ -1652,21 +1444,16 @@ a { ...@@ -1652,21 +1444,16 @@ a {
line-height: 18px; line-height: 18px;
} }
} }
&.is-easy { &.is-easy {
> div { > div {
max-width: unset !important; max-width: unset !important;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> .el-upload-list { > .el-upload-list {
margin: 0 0 0 16px; margin: 0 0 0 16px;
> .el-upload-list__item { > .el-upload-list__item {
margin: 0; margin: 0;
& + .el-upload-list__item { & + .el-upload-list__item {
margin-top: 5px; margin-top: 5px;
} }
...@@ -1680,7 +1467,6 @@ a { ...@@ -1680,7 +1467,6 @@ a {
} }
.bg-upload-image { .bg-upload-image {
.trigger-content { .trigger-content {
> .image-trigger { > .image-trigger {
width: 144px; width: 144px;
...@@ -1688,12 +1474,10 @@ a { ...@@ -1688,12 +1474,10 @@ a {
border: 1px solid #dadee7; border: 1px solid #dadee7;
box-sizing: border-box; box-sizing: border-box;
position: relative; position: relative;
> img { > img {
display: block; display: block;
width: 100%; width: 100%;
} }
> .refresh-image { > .refresh-image {
position: absolute; position: absolute;
top: 0; top: 0;
...@@ -1707,14 +1491,12 @@ a { ...@@ -1707,14 +1491,12 @@ a {
font-size: 20px; font-size: 20px;
color: #fff; color: #fff;
} }
&:hover { &:hover {
> .refresh-image { > .refresh-image {
display: flex; display: flex;
} }
} }
} }
> .upload-trigger { > .upload-trigger {
width: 144px; width: 144px;
height: 144px; height: 144px;
...@@ -1726,12 +1508,10 @@ a { ...@@ -1726,12 +1508,10 @@ a {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
> .upload-icon { > .upload-icon {
width: 40px; width: 40px;
height: 40px; height: 40px;
position: relative; position: relative;
&::before { &::before {
content: ""; content: "";
width: 100%; width: 100%;
...@@ -1741,7 +1521,6 @@ a { ...@@ -1741,7 +1521,6 @@ a {
top: 19.5px; top: 19.5px;
left: 0; left: 0;
} }
&::after { &::after {
content: ""; content: "";
width: 1px; width: 1px;
...@@ -1760,30 +1539,25 @@ a { ...@@ -1760,30 +1539,25 @@ a {
> .el-form-item { > .el-form-item {
width: 100%; width: 100%;
margin-right: 0; margin-right: 0;
> label { > label {
color: #202531; color: #202531;
} }
> .el-form-item__content { > .el-form-item__content {
.el-input__inner, .el-input__inner,
.el-textarea__inner { .el-textarea__inner {
background-color: #f7f7f9; background-color: #f7f7f9;
} }
} }
&.inline { &.inline {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
> label { > label {
width: 10em; width: 10em;
flex-shrink: 0; flex-shrink: 0;
color: #616f94; color: #616f94;
text-align: right; text-align: right;
} }
> .el-form-item__content { > .el-form-item__content {
width: calc(100% - 7em); width: calc(100% - 7em);
flex-grow: 1; flex-grow: 1;
...@@ -1795,12 +1569,10 @@ a { ...@@ -1795,12 +1569,10 @@ a {
.auto-height { .auto-height {
.el-select-dropdown__item { .el-select-dropdown__item {
height: unset; height: unset;
.bg-option-title { .bg-option-title {
font-size: 14px; font-size: 14px;
color: #fff; color: #fff;
} }
.bg-option-sub-title { .bg-option-sub-title {
font-size: 12px; font-size: 12px;
color: #9ea2aa; color: #9ea2aa;
...@@ -1827,15 +1599,12 @@ a { ...@@ -1827,15 +1599,12 @@ a {
padding: 5px; padding: 5px;
border: 1px solid #dadee7; border: 1px solid #dadee7;
border-radius: 4px; border-radius: 4px;
> li { > li {
margin: 5px; margin: 5px;
> a { > a {
cursor: pointer; cursor: pointer;
margin-left: 5px; margin-left: 5px;
} }
&.tag-item { &.tag-item {
height: 36px; height: 36px;
padding: 5px 10px; padding: 5px 10px;
...@@ -1853,17 +1622,14 @@ a { ...@@ -1853,17 +1622,14 @@ a {
.bg-scroll { .bg-scroll {
overflow: hidden auto; overflow: hidden auto;
&::-webkit-scrollbar { &::-webkit-scrollbar {
width: 16px; width: 16px;
} }
/* &::-webkit-scrollbar-track { /* &::-webkit-scrollbar-track {
border-radius: 8px; border-radius: 8px;
box-shadow: 8px 0 0 #f4f4f4 inset; box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} */ } */
&::-webkit-scrollbar-thumb { &::-webkit-scrollbar-thumb {
border-radius: 8px; border-radius: 8px;
box-shadow: 8px 0 0 #c1c7d7 inset; box-shadow: 8px 0 0 #c1c7d7 inset;
...@@ -1873,17 +1639,14 @@ a { ...@@ -1873,17 +1639,14 @@ a {
.bg-no-scroll { .bg-no-scroll {
overflow: hidden auto; overflow: hidden auto;
&::-webkit-scrollbar { &::-webkit-scrollbar {
width: 0px; width: 0px;
} }
/* &::-webkit-scrollbar-track { /* &::-webkit-scrollbar-track {
border-radius: 8px; border-radius: 8px;
box-shadow: 8px 0 0 #f4f4f4 inset; box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0); border: 4px solid rgba(0, 0, 0, 0);
} */ } */
&::-webkit-scrollbar-thumb { &::-webkit-scrollbar-thumb {
border-radius: 0px; border-radius: 0px;
border: 0px solid rgba(0, 0, 0, 0); border: 0px solid rgba(0, 0, 0, 0);
...@@ -1902,8 +1665,7 @@ a { ...@@ -1902,8 +1665,7 @@ a {
background-color: #2b4695; background-color: #2b4695;
cursor: pointer; cursor: pointer;
user-select: none; user-select: none;
transition: all .3s; transition: all 0.3s;
> .label { > .label {
font-size: 12px; font-size: 12px;
font-weight: 400; font-weight: 400;
...@@ -1911,7 +1673,6 @@ a { ...@@ -1911,7 +1673,6 @@ a {
position: absolute; position: absolute;
color: #fff; color: #fff;
} }
> .circle { > .circle {
width: 16px; width: 16px;
height: 16px; height: 16px;
...@@ -1919,9 +1680,8 @@ a { ...@@ -1919,9 +1680,8 @@ a {
position: absolute; position: absolute;
// top: 2px; // top: 2px;
background-color: #fff; background-color: #fff;
transition: all .3s, transition: all 0.3s;
} }
&.disabled { &.disabled {
cursor: not-allowed; cursor: not-allowed;
} }
...@@ -1931,13 +1691,11 @@ a { ...@@ -1931,13 +1691,11 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> .bg-filtrate { > .bg-filtrate {
> * { > * {
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
} }
+ .bg-filtrate { + .bg-filtrate {
margin-left: 30px; margin-left: 30px;
} }
...@@ -1946,28 +1704,23 @@ a { ...@@ -1946,28 +1704,23 @@ a {
.bg-rich-text { .bg-rich-text {
text-align: left; text-align: left;
.w-e-toolbar, .w-e-toolbar,
.w-e-text-container { .w-e-text-container {
border: 1px solid #dadee7 !important; border: 1px solid #dadee7 !important;
width: 100%; width: 100%;
z-index: 1!important; z-index: 1 !important;
} }
.w-e-toolbar { .w-e-toolbar {
border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0;
z-index: 2!important; z-index: 2 !important;
} }
.w-e-text-container { .w-e-text-container {
border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px;
border-top: none !important; border-top: none !important;
} }
.w-e-text { .w-e-text {
overflow-y: auto; overflow-y: auto;
} }
.onlyread { .onlyread {
height: 300px; height: 300px;
padding: 10px; padding: 10px;
...@@ -1983,7 +1736,6 @@ a { ...@@ -1983,7 +1736,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
> span { > span {
// width: 4em; // width: 4em;
height: 24px; height: 24px;
...@@ -1995,13 +1747,11 @@ a { ...@@ -1995,13 +1747,11 @@ a {
margin: 8px 0; margin: 8px 0;
// min-width: 115px; // min-width: 115px;
} }
> ul { > ul {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> li { > li {
background-color: #fff; background-color: #fff;
// border: solid 1px #fff; // border: solid 1px #fff;
...@@ -2011,7 +1761,6 @@ a { ...@@ -2011,7 +1761,6 @@ a {
color: #202531; color: #202531;
cursor: pointer; cursor: pointer;
margin: 6px 4px; margin: 6px 4px;
&.current { &.current {
background-color: #2b4695; background-color: #2b4695;
// border: solid 1px #718ad6; // border: solid 1px #718ad6;
...@@ -2026,22 +1775,18 @@ a { ...@@ -2026,22 +1775,18 @@ a {
display: inline-flex; display: inline-flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
> a { > a {
height: 20px; height: 20px;
font-size: 15px; font-size: 15px;
line-height: 20px; line-height: 20px;
color: #8890a7; color: #8890a7;
cursor: pointer; cursor: pointer;
&.current { &.current {
color: #515fe7; color: #515fe7;
} }
& + a { & + a {
position: relative; position: relative;
margin-left: 30px; margin-left: 30px;
&::before { &::before {
content: ""; content: "";
width: 1px; width: 1px;
...@@ -2069,7 +1814,6 @@ a { ...@@ -2069,7 +1814,6 @@ a {
.el-carousel__indicators--horizontal { .el-carousel__indicators--horizontal {
bottom: 40px; bottom: 40px;
} }
.el-carousel__indicator--horizontal { .el-carousel__indicator--horizontal {
padding: 0; padding: 0;
width: 48px; width: 48px;
...@@ -2077,60 +1821,50 @@ a { ...@@ -2077,60 +1821,50 @@ a {
background-color: #ffffff; background-color: #ffffff;
opacity: 0.3; opacity: 0.3;
margin: 0 16px; margin: 0 16px;
> button { > button {
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: transparent; background-color: transparent;
} }
&.is-active { &.is-active {
opacity: 0.8; opacity: 0.8;
} }
} }
&.hide-indicators { &.hide-indicators {
.el-carousel__indicators { .el-carousel__indicators {
display: none; display: none;
} }
} }
&.hide-bar { &.hide-bar {
.el-carousel__indicators--horizontal { .el-carousel__indicators--horizontal {
bottom: 20px; bottom: 20px;
} }
.el-carousel__indicator--horizontal { .el-carousel__indicator--horizontal {
padding: 0; padding: 0;
width: 24px; width: 24px;
height: 4px; height: 4px;
background-color: #d0d8f1; background-color: #d0d8f1;
margin: 0 8px; margin: 0 8px;
&.is-active { &.is-active {
background-color: #2b4695; background-color: #2b4695;
} }
} }
} }
.el-carousel__indicators--vertical { .el-carousel__indicators--vertical {
right: 20px; right: 20px;
.el-carousel__indicator--vertical { .el-carousel__indicator--vertical {
padding: 0; padding: 0;
height: 24px; height: 24px;
width: 4px; width: 4px;
background-color: #d0d8f1; background-color: #d0d8f1;
margin: 8px 0; margin: 8px 0;
> button { > button {
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: transparent; background-color: transparent;
} }
&.is-active { &.is-active {
background-color: #2b4695; background-color: #2b4695;
} }
...@@ -2153,13 +1887,11 @@ a { ...@@ -2153,13 +1887,11 @@ a {
line-height: 48px; line-height: 48px;
color: #202531; color: #202531;
text-align: center; text-align: center;
> span { > span {
display: inline-block; display: inline-block;
height: 48px; height: 48px;
padding: 0 64px; padding: 0 64px;
position: relative; position: relative;
&::before, &::before,
&::after { &::after {
content: ""; content: "";
...@@ -2169,16 +1901,13 @@ a { ...@@ -2169,16 +1901,13 @@ a {
height: 1px; height: 1px;
background-color: #b0bee8; background-color: #b0bee8;
} }
&::before { &::before {
left: 0; left: 0;
} }
&::after { &::after {
right: 0; right: 0;
} }
} }
&.light-text { &.light-text {
color: #fff; color: #fff;
} }
...@@ -2207,7 +1936,7 @@ a { ...@@ -2207,7 +1936,7 @@ a {
li:hover { li:hover {
color: #3759be; color: #3759be;
} }
} }
.el-input__wrapper { .el-input__wrapper {
background-color: #fff; background-color: #fff;
} }
...@@ -2224,11 +1953,9 @@ a { ...@@ -2224,11 +1953,9 @@ a {
.bg-card { .bg-card {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 1px 4px 0px box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
rgba(0, 7, 101, 0.15); border-radius: 6px;
border-radius: 6px;
margin-bottom: 16px; margin-bottom: 16px;
.card-title { .card-title {
padding: 8px 16px; padding: 8px 16px;
border-bottom: 1px solid #ebedf2; border-bottom: 1px solid #ebedf2;
...@@ -2236,7 +1963,6 @@ a { ...@@ -2236,7 +1963,6 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
.title-icon { .title-icon {
width: 20px; width: 20px;
height: 20px; height: 20px;
...@@ -2246,20 +1972,17 @@ a { ...@@ -2246,20 +1972,17 @@ a {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-right: 12px; margin-right: 12px;
.bg-icon { .bg-icon {
font-size: 14px; font-size: 14px;
color: #fff; color: #fff;
} }
} }
.title-text {
.title-text{
font-size: 18px; font-size: 18px;
line-height: 36px; line-height: 36px;
color: #202531; color: #202531;
} }
} }
.card-content { .card-content {
padding: 24px; padding: 24px;
} }
...@@ -2279,7 +2002,6 @@ a { ...@@ -2279,7 +2002,6 @@ a {
width: 398px; width: 398px;
justify-content: end; justify-content: end;
display: flex; display: flex;
.el-input { .el-input {
width: 280px; width: 280px;
height: 36px; height: 36px;
...@@ -2307,7 +2029,7 @@ a { ...@@ -2307,7 +2029,7 @@ a {
padding: 10px 15px; padding: 10px 15px;
line-height: 1; line-height: 1;
&:active, &:active,
&:hover{ &:hover {
background-color: #fff; background-color: #fff;
color: #3759be; color: #3759be;
} }
...@@ -2333,6 +2055,7 @@ a { ...@@ -2333,6 +2055,7 @@ a {
padding: 24px 16px 8px; padding: 24px 16px 8px;
} }
} }
// 表格操作按钮组 // 表格操作按钮组
.bg-table-btns { .bg-table-btns {
position: relative; position: relative;
...@@ -2351,7 +2074,6 @@ a { ...@@ -2351,7 +2074,6 @@ a {
border-radius: 4px; border-radius: 4px;
border: solid 1px #e6e9ef; border: solid 1px #e6e9ef;
width: 88px; width: 88px;
.bg-table-btn { .bg-table-btn {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
...@@ -2367,7 +2089,6 @@ a { ...@@ -2367,7 +2089,6 @@ a {
background-color: #f2f3f7; background-color: #f2f3f7;
color: #202531; color: #202531;
} }
&.disabled { &.disabled {
color: #a9b1c7; color: #a9b1c7;
} }
...@@ -2375,7 +2096,6 @@ a { ...@@ -2375,7 +2096,6 @@ a {
display: none; display: none;
} }
} }
&::before { &::before {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -2393,11 +2113,11 @@ a { ...@@ -2393,11 +2113,11 @@ a {
width: 100%; width: 100%;
} }
} }
.bg-permission { .bg-permission {
border-top: solid 1px #dadee7; border-top: solid 1px #dadee7;
border-left: solid 1px #dadee7; border-left: solid 1px #dadee7;
width: 100%; width: 100%;
.el-checkbox { .el-checkbox {
width: 100%; width: 100%;
.el-checkbox__label { .el-checkbox__label {
...@@ -2412,8 +2132,7 @@ a { ...@@ -2412,8 +2132,7 @@ a {
color: #202531; color: #202531;
} }
} }
> .permission-header {
>.permission-header {
padding: 0 16px; padding: 0 16px;
height: 48px; height: 48px;
line-height: 48px; line-height: 48px;
...@@ -2421,21 +2140,18 @@ a { ...@@ -2421,21 +2140,18 @@ a {
border-bottom: solid 1px #dadee7; border-bottom: solid 1px #dadee7;
border-right: solid 1px #dadee7; border-right: solid 1px #dadee7;
} }
> .permission-null {
>.permission-null {
padding: 8px 16px; padding: 8px 16px;
border-bottom: solid 1px #dadee7; border-bottom: solid 1px #dadee7;
border-right: solid 1px #dadee7; border-right: solid 1px #dadee7;
> p {
>p {
font-size: 14px; font-size: 14px;
line-height: 16px; line-height: 16px;
color: #333; color: #333;
text-align: center; text-align: center;
} }
} }
> .bg-permission-option--list {
>.bg-permission-option--list {
width: 100%; width: 100%;
} }
} }
...@@ -2444,8 +2160,7 @@ a { ...@@ -2444,8 +2160,7 @@ a {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
> .bg-permission-option--self {
>.bg-permission-option--self {
flex-shrink: 0; flex-shrink: 0;
padding: 8px 16px; padding: 8px 16px;
border-right: solid 1px #dadee7; border-right: solid 1px #dadee7;
...@@ -2454,15 +2169,13 @@ a { ...@@ -2454,15 +2169,13 @@ a {
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
} }
> .bg-permission-option--list {
>.bg-permission-option--list {
flex-shrink: 0; flex-shrink: 0;
} }
} }
.bg-permission-option--self { .bg-permission-option--self {
width: 128px; width: 128px;
&.full-option { &.full-option {
width: 100%; width: 100%;
} }
...@@ -2470,7 +2183,6 @@ a { ...@@ -2470,7 +2183,6 @@ a {
.bg-permission-option--list { .bg-permission-option--list {
width: calc(100% - 128px); width: calc(100% - 128px);
&.flex-wrap { &.flex-wrap {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
...@@ -2478,9 +2190,8 @@ a { ...@@ -2478,9 +2190,8 @@ a {
align-items: stretch; align-items: stretch;
border-right: solid 1px #dadee7; border-right: solid 1px #dadee7;
border-bottom: solid 1px #dadee7; border-bottom: solid 1px #dadee7;
> .bg-permission-option {
>.bg-permission-option { > .bg-permission-option--self {
>.bg-permission-option--self {
width: 128px; width: 128px;
border-right: none; border-right: none;
border-bottom: none; border-bottom: none;
...@@ -2488,6 +2199,7 @@ a { ...@@ -2488,6 +2199,7 @@ a {
} }
} }
} }
.bg-upload-image-dialog { .bg-upload-image-dialog {
width: 650px; width: 650px;
} }
\ No newline at end of file
<template>
<div
class="gap-title"
:class="{
'has-line': hasLine,
}">
<span>{{ title }}</span>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: "",
},
hasLine: {
type: Boolean,
default: false,
},
},
components: {},
data() {
return {};
},
watch: {},
computed: {},
created() {},
mounted() {},
methods: {},
};
</script>
<style scoped>
.gap-title {
height: 18px;
font-size: 18px;
font-weight: 600;
color: #202531;
display: flex;
align-items: center;
}
.gap-title::before {
content: "";
display: inline-block;
margin-right: 8px;
width: 4px;
height: 16px;
background-color: #2b4695;
border-radius: 2px;
}
.gap-title.has-line::after {
content: "";
display: inline-block;
flex: 1;
border-top: 1px dashed #dadee7;
margin-left: 8px;
}
</style>
<template>
<el-button size="default" @click="goBack">返回</el-button>
</template>
<script setup>
import { useRouter } from "vue-router";
const router = useRouter();
const props = defineProps({
href: {
type: Object,
default: null,
},
});
const goBack = () => {
if (props.href) {
router.push(props.href);
} else {
router.go(-1);
}
};
</script>
<style lang="scss" scoped></style>
// 通知方式
export const METHODS = {
1: '钉钉',
2: '短信'
}
// 可以新增的数量
export const ADD_NUM = 5
\ No newline at end of file
<template>
<el-form
:model="state.form"
ref="form"
:rules="state.rules"
label-width="80px"
:disabled="disabled"
>
<el-form-item label="通知方式" prop="method">
<el-checkbox-group v-model="state.form.method">
<el-checkbox v-for="(value, key) in METHODS" :key="key" :label="key">
{{ value }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="" prop="lists" class="user-table bg-scroll">
<el-table :data="state.form.lists" stripe border>
<el-table-column type="index" label="序号" width="60px">
</el-table-column>
<el-table-column
v-for="header in headers"
:prop="header.prop"
:key="header.prop"
:label="header.label"
:width="header.width"
>
<template #default="{ $index }">
<div v-if="header.prop == 'user_id'">
<el-select
v-model="state.form.lists[$index].user_id"
placeholder="请选择"
filterable
@change="($event) => chooseUser($event, $index)"
>
<el-option
v-for="item in userOptions($index)"
:key="item.user_id"
:label="item.user_id"
:value="item.user_id"
>
</el-option>
</el-select>
</div>
<div v-else>
<el-input
v-model="state.form.lists[$index][header.prop]"
placeholder="请输入"
></el-input>
</div>
</template>
</el-table-column>
<el-table-column prop="" label="操作" width="125px">
<template #default="{ $index }">
<div class="table-operation">
<el-button
link
type="primary"
@click="Add($index)"
:disabled="
userLists.length <= state.form.lists.length ||
addTrue >= ADD_NUM
"
>
新增
</el-button>
<span class="line"></span>
<el-button
link
type="primary"
@click="Remove($index)"
:disabled="state.form.lists.length == 1"
>
删除
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, watch, ref, computed } from "vue";
import { METHODS, ADD_NUM } from "./env";
const props = defineProps({
disabled: {
type: Boolean,
default: false,
},
});
const form = ref(null);
// 表单数据
const state = reactive({
form: {
method: [],
lists: [],
},
rules: {
method: [
{
type: "array",
required: true,
message: "请至少选择一个通知方式",
trigger: "change",
},
],
},
});
// 已选中的用户id列表
const selectedUser = computed(() => {
return state.form.lists.map((e) => e.user_id) || [];
});
// 表头
const headers = [
{
prop: "user_id",
label: "账号",
},
{
prop: "user_name",
label: "姓名",
},
{
prop: "phone",
label: "联系方式",
},
];
// 立即下发
const Submit = (cb = null) => {
form.value.validate((valid) => {
if (valid) {
console.log(state.form);
cb && cb();
} else {
return false;
}
});
};
// 已经新增的数量记录
const addTrue = ref(0);
// 获取远程用户列表
const userLists = ref([]);
const getUserLists = () => {
userLists.value = [
{
user_id: 1,
user_name: 11,
phone: 13000000001,
},
{
user_id: 2,
user_name: 22,
phone: 13000000002,
},
{
user_id: 3,
user_name: 33,
phone: 13000000003,
},
{
user_id: 4,
user_name: 44,
phone: 13000000004,
},
{
user_id: 5,
user_name: 55,
phone: 13000000005,
},
{
user_id: 6,
user_name: 66,
phone: 13000000006,
},
{
user_id: 7,
user_name: 77,
phone: 13000000007,
},
];
};
// 格式化处理用户下拉列表,去除已经选择的用户,并将当前选中的也显示到列表中
const userOptions = computed(() => {
return (index) => {
let user_id = state.form.lists[index].user_id;
let s_u_ids = [...selectedUser.value];
if (user_id) {
let i = s_u_ids.findIndex((e) => e == user_id);
s_u_ids.splice(i, 1);
}
return userLists.value.filter((e) => !s_u_ids.includes(e.user_id));
};
});
// 表格新增
const Add = (index) => {
// 新增上限
if (addTrue.value >= ADD_NUM) return;
state.form.lists.splice(index + 1, 0, {
user_id: "",
user_name: "",
phone: "",
});
addTrue.value += 1;
};
// 表格删除
const Remove = (index) => {
state.form.lists.splice(index, 1);
addTrue.value -= 1;
};
// 初始化加载基础数据和获取用户下拉列表
const init = (history) => {
getUserLists();
state.form.method = history?.method || [];
state.form.lists = history?.lists || [];
// 如果没有默认下发用户则创建一条空数据
if (state.form.lists.length == 0) {
Add(0);
}
setTimeout(() => {
form.value.clearValidate();
});
};
// 选择用户操作
const chooseUser = ($event, index) => {
let user = userLists.value.find(
(e) => e.user_id == state.form.lists[index].user_id
);
state.form.lists[index].user_name = user.user_name;
state.form.lists[index].phone = user.phone;
};
defineExpose({
Submit,
form,
init,
});
watch(
() => state.form.lists,
(n) => {
console.log(n);
},
{ deep: true }
);
</script>
<style lang="scss" scoped>
.table-operation {
display: flex;
align-items: center;
.line {
width: 1px;
height: 14px;
background-color: #c1c7d7;
margin: 0 16px;
display: inline-block;
}
}
.user-table {
max-height: 345px;
:deep(.el-form-item__content) {
margin-left: 0 !important;
.el-table thead th {
background-color: #f5f6f9;
}
}
}
</style>
<template>
<el-dialog
v-model="show"
width="804px"
top="10vh"
:close-on-click-modal="false"
:before-close="beforeClose"
>
<template #header>
<GapTitle title="手动下发"></GapTitle>
</template>
<div class="manual-distribution">
<Form ref="form" />
</div>
<template #footer>
<el-button size="default" @click="Close">关闭</el-button>
<el-button type="primary" size="default" @click="Submit">
立即下发
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import GapTitle from "@/components/gap-title.vue";
import Form from "./form.vue";
import { computed, nextTick, ref, watch } from "vue";
const props = defineProps({
// 显示隐藏开关
visible: {
type: Boolean,
default: false,
},
// 关闭前调用
beforeClose: {
type: Function,
default: null,
},
// 默认数据展示
/*
{
methd:['1','2'],
lists:[
{
user_id:'1111',
user_name:'11111111',
phone:'13011111111'
}
]
}
*/
history: {
type: Object,
default: null,
},
});
const emits = defineEmits(["update:visible"]);
const form = ref(null);
// 关闭调用
const Close = async () => {
form.value.form.resetFields();
emits("update:visible", false);
};
const show = computed({
get() {
return props.visible;
},
set() {
Close();
},
});
// 监听是否开启弹窗,并将已经填写的数据配置
watch(
() => show.value,
async (n) => {
if (!n) return;
await nextTick();
form.value.init(props.history);
},
{
immediate: true,
}
);
// 关闭前调用
const beforeClose = () => {
props.beforeClose && props.beforeClose();
Close();
};
// 立即下发
const Submit = () => {
form.value.Submit(() => {
Close();
});
};
</script>
<style lang="scss" scoped>
.manual-distribution {
text-align: left;
padding: 16px 16px 0;
}
</style>
export const STATUS_OBJ = {
success: "已恢复",
error: '未恢复'
}
export const PUSH_STATUS = {
success: '成功',
error: '失败'
}
\ No newline at end of file
<template>
<div class="warn-detail">
<div class="info">
<Info :labelData="labelData" :valueData="valueData" />
</div>
<div class="tabs">
<Tab :tabs="tabs" />
</div>
</div>
</template>
<script setup>
import Info from "./info.vue";
import Tab from "./tab.vue";
const props = defineProps({
labelData: {
type: Array,
default: () => [],
},
valueData: {
type: Object,
default: () => ({}),
},
tabs: {
type: Array,
default: () => [],
},
});
</script>
<style lang="scss" scoped>
.warn-detail {
max-width: 1072px;
width: 100%;
height: 100%;
.tabs{
margin-top: 30px;
}
}
</style>
<template>
<div>
<div class="info-list" v-for="(list, index) in labelData" :key="`warn-${index}`">
<div class="info-item" v-for="(item, i) in list" :key="`warn-${index}-${i}`">
<div class="label">
{{ item.label }}
</div>
<div class="value">
<div class="value-body">
<span v-if="item.prop == 'status'">
<slot name="status" :item="item" :valueData="valueData" v-if="slots.status" />
<span class="status-body" v-else>
<span class="status" :class="`status-${valueData.status}`"></span>
<span>{{ STATUS_OBJ[valueData[item.prop]] }}</span>
</span>
</span>
<span v-else>
<slot name="value" :item="item" :valueData="valueData" v-if="slots.value" />
<span v-else>{{ valueData[item.prop] }}</span>
</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useSlots, computed } from "vue";
import { STATUS_OBJ } from "./env.js";
const slots = useSlots();
const props = defineProps({
labelData: {
type: Array,
default: () => ({}),
},
valueData: {
type: Object,
default: () => ({}),
},
status_obj: {
type: Object,
default: null,
},
});
const status_obj = computed(() => {
return props.status_obj || STATUS_OBJ;
});
</script>
<style lang="scss" scoped>
.info-list {
display: flex;
align-items: center;
border-top: 1px solid #dadee7;
border-left: 1px solid #dadee7;
&:last-of-type {
border-bottom: 1px solid #dadee7;
}
.info-item {
display: flex;
align-items: center;
flex: 1;
height: 48px;
line-height: 46px;
font-size: 14px;
color: #404a62;
.label {
height: 100%;
width: 144px;
background-color: #f7f7f9;
border-right: 1px solid #dadee7;
padding: 0 16px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
.value {
height: 100%;
flex: 1;
border-right: 1px solid #dadee7;
position: relative;
.value-body {
padding: 0 16px;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
.status {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 8px;
$statusObj: (
success: #48ad97,
error: #d75138,
);
@each $status, $color in $statusObj {
&-#{$status} {
background-color: $color;
}
}
}
.status-body {
display: flex;
align-items: center;
}
}
}
}
}
</style>
<template>
<el-tabs v-model="activeTab" tab-position="top">
<el-tab-pane v-for="item in tabs" :key="item.prop" :label="item.label" :name="item.prop">
<bg-table
ref="listtable"
:headers="headers[item.prop]"
:rows="item.lists"
height="100%"
:isIndex="true"
:stripe="true">
<template #person="{ row }">
<span>{{ row.person.join(",") }}</span>
</template>
<template #status="{ row }">
<span v-if="item.prop == 'push'">
<span class="status" :class="`status-${row.status}`"></span>
<span>{{ STATUS_OBJ[row.status] }}</span>
</span>
<span v-else :class="`tab-${row.status}`">
{{ STATUS_OBJ[row.status] }}
</span>
</template>
</bg-table>
</el-tab-pane>
</el-tabs>
</template>
<script setup>
import { ref } from "vue";
import { STATUS_OBJ } from "./env.js";
const activeTab = ref("push");
const props = defineProps({
tabs: {
type: Array,
default: () => [],
},
});
const headers = {
push: [
{
prop: "method",
label: "通知方式",
},
{
prop: "person",
label: "接收人员",
},
{
prop: "push_time",
label: "推送时间",
},
{
prop: "push_type",
label: "推送类型",
},
{
prop: "status",
label: "状态",
},
],
dispose: [
{
prop: "status",
label: "状态",
},
{
prop: "feedback",
label: "处置反馈",
},
{
prop: "feedback_time",
label: "处置反馈",
},
{
prop: "feedback_person",
label: "反馈人员",
},
],
};
</script>
<style lang="scss" scoped>
$statusObj: (
success: #48ad97,
error: #d75138,
);
.tab {
@each $status, $color in $statusObj {
&-#{$status} {
color: $color;
}
}
}
.status {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 8px;
@each $status, $color in $statusObj {
&-#{$status} {
background-color: $color;
}
}
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="directoryForm"
:rules="directoryFormRules"
ref="directoryRef"
style="max-width: 80%">
<el-form-item label="上级目录" prop="p_organization_id" v-if="formType === 'create'">
<el-tree-select
v-model="directoryForm.p_organization_id"
:data="orgData"
:props="treeProps"
:render-after-expand="false"
:check-strictly="true"
:disabled="directoryForm.level"
style="width: 80%" />
<el-form-item label="" style="padding-left: 16px">
<el-checkbox v-model="directoryForm.level" @change="isTop" label="顶级" />
</el-form-item>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="directoryForm.name" />
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted, onBeforeMount, nextTick } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
const props = defineProps({
formType: {
type: String,
default: "create", //false 新增 true 编辑
},
});
const directoryForm = reactive({
p_organization_id: "",
name: "",
level: false,
});
const directoryFormRules = reactive({
p_organization_id: [{ required: true, message: "请输入上级目录", trigger: "blur" }],
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
});
const directoryRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!directoryRef) return;
await directoryRef.value.validate((valid, fields) => {
if (valid) {
emit("action", directoryForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!directoryRef) return;
directoryRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(directoryForm, data);
};
const orgData = ref([]);
const treeProps = {
label: "name",
children: "Child",
value: "organization_id",
disabled: "disabled",
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
const orgDataTemp = res.data.data || [];
orgDataTemp.shift();
orgData.value = filterOrg(orgDataTemp);
} else {
ElMessage.error(res.data.data);
}
});
};
const filterOrg = (data) => {
if (data.length > 0) {
data.forEach((item) => {
item.disabled = item.data_type === 0 ? false : true;
if (item.Child) {
filterOrg(item.Child);
} else {
return;
}
});
}
return data;
};
const isTop = (data) => {
directoryForm.p_organization_id = data ? " " : ""; //空格绕过表单非空校验
};
onBeforeMount(() => {
getOrgTree();
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template> <template>
<div>组织管理</div> <div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="flex_row">
<div class="flex_left bgc_white">
<div class="tree_header">政务组织</div>
<div class="tree_content">
<div class="search">
<el-input v-model="search" placeholder="请输入组织名称搜索" :prefix-icon="Search" @input="searchChange" />
</div>
<div class="tree">
<tree ref="orgTree" @action="treeAction" @select="treeSelect"></tree>
</div>
</div>
</div>
<div class="flex_right">
<div class="info_container bgc_white">
<div class="title">
<span class="icon_box">
<span class="step_icon">
<bg-icon icon="#bg-ic-file"></bg-icon>
</span>
<span> 基本信息 </span>
</span>
<span class="can_click_text detail_btn" v-if="selectTreeDataType === 1" @click="toOrgDetail">
查看详情
<bg-icon style="font-size: 8px; color: #95a3ca; vertical-align: middle" icon="#bg-ic-arrow-right" />
</span>
</div>
<bg-info class="info_box" v-if="selectTreeDataType === 1" :data="baseInfo"></bg-info>
<bg-info class="info_box" v-if="selectTreeDataType === 2" :data="baseInfo2"></bg-info>
</div>
<div class="main_container bgc_white">
<bg-filter-group @search="changeSearch" v-model="filter.key_word" placeholder="请输入关键字">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="addAccount">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
{{ selectTreeDataType === 1 ? "新增组织管理员" : "新增平台用户" }}
</el-button>
<el-button @click="deleteBatch"> 批量删除 </el-button>
<el-button @click="resetPsd"> 重置密码 </el-button>
<span class="header_info"
>已选择<span style="color: #202531; font-weight: bold">{{ selected.length }}</span
></span
>
<span class="header_info can_click_text" @click="clearSelected">清空</span>
</div>
</template>
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">启用状态</span>
<el-select v-model="filter.state" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in stateOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container apaas_scroll">
<bg-table
ref="dataTable"
:headers="headers"
:rows="tableRows"
:isIndex="true"
canEdit
canEditFlag="canSelect"
:stripe="true"
:select="true"
@selectAc="selectRows">
<template v-slot:system_account="{ row }">
<span @click="goDetail(row)" class="can_click_text">
{{ row.system_account }}
</span>
</template>
<template v-slot:state="{ row }">
<bg-switch
@click="stateChange(row)"
:labels="['否', '是']"
:values="[0, 1]"
v-model="row.state"
:disabled="row.is_admin == 4"></bg-switch>
</template>
<template v-slot:action="{ row }">
<bg-table-btn :disabled="row.is_admin == 4" @click="editAccount(row)" class="can_click_text">
编辑
</bg-table-btn>
<bg-table-btn
:disabled="row.is_admin == 4 && userInfo.is_admin !== 4"
@click="editPsdAccount(row)"
class="can_click_text">
修改密码
</bg-table-btn>
<bg-table-btn :disabled="row.is_admin == 4" @click="deleteAccount(row)" class="can_click_text">
删除
</bg-table-btn>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
</div>
</div>
<el-dialog
v-model="dialogDirectory"
:title="action === 'create' ? '新增目录' : '编辑目录'"
width="758px"
:before-close="handleCloseDirectory"
destroy-on-close>
<div class="dialog_form">
<directoryForm
ref="directoryFormRef"
:form-type="directoryFormType"
@action="getDirectoryFromData"></directoryForm>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseDirectory">取消</el-button>
<el-button type="primary" @click="saveDirectory">保存</el-button>
</span>
</template>
</el-dialog>
<el-dialog
v-model="dialogOrg"
:title="action === 'create' ? '新增组织' : '编辑组织'"
width="758px"
:before-close="handleCloseOrg"
destroy-on-close>
<div class="dialog_form">
<orgForm ref="orgFormRef" :form-type="orgFormType" @action="getOrgFormData"></orgForm>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseOrg">取消</el-button>
<el-button type="primary" @click="saveOrg">保存</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="dialogDelNode" title="删除" width="520px" :before-close="handleCloseDelNode">
<div class="dialog_form">确认删除吗?</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseDelNode">取消</el-button>
<el-button type="primary" @click="confirmDelNode">确认</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="deleteRowFlag" title="删除" width="520px" :before-close="handleCloseRowDelete">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.system_account }}</span
>做删除操作。
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseRowDelete">取消</el-button>
<el-button type="primary" @click="deleteRowConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="editFlag" title="修改密码" width="520px" :before-close="handleCloseEdit">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.system_account }}</span
>做修改密码操作,修改后旧密码将无法登录。
</div>
<div>
<el-form
:label-position="'right'"
label-width="120px"
:model="passwordForm"
:rules="passwordFormRules"
ref="passwordRef"
style="max-width: 80%">
<el-form-item label="新密码" prop="password">
<el-input
v-model="passwordForm.password"
:type="password_eye ? 'text' : 'password'"
placeholder="请输入密码">
<template #suffix>
<bg-icon @click="password_eye = !password_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="确认新密码" prop="confirm_password">
<el-input
v-model="passwordForm.confirm_password"
:type="confirm_eye ? 'text' : 'password'"
placeholder="请确认新密码">
<template #suffix>
<bg-icon @click="confirm_eye = !confirm_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseEdit">取消</el-button>
<el-button type="primary" @click="editConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="deleteFlag" title="删除" width="520px" :before-close="handleCloseDelete">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; mdeleteconfirmargin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedName.join("、") }}</span
>做删除操作。
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseDelete">取消</el-button>
<el-button type="primary" @click="deleteConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="resetFlag" title="重置密码" width="520px" :before-close="handleCloseReset">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedName.join("、") }}</span
>做重置密码操作。
</div>
<div>重置密码为123456,是否继续?</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseReset">取消</el-button>
<el-button type="primary" @click="resetConfirm">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template> </template>
<script setup></script> <script setup>
import { Search } from "@element-plus/icons-vue";
import { computed, onBeforeMount, nextTick, reactive, ref, toRefs } from "@vue/runtime-core";
import { useRouter } from "vue-router";
import tree from "./tree.vue";
import directoryForm from "./directory-form.vue";
import orgForm from "./org-form.vue";
import CryptoJS from "crypto-js";
import { downloadFileFormatNew } from "@/services/helper";
import store from "@/store";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
<style lang="scss" scoped></style> const dataTable = ref(null);
const toOrgDetail = () => {
router.push({
path: "/authority/organization/org-detail",
query: {
id: selectOrgNode.value.organization_id,
},
});
};
const baseInfo = reactive([
{
name: "组织类型",
value: "",
nameWidth: 130,
},
{
name: "组织代码",
value: "",
nameWidth: 130,
},
{
name: "组织名称",
value: "",
callback: toOrgDetail,
nameWidth: 130,
},
{
name: "创建时间",
value: "",
nameWidth: 130,
},
{
name: "组织管理员数量",
value: "",
nameWidth: 130,
},
{
name: "业务系统数量",
value: "",
nameWidth: 130,
},
]);
const baseInfo2 = reactive([
{
name: "组织名称",
value: "",
nameWidth: 130,
},
{
name: "组织代码",
value: "",
nameWidth: 130,
},
{
name: "用户数",
value: "",
nameWidth: 130,
full: true,
},
]);
const headers = reactive([
{
label: "账号",
prop: "system_account",
minWidth: 150,
},
{
label: "手机号",
prop: "contact_phone",
minWidth: 150,
},
{
label: "角色",
prop: "system_role",
minWidth: 150,
},
{
label: "创建时间",
prop: "created_time",
minWidth: 200,
},
{
label: "是否启用",
prop: "state",
width: 80,
},
{
label: "操作",
prop: "action",
width: 220,
fixed: "right",
},
]);
const stateOptions = ref([
{
name: "全部",
value: "",
},
{
name: "启用",
value: "1",
},
{
name: "禁用",
value: "0",
},
]);
const tableRows = ref([]);
const tableTotal = ref(0);
const orgTree = ref(null);
const selectTreeData = ref(null);
const actionTreeData = ref(null);
const selectTreeDataType = ref(2);
const selectOrgNode = ref(null);
const dialogDelNode = ref(false);
const router = useRouter();
const filter = reactive({
state: "",
key_word: "",
page: 1,
limit: 10,
});
const deleteFlag = ref(false);
const deleteRowFlag = ref(false);
const resetFlag = ref(false);
const selectedRow = ref({});
const selected = ref([]);
const selectedName = ref([]);
const editFlag = ref(false);
const password_eye = ref(false);
const confirm_eye = ref(false);
const passwordRef = ref(null);
const passwordForm = reactive({
password: "",
confirm_password: "",
});
const search = ref("");
const userInfo = computed(() => {
return store.state.userInfo;
});
const validatePass = (rule, value, callback) => {
if (value !== passwordForm.password) {
callback(new Error("密码输入不一致"));
} else {
callback();
}
};
const passwordFormRules = reactive({
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" },
],
confirm_password: [
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
});
const addAccount = () => {
if (selectTreeDataType.value === 1) {
router.push({
path: "/authority/organization/org-user",
query: {
orgId: selectOrgNode.value.organization_id,
},
});
} else {
router.push({
path: "/authority/organization/platform-user",
});
}
};
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.key_word = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
const filterClear = () => {
filter.state = "";
filter.key_word = "";
filter.limit = 10;
filter.page = 1;
changePage(1);
}; // 重置筛选项
const dialogDirectory = ref(false);
const directoryFormType = ref("create");
const orgFormType = ref("create");
const handleCloseDirectory = () => {
dialogDirectory.value = false;
};
const directoryFormRef = ref(null);
const saveDirectory = () => {
directoryFormRef.value.submitForm();
};
//新增/编剧目录
const getDirectoryFromData = (data) => {
if (directoryFormType.value === "create") {
const params = {
p_organization_id: data.level ? "" : data.p_organization_id,
name: data.name,
data_type: 0,
};
axios.post(`/apaas/system/v5/org/add`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(res.data.data.id);
} else {
ElMessage.error(res.data.data);
}
handleCloseDirectory();
});
} else if (directoryFormType.value === "edit") {
const params = {
name: data.name,
data_type: 0,
};
axios.put(`/apaas/system/v5/org/${actionTreeData.value.id}`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(actionTreeData.value.id);
} else {
ElMessage.error(res.data.data);
}
handleCloseDirectory();
});
}
};
const dialogOrg = ref(false);
const handleCloseOrg = () => {
dialogOrg.value = false;
};
const orgFormRef = ref(null);
const saveOrg = () => {
orgFormRef.value.submitForm();
};
//新增/编辑组织
const getOrgFormData = (data) => {
if (orgFormType.value === "create") {
const params = {
p_organization_id: data.level ? "" : data.p_organization_id,
name: data.name,
organization_code: data.organization_code,
description: data.description,
attachment:
data.attachment && data.attachment.length > 0 ? data.attachment.map((item) => item.url).join(",") : "",
data_type: 1,
};
axios.post(`/apaas/system/v5/org/add`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(res.data.data.id);
} else {
ElMessage.error(res.data.data);
}
handleCloseOrg();
});
} else if (orgFormType.value === "edit") {
const params = {
// p_organization_id: data.level ? "" : data.p_organization_id,
name: data.name,
organization_code: data.organization_code,
description: data.description,
attachment:
data.attachment && data.attachment.length > 0 ? data.attachment.map((item) => item.url).join(",") : "",
data_type: 1,
};
axios.put(`/apaas/system/v5/org/${actionTreeData.value.id}`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(actionTreeData.value.id);
} else {
ElMessage.error(res.data.data);
}
handleCloseOrg();
});
}
};
const handleCloseDelNode = () => {
dialogDelNode.value = false;
};
//删除目录/组织
const confirmDelNode = () => {
axios.delete(`/apaas/system/v5/org/${actionTreeData.value.id}`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(actionTreeData.value.id === selectTreeData.value.id ? null : selectTreeData.value.id);
} else {
ElMessage.error(res.data.data);
}
handleCloseDelNode();
});
};
const moveOrg = (params) => {
axios.put(`/apaas/system/v5/org/sort`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
orgTree.value.getOrgTree(selectTreeData.value.id);
} else {
ElMessage.error(res.data.data);
}
});
};
const action = ref("create");
const treeAction = (data) => {
action.value = data.action;
if (data.action === "create" || data.action === "edit") {
if (data.type === "org") {
orgFormType.value = data.action;
dialogOrg.value = true;
nextTick(() => {
if (data.data) {
if (data.action === "edit") {
orgFormRef.value.setForm({
name: data.data.value.name,
p_organization_id: data.data.value.p_organization_id,
level: data.data.value.p_organization_id ? false : true,
organization_code: data.data.value.organization_code,
description: data.data.value.description,
attachment: data.data.value.attachment.split(",").map((i) => {
return { name: downloadFileFormatNew(i), url: i };
}),
});
} else if (data.action === "create") {
orgFormRef.value.setForm({ p_organization_id: data.data.value.organization_id });
}
}
});
} else {
directoryFormType.value = data.action;
dialogDirectory.value = true;
nextTick(() => {
if (data.data) {
if (data.action === "edit") {
directoryFormRef.value.setForm({ name: data.data.value.name });
} else if (data.action === "create") {
directoryFormRef.value.setForm({ p_organization_id: data.data.value.organization_id });
}
}
});
}
} else if (data.action === "delete") {
dialogDelNode.value = true;
} else if (data.action === "mvup" || data.action === "mvdown") {
moveOrg(data.data);
}
};
const treeSelect = (data) => {
if (data.type === "action") {
actionTreeData.value = data.data.value;
} else {
selectTreeData.value = data.data.value;
}
if (data.type === "click" && (data.data.value.data_type === 1 || data.data.value.data_type === 2)) {
selectTreeDataType.value = data.data.value.data_type;
selectOrgNode.value = data.data.value;
getTableRows();
}
};
const getTableRows = () => {
let params = {
...filter,
organization_id: selectTreeData.value.organization_id,
data_type: selectTreeData.value.data_type,
};
axios
.get(`/apaas/system/v5/org/detail`, {
params,
})
.then((res) => {
if (res.data.code == 200) {
tableRows.value = (res.data.data.org_users.data || []).map((item) => {
item.system_role = item.system_role ? item.system_role.join("") : "-";
return item;
});
tableRows.value.forEach((e) => {
if (e.is_admin == 4 && userInfo.value.is_admin != 4) {
e.canSelect = 1;
} else {
e.canSelect = 0;
}
});
tableTotal.value = res.data.data.org_users.total;
if (params.data_type === 1) {
baseInfo[0].value = res.data.data.org_info.organization_type;
baseInfo[1].value = res.data.data.org_info.organization_code;
baseInfo[2].value = res.data.data.org_info.name;
baseInfo[3].value = res.data.data.org_info.created_time;
baseInfo[4].value = res.data.data.org_info.org_admin_number;
baseInfo[5].value = res.data.data.org_info.business_system_number;
} else {
baseInfo2[0].value = res.data.data.org_info.name;
baseInfo2[1].value = res.data.data.org_info.organization_code;
baseInfo2[2].value = res.data.data.org_info.platform_users_number;
}
console.log(baseInfo);
} else {
ElMessage.error(res.data.data);
}
});
};
const searchChange = (val) => {
orgTree.value.filterTree(val);
};
const goDetail = (params) => {
router.push({
path: "/authority/organization/user-detail",
query: {
id: params.id,
},
});
};
const stateChange = (row) => {
if (row.is_admin == 4) {
return;
}
const state = row.state.toString();
axios.post(`/apaas/system/v5/user/state/${row.id}/${state}`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
row.state = row.state == 0 ? 1 : 0;
}
});
};
const editPsdAccount = (data) => {
selectedRow.value = data;
editFlag.value = true;
};
const handleCloseEdit = () => {
if (!passwordRef) return;
passwordRef.value.resetFields();
editFlag.value = false;
};
const editConfirm = () => {
if (!passwordRef) return;
passwordRef.value.validate((valid, fields) => {
if (valid) {
axios
.post(`/apaas/system/v5/user/editpwd`, {
id: selectedRow.value.id,
password: CryptoJS.AES.encrypt(passwordForm.password, "swuE9cmCZQwrkYRV").toString(),
})
.then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
} else {
ElMessage.error(res.data.data);
}
handleCloseEdit();
});
}
});
};
const deleteAccount = (data) => {
if (data.state === 0) {
selectedRow.value = data;
deleteRowFlag.value = true;
} else {
ElMessage.error("当前状态已启用,不可删除!");
}
};
const handleCloseRowDelete = () => {
deleteRowFlag.value = false;
};
const deleteRowConfirm = () => {
axios.delete(`/apaas/system/v5/user/delete`, { data: { ids: [selectedRow.value.id] } }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseRowDelete();
});
};
const editAccount = (data) => {
if (selectTreeDataType.value === 1) {
router.push({
path: "/authority/organization/org-user/edit",
query: {
id: data.id,
orgId: selectOrgNode.value.organization_id,
},
});
} else {
router.push({
path: "/authority/organization/platform-user/edit",
query: {
id: data.id,
},
});
}
};
const handleCloseDelete = () => {
deleteFlag.value = false;
};
const deleteConfirm = () => {
const ids = selected.value.map((item) => item.id);
axios.delete(`/apaas/system/v5/user/delete`, { data: { ids: ids } }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseDelete();
});
};
const deleteBatch = () => {
if (selectedName.value.length > 0) {
deleteFlag.value = true;
} else {
ElMessage.error("请先选择需要操作的数据!");
}
};
const handleCloseReset = () => {
resetFlag.value = false;
};
const resetPsd = () => {
if (selectedName.value.length > 0) {
resetFlag.value = true;
} else {
ElMessage.error("请先选择需要操作的数据!");
}
};
const resetConfirm = () => {
const ids = selected.value.map((item) => item.id);
axios.post(`/apaas/system/v5/user/resetpwd`, { ids: ids }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseReset();
});
};
const selectRows = (data) => {
selected.value = data.selection;
selectedName.value = data.selection.map((item) => item.system_account);
};
const clearSelected = () => {
dataTable.value.clearTable();
};
onBeforeMount(() => {});
</script>
<style scoped>
.tree_header {
height: 40px;
line-height: 40px;
background-color: #f7f7f9;
border-radius: 6px 6px 0px 0px;
font-size: 16px;
letter-spacing: 0px;
color: #202531;
padding-left: 16px;
}
.tree_content {
overflow: hidden;
height: calc(100% - 45px);
}
.search {
padding: 16px;
}
.tree {
overflow: hidden auto;
height: calc(100% - 65px);
/* padding: 5px; */
}
.tree :deep() .el-tree-node > .el-tree-node__children {
overflow: unset;
}
.flex_right {
display: flex;
flex-direction: column;
}
.info_container {
padding: 15px;
margin-bottom: 10px;
}
.title {
font-size: 18px;
color: #202531;
font-weight: bold;
margin-bottom: 10px;
max-width: 960px;
display: flex;
justify-content: space-between;
align-items: center;
}
.detail_btn {
font-size: 14px;
font-weight: normal;
}
.icon_box {
display: flex;
align-items: center;
}
.step_icon {
display: inline-block;
width: 20px;
height: 20px;
text-align: center;
line-height: 20px;
background-color: #2a4aa7;
color: #fff;
border-radius: 4px;
font-size: 14px;
margin-right: 8px;
}
.info_box {
max-width: 960px;
}
.main_container {
flex: 1;
overflow: hidden;
}
.filter-group .left-filter {
flex: 1;
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.filter-group .right-action {
width: 144px;
padding-bottom: 16px;
}
.filter-group .right-action .el-button {
width: 64px;
}
.table_container {
height: calc(100% - 20px);
overflow: auto;
padding: 0 16px;
}
.bg-pagination {
bottom: unset;
}
.dialog_form {
padding: 24px 8px 6px;
}
</style>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content apaas_scroll">
<div class="info_row">
<div class="title">
<div><span class="icon_box"></span> 基础信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="info_box">
<bg-info :data="baseInfo"></bg-info>
</div>
<div class="org_file info_box">
<div class="pl-1">组织附件</div>
<div>
<div class="file_item pl-1" v-for="(item, index) in fileList" :key="'file_' + index">
<span><bg-icon style="font-size: 24px" :icon="'#bg-ic-' + formatFile(item)"></bg-icon></span>
<span class="file_name">{{ downloadFileFormatNew(item) }}</span>
<span class="fr download_btn">
<el-button type="primary" @click="downloadFile(item)"
><bg-icon icon="#bg-ic-to-bottom"></bg-icon>下载</el-button
>
</span>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="title">
<div><span class="icon_box"></span> 业务系统信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content info_box">
<bg-table ref="bgTable" :headers="headers" :rows="tableRows" :isIndex="true" :stripe="true"> </bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, toRefs, ref, computed, onBeforeMount } from "vue";
import { useRoute } from "vue-router";
import { downloadFileFormatNew } from "@/services/helper";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const baseInfo = reactive([
{
name: "组织名称",
value: "",
nameWidth: 130,
},
{
name: "组织代码",
value: "",
nameWidth: 130,
},
{
name: "组织管理员数量",
value: "",
nameWidth: 130,
},
{
name: "业务系统数量",
value: "",
nameWidth: 130,
},
{
name: "组织描述",
value: "",
nameWidth: 130,
},
]);
const headers = reactive([
{
label: "业务系统名称",
prop: "business_name",
},
{
label: "是否启用",
prop: "state",
},
{
label: "业务系统账号",
prop: "system_account",
},
]);
const tableRows = ref([]);
const fileList = ref([]);
const filter = reactive({
page: 1,
limit: 10,
});
const tableTotal = ref(0);
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
const changePage = (page) => {
filter.page = page;
getSystemInfo();
};
const downloadFile = (data) => {
const a = document.createElement("a"); // 创建a标签
a.setAttribute("download", ""); // download属性
a.setAttribute("href", data); // href链接
a.click(); // 自执行点击事件
};
const formatFile = (url) => {
const file = url.split(".")[1];
let icon = "";
if ("docx".indexOf(file) !== -1) {
icon = "c-file-doc";
} else if ("xlsx".indexOf(file) !== -1) {
icon = "c-file-xlsx";
} else if ("pdf".indexOf(file) !== -1) {
icon = "c-file-pdf";
} else if ("txt".indexOf(file) !== -1) {
icon = "c-file-txt";
} else if ("zip".indexOf(file) !== -1) {
icon = "c-file-zip";
} else if ("jpg,png".indexOf(file) !== -1) {
icon = "c-file-image";
} else {
icon = "txt";
}
return icon;
};
const getDetail = () => {
axios
.get(`/apaas/system/v5/org/detail?organization_id=${route.query.id}&key_word=&state=&limit=&page=&data_type=1`)
.then((res) => {
if (res.data.code == 200) {
const detail = res.data.data.org_info;
baseInfo[0].value = detail.name;
baseInfo[1].value = detail.organization_code;
baseInfo[2].value = detail.org_admin_number;
baseInfo[3].value = detail.business_system_number;
baseInfo[4].value = detail.description;
fileList.value = detail.attachment ? detail.attachment.split(",") : [];
} else {
ElMessage.error(res.data.data);
}
});
};
const getSystemInfo = () => {
const params = { ...filter, organization_id: route.query.id };
axios.get(`/apaas/system/v5/org/business/msg`, { params }).then((res) => {
if (res.data.code == 200) {
tableRows.value = res.data.data || [];
tableTotal.value = res.data.total;
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
if (route.query.id) {
getDetail();
getSystemInfo();
}
});
</script>
<style scoped>
.page_content {
padding: 15px;
overflow: auto;
font-size: 14px;
color: #202531;
}
.info_content {
/* display: flex; */
}
.org_file {
margin-top: 15px;
}
.file_item {
height: 48px;
line-height: 48px;
background-color: #fafafa;
border-radius: 4px;
font-size: 14px;
margin-bottom: 8px;
}
.file_name {
padding-left: 10px;
color: #202531;
}
.download_btn {
padding-right: 4px;
}
.info_row {
margin-bottom: 40px;
}
.img_box {
width: 120px\;;
}
.info_box {
width: 60%;
}
.title {
font-size: 18px;
color: #1a1a1a;
font-weight: bold;
margin-bottom: 10px;
display: flex;
align-items: center;
}
.dashed_line {
flex: 1;
height: 1px;
margin: 0 10px;
border-bottom: dashed 1px #dadee7;
}
.icon_box {
display: inline-block;
width: 4px;
height: 14px;
background-color: #3759be;
border-radius: 2px;
margin-right: 5px;
}
.pagination_box {
position: sticky;
position: -webkit-sticky;
margin-top: 16px;
bottom: -15px;
background-color: #fff;
z-index: 1024;
height: 40px;
line-height: 40px;
padding-top: 5px;
}
.bg-pagination {
margin-top: 0px;
}
.info_content :deep() .bg-table .empty_container {
height: 160px;
padding-top: 25px;
}
</style>
<template>
<el-form :label-position="'right'" label-width="120px" :model="orgForm" :rules="formRules" ref="orgRef">
<el-form-item label="上级目录" prop="p_organization_id" v-if="formType === 'create'">
<el-tree-select
v-model="orgForm.p_organization_id"
:data="orgData"
:props="treeProps"
:render-after-expand="false"
:check-strictly="true"
:disabled="orgForm.level"
style="width: 80%" />
<el-form-item label="" style="padding-left: 16px">
<el-checkbox v-model="orgForm.level" @change="isTop" label="顶级" />
</el-form-item>
</el-form-item>
<el-form-item label="政务组织名称" prop="name">
<el-input v-model="orgForm.name" />
</el-form-item>
<el-form-item label="组织代码" prop="organization_code">
<el-input v-model="orgForm.organization_code" />
</el-form-item>
<el-form-item label="组织介绍" prop="description">
<el-input type="textarea" :rows="3" v-model="orgForm.description" maxlength="300" show-word-limit />
</el-form-item>
<el-form-item label="组织附件" prop="logo">
<bg-upload
v-model="orgForm.attachment"
customTips
:limit="3"
:fileTypes="['zip', 'rar', 'doc', 'docx', 'xlsx', 'xls', 'png', 'jpg']"
:otherInfo="'最多可上传三个附件,可上传zip,rar,doc,docx,xlsx,xls,png,jpg,可上传营业执照和相关协议文件等'">
<span>将文件拖到此处,或 点击上传</span>
</bg-upload>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted, onBeforeMount } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
const props = defineProps({
formType: {
type: String,
default: "create", //false 新增 true 编辑
},
});
const orgForm = reactive({
p_organization_id: "",
level: false,
name: "",
organization_code: "",
description: "",
attachment: [],
});
const checkCode = (rule, value, callback) => {
var reg = /^[a-zA-Z0-9]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和数字"));
} else {
callback();
}
};
const checkName = (rule, value, callback) => {
var reg = /^[a-zA-Z\u4e00-\u9fa5]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和汉字"));
} else {
callback();
}
};
const formRules = reactive({
p_organization_id: [{ required: true, message: "输入上级目录", trigger: "blur" }],
name: [
{ required: true, message: "请输入组织名称", trigger: "blur" },
{ max: 50, message: "组织名称最大长度为50位", trigger: "blur" },
{ validator: checkName, trigger: "blur" },
],
organization_code: [
{ required: true, message: "请输入组织代码", trigger: "blur" },
{ max: 18, message: "组织代码最大长度为18位", trigger: "blur" },
{ validator: checkCode, trigger: "blur" },
],
});
const orgRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!orgRef) return;
await orgRef.value.validate((valid, fields) => {
if (valid) {
emit("action", orgForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!orgRef) return;
orgRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(orgForm, data);
};
const orgData = ref([]);
const treeProps = {
label: "name",
children: "Child",
value: "organization_id",
disabled: "disabled",
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
const orgDataTemp = res.data.data || [];
orgDataTemp.shift();
orgData.value = filterOrg(orgDataTemp);
} else {
ElMessage.error(res.data.data);
}
});
};
const filterOrg = (data) => {
if (data.length > 0) {
data.forEach((item) => {
item.disabled = item.data_type === 0 ? false : true;
if (item.Child) {
filterOrg(item.Child);
} else {
return;
}
});
}
return data;
};
const isTop = (data) => {
orgForm.p_organization_id = data ? " " : ""; //空格绕过表单非空校验
};
onBeforeMount(() => {
getOrgTree();
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content flex_cloumn">
<div class="content_top apaas_scroll">
<div class="content_process">
<div>
<el-steps :active="step">
<el-step title="" :class="{ process_complete: step > 1 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 0"
><bg-icon class="step_icon" icon="#bg-ic-file"></bg-icon
></span>
<span class="circle" v-else></span>
账号信息
</span>
</template>
</el-step>
<el-step title="" :class="{ process_complete: step > 2 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 1"
><bg-icon class="step_icon" icon="#bg-ic-file-staff"></bg-icon
></span>
<span class="circle" v-else></span>
个人信息
</span>
</template>
</el-step>
<el-step title="">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 2"
><bg-icon class="step_icon" icon="#bg-ic-file-success"></bg-icon
></span>
<span class="circle" v-else></span>
完成
</span>
</template>
</el-step>
</el-steps>
</div>
</div>
<div class="content_main">
<orgAccountForm
v-show="step === 1"
:form-type="route.query.id ? true : false"
:id="route.query.id"
ref="orgAccountRef"
@action="getOrgAccountFormData"></orgAccountForm>
<orgPersonForm v-show="step === 2" ref="orgPersonRef" @action="getOrgPersonFormData"></orgPersonForm>
<div class="process_end" v-show="step === 3">
<div>
<div>
<img v-if="successFlag" src="@/assets/imgs/img_data-complete.png" alt="" />
<img v-else src="@/assets/imgs/img_data-fail.png" alt="" />
</div>
<div class="font_bold">
{{
route.query.id
? successFlag
? "组织用户编辑成功"
: "组织用户编辑失败"
: successFlag
? "组织用户新增成功"
: "组织用户新增失败"
}}
</div>
<el-button @click="cancel">返回列表</el-button>
<el-button v-if="!route.query.id" type="primary" @click="continueCreate">继续创建</el-button>
</div>
</div>
</div>
</div>
<div class="content_bottom" v-if="step !== 3">
<div v-show="step === 1">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="nextStep">下一步</el-button>
</div>
<div v-show="step === 2">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="previousStep">上一步</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router";
import orgAccountForm from "./org-account-form.vue";
import orgPersonForm from "./org-person-form.vue";
import { reactive, ref, onBeforeMount, toRefs, computed, onBeforeUnmount, onMounted } from "vue";
import CryptoJS from "crypto-js";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const router = useRouter();
const step = ref(1);
const orgAccountRef = ref(null);
const orgPersonRef = ref(null);
const formData = reactive({
organization_id: "",
select_role: "",
logo: [],
system_account: "",
contact_phone: "",
password: "",
confirm_password: "",
state: 1,
contact_name: "",
document_type: "",
document_number: "",
contact_email: "",
remark: "",
}); //账号信息表单+个人信息表单
const successFlag = ref(false);
const orgId = ref("");
// 下一步
const nextStep = () => {
orgAccountRef.value.submitForm();
};
//账号信息表单检验触发事件 data为null 校验失败
const getOrgAccountFormData = (data) => {
if (data) {
Object.assign(formData, data);
step.value = 2;
} else {
}
};
//个人信息表单检验触发事件 data为null 校验失败
const getOrgPersonFormData = (data) => {
if (data) {
if (data) {
Object.assign(formData, data);
if (route.query.id) {
let params = {
...formData,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
};
params.document_type = params.document_type == "" ? 0 : params.document_type;
axios.put(`/apaas/system/v5/org/update/user/${route.query.id}`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
} else {
const params = {
...formData,
// organization_id: orgId.value,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
is_admin: 2,
password: CryptoJS.AES.encrypt(formData.password, "swuE9cmCZQwrkYRV").toString(),
};
params.document_type = params.document_type == "" ? 0 : params.document_type;
axios.post(`/apaas/system/v5/org/add/user`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
}
}
}
};
//上一步
const previousStep = () => {
step.value--;
};
//提交表单
const submit = () => {
orgPersonRef.value.submitForm();
};
//继续创建 清空表单
const continueCreate = () => {
orgAccountRef.value.clearForm();
orgPersonRef.value.clearForm();
step.value = 1;
successFlag.value = false;
};
//取消
const cancel = () => {
router.push({
path: "/system/organization",
query: {
id: route.query.orgId,
},
});
};
const getDetail = () => {
axios.get(`/apaas/system/v5/org/user/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const form = res.data.data;
orgAccountRef.value.setForm({
organization_id: form.organization_id,
select_role: form.select_role,
logo: form.logo ? [{ url: form.logo }] : [],
system_account: form.system_account,
contact_phone: form.contact_phone,
state: form.state,
});
orgPersonRef.value.setForm({
contact_name: form.contact_name,
document_type: form.document_type ? form.document_type : "",
document_number: form.document_number,
contact_email: form.contact_email,
remark: form.remark,
});
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
if (route.query.id) {
getDetail();
}
});
onMounted(() => {});
</script>
<style scoped>
.flex_cloumn {
display: flex;
flex-direction: column;
}
.content_top {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
}
/* .content_top::-webkit-scrollbar {
width: 5px;
height: 0px;
}
.content_top::-webkit-scrollbar-thumb {
background: #dedede;
border-radius: 10px;
height: 0px;
}
.content_top::-webkit-scrollbar-track {
background: transparent;
border-radius: 2px;
} */
.content_bottom {
height: 68px;
line-height: 68px;
text-align: right;
padding: 0 20px;
border-top: 1px solid #e6e9ef;
}
.content_process {
border-bottom: 1px solid #e6e9ef;
padding: 38px 16%;
}
.content_main {
flex: 1;
padding: 30px;
box-sizing: border-box;
}
.process_desc {
background-color: #fff;
display: inline-block;
position: absolute;
padding: 0 5px;
font-size: 18px;
color: #202531;
font-weight: bold;
}
.process_desc img {
height: 25px;
width: 25px;
vertical-align: middle;
}
.process_end {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.process_end div {
text-align: center;
}
.step_icon {
color: #fff;
font-weight: 600;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.icon_box {
display: inline-block;
background-color: #2b4695;
width: 48px;
height: 48px;
border-radius: 99px;
position: relative;
border: 3px solid #b0bee8;
vertical-align: middle;
}
.circle {
display: inline-block;
background-color: #a9b1c7;
width: 24px;
height: 24px;
border-radius: 99px;
position: relative;
border: 4px solid #e6e9ef;
vertical-align: middle;
}
.content_process :deep() .el-step.is-horizontal .el-step__line {
height: 4px;
}
.content_process :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 50%, #e6e9ef 50%);
}
.process_complete :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 100%, #e6e9ef 0%);
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="orgAccountForm"
:rules="orgAccountFormRules"
ref="orgformAccountRef"
style="max-width: 66%">
<el-form-item label="所属组织" prop="organization_id">
<el-tree-select
v-model="orgAccountForm.organization_id"
:data="orgData"
:props="treeProps"
:render-after-expand="false"
:disabled="true"
style="width: 100%" />
<!-- <el-input v-model="orgAccountForm.organization_id" /> -->
</el-form-item>
<el-form-item label="角色" prop="select_role" v-if="!formType">
<el-select
v-model="orgAccountForm.select_role"
multiple
placeholder="请选择角色"
:disabled="true"
style="width: 100%">
<el-option v-for="item in roleList" :key="item.role_id" :label="item.role_name" :value="item.role_id" />
</el-select>
</el-form-item>
<el-form-item label="头像" prop="logo">
<bg-upload-image
v-model="orgAccountForm.logo"
:showTips="true"
:limit="1"
:fileSize="500"
:fileSizeUnit="'KB'"
listType="picture-card"
:accept="['.jpg', '.jpeg', '.png']"
customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item>
<el-form-item label="账号" prop="system_account">
<el-input v-model="orgAccountForm.system_account" />
</el-form-item>
<el-form-item label="手机号" prop="contact_phone">
<el-input v-model="orgAccountForm.contact_phone" />
</el-form-item>
<el-form-item label="密码" prop="password" v-if="!formType">
<el-input type="password" v-model="orgAccountForm.password" />
</el-form-item>
<el-form-item label="确认密码" prop="confirm_password" v-if="!formType">
<el-input type="password" v-model="orgAccountForm.confirm_password" />
</el-form-item>
<el-form-item label="是否启用" prop="state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="orgAccountForm.state"></bg-switch>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted, onBeforeMount } from "vue";
import { useRoute } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
const route = useRoute();
const props = defineProps({
formType: {
type: Boolean,
default: false, //false 新增 true 编辑
},
id: {
type: String,
default: "",
},
});
const orgAccountForm = reactive({
organization_id: "",
select_role: "",
logo: [],
system_account: "",
contact_phone: "",
password: "",
confirm_password: "",
state: 1,
});
const validatePass = (rule, value, callback) => {
if (value !== orgAccountForm.password) {
callback(new Error("密码输入不一致"));
} else {
callback();
}
};
const validateSystemAccount = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和数字"));
} else {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), system_account: value };
} else {
params = { system_account: value };
}
axios.post(`/apaas/system/v5/user/check/account`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const checkPhone = (rule, value, callback) => {
var phone_ruler = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
setTimeout(() => {
if (!phone_ruler.test(value) && value.length !== 0) {
callback(new Error("请输入正确的手机号码"));
} else {
callback();
}
});
};
const checkPhoneRepet = (rule, value, callback) => {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), contact_phone: value };
} else {
params = { id: 0, contact_phone: value };
}
axios.post(`/apaas/system/v5/org/check`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
};
const orgAccountFormRules = reactive({
organization_id: [{ required: true, message: "请选择组织", trigger: "blur" }],
select_role: [{ required: true, message: "请选择角色", trigger: "blur" }],
system_account: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ min: 4, message: "帐号长度不得低于4个字符", trigger: "blur" },
{ max: 20, message: "帐号最大长度为20个字符", trigger: "blur" },
{ validator: validateSystemAccount, trigger: "blur" },
],
contact_phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
{ validator: checkPhone, trigger: "blur" },
{ validator: checkPhoneRepet, trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" },
],
confirm_password: [
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
});
const orgformAccountRef = ref(null);
const emit = defineEmits(["action"]);
const roleList = ref([]);
const submitForm = async () => {
if (!orgformAccountRef) return;
await orgformAccountRef.value.validate((valid, fields) => {
if (valid) {
emit("action", orgAccountForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!orgformAccountRef) return;
orgformAccountRef.value.resetFields();
orgAccountForm.select_role = [roleList.value[0].role_id];
};
const setForm = (data) => {
Object.assign(orgAccountForm, data);
};
const orgData = ref([]);
const treeProps = {
label: "name",
children: "Child",
value: "organization_id",
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
orgData.value = res.data.data || [];
} else {
ElMessage.error(res.data.data);
}
});
};
const getRoleList = () => {
axios.get(`/apaas/system/v5/org/select/role?is_admin=2`).then((res) => {
if (res.data.code == 200) {
roleList.value = res.data.data;
orgAccountForm.select_role = [roleList.value[0].role_id];
} else {
}
});
};
onBeforeMount(() => {
getOrgTree();
getRoleList();
orgAccountForm.organization_id = route.query.orgId;
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="orgPersonForm"
:rules="orgPersonFormRules"
ref="orgPersonFormRef"
style="max-width: 66%">
<el-form-item label="联系人姓名" prop="contact_name">
<el-input v-model="orgPersonForm.contact_name" />
</el-form-item>
<el-form-item label="证件类型" prop="document_type">
<el-select v-model="orgPersonForm.document_type" placeholder="请选择证件类型" style="width: 100%">
<el-option v-for="item in documentTypeList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="证件号" prop="document_number">
<el-input v-model="orgPersonForm.document_number" />
</el-form-item>
<el-form-item label="联系人邮箱" prop="contact_email">
<el-input v-model="orgPersonForm.contact_email" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="3" v-model="orgPersonForm.remark" />
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted } from "vue";
const orgPersonForm = reactive({
contact_name: "",
document_type: "",
document_number: "",
contact_email: "",
remark: "",
});
const documentTypeList = ref([
{
label: "身份证",
value: 1,
},
]);
const orgPersonFormRules = reactive({
contact_email: [
// { required: true, message: '请输入手机号', trigger: 'blur' },
{ type: "email", message: "请输入正确的邮箱", trigger: "blur" },
],
document_number: [
{
pattern:
/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/,
message: "请输入正确的身份证号",
trigger: "blur",
},
],
});
const orgPersonFormRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!orgPersonFormRef) return;
await orgPersonFormRef.value.validate((valid, fields) => {
if (valid) {
emit("action", orgPersonForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!orgPersonFormRef) return;
orgPersonFormRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(orgPersonForm, data);
};
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content flex_cloumn">
<div class="content_top apaas_scroll">
<div class="content_process" v-if="!route.query.id">
<div>
<el-steps :active="step">
<el-step title="" :class="{ process_complete: step > 1 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 0"
><bg-icon class="step_icon" icon="#bg-ic-file"></bg-icon
></span>
<span class="circle" v-else></span>
账号信息
</span>
</template>
</el-step>
<el-step title="" :class="{ process_complete: step > 2 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 1"
><bg-icon class="step_icon" icon="#bg-ic-file-staff"></bg-icon
></span>
<span class="circle" v-else></span>
个人
</span>
</template>
</el-step>
<el-step title="">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 2"
><bg-icon class="step_icon" icon="#bg-ic-file-success"></bg-icon
></span>
<span class="circle" v-else></span>
完成
</span>
</template>
</el-step>
</el-steps>
</div>
</div>
<div class="content_main">
<platformAccountForm
v-show="step === 1"
:form-type="route.query.id ? true : false"
:id="route.query.id"
ref="platformAccountFormRef"
@action="getPlatformAccountFormData"></platformAccountForm>
<platformPersonForm
v-show="step === 2"
ref="plplatformPersonFormRef"
@action="getPlatformPersonFormData"></platformPersonForm>
<div class="process_end" v-show="step === 3">
<div>
<div>
<img v-if="successFlag" src="@/assets/imgs/img_data-complete.png" alt="" />
<img v-else src="@/assets/imgs/img_data-fail.png" alt="" />
</div>
<div class="font_bold">
{{
route.query.id
? successFlag
? "平台用户编辑成功"
: "平台用户编辑失败"
: successFlag
? "平台用户新增成功"
: "平台用户新增失败"
}}
</div>
<el-button @click="cancel">返回列表</el-button>
<el-button v-if="!route.query.id" type="primary" @click="continueCreate">继续创建</el-button>
</div>
</div>
</div>
</div>
<div class="content_bottom" v-if="step !== 3">
<div v-show="!route.query.id && step === 1">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="nextStep">下一步</el-button>
</div>
<div v-show="step === 2">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="previousStep">上一步</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</div>
<div v-show="route.query.id">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="nextStep">保存</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router";
import platformAccountForm from "./platform-account-form.vue";
import platformPersonForm from "./platform-person-form.vue";
import CryptoJS from "crypto-js";
import { reactive, ref, onBeforeMount, toRefs, computed, onMounted } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const router = useRouter();
const step = ref(1);
const platformAccountFormRef = ref(null);
const plplatformPersonFormRef = ref(null);
const formData = reactive({
logo: "",
system_account: "",
contact_phone: "",
password: "",
confirm_password: "",
select_role: "",
state: "",
contact_name: "",
contact_email: "",
remark: "",
}); //账号信息表单+个人信息表单
const orgId = ref(null);
const successFlag = ref(false);
// 下一步
const nextStep = () => {
platformAccountFormRef.value.submitForm();
};
//账号信息表单检验触发事件 data为null 校验失败
const getPlatformAccountFormData = (data) => {
if (data) {
if (route.query.id) {
Object.assign(formData, data);
let params = {
...formData,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
};
axios.put(`/apaas/system/v5/org/update/user/${route.query.id}`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
} else {
Object.assign(formData, data);
step.value = 2;
}
} else {
}
};
//个人信息表单检验触发事件 data为null 校验失败
const getPlatformPersonFormData = (data) => {
if (data) {
Object.assign(formData, data);
if (route.query.id) {
console.log(formData);
// let params = {
// }
// axios.post(`/apaas/system/v5/org/update/user/${route.query.id}`,params)
// .then((res) => {
// if (res.data.code == 200) {
// successFlag.value = true;
// step.value = 3;
// }else {
// ElMessage.error(res.data.msg)
// }
// })
} else {
const params = {
...formData,
organization_id: orgId.value,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
is_admin: 3,
password: CryptoJS.AES.encrypt(formData.password, "swuE9cmCZQwrkYRV").toString(),
};
axios.post(`/apaas/system/v5/org/add/user`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
}
}
};
//上一步
const previousStep = () => {
step.value--;
};
//提交表单
const submit = () => {
plplatformPersonFormRef.value.submitForm();
};
//继续创建 清空表单
const continueCreate = () => {
platformAccountFormRef.value.clearForm();
plplatformPersonFormRef.value.clearForm();
step.value = 1;
successFlag.value = false;
};
//取消
const cancel = () => {
router.go(-1);
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
orgId.value = res.data.data[0].organization_id;
} else {
ElMessage.error(res.data.data);
}
});
};
const getDetail = () => {
axios.get(`/apaas/system/v5/org/user/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const form = res.data.data;
console.log(form);
platformAccountFormRef.value.setForm({
logo: form.logo ? [{ url: form.logo }] : [],
system_account: form.system_account,
contact_phone: form.contact_phone,
state: form.state,
contact_name: form.contact_name,
contact_email: form.contact_email,
remark: form.remark,
select_role: form.select_role,
});
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
getOrgTree();
if (route.query.id) {
getDetail();
}
});
onMounted(() => {});
</script>
<style scoped>
.flex_cloumn {
display: flex;
flex-direction: column;
}
.content_top {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
}
/* .content_top::-webkit-scrollbar {
width: 5px;
height: 0px;
}
.content_top::-webkit-scrollbar-thumb {
background: #dedede;
border-radius: 10px;
height: 0px;
}
.content_top::-webkit-scrollbar-track {
background: transparent;
border-radius: 2px;
} */
.content_bottom {
height: 68px;
line-height: 68px;
text-align: right;
padding: 0 20px;
border-top: 1px solid #e6e9ef;
}
.content_process {
border-bottom: 1px solid #e6e9ef;
padding: 38px 16%;
}
.content_main {
flex: 1;
padding: 30px;
box-sizing: border-box;
}
.process_desc {
background-color: #fff;
display: inline-block;
position: absolute;
padding: 0 5px;
font-size: 18px;
color: #202531;
font-weight: bold;
}
.process_desc img {
height: 25px;
width: 25px;
vertical-align: middle;
}
.process_end {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.process_end div {
text-align: center;
}
.step_icon {
color: #fff;
font-weight: 600;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.icon_box {
display: inline-block;
background-color: #2b4695;
width: 48px;
height: 48px;
border-radius: 99px;
position: relative;
border: 3px solid #b0bee8;
vertical-align: middle;
}
.circle {
display: inline-block;
background-color: #a9b1c7;
width: 24px;
height: 24px;
border-radius: 99px;
position: relative;
border: 4px solid #e6e9ef;
vertical-align: middle;
}
.content_process :deep() .el-step.is-horizontal .el-step__line {
height: 4px;
}
.content_process :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 50%, #e6e9ef 50%);
}
.process_complete :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 100%, #e6e9ef 0%);
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="platformAccountForm"
:rules="platformAccountFormRules"
ref="platformAccountRef"
style="max-width: 66%">
<el-form-item label="头像" prop="logo">
<bg-upload-image
v-model="platformAccountForm.logo"
:showTips="true"
:limit="1"
:fileSize="500"
:fileSizeUnit="'KB'"
listType="picture-card"
:accept="['.jpg', '.jpeg', '.png']"
customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item>
<el-form-item label="账号" prop="system_account">
<el-input v-model="platformAccountForm.system_account" />
</el-form-item>
<el-form-item label="手机号" prop="contact_phone">
<el-input v-model="platformAccountForm.contact_phone" />
</el-form-item>
<el-form-item v-if="!formType" label="密码" prop="password">
<el-input type="password" v-model="platformAccountForm.password" />
</el-form-item>
<el-form-item v-if="!formType" label="确认密码" prop="confirm_password">
<el-input type="password" v-model="platformAccountForm.confirm_password" />
</el-form-item>
<el-form-item label="角色授权" prop="select_role">
<el-select v-model="platformAccountForm.select_role" multiple placeholder="请选择角色" style="width: 100%">
<el-option v-for="item in roleList" :key="item.role_id" :label="item.role_name" :value="item.role_id" />
</el-select>
</el-form-item>
<el-form-item v-if="formType" label="姓名" prop="contact_name">
<el-input v-model="platformAccountForm.contact_name" />
</el-form-item>
<el-form-item v-if="formType" label="邮箱" prop="contact_email">
<el-input v-model="platformAccountForm.contact_email" />
</el-form-item>
<el-form-item v-if="formType" label="备注" prop="remark">
<el-input type="textarea" :rows="3" v-model="platformAccountForm.remark" />
</el-form-item>
<el-form-item label="是否启用" prop="state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="platformAccountForm.state"></bg-switch>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted, onBeforeMount } from "vue";
import axios from "@/request/http.js";
const props = defineProps({
formType: {
type: Boolean,
default: false, //false 新增 true 编辑
},
id: {
type: String,
default: "",
},
});
const platformAccountForm = reactive({
logo: [],
system_account: "",
contact_phone: "",
password: "",
confirm_password: "",
select_role: "",
state: 1,
contact_name: "",
contact_email: "",
remark: "",
});
const validatePass = (rule, value, callback) => {
if (value !== platformAccountForm.password) {
callback(new Error("密码输入不一致"));
} else {
callback();
}
};
const checkPhone = (rule, value, callback) => {
var phone_ruler = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
setTimeout(() => {
if (!phone_ruler.test(value) && value.length !== 0) {
callback(new Error("请输入正确的手机号码"));
} else {
callback();
}
});
};
const validateSystemAccount = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和数字"));
} else {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), system_account: value };
} else {
params = { system_account: value };
}
axios.post(`/apaas/system/v5/user/check/account`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const checkPhoneRepet = (rule, value, callback) => {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), contact_phone: value };
} else {
params = { id: 0, contact_phone: value };
}
axios.post(`/apaas/system/v5/org/check`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
};
const platformAccountFormRules = reactive({
system_account: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ min: 4, message: "帐号长度不得低于4个字符", trigger: "blur" },
{ max: 20, message: "帐号最大长度为20个字符", trigger: "blur" },
{ validator: validateSystemAccount, trigger: "blur" },
],
contact_phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
{ validator: checkPhone, trigger: "blur" },
{ validator: checkPhoneRepet, trigger: "blur" },
],
select_role: [{ required: true, message: "请选择角色", trigger: "blur" }],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" },
],
confirm_password: [
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
contact_email: [{ type: "email", message: "请输入正确的邮箱", trigger: "blur" }],
});
const roleList = ref([]);
const platformAccountRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!platformAccountRef) return;
await platformAccountRef.value.validate((valid, fields) => {
if (valid) {
emit("action", platformAccountForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!platformAccountRef) return;
platformAccountRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(platformAccountForm, data);
};
const getRoleList = () => {
axios.get(`/apaas/system/v5/org/select/role?is_admin=3`).then((res) => {
if (res.data.code == 200) {
roleList.value = res.data.data;
} else {
}
});
};
onBeforeMount(() => {
getRoleList();
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="platformPersonForm"
:rules="platformPersonFormRules"
ref="platformPersonFormRef"
style="max-width: 66%">
<el-form-item label="姓名" prop="contact_name">
<el-input v-model="platformPersonForm.contact_name" />
</el-form-item>
<el-form-item label="邮箱" prop="contact_email">
<el-input v-model="platformPersonForm.contact_email" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="3" v-model="platformPersonForm.remark" />
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted } from "vue";
const platformPersonForm = reactive({
contact_name: "",
contact_email: "",
remark: "",
});
const platformPersonFormRules = reactive({
contact_email: [{ type: "email", message: "请输入正确的邮箱", trigger: "blur" }],
});
const platformPersonFormRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!platformPersonFormRef) return;
await platformPersonFormRef.value.validate((valid, fields) => {
if (valid) {
emit("action", platformPersonForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!platformPersonFormRef) return;
platformPersonFormRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(platformPersonForm, data);
};
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<el-tree
ref="treeRef"
class="file-tree"
:data="orgData"
:props="defaultProps"
@node-click="handleNodeClick"
node-key="id"
:highlight-current="true"
:filter-node-method="filterNode"
:expand-on-click-node="false"
:default-expand-all="true">
<template #default="{ node, data }">
<div class="custom_tree_node">
<span class="label-text" :title="data.name">{{ data.name }} </span>
<span
v-if="data.data_type === 2"
class="tree-action-box first_node"
:class="{ first_node_focus: (selectData && selectData.id === data.id) || !selectData }"
@click.stop="showAction($event, data, node)">
<bg-icon class="tree-more" icon="#bg-ic-s-more"></bg-icon>
</span>
<span
v-else
class="tree-action-box"
@click.stop="showAction($event, data, node)">
<bg-icon class="tree-more" icon="#bg-ic-s-more"></bg-icon>
</span>
</div>
</template>
</el-tree>
<Teleport to="body">
<div
ref="treeActionRef"
class="tree-action"
v-show="actionFlag"
:style="{ top: acTop, left: acLeft, bottom: acBottom }">
<!-- 平台用户组织 -->
<div
v-if="selectData && selectData.data_type === 2"
class="action"
@click="treeAction({ type: 'directory', action: 'create', target: null })">
新增目录
</div>
<div
v-if="selectData && selectData.data_type === 2"
class="action"
@click="treeAction({ type: 'org', action: 'create', target: null })">
新增组织
</div>
<!-- 目录 -->
<div
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'create', target: 'local' })">
新增本级目录
</div>
<div
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'create', target: 'child' })">
新增下级目录
</div>
<div
v-if="selectData && selectData.data_type === 0 && selectData.level !== 1"
class="action"
@click="treeAction({ type: 'org', action: 'create', target: 'local' })">
新增本级组织
</div>
<div
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'org', action: 'create', target: 'child' })">
新增下级组织
</div>
<div
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'edit', target: 'local' })">
编辑目录
</div>
<div
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'delete', target: 'local' })">
删除
</div>
<div
:class="{
disable:
mvDataParent.indexOf(selectData) === 0 ||
(mvDataParent.indexOf(selectData) === 1 && mvDataParent[0].data_type == 2),
}"
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'mvup', target: 'local' })">
上移
</div>
<div
:class="{ disable: mvDataParent.indexOf(selectData) === mvDataParent.length - 1 }"
v-if="selectData && selectData.data_type === 0"
class="action"
@click="treeAction({ type: 'directory', action: 'mvdown', target: 'local' })">
下移
</div>
<!-- 组织 -->
<div
v-if="selectData && selectData.data_type === 1"
class="action"
@click="treeAction({ type: 'org', action: 'create', target: 'local' })">
新增本级组织
</div>
<div
v-if="selectData && selectData.data_type === 1"
class="action"
@click="treeAction({ type: 'org', action: 'edit', target: 'local' })">
编辑组织
</div>
<div
v-if="selectData && selectData.data_type === 1"
class="action"
@click="treeAction({ type: 'org', action: 'delete', target: 'local' })">
删除
</div>
<div
:class="{ disable: mvDataParent.indexOf(selectData) === 0 }"
v-if="selectData && selectData.data_type === 1"
class="action"
@click="treeAction({ type: 'org', action: 'mvup', target: 'local' })">
上移
</div>
<div
:class="{ disable: mvDataParent.indexOf(selectData) === mvDataParent.length - 1 }"
v-if="selectData && selectData.data_type === 1"
class="action"
@click="treeAction({ type: 'org', action: 'mvdown', target: 'local' })">
下移
</div>
</div>
</Teleport>
</template>
<script setup>
import { reactive, toRefs, ref, computed, onBeforeMount, onBeforeUnmount, watch, nextTick } from "vue";
import { useRoute, useRouter } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
const route = useRoute();
const acTop = ref("");
const acLeft = ref("");
const acBottom = ref("");
const actionFlag = ref(false);
const selectData = ref(null);
const selectDataParent = ref(null);
const mvDataParent = ref([]);
const treeRef = ref(null);
const treeActionRef = ref(null);
const bottomGap = ref(30); //弹窗吸底高度
const orgData = ref([]);
const selectNodeObj = ref(null);
const customNodeClass = (data, node) => {
if (data.data_type == 0) {
return "noFocus";
} else {
return "";
}
};
const defaultProps = {
label: "name",
children: "Child",
value: "organization_id",
class: customNodeClass,
};
const getOrgTree = (data) => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
orgData.value = res.data.data || [];
console.log(route.query.id);
if (route.query.id) {
searchItem(orgData.value, route.query.id);
data = selectNodeObj.value;
}
if (data) {
nextTick(() => {
setCurrentNode(data);
});
} else {
nextTick(() => {
setCurrentNode(orgData.value[0].id);
});
}
} else {
ElMessage.error(res.data.data);
}
});
};
const searchItem = (data, id) => {
data.forEach((e) => {
if (e.organization_id == id) {
selectNodeObj.value = e;
} else {
if (e.Child) {
searchItem(e.Child, id);
}
}
});
};
const filterTree = (val) => {
treeRef.value.filter(val);
};
const setCurrentNode = (data) => {
if (data) {
treeRef.value.setCurrentKey(data, true);
const curNode = treeRef.value.getCurrentNode();
selectData.value = curNode;
emit("select", { data: ref(curNode), type: "click" });
} else {
treeRef.value.setCurrentKey(orgData.value[0].id, true);
const curNode = treeRef.value.getCurrentNode();
selectData.value = curNode;
emit("select", { data: ref(curNode), type: "click" });
}
};
const filterNode = (value, data) => {
if (!value) return true;
return data.name.includes(value);
};
const showAction = (e, data, node) => {
acTop.value = "";
acLeft.value = "";
acBottom.value = "";
var allHeight = document.body.scrollHeight;
actionFlag.value = true;
selectData.value = data;
selectDataParent.value = node.parent.data.name ? node.parent.data : null;
mvDataParent.value = node.parent.data.Child ? node.parent.data.Child : node.parent.data;
const rect = e.target.getBoundingClientRect(); //获取点击的dom的位置
nextTick().then(() => {
setTimeout(() => {
var height = window.getComputedStyle(treeActionRef.value).height;
height = parseInt(height);
//判断弹窗位置是否超过屏幕,超过则吸底展示
if (height + rect.y - 17 > allHeight - bottomGap.value) {
acBottom.value = bottomGap.value + "px";
acLeft.value = rect.x + 35 + "px";
} else {
acTop.value = rect.y - 17 + "px";
acLeft.value = rect.x + 35 + "px";
}
});
});
// acTop.value = rect.y - 17 + "px";
// acLeft.value = rect.x + 35 + "px";
};
const isSticky = (data) => {
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
context.font = "14px MicrosoftYaHei";
const { width } = context.measureText(data);
return width > 255 ? true : false;
};
const closeAction = () => {
actionFlag.value = false;
};
const emit = defineEmits(["action", "select"]);
const handleNodeClick = (node, nodeAttr, treeNode, event) => {
if (node.data_type !== 0) {
selectData.value = node;
emit("select", { data: selectData, type: "click" });
} else {
nextTick(() => {
treeRef.value.setCurrentKey(null);
});
}
//只读则无操作事件
closeAction();
};
const treeAction = (params) => {
emit("select", { data: selectData, type: "action" });
let data = null;
if (params.action === "create") {
if (params.target === "local") {
data = selectDataParent;
} else if (params.target === "child") {
data = selectData;
} else {
}
} else if (params.action === "mvup") {
// 已经是第一个元素 或者上一个元素是平台组织 则不可上移 平台组织始终在第一个
if (
mvDataParent.value.indexOf(selectData.value) === 0 ||
(mvDataParent.value.indexOf(selectData.value) === 1 && mvDataParent.value[0].data_type == 2)
) {
// ElMessage.error('已经是第一个元素,不可上移')
return 0;
} else {
let brother = mvDataParent.value[mvDataParent.value.indexOf(selectData.value) - 1];
data = [
{ id: selectData.value.id, sort: brother.sort },
{ id: brother.id, sort: selectData.value.sort },
];
}
} else if (params.action === "mvdown") {
if (mvDataParent.value.indexOf(selectData.value) === mvDataParent.value.length - 1) {
// ElMessage.error('已经是最后一个元素,不可下移')
return 0;
} else {
let brother = mvDataParent.value[mvDataParent.value.indexOf(selectData.value) + 1];
data = [
{ id: selectData.value.id, sort: brother.sort },
{ id: brother.id, sort: selectData.value.sort },
];
}
} else {
data = selectData;
}
emit("action", { type: params.type, action: params.action, data: data });
};
onBeforeMount(() => {
//只读则无操作事件
window.addEventListener("click", closeAction);
window.addEventListener("scroll", closeAction, true);
getOrgTree();
});
onBeforeUnmount(() => {
//只读则无操作事件
window.removeEventListener("click", closeAction);
window.removeEventListener("scroll", closeAction);
});
defineExpose({ getOrgTree, filterTree, setCurrentNode });
</script>
<style scoped>
.tree-action-box {
display: none;
position: absolute;
right: -5px;
top: 0px;
width: 44px;
height: 36px;
line-height: 36px;
text-align: center;
background-color: #f2f3f7;
box-shadow: -3px 0px 8px -3px rgba(0, 7, 101, 0.15);
}
.position_sticky {
position: sticky;
position: -webkit-sticky;
}
.tree-more {
font-size: 12px;
color: #3759be;
}
.file-tree :deep() .el-tree-node__content:hover .tree-action-box {
display: inline-block;
}
.file-tree :deep() .el-tree-node__content:hover + .label-text {
width: calc(100% - 48px);
}
.file-tree :deep() .el-tree-node__content .first_node {
display: inline-block;
background-color: #fff;
box-shadow: none;
}
.file-tree :deep() .el-tree-node__content .first_node_focus {
background-color: #f2f3f7;
box-shadow: -3px 0px 8px -3px rgba(0, 7, 101, 0.15);
}
.file-tree :deep() .el-tree-node__content:hover .first_node {
background-color: #f2f3f7;
box-shadow: -3px 0px 8px -3px rgba(0, 7, 101, 0.15);
}
.file-tree :deep() .el-tree-node > .el-tree-node__children {
overflow: visible;
}
.file-tree :deep() .el-tree-node__content {
position: relative;
}
.action-box:hover .tree-action {
display: block;
}
.label-text {
font-size: 14px;
color: #404a62;
display: inline-block;
width: calc(100% - 24px);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tree-action-box:hover + .label-text {
padding: 8px 0;
background-color: var(--el-tree-node-hover-bg-color);
}
.label-text:hover {
padding: 8px 0;
/* background-color: var(--el-tree-node-hover-bg-color); */
width: calc(100% - 48px);
}
.is_active {
padding: 8px 0;
background-color: var(--el-color-primary-light-9);
}
.custom_tree_node {
width: 100%;
font-size: 14px;
color: #202531;
padding-right: 16px;
}
.text_clip {
width: 100%;
display: inline-block;
}
.tree-action .action {
width: 100%;
height: 34px;
line-height: 34px;
padding-left: 16px;
font-size: 14px;
color: #202531;
cursor: pointer;
}
.tree-action :deep().el-upload {
width: 100%;
}
.tree-action .action:hover {
background-color: #eff2fa;
color: #3759be;
}
.tree-action .disable {
cursor: not-allowed;
color: #616f94;
}
.tree-action .disable:hover {
background-color: #fff;
color: #616f94;
}
.tree-action {
/* display: none; */
width: 144px;
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
padding: 4px 0;
border-radius: 4px;
position: fixed;
z-index: 9;
}
.file-tree :deep().el-tree-node__content {
height: 36px !important;
}
.tree-action .disable {
cursor: not-allowed;
color: #616f94;
}
.tree-action .disable:hover {
background-color: #fff;
color: #616f94;
}
.file-tree :deep().noFocus:focus > .el-tree-node__content {
background-color: #fff;
}
</style>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content apaas_scroll">
<div class="info_row">
<div class="title">
<div><span class="icon_box"></span> 账号信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="img_box">
<img v-if="logo" :src="logo" style="height: 96px; width: 96px; border-radius: 99px" alt="" />
<img
v-else
src="/src/assets/imgs/home_ic_user.png"
style="height: 96px; width: 96px; border-radius: 99px"
alt="" />
</div>
<div class="info_box">
<bg-info :data="accountInfo"></bg-info>
</div>
</div>
</div>
<div>
<div class="title">
<div><span class="icon_box"></span> 个人信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="img_box"></div>
<div class="info_box">
<bg-info v-if="accountType === 2" :data="personInfo"></bg-info>
<bg-info v-if="accountType === 3" :data="personInfo2"></bg-info>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, toRefs, ref, computed, onBeforeMount } from "vue";
import { useRoute } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const accountInfo = reactive([
{
name: "手机号",
value: "",
nameWidth: 130,
},
{
name: "账号",
value: "",
nameWidth: 130,
},
{
name: "角色",
value: "",
nameWidth: 130,
},
{
name: "所属组织",
value: "",
nameWidth: 130,
},
{
name: "创建人",
value: "",
nameWidth: 130,
},
{
name: "创建账号",
value: "",
nameWidth: 130,
},
{
name: "最后编辑时间",
value: "",
nameWidth: 130,
},
{
name: "创建时间",
value: "",
nameWidth: 130,
},
]);
const personInfo = reactive([
{
name: "姓名",
value: "",
nameWidth: 130,
},
{
name: "邮箱",
value: "",
nameWidth: 130,
},
{
name: "证据类型",
value: "",
nameWidth: 130,
},
{
name: "身份证号",
value: "",
idCard: true,
nameWidth: 130,
},
{
name: "备注",
value: "",
full: true,
nameWidth: 130,
},
]);
const personInfo2 = reactive([
{
name: "姓名",
value: "",
nameWidth: 130,
},
{
name: "邮箱",
value: "",
nameWidth: 130,
},
{
name: "备注",
value: "",
full: true,
nameWidth: 130,
},
]);
const logo = ref("");
const accountType = ref(2); //1.业务系统账号 2.组织管理员账号 3.平台用户账号
const getDetail = () => {
axios.get(`/apaas/system/v5/org/user/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const detail = res.data.data;
accountInfo[0].value = detail.contact_phone;
accountInfo[1].value = detail.system_account;
accountInfo[2].value = detail.system_role && detail.system_role.length > 0 ? detail.system_role.join("") : "";
accountInfo[3].value = detail.organization;
accountInfo[4].value = detail.created_by;
accountInfo[5].value = detail.created_by_account;
accountInfo[6].value = detail.updated_time;
accountInfo[7].value = detail.created_time;
personInfo[0].value = detail.contact_name;
personInfo[1].value = detail.contact_email;
personInfo[2].value = detail.document_type === 1 ? "身份证" : "";
personInfo[3].value = detail.document_number;
personInfo[4].value = detail.remark;
personInfo2[0].value = detail.contact_name;
personInfo2[1].value = detail.contact_email;
personInfo2[2].value = detail.remark;
logo.value = detail.logo;
accountType.value = detail.is_admin;
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
if (route.query.id) {
getDetail();
}
});
</script>
<style scoped>
.page_content {
padding: 15px;
overflow: auto;
}
.info_content {
display: flex;
}
.info_row {
margin-bottom: 40px;
}
.img_box {
width: 120px;
}
.info_box {
width: 60%;
}
.title {
font-size: 18px;
color: #1a1a1a;
font-weight: bold;
margin-bottom: 10px;
display: flex;
align-items: center;
}
.dashed_line {
flex: 1;
height: 1px;
margin: 0 10px;
border-bottom: dashed 1px #dadee7;
}
.icon_box {
display: inline-block;
width: 4px;
height: 14px;
background-color: #3759be;
border-radius: 2px;
margin-right: 5px;
}
</style>
<!-- 角色管理新增 -->
<template>
<role-form></role-form>
</template>
<script setup>
import roleForm from "./role_form.vue";
</script>
<!-- 角色管理 -->
<template>
<div class="detail_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="main_container">
<div class="top_form bg-scroll">
<el-form ref="form" :rules="rules" :model="formData" class="role_form">
<el-form-item prop="role_name" label="角色名称">
<el-input v-model.trim="formData.role_name" maxlength="50" show-word-limit :disabled="rowType != 0" />
</el-form-item>
<el-form-item prop="role_desc" label="描述">
<el-input
class="decs_box"
type="textarea"
v-model="formData.role_desc"
maxlength="300"
show-word-limit
:autosize="{ minRows: 5 }"
:disabled="rowType != 0"></el-input>
</el-form-item>
<el-form-item label="数据权限" prop="data_purview">
<el-radio-group v-model="formData.data_purview" :disabled="rowType != 0">
<el-radio :label="3">全平台所有</el-radio>
<el-radio :label="2">本组织所有</el-radio>
<el-radio :label="1">仅自己</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单功能权限" prop="permission_arr">
<bg-permission
:values="formData.permission_arr"
:options="permissionData"
:props="defaultProps"
@changeMenu="changeMenu" />
</el-form-item>
<el-form-item label="是否启用" prop="state" class="state_item">
<el-switch
class="bg-switch-ele"
v-model="formData.state"
:active-value="1"
:inactive-value="0"
inline-prompt
active-text="是"
inactive-text="否"
:disabled="rowType != 0" />
</el-form-item>
</el-form>
</div>
<div class="bottom_action">
<el-button @click="goList"> 取消 </el-button>
<el-button type="primary" @click="saveRole"> 保存 </el-button>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, toRefs, ref, onBeforeMount, nextTick } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import { useRouter, useRoute } from "vue-router";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const router = useRouter();
const route = useRoute();
const form = ref(null);
const checkMenuLength = (rule, value, callback) => {
if (value.length === 0) {
callback(new Error("请选择所需菜单"));
} else {
callback();
}
};
const roleState = reactive({
form,
formData: {
role_name: "",
role_desc: "",
data_purview: 3,
state: 1,
permission_arr: [],
}, // 表单项
rules: {
role_name: [{ required: true, message: "请输入角色名称", trigger: "blur" }],
data_purview: [{ required: true, message: "请选择数据权限", trigger: "change" }],
state: [{ required: true, message: "请选择是否启用", trigger: "change" }],
permission_arr: [{ required: true, type: "array", validator: checkMenuLength, trigger: "change" }],
}, // 表单校验规则
defaultProps: {
name: "menu_name",
value: "id",
children: "Child",
remark: "remark",
}, // 菜单框默认配置
permissionData: [], // 菜单数据
rowType: 0,
});
const getMenuTree = () => {
axios.get(`/apaas/system/v5/menu/tree`).then((res) => {
if (res.data.code == 200) {
roleState.permissionData = res.data.data || [];
} else {
ElMessage.error(res.data.data);
}
});
}; // 获取菜单数据
const changeMenu = (val) => {
roleState.formData.permission_arr = val;
}; // 修改选中的菜单
const getRoleDetail = () => {
axios.get(`/apaas/system/v5/role/detail/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
let { role_name, role_desc, data_purview, state, menus } = res.data.data;
roleState.rowType = res.data.data.role_type;
let permission_arr = [];
if (menus && menus.length > 0) {
menus.forEach((e) => {
permission_arr.push(e.id);
});
}
roleState.formData = {
role_name,
role_desc,
data_purview,
state,
permission_arr: [...permission_arr],
};
console.log(roleState.formData.permission_arr);
} else {
ElMessage.error(res.data.data);
}
});
}; // 获取角色详情
const saveRole = () => {
roleState.form.validate((valid) => {
if (valid) {
let params = {
role_name: roleState.formData.role_name,
role_desc: roleState.formData.role_desc,
state: roleState.formData.state,
data_purview: roleState.formData.data_purview,
menu_ids: [...roleState.formData.permission_arr],
};
if (!route.query.id) {
// 新增
axios.put(`/apaas/system/v5/role/create`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
router.push("/system/role");
} else {
ElMessage.error(res.data.data);
}
});
} else {
// 编辑
params.id = +route.query.id;
axios.post(`/apaas/system/v5/role/update`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
router.push("/system/role");
} else {
ElMessage.error(res.data.data);
}
});
}
}
});
}; // 新增或编辑角色的保存
const goList = () => {
router.push("/system/role");
};
onBeforeMount(() => {
getMenuTree();
if (route.query.id) {
// 有id表示是编辑,请求详情,回显
getRoleDetail();
}
});
const { formData, rules, defaultProps, permissionData, rowType } = toRefs(roleState);
</script>
<style lang="scss" scoped>
.detail_container {
width: 100%;
padding: 0 24px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.main_container {
flex-grow: 1;
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
background-color: #fff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
margin: 0 0 16px;
position: relative;
height: calc(100% - 62px);
.top_form {
height: calc(100% - 68px);
padding: 30px 0 0 40px;
.role_form {
width: 1048px;
:deep().el-form-item {
display: block;
margin-bottom: 24px;
.el-form-item__label {
display: block;
}
.el-input__count {
bottom: -20px;
right: 4px;
color: #a9b1c7;
}
}
.state_item {
display: flex;
}
}
}
.bottom_action {
height: 68px;
border-top: 1px solid #e6e9ef;
padding: 16px;
text-align: right;
.el-button {
width: 92px;
}
}
}
}
</style>
<!-- 角色管理编辑 -->
<template>
<role-form></role-form>
</template>
<script setup>
import roleForm from "../add/role_form.vue";
</script>
<!-- 角色管理 -->
<template> <template>
<div>角色管理</div> <div class="detail_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="main_container">
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入角色名称">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="register">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增
</el-button>
<el-button type="primary" @click="deleteRows"> 批量删除 </el-button>
<div class="select_text">
<span>已选择</span>
<span class="num">{{ selection.length }}</span>
<span></span>
<span class="can_click_text" @click="clearRoleSelection">清空</span>
</div>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table bg-scroll">
<bg-table
ref="Bgtable"
:headers="headers"
:rows="tableRows"
:select="true"
:stripe="true"
canEdit
canEditFlag="state"
@selectAc="selectRows">
<template v-slot:state="{ row }">
<bg-switch
@click="changeUseRow(row)"
:labels="['否', '是']"
:values="[0, 1]"
v-model="row.state"
:disabled="row.role_type == 1 || row.role_type == 2" />
</template>
<template v-slot:created_time="{ row }">
{{ row.created_time.split("+")[0].replace("T", " ").replace("Z", " ") }}
</template>
<template v-slot:action="{ row }">
<bg-table-btn
class="can_click_text"
:click="
() => {
edit_row(row);
}
">
编辑
</bg-table-btn>
<bg-table-btn
class="can_click_text"
:click="
() => {
distribute_user(row);
}
"
:disabled="row.cant_allot == 1">
分配用户
</bg-table-btn>
<bg-table-btn
class="can_click_text"
:click="
() => {
delete_row(row);
}
"
:disabled="row.state == 1 || row.role_type == 1">
删除
</bg-table-btn>
</template>
</bg-table>
</div>
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
<!-- 删除弹窗 -->
<el-dialog class="dialog_box" title="提示" v-model="delDialog" width="400px">
<div>确定要删除选中的数据吗?</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button type="default" @click="delDialog = false">取 消</el-button>
<el-button type="primary" @click="deleteData">确 定</el-button>
</div>
</template>
</el-dialog>
<!-- 分配用户 -->
<el-dialog class="distribute_dialog" title="分配用户" v-model="distributeDialog" width="1062px">
<div class="distribute_box">
<div class="topFilter">
<div class="left">
<span>已选择</span>
<span class="num">{{ userSelection.length }}</span>
<span></span>
<span class="can_click_text" @click="clearUserSelection">清空</span>
</div>
<div class="right">
<el-select v-model="userFilter.is_admin" placeholder="请选择" style="width: 200px">
<el-option
v-for="(item, index) in userTypeList"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<el-cascader
v-model="userFilter.organization_id"
:options="orgList"
placeholder="请选择组织"
:props="{
expandTrigger: 'hover',
label: 'name',
value: 'id',
emitPath: false,
checkStrictly: true,
children: 'Child',
}"
:clearable="true"
collapse-tags
style="width: 200px">
<template #default="{ data }">
<span>{{ data.name }}</span>
</template>
</el-cascader>
<el-input
v-model.trim="userFilter.search"
placeholder="请输入内容"
style="width: 200px"
:prefix-icon="Search" />
<el-button type="primary" @click="searchAction">查询</el-button>
<el-button type="default" @click="clearAction">重置</el-button>
</div>
</div>
<div class="table_box">
<div class="user_table bg-scroll">
<bg-table
ref="userTable"
:headers="userHeaders"
:rows="userRows"
:select="true"
:stripe="true"
@selectAc="selectUserRows">
<template v-slot:is_admin="{ row }">
{{ ["", "业务系统账号", "组织管理员账号", "平台用户账号"][row.is_admin] }}
</template>
</bg-table>
</div>
<bg-pagination
:page="userFilter.page"
:size="userFilter.limit"
:total="total"
@change-page="changeUserPage"
@change-size="changeUserSize">
</bg-pagination>
</div>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button type="default" @click="distributeDialog = false">取 消</el-button>
<el-button type="primary" @click="distribute">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup></script> <script setup>
import { Search } from "@element-plus/icons-vue";
import { reactive, toRefs, ref, onBeforeMount, nextTick } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const router = useRouter();
const Bgtable = ref(null);
const userTable = ref(null);
const state = reactive({
filter: {
page: 1,
limit: 10,
search: "",
},
headers: [
{
label: "角色名",
prop: "role_name",
width: 220,
},
{
label: "创建人",
prop: "created_by",
width: 220,
},
{
label: "创建时间",
prop: "created_time",
width: 276,
},
{
label: "账号数",
prop: "user_count",
},
{
label: "描述",
prop: "role_desc",
minWidth: 346,
},
{
label: "是否启用",
prop: "state",
width: 95,
},
{
label: "操作",
prop: "action",
width: 220,
fixed: "right",
},
],
tableRows: [],
tableTotal: 0,
actionRow: {},
selection: [],
delDialog: false,
delType: 1, // 删除类型 1-单条删除 2-批量删除
});
const userState = reactive({
userFilter: {
is_admin: "",
organization_id: "",
search: "",
limit: 10,
page: 1,
},
userTypeList: [
{
name: "全部类型",
value: "",
},
{
name: "组织管理员账号",
value: 2,
},
{
name: "平台用户账号",
value: 3,
},
],
orgList: [],
userHeaders: [
{
label: "帐号",
prop: "system_account",
},
{
label: "类型",
prop: "is_admin",
},
{
label: "用户手机号",
prop: "contact_phone",
},
{
label: "所属组织",
prop: "organization_name",
},
],
userRows: [],
total: 0,
userSelection: [],
distributeDialog: false, // 分配用户弹窗
});
const getRoleRows = () => {
let params = { ...state.filter };
console.log(params);
axios.get(`/apaas/system/v5/role/list`, { params }).then((res) => {
if (res.data.code == 200) {
state.tableRows = res.data.data || [];
state.tableTotal = res.data.total;
} else {
ElMessage.error(res.data.data);
}
});
}; // 获取角色列表
<style lang="scss" scoped></style> const getOrgList = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
console.log(res.data.data);
userState.orgList = res.data.data || [];
} else {
ElMessage.error(res.data.data);
}
});
}; // 获取组织列表
const changePage = (val) => {
state.filter.page = val;
getRoleRows();
}; // 改变页码
const changeSize = (val) => {
state.filter.limit = val;
changePage(1);
}; // 改变每页条数
const changeSearch = (val) => {
state.filter.search = val;
changePage(1);
}; // 表格关键字筛选
const changeUseRow = (row) => {
if (row.role_type == 1 || row.role_type == 2) {
return;
}
axios.post(`/apaas/system/v5/role/state/${row.id}/${row.state}`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
changePage(1);
} else {
ElMessage.error(res.data.data);
row.state = row.state == 0 ? 1 : 0;
}
});
}; // 更改启用禁用状态
const selectRows = (data) => {
state.selection = data.selection;
}; // 表格多选
const clearRoleSelection = () => {
Bgtable.value.clearTable();
};
const register = () => {
router.push("/authority/role/add");
}; // 新增角色
const edit_row = (row) => {
router.push({
path: "/authority/role/edit",
query: {
id: row.id,
},
});
}; // 编辑角色
const distribute_user = (row) => {
clearAction(1);
userState.distributeDialog = true;
state.actionRow = row;
getUserList();
}; // 分配角色按钮
const getUserList = () => {
nextTick(() => {
clearUserSelection();
});
let params = {
limit: userState.userFilter.limit,
page: userState.userFilter.page,
search: userState.userFilter.search,
organization_id: userState.userFilter.organization_id,
is_admin: userState.userFilter.is_admin,
role_id: state.actionRow.id,
};
axios.get(`/apaas/system/v5/role/allotment/list`, { params }).then((res) => {
if (res.data.code == 200) {
console.log(res.data.data);
userState.userRows = res.data.data || [];
userState.total = res.data.total;
nextTick(() => {
userState.userRows.forEach((e) => {
if (e.is_bind == 1) {
console.log(userTable);
userTable.value.toggleRowSelection(e, true);
}
});
});
} else {
ElMessage.error(res.data.data);
}
});
};
const changeUserPage = (val) => {
userState.userFilter.page = val;
getUserList();
};
const changeUserSize = (val) => {
userState.userFilter.limit = val;
changeUserPage(1);
};
const searchAction = () => {
console.log(userState.userFilter);
changeUserPage(1);
};
const clearAction = (type) => {
userState.userFilter = {
is_admin: "",
organization_id: "",
search: "",
limit: 10,
page: 1,
};
if (type != 1) {
changeUserPage(1);
}
};
const clearUserSelection = () => {
console.log(userTable.value);
userTable.value.clearTable();
};
const selectUserRows = (data) => {
userState.userSelection = data.selection;
};
const distribute = () => {
let user_ids = [];
userState.userSelection.forEach((e) => {
user_ids.push(e.id);
});
let params = {
id: state.actionRow.id,
user_ids: user_ids,
};
axios.post(`/apaas/system/v5/role/allotment/user`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
userState.distributeDialog = false;
changePage(1);
} else {
ElMessage.error(res.data.data);
}
});
};
const delete_row = (row) => {
state.actionRow = row;
state.delType = 1;
state.delDialog = true;
}; // 删除角色
const deleteRows = () => {
if (state.selection.length == 0) {
ElMessage.error("请先选择要删除的数据");
} else {
state.delType = 2;
state.delDialog = true;
}
}; // 批量删除按钮
const deleteData = () => {
let ids = [];
if (state.delType == 1) {
ids.push(state.actionRow.id);
} else {
state.selection.forEach((e) => {
ids.push(e.id);
});
}
let params = {
ids: [...ids],
};
axios.delete(`/apaas/system/v5/role/delete`, { data: { ids: [...ids] } }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
state.delDialog = false;
changePage(1);
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
getRoleRows();
getOrgList();
});
const { filter, headers, tableRows, tableTotal, delDialog, selection } = toRefs(state);
const { userFilter, userTypeList, orgList, userHeaders, userRows, total, userSelection, distributeDialog } =
toRefs(userState);
</script>
<style lang="scss" scoped>
.detail_container {
width: 100%;
padding: 0 24px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.main_container {
flex-grow: 1;
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
background-color: #fff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
margin: 0 0 16px;
position: relative;
height: calc(100% - 62px);
.table_container {
height: calc(100% - 70px);
padding: 0 16px;
.table {
max-height: calc(100% - 64px);
}
}
.select_text {
display: inline-block;
margin-left: 40px;
font-size: 14px;
color: #404a62;
.num {
color: #202531;
font-weight: 700;
margin: 0 3px;
}
.can_click_text {
margin-left: 24px;
}
}
}
.distribute_dialog {
.distribute_box {
width: 100%;
height: 626px;
.topFilter {
height: 68px;
padding: 16px;
border-bottom: 1px solid #e6e9ef;
display: flex;
text-align: left;
font-size: 14px;
align-items: center;
.left {
width: 240px;
padding-left: 15px;
color: #404a62;
.num {
color: #202531;
font-weight: 700;
margin: 0 3px;
}
.can_click_text {
margin-left: 24px;
}
}
.right {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
.el-button {
margin: 0;
width: 64px;
}
}
}
.table_box {
padding: 10px 16px;
height: calc(100% - 68px);
.user_table {
max-height: calc(100% - 48px);
:deep().bg-table {
.el-scrollbar {
--el-scrollbar-bg-color: #fff;
}
.el-table__empty-block {
.empty_container {
height: calc(100% - 45px);
}
}
}
}
}
}
}
}
</style>
<style>
.distribute_dialog .el-dialog__footer {
padding: 16px !important;
}
.distribute_dialog .el-dialog__body {
padding: 0px !important;
}
.distribute_dialog {
margin-top: 130px !important;
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="contactForm"
:rules="contactFormRules"
ref="contactRef"
style="max-width: 66%">
<el-form-item label="联系人姓名" prop="contact_name">
<el-input v-model="contactForm.contact_name" />
</el-form-item>
<el-form-item label="联系人手机号" prop="contact_phone">
<el-input v-model="contactForm.contact_phone" />
</el-form-item>
<el-form-item label="联系人邮箱" prop="contact_email">
<el-input v-model="contactForm.contact_email" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="3" v-model="contactForm.remark" show-word-limit maxlength="300" />
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted } from "vue";
const contactForm = reactive({
contact_name: "",
contact_phone: "",
contact_email: "",
remark: "",
});
const props = defineProps({
formType: {
type: Boolean,
default: false, //false 新增 true 编辑
},
id: {
type: String,
default: "",
},
});
const checkPhone = (rule, value, callback) => {
var phone_ruler = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
setTimeout(() => {
if (!phone_ruler.test(value) && value.length !== 0) {
callback(new Error("请输入正确的手机号码"));
} else {
callback();
}
});
};
const checkName = (rule, value, callback) => {
var reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母、数字和汉字"));
} else {
callback();
}
};
const contactFormRules = reactive({
contact_name: [
{ required: true, message: "请输入联系人姓名", trigger: "blur" },
{ max: 50, message: "联系人姓名最大长度为50个字符", trigger: "blur" },
{ validator: checkName, trigger: "blur" },
],
contact_phone: [
{ required: true, message: "请输入联系人手机号", trigger: "blur" },
{ validator: checkPhone, trigger: "blur" },
],
contact_email: [
{ type: "email", message: "请输入正确的邮箱", trigger: "blur" },
{ max: 100, message: "邮箱最大长度为100个字符", trigger: "blur" },
],
});
const contactRef = ref(null);
const emit = defineEmits(["action"]);
const submitForm = async () => {
if (!contactRef) return;
await contactRef.value.validate((valid, fields) => {
if (valid) {
emit("action", contactForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!contactRef) return;
contactRef.value.resetFields();
};
const setForm = (data) => {
Object.assign(contactForm, data);
};
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content flex_cloumn">
<div class="content_top apaas_scroll">
<div class="content_process">
<div>
<el-steps :active="step">
<el-step title="" :class="{ process_complete: step > 1 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 0"
><bg-icon class="step_icon" icon="#bg-ic-file"></bg-icon
></span>
<span class="circle" v-else></span>
业务系统信息
</span>
</template>
</el-step>
<el-step title="" :class="{ process_complete: step > 2 }">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 1"
><bg-icon class="step_icon" icon="#bg-ic-file-staff"></bg-icon
></span>
<span class="circle" v-else></span>
联系人信息
</span>
</template>
</el-step>
<el-step title="">
<template #icon>
<span class="process_desc">
<span class="icon_box" v-if="step > 2"
><bg-icon class="step_icon" icon="#bg-ic-file-success"></bg-icon
></span>
<span class="circle" v-else></span>
完成
</span>
</template>
</el-step>
</el-steps>
</div>
</div>
<div class="content_main">
<systemForm
v-show="step === 1"
ref="systemFormRef"
:form-type="route.query.id ? true : false"
:id="route.query.id"
@action="getSystemFormData"></systemForm>
<contactForm
v-show="step === 2"
ref="contactFormRef"
:id="route.query.id"
@action="getContactFormData"></contactForm>
<div class="process_end" v-show="step === 3">
<div>
<div>
<img v-if="successFlag" src="@/assets/imgs/img_data-complete.png" alt="" />
<img v-else src="@/assets/imgs/img_data-fail.png" alt="" />
</div>
<div class="font_bold">
{{
route.query.id
? successFlag
? "业务系统编辑成功"
: "业务系统编辑失败"
: successFlag
? "业务系统新增成功"
: "业务系统新增失败"
}}
</div>
<el-button @click="cancel">返回列表</el-button>
<el-button v-if="!route.query.id" type="primary" @click="continueCreate">继续创建</el-button>
</div>
</div>
</div>
</div>
<div class="content_bottom" v-if="step !== 3">
<div v-show="step === 1">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="nextStep">下一步</el-button>
</div>
<div v-show="step === 2">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="previousStep">上一步</el-button>
<el-button type="primary" @click="submit">保存</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router";
import systemForm from "./system-form.vue";
import contactForm from "./contact-form.vue";
import { reactive, ref, onBeforeUnmount, onMounted } from "vue";
import CryptoJS from "crypto-js";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const router = useRouter();
const step = ref(1);
const systemFormRef = ref(null);
const contactFormRef = ref(null);
const formData = reactive({
organization_id: "",
business_code: "",
business_name: "",
business_desc: "",
logo: "",
system_role_id: "",
system_account: "",
system_phone: "",
password: "",
confirm_password: "",
access_address: "",
develop_id: "",
state: 1,
contact_name: "",
contact_phone: "",
contact_email: "",
remark: "",
}); //业务系统表单+联系人表单
const successFlag = ref(false);
// 下一步
const nextStep = () => {
systemFormRef.value.submitForm();
};
//业务系统表单检验触发事件 data为null 校验失败
const getSystemFormData = (data) => {
if (data) {
Object.assign(formData, data);
step.value = 2;
} else {
}
};
//联系人表单检验触发事件 data为null 校验失败
const getContactFormData = (data) => {
if (data) {
Object.assign(formData, data);
if (route.query.id) {
console.log(formData);
let params = {
...formData,
id: parseInt(route.query.id),
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
};
axios.post(`/apaas/system/v5/user/update`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
} else {
let params = {
...formData,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
password: CryptoJS.AES.encrypt(formData.password, "swuE9cmCZQwrkYRV").toString(),
};
axios.put(`/apaas/system/v5/user/create`, params).then((res) => {
if (res.data.code == 200) {
successFlag.value = true;
step.value = 3;
} else {
ElMessage.error(res.data.data);
}
});
}
}
};
//上一步
const previousStep = () => {
step.value--;
};
//提交表单
const submit = () => {
contactFormRef.value.submitForm();
};
//继续创建 清空表单
const continueCreate = () => {
systemFormRef.value.clearForm();
contactFormRef.value.clearForm();
step.value = 1;
successFlag.value = false;
};
//取消
const cancel = () => {
// router.go(-1);
router.push({
path: "/develop/account",
query: {
id: formData.organization_id,
},
});
};
const getDetail = () => {
axios.get(`/apaas/system/v5/user/detail/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const form = res.data.data;
systemFormRef.value.setForm({
organization_id: form.organization_id,
system_role_id: form.system_role_id,
logo: form.logo ? [{ url: form.logo }] : [],
business_code: form.business_code,
business_name: form.business_name,
business_desc: form.business_desc,
system_account: form.system_account,
system_phone: form.system_phone,
access_address: form.access_address,
develop_id: form.develop_id,
state: form.state,
appid: form.app_id,
appsecret: form.app_secret,
});
contactFormRef.value.setForm({
contact_name: form.contact_name,
contact_phone: form.contact_phone,
contact_email: form.contact_email,
remark: form.remark,
});
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeUnmount(() => {});
onMounted(() => {
if (route.query.id) {
getDetail();
}
});
</script>
<style scoped>
.flex_cloumn {
display: flex;
flex-direction: column;
}
.content_top {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
}
/* .content_top::-webkit-scrollbar {
width: 5px;
height: 0px;
}
.content_top::-webkit-scrollbar-thumb {
background: #dedede;
border-radius: 10px;
height: 0px;
}
.content_top::-webkit-scrollbar-track {
background: transparent;
border-radius: 2px;
} */
.content_bottom {
height: 68px;
line-height: 68px;
text-align: right;
padding: 0 20px;
border-top: 1px solid #e6e9ef;
}
.content_process {
border-bottom: 1px solid #e6e9ef;
padding: 38px 16%;
}
.content_main {
flex: 1;
padding: 30px;
box-sizing: border-box;
}
.process_desc {
background-color: #fff;
display: inline-block;
position: absolute;
padding: 0 5px;
font-size: 18px;
color: #202531;
font-weight: bold;
}
.process_desc img {
height: 25px;
width: 25px;
vertical-align: middle;
}
.process_end {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.process_end div {
text-align: center;
}
.step_icon {
color: #fff;
font-weight: 600;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.icon_box {
display: inline-block;
background-color: #2b4695;
width: 48px;
height: 48px;
border-radius: 99px;
position: relative;
border: 3px solid #b0bee8;
vertical-align: middle;
}
.circle {
display: inline-block;
background-color: #a9b1c7;
width: 24px;
height: 24px;
border-radius: 99px;
position: relative;
border: 4px solid #e6e9ef;
vertical-align: middle;
}
.content_process :deep() .el-step.is-horizontal .el-step__line {
height: 4px;
}
.content_process :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 50%, #e6e9ef 50%);
}
.process_complete :deep() .el-step__head.is-finish .el-step__line {
background: linear-gradient(to right, #2b4695 100%, #e6e9ef 0%);
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="systemForm"
:rules="formRules"
ref="systemRef"
style="max-width: 66%">
<el-form-item label="所属组织" prop="organization_id">
<el-tree-select
v-model="systemForm.organization_id"
:data="orgData"
:props="treeProps"
:render-after-expand="false"
:disabled="formType"
style="width: 100%" />
</el-form-item>
<el-form-item label="业务系统编码" prop="business_code" v-if="formType">
<el-input v-model="systemForm.business_code" :disabled="formType" />
</el-form-item>
<el-form-item label="业务系统名称" prop="business_name">
<el-input v-model="systemForm.business_name" />
</el-form-item>
<el-form-item label="AppId" prop="appid" v-if="formType">
<el-input v-model="systemForm.appid" :disabled="formType">
<template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appid)"></bg-icon>
</template>
</el-input>
<!-- <span class="pl-1"><el-button type="primary" @click="copyText(systemForm.appid)">复制</el-button></span> -->
</el-form-item>
<el-form-item label="AppSecret" prop="appsecret" v-if="formType">
<div style="display: flex; width: 100%">
<el-input v-model="systemForm.appsecret" :disabled="formType">
<template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appsecret)"></bg-icon>
</template>
</el-input>
<span class="pl-1"><el-button type="primary" @click="resetSecret">重置</el-button></span>
</div>
</el-form-item>
<el-form-item label="系统LOGO" prop="logo">
<bg-upload-image
v-model="systemForm.logo"
:showTips="true"
:limit="1"
:fileSize="500"
:fileSizeUnit="'KB'"
listType="picture-card"
:accept="['.jpg', '.jpeg', '.png']"
customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item>
<el-form-item label="业务系统概述" prop="business_desc">
<el-input
type="textarea"
:rows="3"
v-model="systemForm.business_desc"
show-word-limit
maxlength="300" />
</el-form-item>
<el-form-item label="角色" prop="system_role_id" v-if="!formType">
<el-select
v-model="systemForm.system_role_id"
placeholder="请选择角色"
:disabled="true"
style="width: 100%">
<el-option
v-for="item in roleList"
:key="item.role_id"
:label="item.role_name"
:value="item.role_id" />
</el-select>
</el-form-item>
<el-form-item label="账号" prop="system_account">
<el-input v-model="systemForm.system_account" />
</el-form-item>
<el-form-item label="手机号" prop="system_phone">
<el-input v-model="systemForm.system_phone" />
</el-form-item>
<el-form-item label="密码" prop="password" v-if="!formType">
<el-input :type="password_eye ? 'text' : 'password'" v-model="systemForm.password">
<template #suffix>
<bg-icon
@click="password_eye = !password_eye"
class="icon_eye"
icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="确认密码" prop="confirm_password" v-if="!formType">
<el-input :type="confirm_eye ? 'text' : 'password'" v-model="systemForm.confirm_password">
<template #suffix>
<bg-icon @click="confirm_eye = !confirm_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="访问地址" prop="access_address">
<el-input v-model="systemForm.access_address" />
</el-form-item>
<el-form-item label="开发厂商名称" prop="develop_id">
<el-select v-model="systemForm.develop_id" placeholder="请选择开发厂商" style="width: 100%">
<el-option
v-for="item in firmList"
:key="item.dict_id"
:label="item.dict_name"
:value="item.dict_id" />
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="systemForm.state"></bg-switch>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onBeforeMount, onMounted, computed } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import { validatePhone } from "@/services/rules.js";
const props = defineProps({
formType: {
type: Boolean,
default: false, //false 新增 true 编辑
},
id: {
type: String,
default: "",
},
});
const systemForm = reactive({
organization_id: "",
business_code: "",
business_name: "",
business_desc: "",
logo: [],
system_role_id: "",
system_account: "",
system_phone: "",
password: "",
confirm_password: "",
access_address: "",
develop_id: "",
state: 1,
appid: "",
appsecret: "",
});
const password_eye = ref(false);
const confirm_eye = ref(false);
const validatePass = (rule, value, callback) => {
if (value !== systemForm.password) {
callback(new Error("密码输入不一致"));
} else {
callback();
}
};
const validateBusinessName = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母、数字和汉字"));
} else {
let params = null;
if (props.id) {
params = {
id: parseInt(props.id),
business_name: value,
organization_id: systemForm.organization_id,
};
} else {
params = { business_name: value, organization_id: systemForm.organization_id };
}
axios.post(`/apaas/system/v5/user/check/business`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const validateSystemAccount = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和数字"));
} else {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), system_account: value };
} else {
params = { system_account: value };
}
axios.post(`/apaas/system/v5/user/check/account`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const checkPhoneRepet = (rule, value, callback) => {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), contact_phone: value };
} else {
params = { id: 0, contact_phone: value };
}
axios.post(`/apaas/system/v5/org/check`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
};
const formRules = reactive({
organization_id: [{ required: true, message: "请选择组织", trigger: "change" }],
business_name: [
{ required: true, message: "请输入业务系统名称", trigger: "blur" },
{ max: 50, message: "业务系统名称最大长度为50个字符", trigger: "blur" },
{ validator: validateBusinessName, trigger: "blur" },
],
system_role_id: [{ required: true, message: "请选择角色", trigger: "blur" }],
system_account: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ min: 4, message: "帐号长度不得低于4个字符", trigger: "blur" },
{ max: 20, message: "帐号最大长度为20个字符", trigger: "blur" },
{ validator: validateSystemAccount, trigger: "blur" },
],
system_phone: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ validator: validatePhone, trigger: "blur" },
{ validator: checkPhoneRepet, trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" },
],
confirm_password: [
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
access_address: [{ max: 500, message: "访问地址最大长度为500个字符", trigger: "blur" }],
develop_id: [{ required: true, message: "请选择开发厂商", trigger: "change" }],
});
const systemRef = ref(null);
const emit = defineEmits(["action"]);
const roleList = ref([]);
const firmList = ref([]);
const submitForm = async () => {
if (!systemRef) return;
await systemRef.value.validate((valid, fields) => {
if (valid) {
emit("action", systemForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!systemRef) return;
systemRef.value.resetFields();
systemForm.system_role_id = roleList.value[0].role_id;
};
const setForm = (data) => {
Object.assign(systemForm, data);
};
const orgData = ref([]);
const treeProps = {
label: "name",
children: "Child",
value: "organization_id",
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
const orgDataTemp = res.data.data || [];
orgDataTemp.shift();
orgData.value = orgDataTemp;
} else {
ElMessage.error(res.data.data);
}
});
};
const copyText = (data) => {
navigator.clipboard.writeText(data).then(
function () {
ElMessage.success("复制成功");
},
function () {}
);
};
const resetSecret = () => {
axios.get(`/apaas/system/v5/user/reset/secret/${props.id}`).then((res) => {
if (res.data.code == 200) {
systemForm.appsecret = res.data.data;
ElMessage.success("重置成功!");
} else {
ElMessage.error(res.data.data);
}
});
};
const getRoleList = () => {
axios.get(`/apaas/system/v5/org/select/role?is_admin=1`).then((res) => {
if (res.data.code == 200) {
roleList.value = res.data.data;
systemForm.system_role_id = roleList.value[0].role_id;
} else {
}
});
};
const getFirmList = () => {
axios.get(`/apaas/system/v5/dictionary/developer/list`).then((res) => {
if (res.data.code == 200) {
firmList.value = res.data.data || [];
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
getOrgTree();
getRoleList();
getFirmList();
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
</script>
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content apaas_scroll">
<div class="info_row">
<div class="title">
<div><span class="icon_box"></span> 基础信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="img_box">
<img v-if="logo" :src="logo" style="height: 96px; width: 96px; border-radius: 99px" alt="" />
<img
v-else
src="/src/assets/imgs/home_ic_user.png"
style="height: 96px; width: 96px; border-radius: 99px"
alt="" />
</div>
<div class="info_box">
<bg-info :data="baseInfo"></bg-info>
</div>
</div>
</div>
<div>
<div class="title">
<div><span class="icon_box"></span> 联系人信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="img_box"></div>
<div class="info_box">
<bg-info :data="contactInfo"></bg-info>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, toRefs, ref, onBeforeMount } from "vue";
import { useRoute, useRouter } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
const baseInfo = reactive([
{
name: "所属组织",
value: "",
nameWidth: 130,
},
{
name: "业务系统编码",
value: "",
nameWidth: 130,
},
{
name: "业务系统名称",
value: "",
nameWidth: 130,
},
{
name: "账号",
value: "",
nameWidth: 130,
},
{
name: "AppID",
value: "",
nameWidth: 130,
},
{
name: "AppSecret",
value: "",
copy_icon: true,
secret: true,
nameWidth: 130,
},
{
name: "创建人",
value: "",
nameWidth: 130,
},
{
name: "创建时间",
value: "",
nameWidth: 130,
},
{
name: "是否启用",
value: "",
state: "",
nameWidth: 130,
},
{
name: "开发厂商名称",
value: "",
nameWidth: 130,
},
{
name: "访问地址",
value: "",
full: true,
nameWidth: 130,
},
{
name: "业务系统描述",
value: "",
full: true,
nameWidth: 130,
},
]);
const contactInfo = reactive([
{
name: "联系人姓名",
value: "",
nameWidth: 130,
},
{
name: "联系人手机号",
value: "",
nameWidth: 130,
},
{
name: "联系人邮箱",
value: "",
full: true,
nameWidth: 130,
},
{
name: "备注",
value: "",
full: true,
nameWidth: 130,
},
]);
const logo = ref("");
const getDetail = () => {
axios.get(`/apaas/system/v5/user/detail/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const detail = res.data.data;
baseInfo[0].value = detail.organization_name;
baseInfo[1].value = detail.business_code;
baseInfo[2].value = detail.business_name;
baseInfo[3].value = detail.system_account;
baseInfo[4].value = detail.app_id;
baseInfo[5].value = detail.app_secret;
baseInfo[6].value =
detail.created_by + "(" + (detail.created_user_role ? detail.created_user_role.join("") : "") + ")";
baseInfo[7].value = detail.created_time;
baseInfo[8].value = detail.state === 1 ? "" : "";
baseInfo[8].state = detail.state === 1 ? "success" : "default";
baseInfo[9].value = detail.develop_name;
baseInfo[10].value = detail.access_address;
baseInfo[11].value = detail.business_desc;
contactInfo[0].value = detail.contact_name;
contactInfo[1].value = detail.contact_phone;
contactInfo[2].value = detail.contact_email;
contactInfo[3].value = detail.remark;
logo.value = detail.logo;
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
getDetail();
});
</script>
<style scoped>
.page_content {
padding: 15px;
overflow: auto;
}
.info_content {
display: flex;
}
.info_row {
margin-bottom: 40px;
}
.img_box {
width: 120px;
}
.info_box {
width: 60%;
}
.title {
font-size: 18px;
color: #1a1a1a;
font-weight: bold;
margin-bottom: 10px;
display: flex;
align-items: center;
}
.dashed_line {
flex: 1;
height: 1px;
margin: 0 10px;
border-bottom: dashed 1px #dadee7;
}
.icon_box {
display: inline-block;
width: 4px;
height: 14px;
background-color: #3759be;
border-radius: 2px;
margin-right: 5px;
}
</style>
<template> <template>
<div>用户管理</div> <div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="flex_row">
<div class="flex_left bgc_white">
<div class="tree_header">政务组织</div>
<div class="tree_content">
<div class="search">
<el-input v-model="filterTree" placeholder="请输入组织名称搜索" :prefix-icon="Search" />
</div>
<div class="tree">
<el-tree
ref="treeRef"
:data="orgData"
:props="defaultProps"
@node-click="handleNodeClick"
node-key="id"
:highlight-current="true"
:filter-node-method="filterNode"
:default-expand-all="true">
<template #default="{ node, data }">
<div class="custom_tree_node">
<span class="label-text" :title="node.label">{{ node.label }} </span>
</div>
</template>
</el-tree>
</div>
</div>
</div>
<div class="flex_right bgc_white">
<div class="main_container">
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="addAccount">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增
</el-button>
<el-button @click="deleteBatch"> 批量删除 </el-button>
<el-button @click="resetPsd"> 重置密码 </el-button>
<span class="header_info"
>已选择<span style="color: #202531; font-weight: bold">{{ selected.length }}</span
></span
>
<span class="header_info can_click_text" @click="clearSelected">清空</span>
</div>
</template>
</bg-filter-group>
<div class="table_container apaas_scroll">
<bg-table
ref="dataTable"
:headers="headers"
:rows="tableRows"
:isIndex="true"
:stripe="true"
:select="true"
@selectAc="selectRows">
<template v-slot:business_name="{ row }">
<span @click="goDetail(row)" class="can_click_text">
{{ row.business_name }}
</span>
</template>
<template v-slot:state="{ row }">
<bg-switch
@click="stateChange(row)"
:labels="['否', '是']"
:values="[0, 1]"
v-model="row.state"></bg-switch>
</template>
<template v-slot:action="{ row }">
<bg-table-btn @click="editAccount(row.id)"> 编辑 </bg-table-btn>
<bg-table-btn @click="editPsdAccount(row)"> 修改密码 </bg-table-btn>
<bg-table-btn @click="deleteAccount(row)"> 删除 </bg-table-btn>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
</div>
</div>
<el-dialog v-model="deleteFlag" title="删除" width="520px" :before-close="handleCloseDelete">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedName.join("、") }}</span
>做删除操作。
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseDelete">取消</el-button>
<el-button type="primary" @click="deleteConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="deleteRowFlag" title="删除" width="520px" :before-close="handleCloseRowDelete">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.business_name }}</span
>做删除操作。
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseRowDelete">取消</el-button>
<el-button type="primary" @click="deleteRowConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="resetFlag" title="重置密码" width="520px" :before-close="handleCloseReset">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedName.join("、") }}</span
>做重置密码操作。
</div>
<div>重置密码为123456,是否继续?</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseReset">取消</el-button>
<el-button type="primary" @click="resetConfirm">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="editFlag" title="修改密码" width="520px" :before-close="handleCloseEdit">
<div class="warning_info">
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.business_name }}</span
>做修改密码操作,修改后旧密码将无法登录。
</div>
<div>
<el-form
:label-position="'right'"
label-width="120px"
:model="passwordForm"
:rules="passwordFormRules"
ref="passwordRef"
style="max-width: 80%">
<el-form-item label="新密码" prop="password">
<el-input
v-model="passwordForm.password"
:type="password_eye ? 'text' : 'password'"
placeholder="请输入密码">
<template #suffix>
<bg-icon @click="password_eye = !password_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="确认新密码" prop="confirm_password">
<el-input
v-model="passwordForm.confirm_password"
:type="confirm_eye ? 'text' : 'password'"
placeholder="请确认新密码">
<template #suffix>
<bg-icon @click="confirm_eye = !confirm_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCloseEdit">取消</el-button>
<el-button type="primary" @click="editConfirm">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template> </template>
<script setup></script> <script setup>
import { Search } from "@element-plus/icons-vue";
import { watch, nextTick, reactive, ref, computed, onBeforeMount } from "vue";
import { useRoute, useRouter } from "vue-router";
import CryptoJS from "crypto-js";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
<style lang="scss" scoped></style> const dataTable = ref(null);
const headers = ref([
{
label: "业务系统编码",
prop: "business_code",
minWidth: 160,
},
{
label: "业务系统名称",
prop: "business_name",
minWidth: 160,
},
{
label: "账号",
prop: "system_account",
},
{
label: "所属组织",
prop: "organization_name",
minWidth: 180,
},
{
label: "创建时间",
prop: "created_time",
width: 160,
},
{
label: "是否启用",
prop: "state",
},
{
label: "操作",
prop: "action",
width: 220,
fixed: "right",
},
]);
const tableRows = ref([]);
const search = ref("");
const filter = reactive({
search: "",
page: 1,
limit: 10,
});
const tableTotal = ref(0);
const deleteFlag = ref(false);
const deleteRowFlag = ref(false);
const resetFlag = ref(false);
const selectedRow = ref({});
const selected = ref([]);
const selectedName = ref([]);
const editFlag = ref(false);
const password_eye = ref(false);
const confirm_eye = ref(false);
const passwordRef = ref(null);
const passwordForm = reactive({
password: "",
confirm_password: "",
});
const selectNode = ref(null);
const selectNodeObj = ref(null);
const filterTree = ref("");
const treeRef = ref(null);
const validatePass = (rule, value, callback) => {
if (value !== passwordForm.password) {
callback(new Error("密码输入不一致"));
} else {
callback();
}
};
const passwordFormRules = reactive({
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" },
],
confirm_password: [
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
});
const router = useRouter();
const route = useRoute();
const getTableRows = () => {
let params = { ...filter, organization_id: selectNode.value };
axios
.get(`/apaas/system/v5/user/list`, {
params,
})
.then((res) => {
if (res.data.code == 200) {
tableRows.value = res.data.data || [];
tableTotal.value = res.data.total;
} else {
ElMessage.error(res.data.data);
}
});
};
const addAccount = (params) => {
router.push({
path: "/authority/user/add",
});
};
const handleNodeClick = (data) => {
if (data.data_type == 1) {
selectNode.value = data.id;
changePage(1);
} else {
nextTick(() => {
treeRef.value.setCurrentKey(null);
});
}
};
const orgData = ref([]);
const customNodeClass = (data, node) => {
if (data.data_type == 0) {
return "noFocus";
} else {
return "";
}
};
const defaultProps = {
label: "name",
children: "Child",
value: "organization_id",
class: customNodeClass,
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
if (res.data.code == 200) {
orgData.value = res.data.data || [];
orgData.value.shift();
const orgList = searchOrg(orgData.value);
if (route.query.id) {
searchItem(orgData.value, route.query.id);
} else {
selectNode.value = orgList.length > 0 ? orgList[0].id : "";
}
nextTick(() => {
if (route.query.id) {
treeRef.value.setCurrentNode(selectNodeObj.value);
} else {
if (orgList.length > 0) {
treeRef.value.setCurrentNode(orgList[0]);
}
}
});
getTableRows();
} else {
ElMessage.error(res.data.data);
}
});
};
const searchItem = (data, id) => {
data.forEach((e) => {
if (e.organization_id == id) {
selectNodeObj.value = e;
selectNode.value = e.id;
} else {
if (e.Child) {
searchItem(e.Child, id);
}
}
});
};
const searchOrg = (data) => {
const arr = [];
data.forEach((item) => {
if (item.data_type === 1) {
arr.push(item);
return;
} else {
if (item.Child) {
searchOrg(item.Child);
} else {
return;
}
}
});
return arr;
};
watch(filterTree, (val) => {
treeRef.value.filter(val);
});
const filterNode = (value, data) => {
if (!value) return true;
return data.name.includes(value);
};
const stateChange = (row) => {
const state = row.state.toString();
axios.post(`/apaas/system/v5/user/state/${row.id}/${state}`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
row.state = row.state == 0 ? 1 : 0;
}
});
};
const changeSize = (size) => {
filter.limit = size;
filter.page = 1;
changePage(1);
};
const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.search = val;
changePage(1);
}; // 表格关键字筛选
const goDetail = (params) => {
router.push({
path: "/authority/user/detail",
query: {
id: params.id,
},
});
};
const editAccount = (id) => {
router.push({
path: "/authority/user/edit",
query: {
id: id,
},
});
};
const deleteAccount = (data) => {
if (data.state === 0) {
selectedRow.value = data;
deleteRowFlag.value = true;
} else {
ElMessage.error("当前状态已启用,不可删除!");
}
};
const handleCloseDelete = () => {
deleteFlag.value = false;
};
const handleCloseRowDelete = () => {
deleteRowFlag.value = false;
};
const deleteConfirm = () => {
const ids = selected.value.map((item) => item.id);
axios.delete(`/apaas/system/v5/user/delete`, { data: { ids: ids } }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseDelete();
});
};
const deleteRowConfirm = () => {
axios.delete(`/apaas/system/v5/user/delete`, { data: { ids: [selectedRow.value.id] } }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseRowDelete();
});
};
const deleteBatch = () => {
if (selectedName.value.length > 0) {
deleteFlag.value = true;
} else {
ElMessage.error("请先选择需要操作的数据!");
}
};
const handleCloseReset = () => {
resetFlag.value = false;
};
const resetPsd = () => {
if (selectedName.value.length > 0) {
resetFlag.value = true;
} else {
ElMessage.error("请先选择需要操作的数据!");
}
};
const resetConfirm = () => {
const ids = selected.value.map((item) => item.id);
axios.post(`/apaas/system/v5/user/resetpwd`, { ids: ids }).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getTableRows();
} else {
ElMessage.error(res.data.data);
}
handleCloseReset();
});
};
const editPsdAccount = (data) => {
selectedRow.value = data;
editFlag.value = true;
};
const handleCloseEdit = () => {
if (!passwordRef) return;
passwordRef.value.resetFields();
editFlag.value = false;
password_eye.value = false;
confirm_eye.value = false;
};
const editConfirm = () => {
if (!passwordRef) return;
passwordRef.value.validate((valid, fields) => {
if (valid) {
axios
.post(`/apaas/system/v5/user/editpwd`, {
id: selectedRow.value.id,
password: CryptoJS.AES.encrypt(passwordForm.password, "swuE9cmCZQwrkYRV").toString(),
})
.then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
} else {
ElMessage.error(res.data.data);
}
handleCloseEdit();
});
}
});
};
const selectRows = (data) => {
selected.value = data.selection;
selectedName.value = data.selection.map((item) => item.business_name);
};
const clearSelected = () => {
dataTable.value.clearTable();
};
onBeforeMount(() => {
getOrgTree();
//getTableRows()
});
</script>
<style scoped>
.tree_header {
height: 40px;
line-height: 40px;
background-color: #f7f7f9;
border-radius: 6px 6px 0px 0px;
font-size: 16px;
letter-spacing: 0px;
color: #202531;
padding-left: 16px;
}
.tree_content {
overflow: hidden;
height: calc(100% - 45px);
}
.search {
padding: 16px;
}
.tree {
overflow: auto;
height: calc(100% - 65px);
}
.tree :deep() .el-tree-node > .el-tree-node__children {
overflow: unset;
}
.tree :deep().noFocus:focus > .el-tree-node__content {
background-color: #fff;
}
.custom_tree_node {
width: 100%;
font-size: 14px;
color: #202531;
padding-right: 16px;
}
.label-text:hover {
padding: 3px 0;
background-color: var(--el-tree-node-hover-bg-color);
}
.main_container {
height: 100%;
}
.table_container {
height: calc(100% - 30px);
overflow: auto;
padding: 0 16px;
}
.pagination_box {
position: sticky;
position: -webkit-sticky;
margin-top: 16px;
bottom: 25px;
background-color: #fff;
z-index: 1024;
height: 40px;
line-height: 40px;
padding-top: 5px;
}
.bg-pagination {
bottom: unset;
margin-top: 0px;
}
</style>
<template> <template>
<div>预警列表</div> <div class="detail_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="main_container">
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入预警点">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="batchPush">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-edit"></bg-icon>
批量推送
</el-button>
<el-button type="default" @click="batchDelete"> 批量删除 </el-button>
<span class="header_info"
>已选择 <span style="color: #202531; font-weight: bold"> {{ state.selected.length }} </span>
</span>
<span class="header_info can_click_text" @click="clearSelected">清空</span>
</div>
</template>
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">预警分类</span>
<el-select v-model="filter.warning_type" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in warningTypes"
:key="'warningType' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">预警指标</span>
<el-select v-model="filter.warning_target" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in warningTargets"
:key="'warningTargets' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">风险等级</span>
<el-select v-model="filter.risk_level" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in riskLevels"
:key="'riskLevels' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">状态</span>
<el-select v-model="filter.state" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in stateOptions"
:key="'stateOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">预警时间</span>
<el-date-picker
style="width: 300px"
v-model="filter.time"
type="daterange"
value-format="yyyy-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期" />
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table bg-scroll">
<bg-table
ref="dataTable"
:headers="headers"
:rows="tableRows"
@selectAc="selectRows"
:isIndex="true"
:select="true"
:stripe="true">
<template v-slot:warning_point="{ row }">
<span class="can_click_text" @click="goDetail(row)">
{{ row.warning_point }}
</span>
</template>
<template v-slot:warning_time="{ row }">
{{ row.warning_time ? row.warning_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }}
</template>
<template v-slot:last_push_time="{ row }">
{{ row.last_push_time ? row.last_push_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }}
</template>
<template #state="{ row }">
<span :class="`circle bgc_${row.state}`"></span>
{{ ["未恢复", "已恢复", "已关闭"][row.state] }}
</template>
<template v-slot:action="{ row }">
<bg-table-btns2 :limit="3" :tableData="tableRows">
<bg-table-btn :disabled="row.state != 0" @click="pushWarning(row)">推送提醒</bg-table-btn>
<bg-table-btn :disabled="row.state != 0" @click="closeWarning(row)">关闭预警</bg-table-btn>
</bg-table-btns2>
</template>
</bg-table>
</div>
<bg-pagination
:page="filter.page"
:size="filter.size"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
<!-- todo: 推送提醒 -->
<!-- <el-dialog
class="dialog_box"
:title="addType == 1 ? '新增' : '编辑'"
v-model="addDialog"
width="758px">
<el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form">
<el-form-item label="名称" prop="name">
<el-input
v-model.trim="formData.name"
show-word-limit
:maxlength="
nodeClassifyId == 'eb9c7d70-c123-42b7-8e61-dde1b022b669'
? 6
: nodeClassifyId == 'efd9ec3b-7f18-49e2-9d88-bcca022243bb'
? 4
: nodeClassifyId == '949a1138-4995-464e-97a9-424d097eb271'
? 2
: 20
"
placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述" prop="describe">
<el-input
v-model="formData.describe"
type="textarea"
:autosize="{ minRows: 5 }"
show-word-limit
maxlength="200"
resize="vertical"
placeholder="请输入描述"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="state" style="margin-bottom: 0px">
<el-switch
class="bg-switch-ele"
v-model="formData.state"
:active-value="1"
:inactive-value="0"
inline-prompt
active-text="是"
inactive-text="否" />
</el-form-item>
</el-form>
<template v-slot:footer>
<div class="apaas_button">
<el-button type="default" @click="addDialog = false">取 消</el-button>
<el-button type="primary" @click="addConfirm">保 存</el-button>
</div>
</template>
</el-dialog> -->
<!-- todo:关闭提醒 -->
<!-- <el-dialog
class="dialog_box"
title="提示"
v-model="dialogDelete"
width="400px"
:before-close="
() => {
dialogDelete = false;
}
">
<div>确定要删除此字典值吗?</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button type="default" @click="dialogDelete = false">取 消</el-button>
<el-button type="primary" @click="deleteData">确 定</el-button>
</div>
</template>
</el-dialog> -->
</div>
</template> </template>
<script setup></script> <script setup>
import { reactive, ref, onBeforeMount, toRefs, computed, watch, nextTick, watchEffect } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
import { Search } from "@element-plus/icons-vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const bgForm = ref(null);
const dataTable = ref(null);
const state = reactive({
bgForm,
warningTypes: [
{
name: "全部",
value: "",
},
{
name: "分类1",
value: 1,
},
{
name: "分类2",
value: 2,
},
], // 预警分类数据
warningTargets: [
{
name: "全部",
value: "",
},
{
name: "指标1",
value: 1,
},
{
name: "指标2",
value: 2,
},
], // 预警指标数据
riskLevels: [
{
name: "全部",
value: "",
},
{
name: "等级1",
value: 1,
},
{
name: "等级2",
value: 2,
},
], // 风险等级
stateOptions: [
{
name: "全部",
value: "",
},
{
name: "已恢复",
value: "1",
},
{
name: "未恢复",
value: "0",
},
{
name: "已关闭",
value: "2",
},
], // 状态
headers: [
{
label: "预警点",
prop: "warning_point",
width: 180,
},
{
label: "预警时间",
prop: "warning_time",
width: 160,
},
{
label: "预警分类",
prop: "warning_type_name",
},
{
label: "预警指标",
prop: "warning_target_name",
},
{
label: "风险等级",
prop: "risk_level_name",
},
{
label: "当前报警值",
prop: "now_warn_data",
},
{
label: "预警阈值",
prop: "warn_threshold",
},
{
label: "通知人数",
prop: "notice_people_num",
width: 80,
},
{
label: "推送次数",
prop: "push_times",
width: 80,
},
{
label: "最后推送时间",
prop: "last_push_time",
width: 160,
},
{
label: "状态",
prop: "state",
width: 90,
},
{
label: "操作",
prop: "action",
width: 180,
fixed: "right",
},
],
tableRows: [], // 表格数据
selected: [], //选择数据
tableTotal: 0, // 表格数据条数
filter: {
warning_type: "", // 预警类型
warning_target: "", // 预警指标
risk_level: "", // 风险等级
state: "", // 状态
time: [],
search: "",
page: 1,
limit: 10,
}, // 表格筛选项
actionRow: null, // 当前操作的数据
dialogDelete: false, // 删除弹窗
addType: 0, //
addDialog: false,
formData: {
name: "",
describe: "",
state: 1,
p_dict_id: "",
},
rules: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
describe: [
{ required: true, message: "请输入描述", trigger: "blur" },
{ max: 200, message: "描述最大为200字", trigger: "blur" },
],
state: [{ required: true, message: "请选择是否启用", trigger: "change" }],
},
});
const selectRows = (data) => {
state.selected = data.selection;
};
const clearSelected = () => {
dataTable.value.clearTable();
}; // 清空
const batchDelete = () => {
console.log("批量删除");
}; // 批量删除
const goDetail = (row) => {
console.log("去详情");
}; // 查看详情
const changeSearch = (val) => {
state.filter.search = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
const filterClear = () => {
state.filter = {
warning_type: "", // 预警类型
warning_target: "", // 预警指标
risk_level: "", // 风险等级
state: "", // 状态
time: "",
search: "",
page: 1,
limit: 10,
};
changePage(1);
}; // 重置筛选项
const getTableRows = () => {
let params = { ...state.filter };
// axios
// .get(`/apaas/system/v5/dictionary/list`, {
// params,
// })
// .then((res) => {
// if (res.data.code == 200) {
// state.tableRows = res.data.data || [];
// state.tableTotal = res.data.total;
// } else {
// ElMessage.error(res.data.data);
// }
// });
state.tableTotal = 23;
state.tableRows = [
{
id: 1,
warning_point: "容器云/tyyh",
warning_time: "2020-01-01 00:00:00",
warning_type_name: "容器组",
warning_target_name: "服务中断",
risk_level_name: "重大风险",
now_warn_data: "",
warn_threshold: "",
notice_people_num: 2,
push_times: 2,
last_push_time: "2020-01-01 00:00:00",
state: 1,
},
{
id: 2,
warning_point: "容器云/kube-apiserver",
warning_time: "2020-01-01 00:00:00",
warning_type_name: "容器集群",
warning_target_name: "内存使用率",
risk_level_name: "较大风险",
now_warn_data: "66%",
warn_threshold: "60%-70%",
notice_people_num: 3,
push_times: 1,
last_push_time: "2020-01-01 00:00:00",
state: 0,
},
{
id: 3,
warning_point: "容器云/kube-apiserver",
warning_time: "2020-01-01 00:00:00",
warning_type_name: "容器集群",
warning_target_name: "内存使用率",
risk_level_name: "较大风险",
now_warn_data: "66%",
warn_threshold: "60%-70%",
notice_people_num: 3,
push_times: 1,
last_push_time: "2020-01-01 00:00:00",
state: 2,
},
];
}; // 获取表格数据
const changePage = (page) => {
state.filter.page = page;
getTableRows();
}; // 改变页码
const changeSize = (size) => {
state.filter.limit = size;
changePage(1);
}; // 改变每页条数
const batchPush = () => {
console.log("批量推送");
}; // 批量推送
const pushWarning = (row) => {
state.actionRow = row;
console.log("推送提醒");
}; // 推送提醒
const closeWarning = (row) => {
state.actionRow = row;
console.log("关闭预警");
}; // 关闭预警
onBeforeMount(() => {
getTableRows();
});
const { headers, tableRows, tableTotal, filter, warningTypes, warningTargets, riskLevels, stateOptions } =
toRefs(state);
</script>
<style lang="scss" scoped>
.detail_container {
width: 100%;
height: calc(100vh - 56px);
padding: 0 24px;
min-height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.main_container {
height: 100%;
.filter-group {
.left-filter {
flex: 1;
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.right-action {
width: 144px;
padding-bottom: 16px;
.el-button {
width: 64px;
}
}
}
.table_container {
height: calc(100% - 70px);
width: 100%;
padding: 0 16px;
.table {
max-height: calc(100% - 64px);
.circle {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 3px;
margin-right: 8px;
transform: translateY(-2px);
}
.bgc_0 {
background-color: #d75138;
}
.bgc_1 {
background-color: #48ad97;
}
.bgc_2 {
background-color: #9e9e9e;
}
}
}
}
<style lang="scss" scoped></style> .bg_form {
width: 100%;
box-sizing: border-box;
.el-form-item {
margin-bottom: 24px;
:deep().el-form-item__label {
line-height: 36px;
height: 36px;
}
.el-form-item__content {
width: 100%;
.el-textarea {
:deep().el-input__count {
bottom: -16px;
right: 4px;
font-family: Roboto-Regular;
color: #a9b1c7;
}
}
.bg-switch-ele {
width: 52px;
height: 24px;
:deep().el-switch__core {
width: 100%;
height: 24px;
.el-switch__inner,
.el-switch__action {
top: 3px;
}
}
}
}
}
}
}
</style>
<template>
<el-dialog
v-model="show"
width="774px"
top="10vh"
:before-close="beforeClose"
:close-on-click-modal="false"
>
<template #header>
<GapTitle title="关闭工单"></GapTitle>
</template>
<div class="feedback-body">
<el-form
:model="state.form"
ref="form"
:rules="state.rules"
label-width="80px"
>
<el-form-item label="关闭原因" prop="reason">
<el-input
type="textarea"
v-model="state.form.reason"
rows="5"
placeholder="请输入关闭原因"
></el-input>
</el-form-item>
</el-form>
</div>
<template #footer>
<el-button size="default" @click="Close">关闭</el-button>
<el-button type="primary" size="default" @click="Submit">提交</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { computed, reactive, ref } from "vue";
import GapTitle from "@/components/gap-title.vue";
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
beforeClose: {
type: Function,
default: () => {},
},
active_row: {
type: Object,
default: null,
},
});
const state = reactive({
form: {
reason: "",
},
rules: {
reason: [{ required: true, message: "请输入关闭原因", trigger: "blur" }],
},
});
const emits = defineEmits(["update:visible"]);
const form = ref(null);
const Close = () => {
form.value.resetFields();
emits("update:visible", false);
};
const show = computed({
get() {
return props.visible;
},
set() {
Close();
},
});
const beforeClose = () => {
props.beforeClose();
Close();
};
const Submit = () => {
form.value.validate((valid) => {
if (valid) {
console.log(state.form);
} else {
return false;
}
});
};
</script>
<style lang="scss" scoped>
.feedback-body {
text-align: left;
padding: 24px 16px 0;
}
</style>
<template>
<div class="business-ticket-list">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content bg-scroll">
<div class="go-back">
<goBack />
</div>
<gap-title :hasLine="true" title="基本信息"></gap-title>
<div class="info">
<Info :labelData="labelData" :valueData="info">
<template #status="{ item, valueData }">
<span class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span>
<span>{{ STATUS_OBJ[valueData[item.prop]] }}</span>
</span>
</template>
</Info>
</div>
<gap-title :hasLine="true" title="推送方式"></gap-title>
<div class="info">
<Info :labelData="notificationMethod" :valueData="info">
<template #value="{ item, valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join("") }}</span>
</template>
</Info>
<div class="notification-lists">
<bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table>
</div>
</div>
<gap-title :hasLine="true" title="工单反馈"></gap-title>
<div class="info">
<feedback-detail :detail-info="detailInfo"></feedback-detail>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import Info from "@/components/warn-detail/info.vue";
import gapTitle from "@/components/gap-title.vue";
import feedbackDetail from "@/page/main/ticket/modules/feedback-detail/index.vue";
import goBack from "@/components/go-back/index.vue";
import { METHODS } from "@/components/manual-distribution/env.js";
const STATUS_OBJ = {
finish: "已完成",
close: "已关闭",
info: "待处置",
};
const labelData = [
[
{
label: "工单名称",
prop: "ticket_name",
},
{
label: "状态",
prop: "status",
},
],
[
{
label: "工单等级",
prop: "ticket_level",
},
{
label: "创建人",
prop: "create_by",
},
],
[
{
label: "工单描述",
prop: "description",
},
],
[
{
label: "创建时间",
prop: "create_time",
},
{
label: "完成时间",
prop: "finish_time",
},
],
];
const info = {
ticket_name: "7月常态化运维巡检任务",
status: "finish",
ticket_level: "紧急任务",
create_by: "管理员",
description: "请进行所有系统常态化月度巡检任务(每月定期常态运维巡检),将巡检结果上报!",
create_time: "2020-01-01 00:00:00",
finish_time: "2020-01-01 00:00:00",
notification_method: ["1", "2"],
};
const notificationMethod = [
[
{
label: "通知方式",
prop: "notification_method",
},
],
];
const headers = [
{
prop: "user_id",
label: "账号",
},
{
prop: "user_name",
label: "姓名",
},
{
prop: "phone",
label: "联系方式",
},
];
const rows = ref([
{
user_id: "11",
user_name: "1111",
phone: "13211111111",
},
{
user_id: "22",
user_name: "2222",
phone: "13222222222",
},
{
user_id: "33",
user_name: "3333",
phone: "13233333333",
},
]);
const detailInfo = ref([
{
status: "close",
target: "张三",
feedback: "任务临时取消",
time: "2022-10-22 09:58:30",
},
{
status: "finish",
target: "李四",
feedback: "任务临时取消",
time: "2022-10-22 09:58:30",
},
]);
</script>
<style lang="scss" scoped>
.business-ticket-list {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
padding: 24px;
.go-back {
margin-bottom: 24px;
}
:deep(.gap-title) {
margin-bottom: 16px;
}
.info,
.feedback-info {
max-width: 1072px;
width: 100%;
padding: 0 8px 0;
&:not(:last-child) {
padding-bottom: 24px;
}
.status {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 8px;
$statusObj: (
finish: #48ad97,
close: #9e9e9e,
info: #3759be,
);
@each $status, $color in $statusObj {
&-#{$status} {
background-color: $color;
}
}
}
.status-body {
display: flex;
align-items: center;
}
.notification-lists {
margin-top: 16px;
}
}
}
}
</style>
<template> <template>
<div>业务工单列表</div> <div class="business-ticket-list">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content">
<bg-filter-group
@search="changeSearch"
v-model="filter.key_word"
placeholder="请输入任务名称">
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">工单等级</span>
<el-select v-model="filter.ticket_level" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in ticketLevelOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">状态</span>
<el-select v-model="filter.status" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in statusOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">创建时间</span>
<el-date-picker
v-model="filter.create_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
<div class="filter_item">
<span class="filter_title">完成时间</span>
<el-date-picker
v-model="filter.finish_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table">
<bg-table
ref="listtable"
:headers="headers"
:rows="rows"
height="100%"
:isIndex="true"
:stripe="true">
<template #work_order_name="{ row }">
<div class="href" @click="goTo(row)">{{ row.work_order_name || "-" }}</div>
</template>
<template #operation="{ row }">
<span class="primary-edit" @click="operation(row)"> 关闭工单 </span>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
<!-- <el-button type="primary" size="default" @click="feedback">
处置反馈
</el-button> -->
<!-- <ManualDistributionForm ref="form" :disabled="true" /> -->
<CloseTicket v-model:visible="visible" :active_row="active_row" />
<!-- <ManualDistribution v-model:visible="visible" /> -->
</div>
</div>
</template> </template>
<script setup></script> <script setup>
// import { nextTick, onBeforeMount, onMounted, ref } from "vue";
// import ManualDistribution from "@/components/manual-distribution/index.vue";
// import ManualDistributionForm from "@/components/manual-distribution/form.vue";
// const form = ref(null);
// onMounted(async () => {
// await nextTick();
// form.value.init({
// method: ["1", "2"],
// lists: [
// {
// user_id: 1,
// user_name: 1111,
// phone: "13011111111",
// },
// ],
// });
// });
import { ref, reactive, onMounted, nextTick } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import FeedBack from "../modules/feedback.vue";
import CloseTicket from "./close-ticket.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const filter = reactive({
ticket_level: "",
key_word: "",
create_time: [],
finish_time: [],
status: "",
page: 1,
limit: 10,
});
const filterClear = () => {
filter.ticket_level = "";
filter.key_word = "";
filter.status = "";
filter.create_time = [];
filter.finish_time = [];
filter.limit = 10;
filter.page = 1;
changePage(1);
}; // 重置筛选项
const tableTotal = ref(0);
const ticketLevelOptions = ref([
{
value: "",
name: "全部",
},
]);
const statusOptions = ref([
{
value: "",
name: "全部",
},
]);
let headers = reactive([
{
label: "工单名称",
prop: "work_order_name",
align: "left",
},
{
label: "工单等级",
prop: "work_order_level",
align: "left",
},
{
label: "工单状态",
prop: "work_order_status",
align: "left",
},
{
label: "下发对象",
prop: "distribute_target",
align: "left",
},
{
label: "创建人",
prop: "create_by",
align: "left",
},
{
label: "创建时间",
prop: "create_time",
align: "left",
},
{
label: "完成时间",
prop: "finish_time",
align: "left",
},
{
label: "操作",
prop: "operation",
align: "left",
width: "80px",
},
]);
let rows = ref([
{ work_order_name: 11, id: 111 },
{ work_order_name: 22, id: 222 },
{ work_order_name: 33, id: 333 },
]);
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
<style lang="scss" scoped></style> const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.key_word = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
onMounted(() => {
getTableRows();
});
const getTableRows = async () => {
let [createStartTime = "", createEndTime = ""] = filter.create_time || [];
let [finishStartTime = "", finishEndTime = ""] = filter.finish_time || [];
let urlParams = {
...filter,
createStartTime,
createEndTime,
finishStartTime,
finishEndTime,
};
Reflect.deleteProperty(urlParams, "create_time");
Reflect.deleteProperty(urlParams, "finish_time");
console.log("urlParams: ", urlParams);
// const { data, total } = await instanceList(urlParams);
// rows.value = data.list || [];
// pagination.total = data.total_count;
};
// 处置反馈
const visible = ref(false);
const active_row = ref(null);
const operation = (row) => {
active_row.value = row;
visible.value = true;
};
const goTo = ({ id }) => {
router.push({
path: "/ticket/business-ticket-list/detail",
query: {
id,
},
});
};
</script>
<style lang="scss" scoped>
.business-ticket-list {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
display: flex;
flex-direction: column;
padding: 16px;
:deep(.bg-filter-group) {
padding: 0;
}
.filter-group {
.left-filter {
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.right-action {
white-space: nowrap;
}
}
.table_container {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
.table {
position: absolute;
position: absolute;
flex: 1;
width: 100%;
height: calc(100% - 48px);
.href {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
}
}
.bg-pagination {
bottom: unset;
}
}
}
</style>
<template>
<div class="business-manage-detail">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content"></div>
</div>
</template>
<script setup>
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
</script>
<style lang="scss" scoped>
.business-manage-detail {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
}
}
</style>
<template> <template>
<div>业务工单管理</div> <div class="my-alert">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content">
<bg-filter-group
@search="changeSearch"
v-model="filter.key_word"
placeholder="请输入任务名称">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="AddWorkOrder">
<bg-icon
style="font-size: 12px; color: #fff; margin-right: 8px"
icon="#bg-ic-add"></bg-icon>
新增
</el-button>
<el-button type="primary" @click="delBatch"> 批量删除 </el-button>
<div class="select_text">
<span>已选择</span>
<span class="num">{{ selectedItems.length }}</span>
<span></span>
<span class="can_click_text" @click="clearSelected">清空</span>
</div>
</div>
</template>
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">工单等级</span>
<el-select v-model="filter.ticket_level" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in ticketLevelOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">状态</span>
<el-select v-model="filter.status" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in statusOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">定时规则</span>
<el-select v-model="filter.rule" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in ruleOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">创建时间</span>
<el-date-picker
v-model="filter.create_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table">
<bg-table
ref="listtable"
:headers="headers"
:rows="rows"
height="100%"
:isIndex="true"
:select="true"
@selectAc="selectRows"
:stripe="true">
<template #work_order_name="{ row }">
<div class="href" @click="goTo(row)">{{ row.work_order_name || "-" }}</div>
</template>
<template #status="{ row }">
<span>
<span>{{ status[row.status] }}</span>
<span v-if="row.status != 3">{{ row.finish }}/{{ row.all }}</span>
</span>
</template>
<template #operation="{ row }">
<div class="table-operation">
<span class="primary-edit" @click="operation(row)"> 手动下发 </span>
<span class="line"></span>
<span class="primary-edit" @click="Edit(row)"> 编辑 </span>
<span class="line"></span>
<span class="primary-edit" @click="Delete(row)"> 删除 </span>
</div>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
<ManualDistribution v-model:visible="visible" :active_row="active_row" />
</div>
</div>
</template> </template>
<script setup></script> <script setup>
import { ref, reactive, onMounted, nextTick, computed } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import ManualDistribution from "@/components/manual-distribution/index.vue";
const status = {
1: "已完成",
2: "待处置",
3: "已关闭",
};
import { useRouter } from "vue-router";
const router = useRouter();
const filter = reactive({
ticket_level: "",
key_word: "",
create_time: [],
rule: [],
status: "",
page: 1,
limit: 10,
});
const filterClear = () => {
filter.ticket_level = "";
filter.key_word = "";
filter.status = "";
filter.create_time = [];
filter.rule = [];
filter.limit = 10;
filter.page = 1;
changePage(1);
}; // 重置筛选项
const tableTotal = ref(0);
const ticketLevelOptions = ref([
{
value: "",
name: "全部",
},
]);
const statusOptions = ref([
{
value: "",
name: "全部",
},
]);
const ruleOptions = ref([
{
value: "",
name: "全部",
},
]);
let headers = reactive([
{
label: "工单名称",
prop: "work_order_name",
align: "left",
href: {
baseurl: "/ticket/business-ticket-manage/detail",
params: { id: "id", name: "work_order_name" },
},
},
{
label: "工单等级",
prop: "work_order_level",
align: "left",
},
{
label: "实例工单数",
prop: "example_work_order_num",
align: "left",
},
{
label: "下发对象",
prop: "distribute_target",
align: "left",
},
{
label: "定时规则",
prop: "timing_rules",
align: "left",
},
{
label: "定时是否启用",
prop: "status",
align: "left",
width: 150,
},
{
label: "创建人",
prop: "create_by",
align: "left",
},
{
label: "创建时间",
prop: "create_time",
align: "left",
},
{
label: "操作",
prop: "operation",
align: "left",
width: "200px",
},
]);
let rows = ref([
{ work_order_name: 11, id: 111, status: 1, finish: 10, all: 10 },
{ work_order_name: 22, id: 222, status: 2, finish: 5, all: 10 },
{ work_order_name: 33, id: 333, status: 3, finish: 0, all: 10 },
]);
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.key_word = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
onMounted(() => {
getTableRows();
});
const getTableRows = async () => {
let [createStartTime = "", createEndTime = ""] = filter.create_time || [];
let urlParams = {
...filter,
createStartTime,
createEndTime,
};
Reflect.deleteProperty(urlParams, "create_time");
console.log("urlParams: ", urlParams);
// const { data, total } = await instanceList(urlParams);
// rows.value = data.list || [];
// pagination.total = data.total_count;
};
// 手动下发
const visible = ref(false);
const active_row = ref(null);
const operation = (row) => {
active_row.value = row;
visible.value = true;
};
// 编辑调用
const Edit = (row) => {
active_row.value = row;
};
// 删除调用
const selectedItems = ref([]);
const Delete = (row) => {
selectedItems.value = [row];
console.log(del_ids.value);
};
const del_ids = computed(() => {
return selectedItems.value.map((e) => e.id) || [];
});
// 表格选中
const selectRows = ({ selection }) => {
selectedItems.value = selection;
};
// 新增
const AddWorkOrder = () => {};
// 批量删除
const delBatch = () => {
console.log(del_ids.value);
};
// 清空选中
const listtable = ref(null);
const clearSelected = () => {
listtable.value.clearTable();
};
</script>
<style lang="scss" scoped></style> <style lang="scss" scoped>
.my-alert {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
display: flex;
flex-direction: column;
padding: 16px;
:deep(.bg-filter-group) {
padding: 0;
}
.select_text {
display: inline-block;
margin-left: 40px;
font-size: 14px;
color: #404a62;
.num {
color: #202531;
font-weight: 700;
margin: 0 3px;
}
.can_click_text {
margin-left: 24px;
cursor: pointer;
}
}
.filter-group {
.left-filter {
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.right-action {
white-space: nowrap;
}
}
.table_container {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
.table {
position: absolute;
flex: 1;
width: 100%;
height: calc(100% - 48px);
.href {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
}
}
.bg-pagination {
bottom: unset;
}
.table-operation {
display: flex;
align-items: center;
.line {
width: 1px;
height: 14px;
background-color: #c1c7d7;
margin: 0 16px;
display: inline-block;
}
}
}
}
</style>
<template>
<div class="detail-info">
<div class="status" :class="`feedback-detail-status-${info.status}`">
{{ STATUS_OBJ[info.status] }}
</div>
<div class="info-body">
<div v-for="label in infoLabel" :key="label.prop">
<span class="info-label">{{ label.label }}</span>
<span class="info-value">{{ info[label.prop] }}</span>
</div>
</div>
</div>
</template>
<script setup>
const STATUS_OBJ = {
finish: "已完成",
close: "已关闭",
info: "待处置",
};
const props = defineProps({
info: {
type: Object,
default: () => ({}),
},
});
const infoLabel = [
{
label: "下发对象",
prop: "target",
},
{
label: "工单反馈",
prop: "feedback",
},
{
label: "操作时间",
prop: "time",
},
];
</script>
<style lang="scss" scoped>
.detail-info {
background-color: #ffffff;
border-radius: 4px;
border: solid 1px #e3e4ef;
width: 100%;
height: auto;
font-size: 14px;
.status {
width: 100%;
height: 38px;
line-height: 37px;
background-color: #f9fafc;
padding: 0 16px;
font-weight: bold;
border-bottom: 1px solid #e3e4ef;
&.feedback-detail-status {
$statusObj: (
finish: #48ad97,
close: #242c43,
info: #3759be,
);
@each $status, $color in $statusObj {
&-#{$status} {
color: $color;
}
}
}
}
.info-body {
padding: 16px 24px;
& > div {
line-height: 30px;
display: flex;
align-items: flex-start;
.info-label {
width: auto;
color: #7784a6;
}
.info-value {
flex: 1;
color: #242c43;
}
}
}
}
</style>
<template>
<div class="feedback-detail">
<div class="detail-box" v-for="(detail, index) in detailInfo" :key="`feedback-detail-${index}`">
<Detail :info="detail" />
</div>
</div>
</template>
<script setup>
import Detail from "./detail.vue";
const props = defineProps({
detailInfo: {
type: Array,
default: () => [],
},
});
</script>
<style lang="scss" scoped>
.detail-box {
&:not(:first-child) {
margin-top: 16px;
}
}
</style>
<template>
<el-dialog
v-model="show"
width="774px"
top="10vh"
:before-close="beforeClose"
:close-on-click-modal="false"
>
<template #header>
<GapTitle title="处置反馈"></GapTitle>
</template>
<div class="feedback-body">
<el-form
:model="state.form"
ref="form"
:rules="state.rules"
label-width="80px"
>
<el-form-item label="预警状态" prop="status">
<el-radio-group v-model="state.form.status">
<el-radio v-for="(value, key) in status" :key="key" :label="key">
{{ value }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="结果反馈" prop="result">
<el-input
type="textarea"
v-model="state.form.result"
rows="5"
placeholder="请输入结果反馈"
></el-input>
</el-form-item>
</el-form>
</div>
<template #footer>
<el-button size="default" @click="Close">关闭</el-button>
<el-button type="primary" size="default" @click="Submit">保存</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { computed, reactive, ref } from "vue";
import GapTitle from "@/components/gap-title.vue";
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
beforeClose: {
type: Function,
default: () => {},
},
active_row: {
type: Object,
default: null,
},
});
const state = reactive({
form: {
status: "",
result: "",
},
rules: {
status: [{ required: true, message: "请选择预警状态", trigger: "change" }],
result: [{ required: true, message: "请输入结果反馈", trigger: "blur" }],
},
});
const status = {
1: "未恢复",
2: "已恢复",
};
const emits = defineEmits(["update:visible"]);
const form = ref(null);
const Close = () => {
form.value.resetFields();
emits("update:visible", false);
};
const show = computed({
get() {
return props.visible;
},
set() {
Close();
},
});
const beforeClose = () => {
props.beforeClose();
Close();
};
const Submit = () => {
form.value.validate((valid) => {
if (valid) {
console.log(state.form);
} else {
return false;
}
});
};
</script>
<style lang="scss" scoped>
.feedback-body {
text-align: left;
padding: 24px 16px 0;
}
</style>
<template>
<div class="warn-detail">
<div class="detail-info">
</div>
</div>
</template>
<script setup>
</script>
<style lang="scss" scoped>
.warn-detail{
max-width: 1072px;
width: 100%;
height: 100%;
}
</style>
\ No newline at end of file
<template>
<div class="my-business-detail">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content bg-scroll">
<div class="go-back">
<goBack />
</div>
<gap-title :hasLine="true" title="基本信息"></gap-title>
<div class="info">
<Info :labelData="labelData" :valueData="info">
<template #status="{ item, valueData }">
<span class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span>
<span>{{ STATUS_OBJ[valueData[item.prop]] }}</span>
</span>
</template>
</Info>
</div>
<gap-title :hasLine="true" title="推送方式"></gap-title>
<div class="info">
<Info :labelData="notificationMethod" :valueData="info">
<template #value="{ item, valueData }">
<span>{{ valueData[item.prop].map((e) => METHODS[e]).join("") }}</span>
</template>
</Info>
<div class="notification-lists">
<bg-table border ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true"> </bg-table>
</div>
</div>
<gap-title :hasLine="true" title="工单反馈"></gap-title>
<div class="info">
<feedback-detail :detail-info="detailInfo"></feedback-detail>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import Info from "@/components/warn-detail/info.vue";
import gapTitle from "@/components/gap-title.vue";
import feedbackDetail from "@/page/main/ticket/modules/feedback-detail/index.vue";
import goBack from "@/components/go-back/index.vue";
import { METHODS } from "@/components/manual-distribution/env.js";
const STATUS_OBJ = {
finish: "已完成",
close: "已关闭",
info: "待处置",
};
const labelData = [
[
{
label: "工单名称",
prop: "ticket_name",
},
{
label: "状态",
prop: "status",
},
],
[
{
label: "工单等级",
prop: "ticket_level",
},
{
label: "创建人",
prop: "create_by",
},
],
[
{
label: "工单描述",
prop: "description",
},
],
[
{
label: "创建时间",
prop: "create_time",
},
{
label: "完成时间",
prop: "finish_time",
},
],
];
const info = {
ticket_name: "7月常态化运维巡检任务",
status: "finish",
ticket_level: "紧急任务",
create_by: "管理员",
description: "请进行所有系统常态化月度巡检任务(每月定期常态运维巡检),将巡检结果上报!",
create_time: "2020-01-01 00:00:00",
finish_time: "2020-01-01 00:00:00",
notification_method: ["1", "2"],
};
const notificationMethod = [
[
{
label: "通知方式",
prop: "notification_method",
},
],
];
const headers = [
{
prop: "user_id",
label: "账号",
},
{
prop: "user_name",
label: "姓名",
},
{
prop: "phone",
label: "联系方式",
},
];
const rows = ref([
{
user_id: "11",
user_name: "1111",
phone: "13211111111",
},
{
user_id: "22",
user_name: "2222",
phone: "13222222222",
},
{
user_id: "33",
user_name: "3333",
phone: "13233333333",
},
]);
const detailInfo = ref([
{
status: "close",
target: "张三",
feedback: "任务临时取消",
time: "2022-10-22 09:58:30",
},
{
status: "finish",
target: "李四",
feedback: "任务临时取消",
time: "2022-10-22 09:58:30",
},
]);
</script>
<style lang="scss" scoped>
.my-business-detail {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
padding: 24px;
.go-back {
margin-bottom: 24px;
}
:deep(.gap-title) {
margin-bottom: 16px;
}
.info,
.feedback-info {
max-width: 1072px;
width: 100%;
padding: 0 8px 0;
&:not(:last-child) {
padding-bottom: 24px;
}
.status {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 8px;
$statusObj: (
finish: #48ad97,
close: #9e9e9e,
info: #3759be,
);
@each $status, $color in $statusObj {
&-#{$status} {
background-color: $color;
}
}
}
.status-body {
display: flex;
align-items: center;
}
.notification-lists {
margin-top: 16px;
}
}
}
}
</style>
<template> <template>
<div>我的业务工单</div> <div class="my-business-ticket">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content">
<bg-filter-group @search="changeSearch" v-model="filter.key_word" placeholder="请输入角色名称">
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">工单等级</span>
<el-select v-model="filter.ticket_level" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in ticketLevelOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">状态</span>
<el-select v-model="filter.status" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in statusOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">创建时间</span>
<el-date-picker
v-model="filter.create_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
<div class="filter_item">
<span class="filter_title">完成时间</span>
<el-date-picker
v-model="filter.finish_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table">
<bg-table ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true" :stripe="true">
<template #ticket_name="{ row }">
<div class="href" @click="goTo(row)">{{ row.ticket_name || "-" }}</div>
</template>
<template #operation="{ row }">
<span class="primary-edit" @click="operation(row)"> 处置反馈 </span>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
<!-- <el-button type="primary" size="default" @click="feedback">
处置反馈
</el-button> -->
<!-- <ManualDistributionForm ref="form" :disabled="true" /> -->
<FeedBack v-model:visible="visible" :active_row="active_row" />
<!-- <ManualDistribution v-model:visible="visible" /> -->
</div>
</div>
</template> </template>
<script setup></script> <script setup>
// import { nextTick, onBeforeMount, onMounted, ref } from "vue";
// import ManualDistribution from "@/components/manual-distribution/index.vue";
// import ManualDistributionForm from "@/components/manual-distribution/form.vue";
// const form = ref(null);
// onMounted(async () => {
// await nextTick();
// form.value.init({
// method: ["1", "2"],
// lists: [
// {
// user_id: 1,
// user_name: 1111,
// phone: "13011111111",
// },
// ],
// });
// });
import { ref, reactive, onMounted, nextTick } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import FeedBack from "../modules/feedback.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const filter = reactive({
ticket_level: "",
key_word: "",
create_time: [],
finish_time: [],
status: "",
page: 1,
limit: 10,
});
const filterClear = () => {
filter.ticket_level = "";
filter.key_word = "";
filter.status = "";
filter.create_time = [];
filter.finish_time = [];
filter.limit = 10;
filter.page = 1;
changePage(1);
}; // 重置筛选项
const tableTotal = ref(0);
const ticketLevelOptions = ref([
{
value: "",
name: "全部",
},
]);
const statusOptions = ref([
{
value: "",
name: "全部",
},
]);
let headers = reactive([
{
label: "工单名称",
prop: "ticket_name",
align: "left",
},
{
label: "工单等级",
prop: "ticket_level",
align: "left",
},
{
label: "工单状态",
prop: "ticket_status",
align: "left",
},
{
label: "下发对象",
prop: "distribute_target",
align: "left",
},
{
label: "创建人",
prop: "create_by",
align: "left",
},
{
label: "创建时间",
prop: "create_time",
align: "left",
},
{
label: "完成时间",
prop: "finish_time",
align: "left",
},
{
label: "操作",
prop: "operation",
align: "left",
width: "80px",
},
]);
let rows = ref([
{ ticket_name: 11, id: 111 },
{ ticket_name: 22, id: 222 },
{ ticket_name: 33, id: 333 },
]);
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
<style lang="scss" scoped></style> const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.key_word = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
onMounted(() => {
getTableRows();
});
const getTableRows = async () => {
let [createStartTime = "", createEndTime = ""] = filter.create_time || [];
let [finishStartTime = "", finishEndTime = ""] = filter.finish_time || [];
let urlParams = {
...filter,
createStartTime,
createEndTime,
finishStartTime,
finishEndTime,
};
Reflect.deleteProperty(urlParams, "create_time");
Reflect.deleteProperty(urlParams, "finish_time");
console.log("urlParams: ", urlParams);
// const { data, total } = await instanceList(urlParams);
// rows.value = data.list || [];
// pagination.total = data.total_count;
};
// 处置反馈
const visible = ref(false);
const active_row = ref(null);
const operation = (row) => {
active_row.value = row;
visible.value = true;
};
const goTo = ({ id }) => {
router.push({
path: "/ticket/my-business-ticket/detail",
query: {
id,
},
});
};
</script>
<style lang="scss" scoped>
.my-business-ticket {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
display: flex;
flex-direction: column;
padding: 16px;
:deep(.bg-filter-group) {
padding: 0;
}
.filter-group {
.left-filter {
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.right-action {
white-space: nowrap;
}
}
.table_container {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
.table {
position: absolute;
flex: 1;
width: 100%;
height: calc(100% - 48px);
.href {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
}
}
.bg-pagination {
bottom: unset;
}
}
}
</style>
<template>
<div class="my-warn-detail">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content">
<warn-detail :label-data="labelData" :value-data="info" :tabs="tabs"></warn-detail>
</div>
</div>
</template>
<script setup>
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import warnDetail from "@/components/warn-detail/index.vue";
const labelData = [
[
{
label: "预警点",
prop: "warning_point",
},
],
[
{
label: "预警指标",
prop: "warning_index",
},
{
label: "风险等级",
prop: "risk_level",
},
],
[
{
label: "状态",
prop: "status",
},
{
label: "预警阀值",
prop: "warning_threshold",
},
],
[
{
label: "当前报警值",
prop: "current_alarm_value",
},
{
label: "预警时间",
prop: "warning_time",
},
],
];
const info = {
warning_point: "SaaS层/数据治理系统",
warning_index: "响应时间超时",
risk_level: "一般风险",
status: "success",
warning_threshold: "10ms",
current_alarm_value: "16ms",
warning_time: "2020-01-01 00:00:00",
};
const tabs = [
{
label: "推送记录",
prop: "push",
lists: [
{
method: "短信",
person: [11, 22, 33, 44],
push_time: "2022-07-29 10:23:59",
push_type: "自动推送",
status: "success",
},
{
method: "钉钉",
person: [11, 33, 44],
push_time: "2022-07-29 10:23:59",
push_type: "自动推送",
status: "error",
},
],
},
{
label: "处置记录",
prop: "dispose",
lists: [
{
status: "error",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
{
status: "success",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
],
},
];
</script>
<style lang="scss" scoped>
.my-warn-detail {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
padding: 32px;
}
}
</style>
<template> <template>
<div>我的预警工单</div> <div class="my-warn-ticket">
<div class="breadcrumb">
<bg-breadcrumb />
</div>
<div class="content">
<bg-filter-group
@search="changeSearch"
v-model="filter.key_word"
placeholder="请输入角色名称">
<template v-slot:filter_group>
<div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">预警分类</span>
<el-select v-model="filter.warning_type" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in wainingTypeOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">预警指标</span>
<el-select v-model="filter.warning_index" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in wainingIndexOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">风险等级</span>
<el-select v-model="filter.risk_level" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in riskLevelOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">状态</span>
<el-select v-model="filter.status" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in statusOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">预警时段</span>
<el-date-picker
v-model="filter.date"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
</div>
<div class="right-action apaas_button">
<el-button type="primary" @click="filterAction"> 查询 </el-button>
<el-button type="default" @click="filterClear"> 重置 </el-button>
</div>
</template>
</bg-filter-group>
<div class="table_container">
<div class="table">
<bg-table
ref="listtable"
:headers="headers"
:rows="rows"
height="100%"
:isIndex="true"
:stripe="true">
<template #warning_point="{ row }">
<div class="href" @click="goTo(row)">{{ row.warning_point || "-" }}</div>
</template>
<template #operation="{ row }">
<span class="primary-edit" @click="operation(row)"> 处置反馈 </span>
</template>
</bg-table>
<div class="pagination_box">
<bg-pagination
:page="filter.page"
:size="filter.limit"
:total="tableTotal"
@change-page="changePage"
@change-size="changeSize">
</bg-pagination>
</div>
</div>
</div>
<!-- <el-button type="primary" size="default" @click="feedback">
处置反馈
</el-button> -->
<!-- <ManualDistributionForm ref="form" :disabled="true" /> -->
<!-- <ManualDistribution v-model:visible="visible" /> -->
</div>
<FeedBack v-model:visible="visible" :active_row="active_row" />
</div>
</template> </template>
<script setup></script> <script setup>
// import { nextTick, onBeforeMount, onMounted, ref } from "vue";
// import ManualDistribution from "@/components/manual-distribution/index.vue";
// import ManualDistributionForm from "@/components/manual-distribution/form.vue";
// const form = ref(null);
// onMounted(async () => {
// await nextTick();
// form.value.init({
// method: ["1", "2"],
// lists: [
// {
// user_id: 1,
// user_name: 1111,
// phone: "13011111111",
// },
// ],
// });
// });
import { ref, reactive, onMounted, nextTick } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import FeedBack from "../modules/feedback.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const filter = reactive({
warning_type: "",
key_word: "",
warning_index: "",
risk_level: "",
status: "",
date: [],
page: 1,
limit: 10,
});
const tableTotal = ref(0);
const filterClear = () => {
filter.warning_type = "";
filter.key_word = "";
filter.warning_index = "";
filter.risk_level = "";
filter.status = "";
filter.date = [];
filter.limit = 10;
filter.page = 1;
changePage(1);
}; // 重置筛选项
const wainingTypeOptions = ref([
{
value: "",
name: "全部",
},
]);
const wainingIndexOptions = ref([
{
value: "",
name: "全部",
},
]);
const riskLevelOptions = ref([
{
value: "",
name: "全部",
},
]);
const statusOptions = ref([
{
value: "",
name: "全部",
},
]);
let headers = reactive([
{
label: "预警点",
prop: "warning_point",
align: "left",
},
{
label: "预警时间",
prop: "warning_time",
align: "left",
},
{
label: "预警分类",
prop: "warning_type",
align: "left",
},
{
label: "预警指标",
prop: "warning_index",
align: "left",
},
{
label: "风险等级",
prop: "risk_level",
align: "left",
},
{
label: "当前报警值",
prop: "current_alarm_value",
align: "left",
},
{
label: "预警阀值",
prop: "warning_threshold",
align: "left",
},
{
label: "推送次数",
prop: "push_num",
align: "left",
},
{
label: "最近推送时间",
prop: "push_time",
align: "left",
},
{
label: "状态",
prop: "status",
align: "left",
},
{
label: "操作",
prop: "operation",
align: "left",
width: "80px",
},
]);
let rows = ref([
{
warning_point: 1,
id: 1,
},
]);
const changeSize = (size) => {
filter.limit = size;
changePage(1);
};
<style lang="scss" scoped></style> const changePage = (page) => {
filter.page = page;
getTableRows();
};
const changeSearch = (val) => {
filter.key_word = val;
changePage(1);
}; // 表格关键字筛选
const filterAction = () => {
changePage(1);
}; // 查询按钮
onMounted(() => {
getTableRows();
});
const getTableRows = async () => {
let [startTime = "", endTime = ""] = filter.date || [];
let urlParams = {
...filter,
startTime,
endTime,
};
Reflect.deleteProperty(urlParams, "date");
console.log("urlParams: ", urlParams);
// const { data, total } = await instanceList(urlParams);
// rows.value = data.list || [];
// pagination.total = data.total_count;
};
// 处置反馈
const visible = ref(false);
const active_row = ref(null);
const operation = (row) => {
active_row.value = row;
visible.value = true;
};
const goTo = ({ id }) => {
router.push({
path: "/ticket/my-warn-ticket/detail",
query: {
id,
},
});
};
</script>
<style lang="scss" scoped>
.my-warn-ticket {
width: 100%;
height: 100%;
padding: 0 24px 16px;
.breadcrumb {
width: 100%;
height: 46px;
}
.content {
width: 100%;
height: calc(100% - 46px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
display: flex;
flex-direction: column;
padding: 16px;
:deep(.bg-filter-group) {
padding: 0;
}
.filter-group {
.left-filter {
display: flex;
justify-content: start;
flex-wrap: wrap;
}
.right-action {
white-space: nowrap;
}
}
.table_container {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
.table {
position: absolute;
flex: 1;
width: 100%;
height: calc(100% - 48px);
.href {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
}
}
.bg-pagination {
bottom: unset;
}
}
}
</style>
...@@ -3,93 +3,98 @@ ...@@ -3,93 +3,98 @@
import { createRouter, createWebHashHistory } from "vue-router"; import { createRouter, createWebHashHistory } from "vue-router";
import store from "../store"; import store from "../store";
//写入初始必须有的路由 //写入初始必须有的路由
//或者隐藏式路由,不会表现在菜单上,但是需要存在的路由 //或者隐藏式路由,不会表现在菜单上,但是需要存在的路由
const routes = [ const routes = [{
{ path: "/login",
path: "/login", name: "login",
name: "login", show: true,
show: true, component: () =>
component: () => import("../page/login/index.vue"), import ("../page/login/index.vue"),
}, },
{ {
path: "/register", path: "/register",
name: "register", name: "register",
show: true, show: true,
component: () => import("../page/register/index.vue"), component: () =>
}, import ("../page/register/index.vue"),
{ },
path: "/password", {
name: "password", path: "/password",
show: true, name: "password",
component: () => import("../page/password/index.vue"), show: true,
}, component: () =>
{ import ("../page/password/index.vue"),
path: "/", },
name: "index", {
component: () => import("../page/welcom.vue"), path: "/",
}, name: "index",
{ component: () =>
path: "/404", import ("../page/welcom.vue"),
show: true, },
component: () => import("../page/404.vue"), {
}, path: "/404",
show: true,
component: () =>
import ("../page/404.vue"),
},
]; ];
//重新创建router //重新创建router
function newRouterFunc() { function newRouterFunc() {
return createRouter({ return createRouter({
history: createWebHashHistory(), history: createWebHashHistory(),
routes, routes,
}); });
} }
const router = newRouterFunc(); const router = newRouterFunc();
function inWhiteList(toPath) { function inWhiteList(toPath) {
//配置白名单 //配置白名单
const whiteList = store.state.whiteList; const whiteList = ['/login']
const path = whiteList.find((value) => { const path = whiteList.find((value) => {
// 使用正则匹配 // 使用正则匹配
const reg = new RegExp("^" + value); const reg = new RegExp('^' + value)
return reg.test(toPath); return reg.test(toPath)
}); })
return !!path; return !!path
} }
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const userInfo = store.state.userInfo;
//已登录不可跳转登陆页 || to.path == "/" 去除首页跳转判断 const userInfo = store.state.userInfo
if (userInfo && (to.path == "/login" )) {
return next({ //已登录不可跳转登陆页
path: "/", if (userInfo && to.path == '/login') {
}) next({ path: from.path })
} }
// 检查to.path是否存在于免登陆白名单 // 检查to.path是否存在于免登陆白名单
if (inWhiteList(to.path)) { if (inWhiteList(to.path)) {
return next(); next()
} else {
// 判断是否已经登录,未登录则重定向到首页或其他页面(通过query传参记录原来的路径)
// 根据配置判断是否跳转第三方登录,跳转第三方登录则不跳login
// axios封装中也需要对是否登录过期进行判断,如果登录过期,则跳转登录页,具体跳转地址根据配置来·
if (!userInfo) {
return next({
path: "/login",
});
} else { } else {
// 判断是否已经登录,未登录则重定向到首页或其他页面(通过query传参记录原来的路径)
// 根据配置判断是否跳转第三方登录,跳转第三方登录则不跳login
// axios封装中也需要对是否登录过期进行判断,如果登录过期,则跳转登录页,具体跳转地址根据配置来·
// if (!userInfo) {
// next({
// path: '/login',
// })
// } else {
// }
} }
}
//判读是否匹配,否则跳转404
//判读是否匹配,否则跳转404 if (to.matched.length !== 0) {
if (to.matched.length !== 0) { next()
return next(); } else {
} else { return next({ path: '/404' })
return next({ }
path: "/404", })
});
}
});
// 在路由完成初始导航时调用,如果有异步操作放置到这里 // 在路由完成初始导航时调用,如果有异步操作放置到这里
// 请求相应的角色和菜单 // 请求相应的角色和菜单
...@@ -97,35 +102,38 @@ router.beforeEach((to, from, next) => { ...@@ -97,35 +102,38 @@ router.beforeEach((to, from, next) => {
// generateRoutes() // generateRoutes()
// }) // })
function addRoute(router, routers) { function addRoute(router, routers) {
routers.forEach((e) => { routers.forEach(e => {
if (e.path[0] == "/") { router.addRoute(e)
router.addRoute(e); if (e.children && e.children.length) {
if (e.children && e.children.length) { addRoute(router, e.children)
addRoute(router, e.children); }
} });
}
});
} }
export function generateRoutes() { export function generateRoutes() {
const _asyncRoutes = store.state.route; const _asyncRoutes = store.state.route
if (_asyncRoutes) {
//动态添加路由
if (_asyncRoutes) { addRoute(router, _asyncRoutes)
//动态添加路由 }
router.addRoute({
path: '/:pathMatch(.*)',
redirect: '/404'
})
addRoute(router, _asyncRoutes);
}
router.addRoute({
path: "/:pathMatch(.*)",
redirect: "/404",
});
} }
//新创建一个router替代之前的router,并把matcher方法替换成新的router的matcher //新创建一个router替代之前的router,并把matcher方法替换成新的router的matcher
export function resetRouter() { export function resetRouter() {
const newRouter = newRouterFunc(); const newRouter = newRouterFunc()
router.matcher = newRouter.matcher; router.matcher = newRouter.matcher
} }
export default router;
export default router
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment