Commit ef5c4b4f by qinjianhui

feat:打版管理

parent 28ba2892
......@@ -7,6 +7,8 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
CardWrapper: typeof import('./src/components/CardWrapper.vue')['default']
CommodityCard: typeof import('./src/components/commodityCard.vue')['default']
ElButton: typeof import('element-plus/es')['ElButton']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCol: typeof import('element-plus/es')['ElCol']
......@@ -27,6 +29,8 @@ declare module 'vue' {
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
......@@ -37,6 +41,8 @@ declare module 'vue' {
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElUpload: typeof import('element-plus/es')['ElUpload']
Icon: typeof import('./src/components/Icon.vue')['default']
ImageView: typeof import('./src/components/ImageView.vue')['default']
LogList: typeof import('./src/components/LogList.vue')['default']
......@@ -45,6 +51,8 @@ declare module 'vue' {
RouterView: typeof import('vue-router')['RouterView']
SplitDiv: typeof import('./src/components/splitDiv/splitDiv.vue')['default']
TableView: typeof import('./src/components/TableView.vue')['default']
UploadImage: typeof import('./src/components/UploadImage.vue')['default']
WangEditor: typeof import('./src/components/WangEditor.vue')['default']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
......
......@@ -9,12 +9,16 @@
"version": "0.0.0",
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.7",
"dayjs": "^1.11.13",
"element-plus": "^2.6.0",
"lodash-es": "^4.17.21",
"pinia": "^2.1.7",
"splitpanes": "^3.1.5",
"vue": "^3.4.19",
"vue-dompurify-html": "^5.1.0",
"vue-router": "^4.3.0"
},
"devDependencies": {
......@@ -76,6 +80,17 @@
"node": ">=6.0.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
"integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
......@@ -985,12 +1000,22 @@
"win32"
]
},
"node_modules/@transloadit/prettier-bytes": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
"integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
},
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
"node_modules/@types/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
......@@ -1251,6 +1276,56 @@
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
"node_modules/@uppy/companion-client": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-2.2.2.tgz",
"integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
"dependencies": {
"@uppy/utils": "^4.1.2",
"namespace-emitter": "^2.0.1"
}
},
"node_modules/@uppy/core": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
"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.1.25",
"preact": "^10.5.13"
}
},
"node_modules/@uppy/store-default": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-2.1.1.tgz",
"integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
},
"node_modules/@uppy/utils": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-4.1.3.tgz",
"integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
"dependencies": {
"lodash.throttle": "^4.1.1"
}
},
"node_modules/@uppy/xhr-upload": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
"dependencies": {
"@uppy/companion-client": "^2.2.2",
"@uppy/utils": "^4.1.2",
"nanoid": "^3.1.25"
},
"peerDependencies": {
"@uppy/core": "^2.3.3"
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "5.0.4",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
......@@ -1659,6 +1734,156 @@
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@wangeditor/basic-modules": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"dependencies": {
"is-url": "^1.2.4"
},
"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"
}
},
"node_modules/@wangeditor/code-highlight": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
"integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
"dependencies": {
"prismjs": "^1.23.0"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/core": {
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"dependencies": {
"@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5",
"html-void-elements": "^2.0.0",
"i18next": "^20.4.0",
"scroll-into-view-if-needed": "^2.2.28",
"slate-history": "^0.66.0"
},
"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"
}
},
"node_modules/@wangeditor/editor": {
"version": "5.1.23",
"resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "^1.1.7",
"@wangeditor/code-highlight": "^1.0.3",
"@wangeditor/core": "^1.1.19",
"@wangeditor/list-module": "^1.0.5",
"@wangeditor/table-module": "^1.1.4",
"@wangeditor/upload-image-module": "^1.0.2",
"@wangeditor/video-module": "^1.1.4",
"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"
}
},
"node_modules/@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"peerDependencies": {
"@wangeditor/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
"integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/table-module": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz",
"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"
}
},
"node_modules/@wangeditor/upload-image-module": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
"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"
}
},
"node_modules/@wangeditor/video-module": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz",
"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"
}
},
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
......@@ -1891,6 +2116,11 @@
"node": ">= 0.8"
}
},
"node_modules/compute-scroll-into-view": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
"integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
},
"node_modules/computeds": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz",
......@@ -1934,10 +2164,22 @@
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/d": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
"integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
"dependencies": {
"es5-ext": "^0.10.64",
"type": "^2.7.2"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/dayjs": {
"version": "1.11.10",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz",
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
},
"node_modules/de-indent": {
"version": "1.0.2",
......@@ -2000,6 +2242,19 @@
"node": ">=6.0.0"
}
},
"node_modules/dom7": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"dependencies": {
"ssr-window": "^3.0.0-alpha.1"
}
},
"node_modules/dompurify": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz",
"integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ=="
},
"node_modules/element-plus": {
"version": "2.6.0",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.6.0.tgz",
......@@ -2055,6 +2310,43 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es5-ext": {
"version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"hasInstallScript": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"esniff": "^2.0.1",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"node_modules/es6-symbol": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"dependencies": {
"d": "^1.0.2",
"ext": "^1.7.0"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/esbuild": {
"version": "0.19.12",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.12.tgz",
......@@ -2272,6 +2564,20 @@
"node": "*"
}
},
"node_modules/esniff": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
"dependencies": {
"d": "^1.0.1",
"es5-ext": "^0.10.62",
"event-emitter": "^0.3.5",
"type": "^2.7.2"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/espree": {
"version": "9.6.1",
"resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
......@@ -2336,6 +2642,15 @@
"node": ">=0.10.0"
}
},
"node_modules/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"dependencies": {
"d": "1",
"es5-ext": "~0.10.14"
}
},
"node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz",
......@@ -2359,6 +2674,14 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/ext": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"dependencies": {
"type": "^2.7.2"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
......@@ -2661,6 +2984,15 @@
"he": "bin/he"
}
},
"node_modules/html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz",
......@@ -2670,6 +3002,14 @@
"node": ">=16.17.0"
}
},
"node_modules/i18next": {
"version": "20.6.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz",
"integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
"dependencies": {
"@babel/runtime": "^7.12.0"
}
},
"node_modules/ignore": {
"version": "5.3.1",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz",
......@@ -2679,6 +3019,15 @@
"node": ">= 4"
}
},
"node_modules/immer": {
"version": "9.0.21",
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
"integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
}
},
"node_modules/immutable": {
"version": "4.3.5",
"resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.5.tgz",
......@@ -2775,6 +3124,11 @@
"node": ">=0.10.0"
}
},
"node_modules/is-hotkey": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
......@@ -2793,6 +3147,14 @@
"node": ">=8"
}
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz",
......@@ -2805,6 +3167,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
......@@ -2926,12 +3293,47 @@
"lodash-es": "*"
}
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"node_modules/lodash.foreach": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
},
"node_modules/lodash.toarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
},
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
......@@ -3020,6 +3422,14 @@
"node": ">= 0.6"
}
},
"node_modules/mime-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
"integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
"dependencies": {
"wildcard": "^1.1.0"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
......@@ -3082,6 +3492,11 @@
"integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
"dev": true
},
"node_modules/namespace-emitter": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
"integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
......@@ -3105,6 +3520,11 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
......@@ -3413,6 +3833,15 @@
"node": ">=4"
}
},
"node_modules/preact": {
"version": "10.24.3",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz",
"integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
......@@ -3438,6 +3867,14 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"engines": {
"node": ">=6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
......@@ -3484,6 +3921,11 @@
"node": ">=8.10.0"
}
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
......@@ -3608,6 +4050,14 @@
"node": ">=14.0.0"
}
},
"node_modules/scroll-into-view-if-needed": {
"version": "2.2.31",
"resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
"integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
"dependencies": {
"compute-scroll-into-view": "^1.0.20"
}
},
"node_modules/scule": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
......@@ -3671,6 +4121,35 @@
"node": ">=8"
}
},
"node_modules/slate": {
"version": "0.72.8",
"resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
"tiny-warning": "^1.0.3"
}
},
"node_modules/slate-history": {
"version": "0.66.0",
"resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.66.0.tgz",
"integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
"dependencies": {
"is-plain-object": "^5.0.0"
},
"peerDependencies": {
"slate": ">=0.65.3"
}
},
"node_modules/snabbdom": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.2.tgz",
"integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
......@@ -3696,6 +4175,11 @@
"url": "https://github.com/sponsors/antoniandre"
}
},
"node_modules/ssr-window": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
"integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
......@@ -3774,6 +4258,11 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"node_modules/tiny-warning": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
......@@ -3798,6 +4287,11 @@
"typescript": ">=4.2.0"
}
},
"node_modules/type": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
......@@ -4126,6 +4620,17 @@
}
}
},
"node_modules/vue-dompurify-html": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/vue-dompurify-html/-/vue-dompurify-html-5.1.0.tgz",
"integrity": "sha512-616o2/PBdOLM2bwlRWLdzeEC9NerLkwiudqNgaIJ5vBQWXec+u7Kuzh+45DtQQrids67s4pHnTnJZLVfyPMxbA==",
"dependencies": {
"dompurify": "^3.0.0"
},
"peerDependencies": {
"vue": "^3.0.0"
}
},
"node_modules/vue-eslint-parser": {
"version": "9.4.2",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
......@@ -4221,6 +4726,11 @@
"node": ">= 8"
}
},
"node_modules/wildcard": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
"integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
......
......@@ -11,12 +11,16 @@
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.7",
"dayjs": "^1.11.13",
"element-plus": "^2.6.0",
"lodash-es": "^4.17.21",
"pinia": "^2.1.7",
"splitpanes": "^3.1.5",
"vue": "^3.4.19",
"vue-dompurify-html": "^5.1.0",
"vue-router": "^4.3.0"
},
"devDependencies": {
......
......@@ -55,6 +55,54 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe62e;</span>
<div class="name">查看详情</div>
<div class="code-name">&amp;#xe62e;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe634;</span>
<div class="name">报价查询</div>
<div class="code-name">&amp;#xe634;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe678;</span>
<div class="name">操作日志</div>
<div class="code-name">&amp;#xe678;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6ab;</span>
<div class="name">确认审核【询价】</div>
<div class="code-name">&amp;#xe6ab;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe612;</span>
<div class="name">审核</div>
<div class="code-name">&amp;#xe612;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe600;</span>
<div class="name">审核</div>
<div class="code-name">&amp;#xe600;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe623;</span>
<div class="name">审核</div>
<div class="code-name">&amp;#xe623;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe614;</span>
<div class="name">审核节点</div>
<div class="code-name">&amp;#xe614;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe64a;</span>
<div class="name">超级管理员</div>
<div class="code-name">&amp;#xe64a;</div>
......@@ -84,9 +132,9 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1711355340676') format('woff2'),
url('iconfont.woff?t=1711355340676') format('woff'),
url('iconfont.ttf?t=1711355340676') format('truetype');
src: url('iconfont.woff2?t=1729077025378') format('woff2'),
url('iconfont.woff?t=1729077025378') format('woff'),
url('iconfont.ttf?t=1729077025378') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
......@@ -113,6 +161,78 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-chakanxiangqing"></span>
<div class="name">
查看详情
</div>
<div class="code-name">.icon-chakanxiangqing
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-baojiachaxun"></span>
<div class="name">
报价查询
</div>
<div class="code-name">.icon-baojiachaxun
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-caozuorizhi"></span>
<div class="name">
操作日志
</div>
<div class="code-name">.icon-caozuorizhi
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-querenshenhexunjia"></span>
<div class="name">
确认审核【询价】
</div>
<div class="code-name">.icon-querenshenhexunjia
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shenhe"></span>
<div class="name">
审核
</div>
<div class="code-name">.icon-shenhe
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shenhe1"></span>
<div class="name">
审核
</div>
<div class="code-name">.icon-shenhe1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shenhe2"></span>
<div class="name">
审核
</div>
<div class="code-name">.icon-shenhe2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shenhe3"></span>
<div class="name">
审核节点
</div>
<div class="code-name">.icon-shenhe3
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zu54"></span>
<div class="name">
超级管理员
......@@ -159,6 +279,70 @@
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-chakanxiangqing"></use>
</svg>
<div class="name">查看详情</div>
<div class="code-name">#icon-chakanxiangqing</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-baojiachaxun"></use>
</svg>
<div class="name">报价查询</div>
<div class="code-name">#icon-baojiachaxun</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-caozuorizhi"></use>
</svg>
<div class="name">操作日志</div>
<div class="code-name">#icon-caozuorizhi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-querenshenhexunjia"></use>
</svg>
<div class="name">确认审核【询价】</div>
<div class="code-name">#icon-querenshenhexunjia</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shenhe"></use>
</svg>
<div class="name">审核</div>
<div class="code-name">#icon-shenhe</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shenhe1"></use>
</svg>
<div class="name">审核</div>
<div class="code-name">#icon-shenhe1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shenhe2"></use>
</svg>
<div class="name">审核</div>
<div class="code-name">#icon-shenhe2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shenhe3"></use>
</svg>
<div class="name">审核节点</div>
<div class="code-name">#icon-shenhe3</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zu54"></use>
</svg>
<div class="name">超级管理员</div>
......
@font-face {
font-family: "iconfont"; /* Project id 4462827 */
src: url('iconfont.woff2?t=1711355340676') format('woff2'),
url('iconfont.woff?t=1711355340676') format('woff'),
url('iconfont.ttf?t=1711355340676') format('truetype');
src: url('iconfont.woff2?t=1729077025378') format('woff2'),
url('iconfont.woff?t=1729077025378') format('woff'),
url('iconfont.ttf?t=1729077025378') format('truetype');
}
.iconfont {
......@@ -13,6 +13,38 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-chakanxiangqing:before {
content: "\e62e";
}
.icon-baojiachaxun:before {
content: "\e634";
}
.icon-caozuorizhi:before {
content: "\e678";
}
.icon-querenshenhexunjia:before {
content: "\e6ab";
}
.icon-shenhe:before {
content: "\e612";
}
.icon-shenhe1:before {
content: "\e600";
}
.icon-shenhe2:before {
content: "\e623";
}
.icon-shenhe3:before {
content: "\e614";
}
.icon-zu54:before {
content: "\e64a";
}
......
window._iconfont_svg_string_4462827='<svg><symbol id="icon-zu54" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#007AFF" ></path><path d="M717.824 407.466667a52.992 52.992 0 0 0-49.194667 72.533333l-83.242666 33.28-55.808-111.573333a52.992 52.992 0 1 0-47.36 0l-55.808 111.573333-83.285334-33.28a52.992 52.992 0 1 0-49.152 33.28 48.341333 48.341333 0 0 0 8.832-0.725333l28.245334 167.68a51.2 51.2 0 0 0 50.346666 44.970666h246.4a53.888 53.888 0 0 0 52.992-44.970666l28.245334-167.68a48.085333 48.085333 0 0 0 8.832 0.725333 52.992 52.992 0 1 0 0-105.941333z m-161.194667 276.608l-50.730666-26.666667-50.730667 26.666667 9.685333-56.490667-41.045333-39.978667 56.704-8.234666 25.344-51.2 25.344 51.2 56.704 8.234666-41.045333 40.021334 9.685333 56.490666z" fill="#FFFFFF" ></path></symbol><symbol id="icon-a-2labadianji3x" viewBox="0 0 1024 1024"><path d="M752 416a16 16 0 0 1 16 16v160a16 16 0 1 1-32 0v-160a16 16 0 0 1 16-16z m64-32a16 16 0 0 1 16 16v224a16 16 0 1 1-32 0v-224a16 16 0 0 1 16-16z m64-32a16 16 0 0 1 16 16v288a16 16 0 1 1-32 0v-288a16 16 0 0 1 16-16z m-220.864-134.176A64 64 0 0 1 672 256.32v513.76a64 64 0 0 1-101.728 51.712L321.152 640H192a64 64 0 0 1-64-64v-128a64 64 0 0 1 64-64h140.096l237.408-178.784a64 64 0 0 1 89.6 12.608z" fill="#2875FF" ></path></symbol></svg>',function(n){var t=(t=document.getElementsByTagName("script"))[t.length-1],e=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var a,i,o,d,l,c=function(t,e){e.parentNode.insertBefore(t,e)};if(e&&!n.__iconfont__svg__cssinject__){n.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}a=function(){var t,e=document.createElement("div");e.innerHTML=n._iconfont_svg_string_4462827,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?c(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=a,d=n.document,l=!1,r(),d.onreadystatechange=function(){"complete"==d.readyState&&(d.onreadystatechange=null,s())})}function s(){l||(l=!0,o())}function r(){try{d.documentElement.doScroll("left")}catch(t){return void setTimeout(r,50)}s()}}(window);
\ No newline at end of file
window._iconfont_svg_string_4462827='<svg><symbol id="icon-chakanxiangqing" viewBox="0 0 1024 1024"><path d="M383.6 62.8h256.3c213.6 0 320.4 106.8 320.4 320.4v256.3c0 213.6-106.8 320.4-320.4 320.4H383.6C170 959.8 63.2 853 63.2 639.4V383.2C63.2 169.6 170 62.8 383.6 62.8z" fill="#2084FE" ></path><path d="M254.1 515.3H416v-53.2H254.1zM254.1 358h363.1v53.2H254.1z" fill="#FFFFFF" opacity=".7" ></path><path d="M700.5 663.3c13.9-20.8 20.8-43.9 20.8-71.7 0-71.7-57.8-129.5-127.2-129.5S466.8 520 466.8 591.6 524.7 721 594 721c25.5 0 50.8-9.3 71.7-23.1l71.7 74 34.7-34.6-71.6-74z m-108.7 9.2c-41.7 0-76.3-34.7-76.3-78.6 0-43.9 34.7-78.6 76.3-78.6 41.7 0 76.3 34.7 76.3 78.6 0 41.7-34.7 78.6-76.3 78.6z" fill="#FFFFFF" ></path><path d="M254.1 254h363.1v53.2H254.1z" fill="#FFFFFF" opacity=".7" ></path></symbol><symbol id="icon-baojiachaxun" viewBox="0 0 1024 1024"><path d="M0 0m178.086957 0l667.826086 0q178.086957 0 178.086957 178.086957l0 667.826086q0 178.086957-178.086957 178.086957l-667.826086 0q-178.086957 0-178.086957-178.086957l0-667.826086q0-178.086957 178.086957-178.086957Z" fill="#2E7BFC" ></path><path d="M790.327652 721.363478l23.730087 23.730087a42.073043 42.073043 0 0 1 0 59.481044l-9.48313 9.48313a42.073043 42.073043 0 0 1-59.481044 0l-23.730087-23.730087a42.073043 42.073043 0 0 1 0-59.503304l9.46087-9.46087a42.073043 42.073043 0 0 1 59.503304 0zM505.499826 226.081391c154.312348 0 279.418435 125.106087 279.418435 279.418435 0 154.312348-125.106087 279.418435-279.418435 279.418435-154.312348 0-279.418435-125.106087-279.418435-279.418435 0-154.312348 125.106087-279.418435 279.418435-279.418435z m-100.797217 158.764522a19.300174 19.300174 0 0 0-0.24487 25.377391l1.847652 1.869913 44.076522 39.201392h-58.278956l-2.626783 0.178087a19.300174 19.300174 0 0 0 0.200348 38.288695l2.426435 0.133566h84.902956v38.622608h-61.751652l-2.604522 0.178087a19.300174 19.300174 0 0 0 0.200348 38.288696l2.404174 0.133565h61.751652l0.022261 83.656348 0.178087 2.604522a19.300174 19.300174 0 0 0 38.288696-0.200348l0.155826-2.404174-0.044522-83.656348h61.796174l2.626782-0.178087a19.300174 19.300174 0 0 0-0.200347-38.288696l-2.426435-0.133565h-61.796174v-38.622608h84.969739l2.626783-0.178087a19.300174 19.300174 0 0 0-0.222609-38.288696l-2.404174-0.133565h-58.323478l44.121043-39.179131 2.003478-2.070261a19.300174 19.300174 0 0 0-25.577739-28.404869l-2.070261 1.602782-64.400695 57.210435-64.378435-57.210435-2.270609-1.736347a19.300174 19.300174 0 0 0-24.976695 3.33913z" fill="#FFFFFF" ></path></symbol><symbol id="icon-caozuorizhi" viewBox="0 0 1024 1024"><path d="M312.416187 5.855995C376.992127 1.951998 443.520064 0 512 0c68.479936 0 135.007873 1.951998 199.583813 5.855995a319.9997 319.9997 0 0 1 298.14372 279.359738 1811.582302 1811.582302 0 0 1 0 453.535574 319.9997 319.9997 0 0 1-298.14372 279.359739A3304.316902 3304.316902 0 0 1 512 1023.99904c-68.479936 0-135.007873-1.951998-199.583813-5.855995a319.9997 319.9997 0 0 1-298.14372-279.359738 1811.582302 1811.582302 0 0 1 0-453.535574A319.9997 319.9997 0 0 1 312.416187 5.887994z" fill="#40C791" ></path><path d="M384.00012 298.65572A85.34392 85.34392 0 0 0 469.34404 383.99964h85.31192A85.34392 85.34392 0 0 0 639.99988 298.65572h42.65596A85.34392 85.34392 0 0 1 767.99976 383.99964v298.65572A85.34392 85.34392 0 0 1 682.65584 767.99928H341.34416A85.34392 85.34392 0 0 1 256.00024 682.65536V383.99964a85.34392 85.34392 0 0 1 85.34392-85.34392H384.00012z m0 1.311999h255.99976-255.99976z m149.34386 169.375841a21.34398 21.34398 0 1 0 0 42.65596h127.99988a21.34398 21.34398 0 0 0 0-42.65596h-127.99988z m0 127.99988a21.34398 21.34398 0 1 0 0 42.65596h127.99988a21.34398 21.34398 0 0 0 0-42.65596h-127.99988z m-140.479868-119.167888l-15.103986-15.103986a21.34398 21.34398 0 0 0-30.175972 30.207972l30.175972 30.143971a21.27998 21.27998 0 0 0 30.175972 0l60.319943-60.351943a21.34398 21.34398 0 1 0-30.175972-30.143972l-45.247957 45.247958z m0 127.99988l-15.103986-15.103986a21.34398 21.34398 0 0 0-30.175972 30.207972l30.175972 30.143971a21.27998 21.27998 0 0 0 30.175972 0l60.319943-60.351943a21.34398 21.34398 0 1 0-30.175972-30.143972l-45.247957 45.247958zM469.31204 255.99976h85.31192a42.65596 42.65596 0 1 1 0 85.34392h-85.31192a42.65596 42.65596 0 1 1 0-85.34392z" fill="#FFFFFF" ></path></symbol><symbol id="icon-querenshenhexunjia" viewBox="0 0 1024 1024"><path d="M474.500517 639.29203a320.016772 320.016772 0 0 0 93.819328 378.808334 51.976684 51.976684 0 0 1-53.777507-7.16798l-72.950971-58.120668-65.323958 58.120668c-9.321905 8.121357-21.327389 12.535138-33.650666 12.429207a50.140551 50.140551 0 0 1-33.368184-12.287966L243.995222 952.952957l-65.994852 58.615011a50.987997 50.987997 0 0 1-33.544735 12.429207 50.140551 50.140551 0 0 1-33.438805-12.287966L34.499524 943.595742a35.310247 35.310247 0 0 1-6.249914-7.06205A67.407262 67.407262 0 0 1 0.001412 882.756186V51.41172C0.001412 23.057592 23.023694 0 50.742238 0h794.480567c28.036336 0 50.776136 22.84573 50.776136 51.41172V474.569725a319.981462 319.981462 0 0 0-421.498424 164.686994zM127.612647 227.397993h333.575907c14.088789 0 25.211517-11.334589 25.211517-25.282137a25.458688 25.458688 0 0 0-25.211517-25.282137H127.612647a25.070276 25.070276 0 0 0-25.211517 24.964345v0.317792c0 13.559135 11.263969 25.282137 25.211517 25.282137z m231.423361 227.327373a24.752483 24.752483 0 0 0 24.964345-25.211516 25.423378 25.423378 0 0 0-24.964345-25.282138H127.365475a24.823104 24.823104 0 0 0-24.964345 24.717174v0.564964c0 13.488515 11.193348 25.211517 24.964345 25.211516h231.670533z m-26.235514 176.833719a25.176206 25.176206 0 0 0-24.646552-25.211516H127.047683a24.929035 24.929035 0 0 0-24.646553 25.211516c0 13.559135 11.016797 25.282137 24.646553 25.282138h181.141569a24.964345 24.964345 0 0 0 24.611242-25.282138zM766.09254 511.998588a255.999294 255.999294 0 1 1 0 511.998587 255.999294 255.999294 0 0 1 0-511.998587z m145.195738 206.105914a26.553306 26.553306 0 0 0-37.605414-37.428862l-131.001018 131.001017-84.25025-84.21494a26.447375 26.447375 0 1 0-37.428862 37.428863l102.999992 103.035302a26.517996 26.517996 0 0 0 37.428862 0l149.85669-149.82138z" fill="#389AFB" ></path></symbol><symbol id="icon-shenhe" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#00CD82" ></path><path d="M512 744.727273h-211.549091a16.989091 16.989091 0 0 1-16.989091-16.989091V318.836364a16.989091 16.989091 0 0 1 16.989091-16.989091h335.127273a16.989091 16.989091 0 0 1 16.989091 16.989091v144.756363a17.221818 17.221818 0 0 0 34.210909 0V318.836364a51.2 51.2 0 0 0-50.967273-50.967273H300.450909a51.2 51.2 0 0 0-50.967273 50.967273v408.203636a51.2 51.2 0 0 0 50.967273 51.2H512A17.221818 17.221818 0 0 0 512 744.727273z m0 0" fill="#FFFFFF" ></path><path d="M596.945455 361.425455H330.007273a16.989091 16.989091 0 1 0 0 33.978181h266.938182a16.989091 16.989091 0 0 0 0-33.978181z m0 84.945454H330.007273a17.221818 17.221818 0 1 0 0 34.210909h266.938182a17.221818 17.221818 0 0 0 0-34.210909z m-42.821819 85.178182h-224.116363a16.989091 16.989091 0 1 0 0 33.978182h224.349091a16.989091 16.989091 0 0 0 16.989091-16.989091 17.454545 17.454545 0 0 0-17.221819-16.989091z m220.16 262.050909h-184.087272a15.592727 15.592727 0 1 0 0 31.185455h184.087272a16.756364 16.756364 0 0 0 17.221819-16.058182 16.290909 16.290909 0 0 0-17.221819-15.127273z m-4.887272-122.181818h-36.072728c-4.887273-9.774545 0-28.625455 16.290909-50.734546a84.014545 84.014545 0 0 0 13.265455-43.985454 78.196364 78.196364 0 0 0-82.152727-74.007273 77.498182 77.498182 0 0 0-81.687273 74.007273 83.316364 83.316364 0 0 0 13.265455 43.752727v1.629091c15.127273 22.109091 21.178182 40.494545 16.523636 50.734545h-34.676364a35.607273 35.607273 0 0 0-37.003636 34.443637v54.458182a14.894545 14.894545 0 0 0 15.36 13.963636H791.272727a14.429091 14.429091 0 0 0 15.127273-13.498182v-56.32a35.607273 35.607273 0 0 0-37.003636-34.443636z m3.025454 71.447273h-181.061818v-37.003637a2.792727 2.792727 0 0 1 2.792727-2.792727h48.64a7.447273 7.447273 0 0 0 4.887273-1.861818c26.530909-19.549091 25.134545-53.76-4.421818-96.581818a57.250909 57.250909 0 0 1-9.309091-29.556364 48.174545 48.174545 0 0 1 95.650909 0 54.225455 54.225455 0 0 1-9.541818 30.021818c-29.323636 42.821818-30.487273 77.032727-4.189091 96.581818a7.447273 7.447273 0 0 0 4.887273 1.861818H768a2.792727 2.792727 0 0 1 2.792727 2.792728v37.003636z m-215.272727-126.37091h-227.141818a17.221818 17.221818 0 1 0 0 34.21091h227.141818a17.221818 17.221818 0 1 0 0-34.21091z m0 0" fill="#FFFFFF" ></path></symbol><symbol id="icon-shenhe1" viewBox="0 0 1024 1024"><path d="M0.000608 512c0 282.766309 229.228574 512 512 512 282.766309 0 512-229.233691 512-512C1024.000608 229.228574 794.766917 0 512.000608 0 229.229182 0 0.000608 229.228574 0.000608 512z m0 0" fill="#FF7A65" ></path><path d="M708.338383 848.605944h-392.67555c-4.845762 0-8.71009-3.934943-8.710091-8.71009v-37.856297c0-4.845762 3.94006-8.71009 8.710091-8.710091h392.754351c4.845762 0 8.70395 3.934943 8.70395 8.710091v37.856297c0 4.845762-3.936989 8.71009-8.782751 8.71009z m-383.966484-17.490794h375.262534v-20.366527H324.371899v20.366527z m0 0" fill="#FFFFFF" ></path><path d="M739.601989 810.064997H284.38797c-28.925154 0-52.473407-23.547229-52.473407-52.473406v-72.007916c0-28.925154 23.548252-52.472383 52.473407-52.472383h455.219136c28.925154 0 52.473407 23.547229 52.473406 52.472383v72.007916c0 28.927201-23.548252 52.473407-52.478523 52.473406zM284.38797 668.093904c-9.614769 0-17.491818 7.870909-17.491818 17.489771v72.007916c0 9.614769 7.877049 17.491818 17.491818 17.491817h455.219136c9.613745 0 17.490794-7.877049 17.490794-17.491817v-72.007916c0-9.618862-7.877049-17.489771-17.490794-17.489771H284.38797z m0 0" fill="#FFFFFF" ></path><path d="M610.890987 664.989956H413.188007c-5.529388 0-10.829535-2.652632-14.082899-7.116669-3.331141-4.473247-4.24196-10.302488-2.575878-15.602636l55.426916-177.55853c-54.287881-23.697668-90.862891-78.291543-90.862891-138.414806 0-83.214059 67.693294-150.908376 150.908376-150.908376 83.214059 0 150.908376 67.694318 150.908377 150.908376 0 60.123263-36.57501 114.789799-90.862892 138.414806l55.503671 177.637331c1.665059 5.300148 0.677486 11.051611-2.574854 15.597519-3.331141 4.391376-8.560675 7.044008-14.088016 7.044008h0.00307z m-173.923441-34.981589h150.147996l-53.383203-170.747856a17.901175 17.901175 0 0 1 1.214767-13.400296 17.564479 17.564479 0 0 1 10.44781-8.558628c48.610102-14.610969 82.610258-60.272678 82.610257-111.004272 0-63.901626-52.019021-116.003542-115.926787-116.003542-63.903673 0-115.927811 52.023114-115.927811 116.003542 0 50.808348 34.000156 96.392279 82.615374 111.004272 4.463013 1.365205 8.249564 4.391376 10.44781 8.558628 2.193129 4.163159 2.647515 8.931143 1.20965 13.400296l-53.455863 170.747856z m0 0" fill="#FFFFFF" ></path></symbol><symbol id="icon-shenhe2" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#A5BFFF" ></path><path d="M345.043478 602.980174v-43.408696a45.568 45.568 0 0 1 47.415652-43.408695h72.125218v-16.695653a87.151304 87.151304 0 0 1-47.415652-75.79826A91.336348 91.336348 0 0 1 512 336.695652a91.314087 91.314087 0 0 1 94.831304 86.973218 85.481739 85.481739 0 0 1-47.593739 74.974608v16.695652h71.969392a45.568 45.568 0 0 1 47.749565 44.410435v43.408696l-333.913044-0.178087z m258.114783 84.324174l-183.808-0.178087v-49.753044l185.299478 0.178087v49.753044h-1.491478z" fill="#5782FD" ></path></symbol><symbol id="icon-shenhe3" viewBox="0 0 1060 1024"><path d="M921.234286 714.715429h-69.961143c-4.498286-9.947429-13.458286-34.377143-17.408-78.628572a165.449143 165.449143 0 1 0-127.341714 3.547429c-3.584 25.161143-10.569143 58.697143-23.478858 75.081143h-72.484571a127.524571 127.524571 0 0 0-127.524571 127.524571v91.465143h565.76v-91.428572a127.524571 127.524571 0 0 0-127.561143-127.561142zM539.062857 965.595429h453.741714c14.262857 0 21.321143 7.094857 21.321143 21.284571v10.752c0 14.226286-7.094857 21.321143-21.321143 21.321143H539.062857c-14.189714 0-21.321143-7.094857-21.321143-21.321143v-10.752c0-14.189714 7.131429-21.284571 21.321143-21.284571z" fill="#108EE9" ></path><path d="M695.296 997.668571H50.834286A50.834286 50.834286 0 0 1 0 946.834286V50.834286C0 22.747429 22.747429 0 50.834286 0h644.461714c28.050286 0 50.834286 22.747429 50.834286 50.834286v896a50.834286 50.834286 0 0 1-50.834286 50.834285zM584.118857 198.217143c0-22.381714-18.176-40.521143-40.521143-40.521143H202.496a40.484571 40.484571 0 1 0 0 81.005714h341.101714c22.345143 0 40.484571-18.102857 40.484572-40.484571z m0 179.053714c0-22.345143-18.176-40.484571-40.521143-40.484571H202.496a40.484571 40.484571 0 0 0 0 81.005714h341.101714c22.345143 0 40.484571-18.139429 40.484572-40.521143z m0 179.090286c0-22.381714-18.176-40.521143-40.521143-40.521143H202.496a40.484571 40.484571 0 1 0 0 81.005714h341.101714c22.345143 0 40.484571-18.139429 40.484572-40.484571z" fill="#108EE9" opacity=".5" ></path></symbol><symbol id="icon-zu54" viewBox="0 0 1024 1024"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#007AFF" ></path><path d="M717.824 407.466667a52.992 52.992 0 0 0-49.194667 72.533333l-83.242666 33.28-55.808-111.573333a52.992 52.992 0 1 0-47.36 0l-55.808 111.573333-83.285334-33.28a52.992 52.992 0 1 0-49.152 33.28 48.341333 48.341333 0 0 0 8.832-0.725333l28.245334 167.68a51.2 51.2 0 0 0 50.346666 44.970666h246.4a53.888 53.888 0 0 0 52.992-44.970666l28.245334-167.68a48.085333 48.085333 0 0 0 8.832 0.725333 52.992 52.992 0 1 0 0-105.941333z m-161.194667 276.608l-50.730666-26.666667-50.730667 26.666667 9.685333-56.490667-41.045333-39.978667 56.704-8.234666 25.344-51.2 25.344 51.2 56.704 8.234666-41.045333 40.021334 9.685333 56.490666z" fill="#FFFFFF" ></path></symbol><symbol id="icon-a-2labadianji3x" viewBox="0 0 1024 1024"><path d="M752 416a16 16 0 0 1 16 16v160a16 16 0 1 1-32 0v-160a16 16 0 0 1 16-16z m64-32a16 16 0 0 1 16 16v224a16 16 0 1 1-32 0v-224a16 16 0 0 1 16-16z m64-32a16 16 0 0 1 16 16v288a16 16 0 1 1-32 0v-288a16 16 0 0 1 16-16z m-220.864-134.176A64 64 0 0 1 672 256.32v513.76a64 64 0 0 1-101.728 51.712L321.152 640H192a64 64 0 0 1-64-64v-128a64 64 0 0 1 64-64h140.096l237.408-178.784a64 64 0 0 1 89.6 12.608z" fill="#2875FF" ></path></symbol></svg>',(l=>{var a=(t=(t=document.getElementsByTagName("script"))[t.length-1]).getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var h,e,i,c,o,n=function(a,t){t.parentNode.insertBefore(a,t)};if(a&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(a){console&&console.log(a)}}h=function(){var a,t=document.createElement("div");t.innerHTML=l._iconfont_svg_string_4462827,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?n(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(e=function(){document.removeEventListener("DOMContentLoaded",e,!1),h()},document.addEventListener("DOMContentLoaded",e,!1)):document.attachEvent&&(i=h,c=l.document,o=!1,m(),c.onreadystatechange=function(){"complete"==c.readyState&&(c.onreadystatechange=null,d())})}function d(){o||(o=!0,i())}function m(){try{c.documentElement.doScroll("left")}catch(a){return void setTimeout(m,50)}d()}})(window);
\ No newline at end of file
......@@ -6,6 +6,62 @@
"description": "",
"glyphs": [
{
"icon_id": "22718987",
"name": "查看详情",
"font_class": "chakanxiangqing",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "31191570",
"name": "报价查询",
"font_class": "baojiachaxun",
"unicode": "e634",
"unicode_decimal": 58932
},
{
"icon_id": "31891767",
"name": "操作日志",
"font_class": "caozuorizhi",
"unicode": "e678",
"unicode_decimal": 59000
},
{
"icon_id": "5439090",
"name": "确认审核【询价】",
"font_class": "querenshenhexunjia",
"unicode": "e6ab",
"unicode_decimal": 59051
},
{
"icon_id": "5975820",
"name": "审核",
"font_class": "shenhe",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "9346061",
"name": "审核",
"font_class": "shenhe1",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "10190960",
"name": "审核",
"font_class": "shenhe2",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "13938594",
"name": "审核节点",
"font_class": "shenhe3",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "16716546",
"name": "超级管理员",
"font_class": "zu54",
......
......@@ -25,4 +25,7 @@ body,
div {
box-sizing: border-box;
}
li {
list-style: none;
}
</style>
import { BaseRespData } from '@/types/api'
import axios from './axios'
import { LogisticsData } from '@/types/api/order'
import { userData } from '@/types/api/user'
import { VersionImageList } from '@/types/api/typesetting'
// 获取物流公司
export function getLogisticsCompanyList() {
......@@ -8,3 +10,22 @@ export function getLogisticsCompanyList() {
'factory/customJomallOrder/getLogisticsList',
)
}
// 获取用户
export function getUserListApi() {
return axios.get<never, BaseRespData<userData[]>>('factory/factoryUser/list')
}
// 上传图片文件
export function uploadImageApi(data: FormData) {
return axios.post<never, BaseRespData<never> & VersionImageList>(
'upload/ossUpload',
data,
)
}
export function uploadFileApi(data: FormData) {
return axios.post<never, BaseRespData<VersionImageList>>(
'supply/supplyTypesettingInfo/uploadManuscript',
data,
)
}
import axios from './axios'
import { BasePaginationData, BaseRespData } from '@/types/api'
import {
TypesettingListData,
SearchForm,
LogList,
} from '@/types/api/typesetting'
import type {
PriceForm,
TreeData,
VersionImageList,
VersionList,
} from '@/types/api/typesetting'
export function getTypeListApi(
data: SearchForm,
currentPage: number,
pageSize: number,
) {
return axios.post<never, BasePaginationData<TypesettingListData>>(
'supply/supplyTypesettingInfo/list_page',
{ ...data, currentPage, pageSize },
)
}
export function getStatusListApi() {
return axios.get<never, BaseRespData<TreeData[]>>(
'supply/supplyTypesettingInfo/findStateGroupList',
)
}
export function getTypesettingDetail(id: number) {
return axios.get<never, BaseRespData<never>>(
'supply/supplyTypesettingInfo/get',
{
params: {
id,
},
},
)
}
export function saveTypesettingReviewApi(data: TypesettingListData) {
return axios.post<never, BaseRespData<never>>(
'supply/supplyTypesettingInfo/supplierConfirm',
data,
)
}
export function submitReviewApi(
typesettingId: number,
version: number,
examineImages: VersionImageList[],
) {
return axios.post<never, BaseRespData<never>>(
'supply/supplyTypesettingExamine/submitExamine',
{
typesettingId,
version,
examineImages,
},
)
}
export function getExamineInfoByIdApi(typesettingId: number) {
return axios.get<never, BaseRespData<VersionList[]>>(
'supply/supplyTypesettingExamine/getByTypesettingId',
{
params: {
typesettingId,
},
},
)
}
export function submitReviewOpinionApi(
typesettingId: number,
examine: boolean,
opinion: string,
id?: number,
) {
return axios.post<never, BaseRespData<never>>(
'supply/supplyTypesettingExamine/examine',
{
typesettingId,
examine,
opinion,
id,
},
)
}
export function submitReviewPriceInfoApi(id: number, data: PriceForm) {
return axios.post<never, BaseRespData<never>>(
'supply/supplyTypesettingPrice/saveQuotedPrice',
{
typesettingId: id,
...data,
},
)
}
export function getTypesettingLogByIdApi(id: number) {
return axios.get<never, BaseRespData<LogList[]>>(
'supply/supplyTypesettingInfo/getLogList',
{
params: { id },
},
)
}
export function rejectDataApi(ids: string) {
return axios.get<never, BaseRespData<never>>(
'supply/supplyTypesettingInfo/batchReject',
{
params: {
ids,
},
},
)
}
export function getPriceDetailApi(id: number) {
return axios.get<never, BaseRespData<PriceForm>>(
'supply/supplyTypesettingPrice/getPriceDetail',
{
params: {
id,
},
},
)
}
<template>
<div class="commodity-card">
<div class="commodity-card-image">
<div class="before"></div>
<div class="image">
<img :src="cardItem.mainImage" />
</div>
<div class="commodity-card-image-select">
<span class="select-icon"></span>
</div>
<div class="operation-icon">
<slot name="operations"></slot>
</div>
</div>
<div class="commodity-card-info">
<div class="color-image flex flex-gap-10">
<div
v-for="c in cardItem.imageList"
:key="c.id"
class="color-image-item"
>
<img :src="c.imagePath" />
</div>
</div>
<div class="commodity-card-name-price flex flex-justify-space-between">
<slot name="productName"></slot>
<slot name="price"></slot>
</div>
<div class="commodity-card-sku" @click.stop="copy(cardItem.sku ?? '')">
<img src="../assets/images/id.png" height="20" />
<span>{{ cardItem.sku }}</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
import type { TypesettingListData } from '../types/api/typesetting'
defineProps({
cardItem: {
type: Object as PropType<TypesettingListData>,
required: true,
},
})
const copy = (text: string) => {
navigator.clipboard.writeText(text)
ElMessage.success('复制成功')
}
</script>
<style lang="scss" scoped>
.commodity-card-image {
position: relative;
}
.before {
height: 0;
padding-top: 120%;
}
.image {
position: absolute;
inset: 0;
img {
width: 100%;
height: 100%;
object-fit: contain;
object-position: center;
}
}
.color-image {
.color-image-item {
width: 50px;
height: 50px;
}
img {
width: 100%;
height: 100%;
}
}
.commodity-card-info {
padding: 10px;
font-size: 14px;
background: linear-gradient(
90deg,
rgba(228, 228, 228, 0.4) 0%,
rgba(255, 255, 255, 1) 100%
);
}
.commodity-card-name-price {
height: 30px;
line-height: 30px;
}
.commodity-card-sku {
display: flex;
align-items: center;
gap: 5px;
background-color: #fff;
}
.commodity-card-image-select {
position: absolute;
top: 5px;
left: 5px;
}
.select-icon {
position: relative;
display: block;
width: 16px;
height: 16px;
border: 1px solid #cccccc;
box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.4) inset;
border-radius: 8px;
background: #fff;
}
.commodity-card.active .select-icon {
background: #4168ff;
position: relative;
border-color: #4168ff;
box-shadow: none;
font-size: 18px;
top: -1px;
left: -1px;
}
.commodity-card.active .select-icon::after {
position: absolute;
content: '';
top: 0px;
left: 4px;
width: 4px;
height: 8px;
border-width: 2px;
border-style: solid;
border-color: transparent #fff #fff transparent;
transform: rotate(45deg) scale(0.8);
}
.operation-icon {
position: absolute;
bottom: 5px;
right: 5px;
:deep(.svg-icon) {
width: 2em;
height: 2em;
}
}
</style>
<template>
<div v-loading="loading" class="upload-file">
<input
ref="fileInputRef"
type="file"
style="display: none"
@change="onChange"
/>
<div v-if="imageMode" class="image-wrap" @click="onFileClick">
<img v-if="value" :src="value" alt="" />
<el-icon v-else><Plus /></el-icon>
</div>
<template v-else>
<div v-if="(files && files.length) < max" class="upload-file-add">
<el-icon @click="fileInputRef.click()"><Plus /></el-icon>
</div>
<ul class="files">
<li
v-for="(item, i) in files"
:key="item.path"
class="upload-files-file"
>
<span
:title="`点击下载 ${item.path} 文件`"
class="filename"
@click="downloadFile(item)"
>
{{ item?.filename || filename(item.path) }}
</span>
<el-icon v-if="!disabled" style="cursor: pointer" @click="removeFile(i)"
><Close
/></el-icon>
</li>
</ul>
</template>
</div>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { Plus, Close } from '@element-plus/icons-vue'
import { uploadImageApi, uploadFileApi } from '@/api/common'
import { getFilePath } from '@/api/axios'
const props = defineProps({
modelValue: String,
disabled: Boolean,
imageMode: {
type: Boolean,
default: false,
},
max: {
type: Number,
default: 1,
},
text: String,
})
const emit = defineEmits(['update:modelValue'])
const value = computed({
get() {
return props.modelValue
},
set(val) {
emit('update:modelValue', val)
},
})
const files = ref<FileItem[]>([])
watch(
value,
() => {
let file = []
if (!Array.isArray(value)) {
if (value.value) {
file.push({ path: value.value })
} else {
file = []
}
}
files.value = file
},
{ immediate: true },
)
const fileInputRef = ref()
const loading = ref(false)
const onChange = async (e: Event) => {
const files = (e.target as HTMLInputElement).files
if (!files) return
const file = files[0]
if (props.imageMode) {
imageUpload(file)
} else {
fileUpload(file)
}
fileInputRef.value.value = ''
}
interface FileItem {
path: string
filename?: string
}
const fileUpload = async (file: File) => {
const formData = new FormData()
const filename = file.name
formData.append('file', file)
formData.append('businessType', 'product')
loading.value = true
try {
const res = await uploadFileApi(formData)
files.value.push({ path: res.message ?? '', filename })
value.value = res.message
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const imageUpload = async (file: File) => {
const formData = new FormData()
formData.append('file', file)
formData.append('businessType', 'product')
loading.value = true
try {
const res = await uploadImageApi(formData)
value.value = res.filePath
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const onFileClick = () => {
if (props.disabled) return
fileInputRef.value.click()
}
const filename = (path: string) => {
if (!path) return ''
const i = path.lastIndexOf('/')
if (i === -1) return path
return path.substring(i + 1)
}
const downloadFile = (item: FileItem) => {
window.open(getFilePath() + item.path)
}
const removeFile = (i: number) => {
files.value.splice(i, 1)
value.value = ''
}
// const _lastValue = ref()
// const emitValue = () => {
// let v
// if (props.max === 1) {
// v = files.value[0] && files.value[0].path
// } else {
// v = files.value.map((e) => e.path)
// }
// _lastValue.value = v
// emit('update:modelValue', v)
// }
</script>
<style scoped lang="scss">
ul,
li {
margin: 0;
padding: 0;
}
.upload-file {
width: 100%;
}
.image-wrap {
width: 100%;
height: 200px;
width: 100%;
border: 1px solid #dcdfe6;
display: flex;
align-items: center;
justify-content: center;
i {
font-size: 36px;
color: #777;
cursor: pointer;
}
img {
height: 100%;
width: 100%;
object-fit: contain;
}
}
.upload-file-add {
height: 100px;
border: 1px solid #dcdfe6;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
.el-icon {
font-size: 36px;
color: #777;
}
}
.upload-files-file {
display: flex;
align-items: center;
justify-content: space-between;
}
.filename {
cursor: pointer;
}
</style>
<template>
<div style="border: 1px solid #ccc; z-index: 9999">
<Toolbar
class="editor_toolbar"
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:default-config="toolbarConfig"
:mode="mode"
/>
<Editor
v-model="html"
style="height: 300px; overflow-y: hidden"
:default-config="editorConfig"
:mode="mode"
@on-created="onCreated"
/>
</div>
</template>
<script setup lang="ts">
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import '@wangeditor/editor/dist/css/style.css'
import { computed, onBeforeUnmount, ref, shallowRef } from 'vue'
import { uploadImg } from '@/utils/file'
const props = defineProps({
modelValue: String,
placeholder: {
type: String,
default: '',
},
isInsert: {
type: Boolean,
default: false,
},
insertData: {
type: Array,
default: () => [
{
label: '客户名称',
value: '{payerName} {payerSurname}',
},
{ label: '订单编号', value: '{id}' },
{ label: '店铺单号', value: '{shopNumber}' },
{ label: '商品名称', value: '{productName}' },
{ label: '商品规格', value: '{productSpec}' },
{ label: '商品数量', value: '{productQuantity}' },
{ label: '商品单价', value: '{productPrice}' },
],
},
})
const emit = defineEmits(['update:modelValue'])
const html = computed({
get() {
return props.modelValue
},
set(value) {
emit('update:modelValue', value)
},
})
const editorRef = shallowRef()
const toolbarConfig = computed(() => {
return {
excludeKeys: ['group-video'],
}
})
const editorConfig = computed(() => {
return {
placeholder: props.placeholder,
MENU_CONF: {
uploadImage: {
allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],
async customUpload(files: File, insertFn: (url: string) => void) {
// JS 语法
// res 即服务端的返回结果
const res = await uploadImg(files, {
url: 'upload/ossUpload',
businessType: 'product',
})
const url = res.imagePath || res.filePath
// 从 res 中找到 url alt href ,然后插入图片
if (url) insertFn(url)
},
},
insertSelect: { options: props.insertData },
},
}
})
const mode = ref('default')
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const onCreated = (editor: any) => {
console.log(editor)
editorRef.value = editor
}
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
</script>
<style scoped>
.editor_toolbar::v-deep .panel_menu li:hover {
background: #efefef;
}
</style>
......@@ -4,5 +4,6 @@ import App from './App.vue'
import router from './router'
import store from './store'
import './styles/index.scss'
import vueDomPurifyHTMLPlugin from 'vue-dompurify-html'
createApp(App).use(router).use(store).mount('#app')
createApp(App).use(vueDomPurifyHTMLPlugin).use(router).use(store).mount('#app')
......@@ -16,6 +16,7 @@ import { getToken } from '@/api/axios'
import UserPage from '@/views/UserPage.vue'
import DeliveryNotePage from '@/views/DeliveryNotePage.vue'
import AccountStatementNote from '@/views/AccountStatementNote.vue'
import TypeseetingManagement from '@/views/typesetting/TypesettingManagement.vue'
const router = createRouter({
history: createWebHistory(),
......@@ -49,6 +50,10 @@ const router = createRouter({
path: '/account/statement-note',
component: AccountStatementNote,
},
{
path:'/typesetting-management/list',
component: TypeseetingManagement,
}
],
},
// 登录
......
......@@ -25,8 +25,13 @@ const menu: MenuItem[] = [
label: '发货单',
},
{
index: '',
index: '/typesetting-management/list',
id: 5,
label:'打版管理'
},
{
index: '',
id: 6,
label: '系统设置',
children: [
{
......
......@@ -50,6 +50,10 @@ img {
flex: 1;
}
.flex-gap-10 {
gap: 10px;
}
.font-bold {
font-weight: bold;
}
......
export interface TreeData {
statusName: string
children?: TreeData[]
statusCode: string
quantity?: number
}
export interface TypesettingListData {
id: number
sku?: string
homeSku?: string
productName?: string
mainImage?: string
categoryId?: number
status?: string
state?: number | string
type?: number
shelve?: number
printType?: number
scImgType?: number
openly?: number
imageList?: ImageListData[]
retailPrice?: number
urgentLevel?: number
expectCompleteTime?: string
promiseCompleteTime?: string
requirement?: string
confirm?: boolean
personInChargeId?: number
personInChargeName?: string
}
export interface SearchForm {
pageSize: number
currentPage: number
sku: string
state?: string
}
export interface EmergencyLevel {
name: string
desc: string
value: number
}
export interface VersionImageList {
imagePath?: string
filePath?: string
sort: number
version?: string
}
export interface VersionList {
id?: number
typesettingId?: number
opinion?: string
examinePeopleId?: string
examinePeopleName?: string
state?: number
version?: number
createTime?: string
updateTime?: string
examineImages: ExamineImage[]
examine?: string
}
export interface ExamineImage {
id: number
typesettingId: number
typesettingExamineId?: number
imagePath: string
zimagePath?: string
sort: number
createTime?: string
updateTime?: string
}
export interface PriceForm {
id?: number
supplyTypesettingId?: number
craftImage?: string
bulkUnitPrice?: string
testUnitPrice?: string
deliveryDay?: number
priceOpinion?: string
priceNote?: string
updateTime?: string
createTime?: string
flag?: boolean
}
export interface LogList {
id: number
supplyTypesettingId: number
supplyTypesettingStatus: string
employeeId: number
description: string
createdTime: string
}
export interface ImageListData {
id: number
imagePath: string
filePath?: string
sort: number
}
import axios from '@/api/axios'
import { BaseRespData } from '@/types/api'
import { VersionImageList } from '@/types/api/typesetting'
export function getFilePath(fileName?: string) {
return import.meta.env.BASE_URL + fileName
}
// 上传
export function uploadImg(
file: File,
params: { url?: string } & Record<string, string | Blob> = {},
) {
const from = new FormData()
from.append('file', file)
const { url, ...otherParams } = params
for (const key in otherParams) {
from.append(key, otherParams[key])
}
return axios.post<never, BaseRespData<void> & VersionImageList>(
url || `upload/ossUpload`,
from,
{
headers: { 'content-type': 'multipart/form-data' },
},
)
}
<template>
<div
class="typesetting-management card flex flex-gap-10 h-100 overflow-hidden"
>
<div class="left-status">
<ElTree
ref="treeRef"
default-expand-all
:expand-on-click-node="false"
:default-expanded-keys="[]"
:highlight-current="true"
node-key="statusCode"
:data="treeData"
@node-click="nodeClick"
>
<template #default="{ data }">
<div class="tree-node">
<div class="tree-node-label">{{ data.statusName }}</div>
<div class="tree-node-count">{{ `(${data.quantity})` }}</div>
</div>
</template>
</ElTree>
</div>
<div class="right-content flex-1 flex-column overflow-hidden">
<div class="search-form">
<ElForm :model="searchForm" size="large" inline>
<!-- <ElFormItem label="创建时间" prop="rangeDate">
<ElDatePicker
v-model="searchForm.rangeDate"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 300px;"
></ElDatePicker>
</ElFormItem> -->
<ElFormItem label="ID" prop="sku">
<ElInput
v-model="searchForm.sku"
clearable
placeholder="ID"
style="width: 160px"
></ElInput>
</ElFormItem>
<!-- <ElFormItem label="商品名称" prop="productName">
<ElInput
v-model="searchForm.productName"
clearable
placeholder="商品名称"
style="width: 160px"
></ElInput>
</ElFormItem> -->
<ElFormItem>
<ElButton type="primary" size="large" @click="search"
>查询</ElButton
>
</ElFormItem>
<ElFormItem v-if="treeId === '201'">
<el-button size="large" type="danger" @click="reject"
>驳回</el-button
>
</ElFormItem>
</ElForm>
</div>
<div v-if="cardList.length" class="card-mode">
<div v-loading="loading" class="card-list">
<div
v-for="cardItem in cardList"
:key="cardItem.id"
class="card-list_item"
@click="cardClick(cardItem)"
>
<CardWrapper
:card-item="cardItem"
:class="{ active: isSelectStatused(cardItem) }"
>
<template #productName>
<span class="commodity-card-name">{{
cardItem.productName
}}</span>
</template>
<template #price>
<span class="price">
{{ cardItem.retailPrice ? '$' : ''
}}{{ cardItem.retailPrice }}
</span>
</template>
<template #operations>
<Icon name="caozuorizhi" @click.stop="operationLog(cardItem)">
<template #title>
<title>操作日志</title>
</template>
</Icon>
<Icon
v-if="treeId === '201'"
name="querenshenhexunjia"
@click.stop="confirm(cardItem)"
>
<template #title>
<title>确认</title>
</template>
</Icon>
<Icon
v-if="
treeId === '301' || treeId === '401' || treeId === '501'
"
name="shenhe2"
@click.stop="submitReview(cardItem)"
>
<template #title>
<title>提交审核</title>
</template>
</Icon>
<Icon
v-if="treeId === '601'"
name="baojiachaxun"
@click.stop="submitReview(cardItem)"
>
<template #title>
<title>报价</title>
</template>
</Icon>
<Icon
v-if="treeId === '701' || treeId === '901'"
name="chakanxiangqing"
@click.stop="submitReview(cardItem)"
>
<template #title>
<title>查看</title>
</template>
</Icon>
</template>
</CardWrapper>
</div>
</div>
</div>
<div v-else class="no-data">暂无数据</div>
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[100, 200, 300, 400]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="margin: 10px auto 10px; text-align: right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
<!-- 确认 -->
<reviewModel
ref="reviewModal"
v-model="reviewVisible"
v-model:row="row"
title="确认"
@refresh="onRefreshPage"
/>
<!-- 提交审核 -->
<submitReviewModal
ref="submitReviewModelRef"
v-model="submitReviewVisible"
title="提交审核"
:row="row"
@refresh="onRefreshPage"
></submitReviewModal>
<!-- 操作日志 -->
<ElDialog
v-model="logVisible"
title="操作日志"
width="600px"
:close-on-click-modal="false"
>
<template #default>
<div
class="log-list"
style="color: #333; height: 400px; overflow: auto"
>
<div v-for="(item, index) in logList" :key="index" class="log-item">
{{ item.createdTime + ' ' + item.description }}
</div>
</div>
</template>
</ElDialog>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, nextTick } from 'vue'
import type {
TreeData,
SearchForm,
TypesettingListData,
LogList,
} from '@/types/api/typesetting'
import CardWrapper from '@/components/CardWrapper.vue'
import { useValue } from '@/utils/hooks/useValue'
import usePageList from '@/utils/hooks/usePageList'
import {
getTypeListApi,
getStatusListApi,
getTypesettingDetail,
getTypesettingLogByIdApi,
rejectDataApi
} from '@/api/typesetting'
import Icon from '@/components/Icon.vue'
import reviewModel from './reviewModel.vue'
import submitReviewModal from './submitReviewModal.vue'
import dayjs from 'dayjs'
const treeData = ref<TreeData[]>([])
const treeRef = ref()
const treeId = ref('201')
const [searchForm] = useValue<SearchForm>({
pageSize: 20,
currentPage: 1,
sku: '',
})
const getStatusList = async () => {
try {
const res = await getStatusListApi()
treeData.value = res.data.slice(0, 1)
treeData.value[0].children = res.data.slice(1)
nextTick(() => {
treeRef.value.setCurrentKey(treeId.value, true)
})
} catch (e) {
console.error(e)
}
}
onMounted(() => {
getStatusList()
})
const nodeClick = (data: TreeData) => {
treeId.value = data.statusCode
selection.value = []
refresh()
}
const onRefreshPage = () => {
refresh()
getStatusList()
}
const {
loading,
currentPage,
pageSize,
total,
onCurrentPageChange: handleSizeChange,
onPageSizeChange: handleCurrentChange,
refresh,
data: cardList,
} = usePageList({
query: (page, pageSize) =>
getTypeListApi(
{ ...searchForm.value, state: treeId.value },
page,
pageSize,
).then((res) => res.data),
})
const search = () => {
refresh()
}
const selection = ref<TypesettingListData[]>([])
const cardClick = (data: TypesettingListData) => {
const status = isSelectStatused(data)
if (status) {
selection.value = selection.value.filter((item) => item.id !== data.id)
} else {
selection.value.push(data)
}
}
const isSelectStatused = (data: TypesettingListData) => {
const index = selection.value.findIndex((item) => item.id === data.id)
return index !== -1
}
const reviewModal = ref()
const reviewVisible = ref(false)
const row = ref<TypesettingListData>()
const confirm = async (data: TypesettingListData) => {
try {
const res = await getTypesettingDetail(data.id)
row.value = res.data
reviewVisible.value = true
nextTick(() => {
reviewModal.value?.refreshForm()
})
} catch (e) {
console.error(e)
}
}
const submitReviewVisible = ref(false)
const submitReviewModelRef = ref()
const submitReview = async (data: TypesettingListData) => {
try {
submitReviewModelRef.value?.getExamineInfo(data)
if (data.state === '701' || data.state === '901') {
submitReviewModelRef.value?.getPriceDetail(data)
}
const res = await getTypesettingDetail(data.id)
row.value = res.data
nextTick(() => {
submitReviewModelRef.value?.reset()
})
submitReviewVisible.value = true
} catch (e) {
console.error(e)
}
}
const logList = ref<LogList[]>([])
const logVisible = ref(false)
const operationLog = async (data: TypesettingListData) => {
try {
const res = await getTypesettingLogByIdApi(data.id)
res.data.forEach((item) => {
item.createdTime = dayjs(item.createdTime).format('YYYY-MM-DD HH:mm:ss')
})
logList.value = res.data
logVisible.value = true
} catch (e) {
console.error(e)
}
}
const reject = async () => {
if (!selection.value.length) {
return ElMessage.warning('请选择要驳回的数据')
}
const ids = selection.value.map((item) => item.id).join(',')
try {
const res = await rejectDataApi(ids)
ElMessage.success(res.message)
onRefreshPage()
} catch (e) {
console.error(e)
}
}
</script>
<style lang="scss" scoped>
.left-status {
width: 160px;
:deep(.el-tree-node__content) {
height: 30px;
line-height: 30px;
}
:deep(.el-tree-node__label) {
font-size: 13px;
cursor: pointer;
display: inline-block;
width: 100%;
color: black !important;
padding: 3px 7px;
}
:deep(.el-tree-node__expand-icon) {
display: none;
}
:deep(.is-current) {
.tree-node-label,
.tree-node-count {
background-color: #ecf5ff;
color: #409eff !important;
}
.el-tree-node__children {
.tree-node-label,
.tree-node-count {
background-color: transparent !important;
color: black !important;
}
}
}
}
.tree-node {
display: flex;
color: #333;
font-weight: 500;
}
.card-mode {
flex: 1;
overflow: auto;
}
.card-list {
flex: 1;
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: max-content;
gap: 10px;
}
.card-list_item {
border: 1px solid #eee;
border-top-left-radius: 10px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
}
.price {
color: rgba(181, 124, 91, 1);
font-weight: 600;
}
.no-data {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
color: #777;
}
.log-item {
height: 30px;
line-height: 30px;
}
.svg-icon {
margin-left: 5px;
}
</style>
<template>
<ElDialog
v-model="visible"
:title="title"
width="1400px"
top="6vh"
:close-on-click-modal="false"
>
<div v-if="row" class="detail-info">
<div class="review-image">
<ul class="color-image">
<li
v-for="(val, index) in imageList"
:key="index"
class="color-image-item"
>
<!-- <button class="remove" type="button">
<i class="el-icon-close"></i>
</button> -->
<img loading="lazy" :src="val.imagePath" alt="" />
</li>
<!-- <li>
<div class="color-image-item" @click="upload">
<el-icon><Plus /></el-icon>
</div>
</li> -->
</ul>
<div class="main-image">
<img :src="row?.mainImage" />
</div>
</div>
<div class="review-from">
<ElForm
ref="reviewFormRef"
:model="reviewForm"
label-width="120px"
inline
>
<ElFormItem label="编码" prop="sku">
<ElInput
v-model="reviewForm.sku"
disabled
placeholder="编码"
style="width: 200px"
/>
</ElFormItem>
<ElFormItem label="负责人" prop="personInChargeId">
<ElSelect
v-model="reviewForm.personInChargeId"
style="width: 200px"
clearable
disabled
placeholder="请选择负责人"
>
<ElOption
v-for="item in userList"
:key="item.id"
:label="item.account"
:value="item.id"
></ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem label="紧急程度" prop="urgentLevel">
<el-radio-group
v-model="reviewForm.urgentLevel"
style="width: 200px"
>
<el-radio
v-for="(item, index) in emergencyLevel"
:key="index"
disabled
:label="item.value"
>
<svg
t="1627697200171"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="629"
width="18"
height="18"
>
<path
:fill="setColor(index)"
d="M444.970667 850.090667l151.978666-64.512a85.290667 85.290667 0 0 1-151.978666 64.512z m231.765333-760.746667c89.002667 48.597333 155.818667 111.018667 199.765333 187.178667 43.946667 76.117333 64.64 165.205333 62.250667 266.581333a32 32 0 0 1-64-1.536c2.133333-90.069333-15.872-167.552-53.674667-233.045333-37.802667-65.536-95.957333-119.850667-175.018666-163.029334a32 32 0 1 1 30.72-56.192z m-390.4 188.629333a248.490667 248.490667 0 0 1 324.266667 117.162667l4.181333 8.917333 54.954667 123.392 72.448 62.72c3.968 3.413333 7.381333 7.381333 11.349333 13.824l2.517333 4.906667a53.333333 53.333333 0 0 1-27.178666 70.357333L288.213333 874.24A53.333333 53.333333 0 0 1 213.333333 825.472l-0.042666-99.968-52.992-119.082667A248.405333 248.405333 0 0 1 286.293333 277.973333z m380.288-34.986666c41.258667 22.442667 74.325333 55.210667 98.816 97.621333 24.490667 42.453333 36.309333 87.466667 35.157333 134.442667a32 32 0 1 1-64-1.578667c0.853333-35.029333-7.893333-68.437333-26.581333-100.864-18.688-32.384-43.264-56.661333-74.026667-73.472a32 32 0 0 1 30.634667-56.192z"
p-id="630"
></path>
</svg>
</el-radio>
</el-radio-group>
</ElFormItem>
<ElFormItem label="期望完成日期" prop="expectCompleteTime">
<ElDatePicker
v-model="reviewForm.expectCompleteTime"
disabled
placeholder="期望完成日期"
style="width: 200px"
></ElDatePicker>
</ElFormItem>
<ElFormItem
label="承诺完成日期"
prop="promiseCompleteTime"
:rules="[
{
required: true,
message: '请选择承诺完成日期',
},
]"
>
<ElDatePicker
v-model="reviewForm.promiseCompleteTime"
style="width: 200px"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="承诺完成日期"
></ElDatePicker>
</ElFormItem>
<p
v-dompurify-html="reviewForm.requirement"
style="height: 470px"
class="requirement"
></p>
</ElForm>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button size="large" @click="visible = false">取消</el-button>
<el-button size="large" type="primary" @click="saveReview(true)"
>保存
</el-button>
</div>
</template>
</ElDialog>
</template>
<script setup lang="ts">
import { TypesettingListData, EmergencyLevel,ImageListData } from '@/types/api/typesetting'
import {
computed,
defineEmits,
defineProps,
PropType,
ref,
onMounted,
} from 'vue'
import { saveTypesettingReviewApi } from '@/api/typesetting'
import { getUserListApi } from '@/api/common'
import { userData } from '@/types/api/user'
// import { Plus } from '@element-plus/icons-vue'
import { showConfirm } from '@/utils/ui'
const props = defineProps({
row: {
type: Object as PropType<TypesettingListData>,
default: () => {},
},
modelValue: Boolean,
title: String,
})
const emit = defineEmits(['update:modelValue', 'update:modelValue', 'refresh'])
const visible = computed({
get() {
return props.modelValue
},
set(val: boolean) {
emit('update:modelValue', val)
},
})
const reviewForm = computed({
get() {
return props.row
},
set(val: TypesettingListData) {
emit('update:modelValue', val)
},
})
const emergencyLevel = ref<EmergencyLevel[]>([])
emergencyLevel.value = [
{
name: 'VERY_URGENT',
desc: '非常紧急',
value: 3,
},
{
name: 'URGENT',
desc: '紧急',
value: 2,
},
{
name: 'GENERAL',
desc: '一般',
value: 1,
},
]
const setColor = (index: number) => {
if (index == 0) {
return '#F54D66'
}
if (index == 1) {
return '#FDC834'
}
if (index == 2) {
return '#5DE088'
}
}
const reviewFormRef = ref()
const saveReview = async (bol: boolean) => {
if (!bol) {
try {
await showConfirm('是否确认驳回', {
type: 'warning',
confirmButtonText: '确认',
cancelButtonText: '取消',
})
} catch {
return
}
}
try {
await reviewFormRef.value.validate()
} catch {
return
}
const personInChargeName = userList.value.find(
(item) => item.id === reviewForm.value.personInChargeId,
)?.account
try {
const res = await saveTypesettingReviewApi({
...reviewForm.value,
personInChargeName,
confirm: bol,
})
ElMessage.success(res.message)
emit('update:modelValue', false)
emit('refresh')
} catch (e) {
console.error(e)
}
}
const refreshForm = () => {
reviewFormRef.value.resetFields()
}
const userList = ref<userData[]>([])
const getUserList = async () => {
try {
const res = await getUserListApi()
userList.value = res.data
} catch (e) {
console.error(e)
}
}
onMounted(() => {
getUserList()
})
defineExpose({
refreshForm,
})
const imageList = computed<ImageListData[]>(() => {
if (!props.row) return []
return props.row?.imageList ?? []
})
// const upload = () => {}
</script>
<style lang="scss" scoped>
ul,li {
margin: 0;
padding: 0;
}
.color-image-item {
width: 58px;
height: 58px;
border: 1px solid #ddd;
cursor: pointer;
position: relative;
margin: 5px auto;
img {
width: 100%;
height: 100%;
}
}
.detail-info {
display: flex;
gap: 10px;
}
.review-image {
width: 40%;
display: flex;
gap: 10px;
}
.review-from {
width: 60%;
}
.requirement {
border: 1px solid #ddd;
}
.main-image {
border: 1px solid #ddd;
flex: 1;
display: flex;
align-items: center;
img {
height: 100%;
width: 100%;
object-fit: contain;
}
}
.dialog-footer {
text-align: center;
}
</style>
<template>
<ElDialog
v-model="visible"
:title="title"
top="6vh"
width="1400px"
:close-on-click-modal="false"
>
<ElTabs v-model="activeName" class="demo-tabs">
<ElTabPane label="打版信息" name="first">
<div v-loading="loading" class="review-info">
<div class="modals-image">
<div class="modals-image-title">
<span>模特图</span>
</div>
<div style="display: flex; gap: 10px; flex: 1; overflow: hidden">
<div class="color-images-list">
<div
v-for="(item, index) of row?.imageList"
:key="index"
class="color-image-item"
>
<img :src="item.imagePath" alt="" class="img-sign" />
</div>
</div>
<div class="modals-image-big">
<img :src="row?.mainImage" alt="" class="img-sign" />
</div>
</div>
</div>
<div class="modals-image-version">
<div
style="
height: 60px;
font-size: 30px;
line-height: 60px;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
"
>
<span
:style="{
cursor: 'pointer',
color: version === 1 ? '#eee' : '#333',
}"
style="height: 100%; display: inline-block"
title="上一版"
>
<el-icon style="height: 100%" @click="prev"
><CaretLeft
/></el-icon>
</span>
<span>{{ version }}</span>
<span
:title="
version === versionList?.length ? '添加新版本' : '下一版'
"
style="height: 100%; display: inline-block"
>
<el-icon
:style="{
color: versionList?.length == version ? '#eee' : '#333',
cursor: 'pointer',
}"
style="height: 100%"
@click="next"
><CaretRight />
</el-icon>
</span>
</div>
<div
v-loading="uploadLoading"
element-loading-text="加载中..."
class="image-wrap"
>
<div class="image-wrap-url">
<img :src="versionImageUrl" alt="" class="img-sign" />
</div>
<div
style="
height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
"
>
<div class="color-image-list">
<div
v-for="(item, index) of versionImageList"
:key="index"
class="color-image-item"
>
<img :src="item.imagePath" alt="" class="img-sign" />
<span
v-if="
lastVersion === version &&
(row?.state === '301' || row?.state === '401')
"
class="remove"
@click="remove(index)"
>
<el-icon><Close /></el-icon>
</span>
</div>
</div>
<input
ref="fileInputRef"
type="file"
style="display: none"
multiple
@change="onChange"
/>
<div
v-if="
lastVersion === version &&
(row?.state === '301' || row?.state === '401')
"
class="color-image-item-icon-plus"
@click="addImage"
>
<el-icon><Plus /></el-icon>
</div>
</div>
</div>
</div>
</div>
</ElTabPane>
<ElTabPane
v-if="row?.state === '601' || row?.state === '701' || row?.state === '901'"
label="报价信息"
name="second"
>
<div v-loading="loading" class="review-info">
<div class="modals-image">
<div class="modals-image-title">
<span>模特图</span>
</div>
<div style="display: flex; gap: 10px; flex: 1; overflow: hidden">
<div class="color-images-list">
<div
v-for="(item, index) of row?.colorImageList"
:key="index"
class="color-image-item"
>
<img :src="item" alt="" class="img-sign" />
</div>
</div>
<div class="modals-image-big">
<img :src="row?.mainImage" alt="" class="img-sign" />
</div>
</div>
</div>
<div class="price-form">
<div class="modals-image-title">
<span>报价信息</span>
</div>
<ElForm ref="priceFormRef" :model="priceForm" label-width="100px">
<ElFormItem
label="工艺单"
prop="craftImage"
:rules="[{ required: true, message: '请上传工艺单' }]"
>
<UploadImage
v-model="priceForm.craftImage"
:disabled="row?.state === '701' || row?.state === '901'"
></UploadImage>
</ElFormItem>
<ElFormItem
label="大货单价"
prop="bulkUnitPrice"
:rules="[{ required: true, message: '请输入大货单价' }]"
>
<ElInput
v-model="priceForm.bulkUnitPrice"
clearable
:disabled="row?.state === '701' || row?.state === '901'"
placeholder="大货单价"
></ElInput>
</ElFormItem>
<ElFormItem label="测试单价" prop="testUnitPrice">
<ElInput
v-model="priceForm.testUnitPrice"
placeholder="测试单价"
clearable
:disabled="row?.state === '701' || row?.state === '901'"
></ElInput>
</ElFormItem>
<!-- <ElFormItem
label="货期(天)"
prop="deliveryDay"
:rules="[{ type: 'number', message: '货期必须为数字值' }]"
>
<ElInput
v-model.number="priceForm.deliveryDay"
placeholder="货期(天)"
clearable
></ElInput>
</ElFormItem> -->
<ElFormItem label="备注" prop="priceNote">
<ElInput
v-model="priceForm.priceNote"
type="textarea"
:disabled="row?.state === '701' || row?.state === '901'"
placeholder="备注"
></ElInput>
</ElFormItem>
<ElFormItem
v-if="priceForm.priceOpinion"
label="审核意见"
prop="priceOpinion"
>
<p v-dompurify-html="priceForm.priceOpinion"></p>
</ElFormItem>
</ElForm>
</div>
</div>
</ElTabPane>
<ElTabPane label="详情" name="third">
<div class="detail-info">
<ElRow :gutter="20">
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">编码</span>
<span class="value">{{ row?.code || '--' }}</span>
</div>
</ElCol>
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">SKU</span>
<span class="value">{{ row?.homeSku || '--' }}</span>
</div>
</ElCol>
</ElRow>
<ElRow :gutter="20">
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">货号</span>
<span class="value">{{ row?.code || '--' }}</span>
</div>
</ElCol>
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">负责人</span>
<span class="value">{{ row?.personInChargeName || '--' }}</span>
</div>
</ElCol>
</ElRow>
<ElRow :gutter="20">
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">紧急程度</span>
<span class="value" :style="renderStyle(row?.urgentLevel)">{{
renderLevel(row?.urgentLevel)
}}</span>
</div>
</ElCol>
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">期望完成日期</span>
<span class="value">{{ row?.expectCompleteTime || '--' }}</span>
</div>
</ElCol>
</ElRow>
<ElRow :gutter="20">
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">承诺完成日期</span>
<span class="value">{{
row?.promiseCompleteTime || '--'
}}</span>
</div>
</ElCol>
</ElRow>
<ElRow :gutter="20">
<ElCol :span="12">
<div class="detail-info-item">
<span class="label">样板要求</span>
<p v-dompurify-html="row?.remark"></p>
</div>
</ElCol>
</ElRow>
</div>
</ElTabPane>
<ElTabPane label="审核意见" name="four">
<div class="audit-opinion">
<div
v-for="(item, index) in versionList"
v-show="item.state == 3 || item.state == 2"
:key="index"
class="opinion_version"
>
<p>
{{ item.updateTime }}
{{ item.examinePeopleName }} 审核了样版,版本为{{
item.version
}},审核结果为【{{ item.state == 2 ? '通过 】' : ''
}}{{ item.state == 3 ? '不通过】' : '' }}
,审核意见如下:
</p>
<p v-dompurify-html="item.opinion"></p>
</div>
</div>
</ElTabPane>
</ElTabs>
<template #footer>
<div class="dialog-footer">
<el-button size="large" @click="visible = false">取消</el-button>
<el-button
v-if="row?.state === '301' || row?.state === '401'"
size="large"
type="primary"
@click="submitReview"
>提交审核</el-button
>
<el-button
v-if="row?.state === '601'"
size="large"
type="primary"
@click="submitReviewPriceInfo"
>保存</el-button
>
<template v-if="row?.state === '501'">
<el-button size="large" type="warning" @click="notPassReview"
>不通过</el-button
>
<el-button size="large" type="success" @click="passReview"
>通过</el-button
>
</template>
</div>
</template>
</ElDialog>
<el-dialog
v-model="innerVisible"
width="800px"
title="审核意见"
append-to-body
>
<wangEditor
ref="wangeditorRef"
v-model="opinion"
placeholder="审核意见"
height="400px"
filename="files"
></wangEditor>
<template #footer>
<el-button @click="innerVisible = false">取 消</el-button>
<el-button type="primary" @click="submitAudit">确定</el-button>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { computed, defineEmits, defineProps, ref, watch } from 'vue'
import { CaretLeft, CaretRight, Plus, Close } from '@element-plus/icons-vue'
import { showError } from '@/utils/ui'
import { uploadImageApi } from '@/api/common'
import {
TypesettingListData,
VersionImageList,
VersionList,
PriceForm,
} from '@/types/api/typesetting'
import {
getExamineInfoByIdApi,
submitReviewApi,
submitReviewOpinionApi,
submitReviewPriceInfoApi,
getPriceDetailApi,
} from '@/api/typesetting'
import wangEditor from '@/components/WangEditor.vue'
import UploadImage from '@/components/UploadImage.vue'
const props = defineProps({
modelValue: Boolean,
title: String,
row: Object,
})
const emit = defineEmits(['update:modelValue', 'refresh'])
const visible = computed({
get() {
return props.modelValue
},
set(val) {
emit('update:modelValue', val)
},
})
watch(visible, (val) => {
if (val) {
if (props.row?.state === '601') {
activeName.value = 'second'
} else {
activeName.value = 'first'
}
}
})
const opinion = ref('')
const loading = ref(false)
const submitReview = async () => {
if (versionImageList.value.length === 0) {
showError('请上传图片')
return
}
loading.value = true
try {
const res = await submitReviewApi(
props.row?.id,
version.value,
versionImageList.value,
)
ElMessage.success(res.message)
emit('update:modelValue', false)
emit('refresh')
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const activeName = ref('first')
const innerVisible = ref(false)
const version = ref(1)
const prev = () => {
if (version.value > 1) {
version.value -= 1
const item = versionList.value.find((item) => item.version == version.value)
if (item) {
versionImageList.value = item.examineImages
versionImageUrl.value = item.examineImages[0]?.imagePath
} else {
versionImageList.value = []
versionImageUrl.value = ''
}
}
}
const next = () => {
if (versionList.value.length == version.value) return
version.value += 1
const item = versionList.value.find((item) => item.version == version.value)
if (item) {
versionImageList.value = item.examineImages
versionImageUrl.value = item.examineImages[0]?.imagePath
} else {
versionImageList.value = []
versionImageUrl.value = ''
}
}
const versionImageUrl = ref('')
const versionImageList = ref<VersionImageList[]>([])
const fileInputRef = ref()
const addImage = () => {
fileInputRef.value.click()
}
const uploadLoading = ref(false)
const onChange = async (files: Event) => {
const fileList = (files.target as HTMLInputElement).files
if (!fileList) return
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const requestList: Promise<any>[] = []
for (let i = 0; i < fileList.length; i++) {
const file = fileList[i]
const formData = new FormData()
formData.append('file', file)
formData.append('businessType', 'product')
requestList.push(uploadImageApi(formData))
}
uploadLoading.value = true
fileInputRef.value.value = ''
try {
const res = await Promise.all(requestList)
versionImageList.value = res.map((item) => {
return {
imagePath: item?.filePath,
sort: versionImageList.value.length + 1,
}
})
versionImageUrl.value = res[0].filePath ?? ''
} catch (e) {
console.error(e)
} finally {
uploadLoading.value = false
}
}
const versionList = ref<VersionList[]>([])
const lastVersion = ref<number | null>(null)
const getExamineInfo = async (data: TypesettingListData) => {
try {
const res = await getExamineInfoByIdApi(data.id)
if (!res.data) return
versionList.value = res.data
if (data?.state === '301' || data?.state === '401') {
versionList.value.push({
version: versionList.value.length + 1,
examineImages: [],
})
}
if (res.data.length > 0) {
version.value = res.data[res.data.length - 1].version ?? 1
lastVersion.value = res.data[res.data.length - 1].version ?? 1
versionImageList.value = res.data[res.data.length - 1]?.examineImages
versionImageUrl.value =
res.data[res.data.length - 1]?.examineImages[0]?.imagePath
} else {
versionImageList.value = []
versionImageUrl.value = ''
}
} catch (e) {
console.error(e)
}
}
const examine = ref(false)
const notPassReview = () => {
innerVisible.value = true
examine.value = false
opinion.value = ''
}
const passReview = () => {
innerVisible.value = true
examine.value = true
opinion.value = ''
}
const submitAudit = async () => {
if (opinion.value === '') {
showError('请输入审核意见')
return
}
loading.value = true
try {
const res = await submitReviewOpinionApi(
props.row?.id,
examine.value,
opinion.value,
versionList.value[versionList.value.length - 1]?.id,
)
ElMessage.success(res.message)
emit('update:modelValue', false)
emit('refresh')
innerVisible.value = false
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const priceForm = ref<PriceForm>({})
const priceFormRef = ref()
const submitReviewPriceInfo = async () => {
try {
await priceFormRef.value?.validate()
} catch {
return
}
loading.value = true
try {
const res = await submitReviewPriceInfoApi(props.row?.id, priceForm.value)
ElMessage.success(res.message)
emit('update:modelValue', false)
emit('refresh')
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const reset = async () => {
await priceFormRef.value?.resetFields()
}
const remove = (index: number) => {
versionImageList.value.splice(index, 1)
if (versionImageList.value.length > 0) {
versionImageUrl.value = versionImageList.value[0].imagePath ?? ''
} else {
versionImageUrl.value = ''
}
}
const renderLevel = (level: number) => {
if (level === 3) {
return '非常紧急'
} else if (level === 2) {
return '紧急'
} else if (level === 1) {
return '一般'
} else {
return '--'
}
}
const renderStyle = (level: number) => {
if (level === 3) {
return {
color: '#F54D66',
fontWeight: 'bold',
}
} else if (level === 2) {
return {
color: '#FDC834',
fontWeight: 'bold',
}
} else if (level === 1) {
return {
color: '#5DE088',
fontWeight: 'bold',
}
} else {
return {
color: '#333',
}
}
}
const getPriceDetail = async (data: TypesettingListData) => {
try {
const res = await getPriceDetailApi(data.id)
priceForm.value = res.data
} catch (e) {
console.error(e)
}
}
defineExpose({ getExamineInfo, reset, getPriceDetail })
</script>
<style lang="scss" scoped>
.dialog-footer {
text-align: center;
}
.review-info {
display: flex;
gap: 10px;
height: 600px;
}
.modals-image {
flex: 1;
display: flex;
flex-direction: column;
.color-image-item {
width: 60px;
height: 60px;
border: 1px solid #eee;
img {
width: 100%;
height: 100%;
}
}
}
.modals-image-title {
font-size: 30px;
text-align: center;
height: 60px;
line-height: 60px;
}
.modals-image-version,
.price-form {
flex: 1;
display: flex;
flex-direction: column;
}
.image-wrap {
display: flex;
gap: 10px;
flex: 1;
overflow: hidden;
.image-wrap-url {
flex: 1;
text-align: center;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.color-image-item-icon-plus {
width: 60px;
height: 60px;
border: 1px solid #eee;
cursor: pointer;
position: relative;
display: flex;
align-items: center;
justify-content: center;
i {
color: #777;
font-size: 24px;
}
}
.color-image-list {
display: flex;
flex-direction: column;
gap: 10px;
flex: 1;
overflow-y: auto;
}
.color-image-item {
width: 60px;
height: 60px;
border: 1px solid #eee;
cursor: pointer;
position: relative;
img {
width: 100%;
height: 100%;
}
}
}
.modals-image-big {
flex: 1;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.detail-info {
height: 600px;
:deep(.el-row) {
height: 30px;
line-height: 30px;
}
}
.detail-info-item {
.value {
color: #333;
}
.label {
display: inline-block;
width: 100px;
text-align: right;
margin-right: 6px;
}
}
.audit-opinion {
height: 600px;
}
.img-sign[src=''],
.img-sign:not([src]) {
opacity: 0;
}
.remove {
position: absolute;
right: 0px;
top: 0px;
font-size: 20px;
cursor: pointer;
border: 1px solid #333;
border-radius: 50%;
width: 10px;
height: 10px;
display: flex;
align-items: center;
justify-content: center;
i {
font-size: 12px;
}
}
</style>
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