diff --git a/package.json b/package.json index 58fd6abc776a3f9c0974db04deef76a60f1b7f65..29c74b7c38c91eb1344c4ce492e3e43e75a2e367 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "@arco-design/color": "^0.4.0", - "@arco-design/web-vue": "^2.37.4", - "@arco-themes/vue-mine-admin": "^0.0.8", + "@arco-design/web-vue": "^2.38.3", + "@arco-themes/vue-mine-admin": "^0.0.9", "@tinymce/tinymce-vue": "^5.0.0", "autoprefixer": "^10.4.0", "axios": "^0.27.2", @@ -37,7 +37,7 @@ "vue-router": "^4.1.2" }, "devDependencies": { - "@vitejs/plugin-vue": "^3.0.0", + "@vitejs/plugin-vue": "^3.1.2", "@vitejs/plugin-vue-jsx": "^2.0.0", "less": "^4.1.3", "less-loader": "^11.0.0", diff --git a/src/api/common.js b/src/api/common.js index 9698436473849087de63bb27402341a885d82d46..c6bb20bd6005836aa088ec1463bba493792c4bea 100644 --- a/src/api/common.js +++ b/src/api/common.js @@ -211,5 +211,33 @@ export default { url: 'setting/common/getModuleList', method: 'get' }) + }, + + downloadById(id) { + return request({ + url: 'system/downloadById?id=' + id, + method: 'get', + }) + }, + + downloadByHash(hash) { + return request({ + url: 'system/downloadByHash?hash=' + hash, + method: 'get', + }) + }, + + getFileInfoById(id) { + return request({ + url: 'system/getFileInfoById?id=' + id, + method: 'get', + }) + }, + + getFileInfoByHash(hash) { + return request({ + url: 'system/getFileInfoByHash?hash=' + hash, + method: 'get', + }) } } diff --git a/src/assets/ma-icons/Workflow.vue b/src/assets/ma-icons/Workflow.vue new file mode 100644 index 0000000000000000000000000000000000000000..cd16557d3f0961f8a8fecd817e33aaecdcd3533a --- /dev/null +++ b/src/assets/ma-icons/Workflow.vue @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/src/assets/ma-icons/index.js b/src/assets/ma-icons/index.js index 60413f25ae75bf33ab10b70e6f0c0726bed66d2d..5b8d57c8d735537436fac76eb8666a9ff8343b1d 100644 --- a/src/assets/ma-icons/index.js +++ b/src/assets/ma-icons/index.js @@ -12,4 +12,5 @@ export { default as Db } from './Db.vue' export { default as Group } from './Group.vue' export { default as Rely } from './Rely.vue' export { default as Code } from './Code.vue' -export { default as Online } from './Online.vue' \ No newline at end of file +export { default as Online } from './Online.vue' +export { default as Workflow } from './Workflow.vue' \ No newline at end of file diff --git a/src/components/ma-crud/components/column.vue b/src/components/ma-crud/components/column.vue index d485fc5400ebe4b1e534a1ee73f8bf50edf5d931..e80d17d7759687ffc9d23352c47cf9dc98e7e224 100644 --- a/src/components/ma-crud/components/column.vue +++ b/src/components/ma-crud/components/column.vue @@ -46,7 +46,7 @@ > {{ props.options.see.text || '查看' }} --> @@ -70,7 +70,7 @@ content="确定要删除该数据吗?" position="bottom" @ok="deleteAction(record)" - v-if="props.options.delete.show" + v-if="(isFunction(props.options.delete.show) ? props.options.delete.show(record):props.options.delete.show)" > + @@ -120,8 +124,10 @@ import { Message } from '@arco-design/web-vue' import config from '@/config/crud' import { isFunction, get } from 'lodash' import CustomRender from '../js/custom-render' +import tool from '@/utils/tool' +import commonApi from '@/api/common' -const emit = defineEmits(['refresh']) +const emit = defineEmits(['refresh', 'showImage']) const props = defineProps({ options: Object, searchRef: Object, @@ -131,6 +137,48 @@ const props = defineProps({ isRecovery: Boolean, }) +const storageMode = { + '1': 'LOCAL', + '2': 'OSS', + '3': 'COS', + '4': 'QINIU' +} + +const imageSee = async (row, record) => { + if (row.returnType) { + + if (row.returnType == 'url') { + emit('showImage', record.url) + return + } + + if (! ['id', 'hash'].includes(row.returnType)) { + Message.info('该图片无法查看') + return + } + Message.info('获取图片中,请稍等...') + const res = row.returnType == 'id' ? await commonApi.getFileInfoById({ id: record.id }) : await commonApi.getFileInfoByHash({ hash: record.hash }) + const result = res?.success ?? false + if (! result) { + Message.info('图片信息无法获取') + return + } + + const isImage = res.data.mime_type.indexOf('image') > -1 + result && emit( + 'showImage', + isImage ? tool.attachUrl(res.data.url, storageMode[res.data.storage_mode]) : 'not-image.png' + ) + + } else { + if (! record[row.dataIndex]) { + Message.info('无图片') + return + } + emit('showImage', record[row.dataIndex] ?? 'not-image.png') + } +} + const getTagColor = (row, record) => { return props.searchRef.dictColors( row.dataIndex, (row.dataIndex.indexOf('.') > -1 ) ? get(record, row.dataIndex) : record[row.dataIndex] ) } @@ -180,3 +228,10 @@ const refresh = () => { emit('refresh') } + + \ No newline at end of file diff --git a/src/components/ma-crud/components/form.vue b/src/components/ma-crud/components/form.vue index 8d61fddc7a19859bda7bed8eccb145fe42c1831d..dad5a6b15a1110d853e7a6213a436f5f69cee7a0 100644 --- a/src/components/ma-crud/components/form.vue +++ b/src/components/ma-crud/components/form.vue @@ -24,13 +24,12 @@ - - \ No newline at end of file + diff --git a/src/components/ma-crud/components/search.vue b/src/components/ma-crud/components/search.vue index d781e6390e73b75cb89b2d978d0eaf4e1072fa29..3a3c409c7a6683ed7070ff63d1a83db90568dabf 100644 --- a/src/components/ma-crud/components/search.vue +++ b/src/components/ma-crud/components/search.vue @@ -186,7 +186,7 @@ \ No newline at end of file diff --git a/src/components/ma-icon/index.vue b/src/components/ma-icon/index.vue index cc945f69ba91d9665282bd800f6ce0e7b696061f..2d269ac0e1f250678d3300a1a7164686fd3e2218 100644 --- a/src/components/ma-icon/index.vue +++ b/src/components/ma-icon/index.vue @@ -16,6 +16,7 @@ allow-clear v-model="currentIcon" @change="handlerChange" + v-if="props.type === 'select'" > -
+ +
选择图标 @@ -91,7 +93,9 @@ const currentIcon = ref() const props = defineProps({ - modelValue: { type: String } + modelValue: { type: String }, + type: { type: String, default: 'select' }, + preview: { type: Boolean, default: true }, }) const emit = defineEmits(['update:modelValue']) diff --git a/src/components/ma-resource/button.vue b/src/components/ma-resource/button.vue index a978fec43b3db2a9743502d5a876e1ca750cee5e..73edccf3ff5c996523ed9d27cf30745cdce62da7 100644 --- a/src/components/ma-resource/button.vue +++ b/src/components/ma-resource/button.vue @@ -30,7 +30,7 @@ - +
@@ -48,7 +48,7 @@ const props = defineProps({ modelValue: { type: [ String, Array ] }, multiple: { type: Boolean, default: true }, - onlyUrl: { type: Boolean, default: true }, + onlyData: { type: Boolean, default: true }, width: { type: Number, default: 1080 }, }) diff --git a/src/components/ma-resource/index.vue b/src/components/ma-resource/index.vue index cc19b9dd414a0a6d5941f0361cbea8f5fd7edafc..28a1ed0ab3ccef98d6d58b302d4ebe887446e60c 100644 --- a/src/components/ma-resource/index.vue +++ b/src/components/ma-resource/index.vue @@ -117,7 +117,8 @@ const props = defineProps({ modelValue: { type: [ String, Array ] }, multiple: { type: Boolean, default: true }, - onlyUrl: { type: Boolean, default: true } + onlyData: { type: Boolean, default: true }, + returnType: { type: String, default: 'url'}, }) onMounted(async () => { @@ -165,8 +166,8 @@ const selectFile = (item, index) => { if ( ! props.multiple && selecteds.value ) { - if (props.onlyUrl && item.url != selecteds.value) return - if (! props.onlyUrl && item.id != selecteds.value.id) return + if (props.onlyData && item.url != selecteds.value) return + if (! props.onlyData && item.id != selecteds.value.id) return } const children = rl.value.children @@ -178,8 +179,8 @@ children[index].className = className if (props.multiple) { selecteds.value.map((file, idx) => { - if (props.onlyUrl && file == item.url) selecteds.value.splice(idx, 1) - if (! props.onlyUrl && file.id == item.id) selecteds.value.splice(idx, 1) + if (props.onlyData && file == item.url) selecteds.value.splice(idx, 1) + if (! props.onlyData && file.id == item.id) selecteds.value.splice(idx, 1) }) } else { selecteds.value = '' @@ -187,9 +188,9 @@ } else { children[index].className = className + ' active' if (props.multiple) { - selecteds.value.push(props.onlyUrl ? item?.url : item) + selecteds.value.push(props.onlyData ? item[props.returnType] : item) } else { - selecteds.value = props.onlyUrl ? item?.url : item + selecteds.value = props.onlyData ? item[props.returnType] : item } } } diff --git a/src/components/ma-upload/index.vue b/src/components/ma-upload/index.vue index 16493f4f4d2ed4da6155d7b416c52cd3c94e69b3..e4858325cb9fd3f7b5dde3917e915a28342fa6b9 100644 --- a/src/components/ma-upload/index.vue +++ b/src/components/ma-upload/index.vue @@ -225,7 +225,8 @@ const props = defineProps({ tip: { type: String, default: undefined }, type: { type: String, default: 'image' }, accept: { type: String, default: '*' }, - onlyUrl: { type: Boolean, default: true }, + onlyData: { type: Boolean, default: true }, + returnType: { type: String, default: 'url' }, fileType: { type: String, default: 'button' }, showList: { type: Boolean, default: true }, }) @@ -319,7 +320,7 @@ const uploadImageHandler = async (options) => { if (result) { result.url = tool.attachUrl(result.url, storageMode[result.storage_mode]) if (! props.multiple) { - fileList.value = props.onlyUrl ? result.url : result + fileList.value = props.onlyData ? result[props.returnType] : result emit('update:modelValue', fileList.value) currentItem.value.percent = 99 setTimeout(() => { @@ -338,7 +339,7 @@ const uploadImageHandler = async (options) => { }, 1200) let files = [] fileList.value.map(item => { - files.push(props.onlyUrl ? item.url : item) + files.push(props.onlyData ? item[props.returnType] : item) }) emit('update:modelValue', files) } @@ -360,12 +361,12 @@ const uploadFileHandler = async (options) => { let files = [] fileList.value.push(res) fileList.value.map(item => { - files.push(props.onlyUrl && item.url ? item.url : item) + files.push(props.onlyData && item[props.returnType] ? item[props.returnType] : item) }) emit('update:modelValue', files) } else { fileList.value = res - emit('update:modelValue', props.onlyUrl && res.url ? res.url : res) + emit('update:modelValue', props.onlyData && res[props.returnType] ? res[props.returnType] : res) } }) } @@ -410,12 +411,12 @@ const chunkUpload = async (options) => { fileList.value[idx].res = res.data const files = [] fileList.value.map(item => { - item.percent === 1 && files.push(props.onlyUrl ? item.res.url : item.res) + item.percent === 1 && files.push(props.onlyData ? item.res[props.returnType] : item.res) }) emit('update:modelValue', files) } else { fileList.value.percent = 1 - emit('update:modelValue', props.onlyUrl ? res.data.url : res.data) + emit('update:modelValue', props.onlyData ? res.data[props.returnType] : res.data) } return } @@ -469,7 +470,7 @@ const removeChunkFile = (file = null) => { if (file.uid === item.uid) { fileList.value.splice(idx, 1) } else if (item.res) { - files.push(props.onlyUrl ? item.res.url : item.res) + files.push(props.onlyData ? item.res[props.returnType] : item.res) } }) emit('update:modelValue', files) @@ -487,7 +488,7 @@ const removeFile = async (fileItem) => { if (item.uid === fileItem.uid) fileList.value.splice(idx, 1) }) fileList.value.map( item => { - files.push(props.onlyUrl && item.url ? item.url : item) + files.push(props.onlyData && item[props.returnType] ? item[props.returnType] : item) }) emit('update:modelValue', files) return true diff --git a/src/components/ma-verifyCode/index.vue b/src/components/ma-verifyCode/index.vue index b18208f4af17cdd45d8fed8cf39b06e6253a1107..7cbf559ceb119af2004ad7f91b924eb29b860eef 100644 --- a/src/components/ma-verifyCode/index.vue +++ b/src/components/ma-verifyCode/index.vue @@ -8,7 +8,7 @@ - @Link https://gitee.com/xmo/mineadmin-vue --> + + \ No newline at end of file diff --git a/src/layout/components/components/message-notification.vue b/src/layout/components/components/message-notification.vue index 9f0983ecbc73b594e47bec619a20c7dce3dc1f53..9184304b90172b3be1d0c1c37eadf2e720430b79 100644 --- a/src/layout/components/components/message-notification.vue +++ b/src/layout/components/components/message-notification.vue @@ -71,7 +71,7 @@ const viewMessage = async (record) => { row.value = record await queueMessage.updateReadStatus({ ids: [record.id] }) messageStore.messageList.find( (item, idx) => { - if (record.id == item.id) messageStore.messageList.splice(idx, 1) + if (item && record.id == item.id) messageStore.messageList.splice(idx, 1) }) detailVisible.value = true } diff --git a/src/layout/components/components/sub-menu.vue b/src/layout/components/components/sub-menu.vue new file mode 100644 index 0000000000000000000000000000000000000000..b78dd11545d19a05a65eab67877e5fcf5e752dad --- /dev/null +++ b/src/layout/components/components/sub-menu.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/src/layout/components/ma-tags.vue b/src/layout/components/ma-tags.vue index fa9d58de716a6a81262b24b29032ce2e72f10dbc..146365bd18335351bc95e4789789d372dd4fd2f2 100644 --- a/src/layout/components/ma-tags.vue +++ b/src/layout/components/ma-tags.vue @@ -3,7 +3,7 @@