This commit is contained in:
lcw
2025-09-25 10:37:28 +08:00
11 changed files with 207 additions and 146 deletions

83
package-lock.json generated
View File

@ -1174,6 +1174,11 @@
}, },
"@element-plus/icons-vue": { "@element-plus/icons-vue": {
"version": "2.3.2", "version": "2.3.2",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
"requires": {}
=======
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==" "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A=="
}, },
@ -1198,6 +1203,29 @@
"version": "0.2.10", "version": "0.2.10",
"resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz", "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
},
"@floating-ui/core": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
"integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"requires": {
"@floating-ui/utils": "^0.2.10"
}
},
"@floating-ui/dom": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"requires": {
"@floating-ui/core": "^1.7.3",
"@floating-ui/utils": "^0.2.10"
}
},
"@floating-ui/utils": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="
}, },
"@fullcalendar/common": { "@fullcalendar/common": {
"version": "5.11.2", "version": "5.11.2",
@ -1459,7 +1487,11 @@
}, },
"@popperjs/core": { "@popperjs/core": {
"version": "npm:@sxzz/popperjs-es@2.11.7", "version": "npm:@sxzz/popperjs-es@2.11.7",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
=======
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
}, },
"@samverschueren/stream-to-observable": { "@samverschueren/stream-to-observable": {
@ -1642,12 +1674,20 @@
}, },
"@types/lodash": { "@types/lodash": {
"version": "4.17.20", "version": "4.17.20",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz",
=======
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz", "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==" "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA=="
}, },
"@types/lodash-es": { "@types/lodash-es": {
"version": "4.17.12", "version": "4.17.12",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
=======
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"requires": { "requires": {
"@types/lodash": "*" "@types/lodash": "*"
@ -1739,7 +1779,11 @@
}, },
"@types/web-bluetooth": { "@types/web-bluetooth": {
"version": "0.0.16", "version": "0.0.16",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
=======
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
}, },
"@types/webpack": { "@types/webpack": {
@ -2446,26 +2490,54 @@
}, },
"@vueuse/core": { "@vueuse/core": {
"version": "9.13.0", "version": "9.13.0",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
=======
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"requires": { "requires": {
"@types/web-bluetooth": "^0.0.16", "@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0", "@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0", "@vueuse/shared": "9.13.0",
"vue-demi": "*" "vue-demi": "*"
},
"dependencies": {
"vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"requires": {}
}
} }
}, },
"@vueuse/metadata": { "@vueuse/metadata": {
"version": "9.13.0", "version": "9.13.0",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
=======
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
}, },
"@vueuse/shared": { "@vueuse/shared": {
"version": "9.13.0", "version": "9.13.0",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
=======
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"requires": { "requires": {
"vue-demi": "*" "vue-demi": "*"
},
"dependencies": {
"vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"requires": {}
}
} }
}, },
"@webassemblyjs/ast": { "@webassemblyjs/ast": {
@ -5090,7 +5162,11 @@
}, },
"dayjs": { "dayjs": {
"version": "1.11.18", "version": "1.11.18",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
=======
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz", "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==" "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA=="
}, },
"debug": { "debug": {
@ -5650,7 +5726,11 @@
}, },
"element-plus": { "element-plus": {
"version": "2.11.3", "version": "2.11.3",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.3.tgz",
=======
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.3.tgz", "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.3.tgz",
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"integrity": "sha512-769xsjLR4B9Vf9cl5PDXnwTEdmFJvMgAkYtthdJKPhjVjU3hdAwTJ+gXKiO+PUyo2KWFwOYKZd4Ywh6PHfkbJg==", "integrity": "sha512-769xsjLR4B9Vf9cl5PDXnwTEdmFJvMgAkYtthdJKPhjVjU3hdAwTJ+gXKiO+PUyo2KWFwOYKZd4Ywh6PHfkbJg==",
"requires": { "requires": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
@ -14764,11 +14844,14 @@
"integrity": "sha512-ctG5mynJIyGLFBhS2JpzXmBWT3JRXwzMm5AoANUmBlbZHTruct1xQF2OKM/mfJv6tSfqCcEfgH8rGCAY5ca83Q==", "integrity": "sha512-ctG5mynJIyGLFBhS2JpzXmBWT3JRXwzMm5AoANUmBlbZHTruct1xQF2OKM/mfJv6tSfqCcEfgH8rGCAY5ca83Q==",
"dev": true "dev": true
}, },
<<<<<<< HEAD
=======
"vue-demi": { "vue-demi": {
"version": "0.14.10", "version": "0.14.10",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==" "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg=="
}, },
>>>>>>> 83b69c40326e16a175d224acfe21525105ff1b3a
"vue-eslint-parser": { "vue-eslint-parser": {
"version": "7.11.0", "version": "7.11.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",

View File

@ -1,44 +1,44 @@
<template> <template>
<div class="form-item-box" :style="{ width: width }"> <div class="form-item-box" :class="props.showBtn ? 'showBtn-upload' : ''" :style="{ width: width }">
<el-upload v-bind="$attrs" :headers="headers" :multiple="false" class="avatar-uploader" :limit="props.limit" <el-upload
:action="actionUrl" list-type="picture-card" :file-list="fileList" show-file-list :on-exceed="handleExceed" v-bind="$attrs"
:on-success="handlerSuccess" :before-upload="beforeImgUpload"> :headers="headers"
:multiple="false"
class="avatar-uploader"
:limit="props.limit"
:action="actionUrl"
:list-type="props.showBtn ? '' : 'picture-card'"
:file-list="fileList" show-file-list
:on-exceed="handleExceed"
:on-success="handlerSuccess"
:before-upload="beforeImgUpload">
<template #default> <template #default>
<el-icon> <el-button v-if="props.showBtn" size="small" type="primary">上传文件</el-button>
<Plus /> <el-icon v-else><Plus /></el-icon>
</el-icon>
</template> </template>
<template #file="{ file }"> <template #file="{ file }" v-if="!props.showBtn">
<div v-if="props.isImg"> <div v-if="props.isImg">
<img class="el-upload-list__item-thumbnail" :src="file.url" alt="" /> <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<el-icon><zoom-in /></el-icon> <el-icon> <zoom-in /></el-icon>
</span> </span>
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)"> <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)">
<el-icon> <el-icon><Delete /></el-icon>
<Delete />
</el-icon>
</span> </span>
</span> </span>
</div> </div>
<div v-else> <div v-else>
<div class="file-wrap"> <div class="file-wrap">
<span> <span><svg-icon :icon="getSuffix(file.name)" /></span>
<svg-icon :icon="getSuffix(file.name)" />
</span>
<span class="file-name">{{ file.name }}</span> <span class="file-name">{{ file.name }}</span>
</div> </div>
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)"> <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)">
<el-icon> <el-icon><Download /></el-icon>
<Download />
</el-icon>
</span> </span>
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)"> <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)">
<el-icon> <el-icon><Delete /></el-icon>
<Delete />
</el-icon>
</span> </span>
</span> </span>
</div> </div>
@ -52,9 +52,8 @@
<script setup> <script setup>
import { COMPONENT_WIDTH } from "@/constant"; import { COMPONENT_WIDTH } from "@/constant";
import { ref, defineProps, defineEmits, defineExpose, computed, watch, onMounted } from "vue"; import { ref, defineProps, defineEmits, computed, watch, onMounted } from "vue";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage } from "element-plus";
import { useStore } from "vuex"; import { useStore } from "vuex";
const props = defineProps({ const props = defineProps({
//获取组件传值 //获取组件传值
@ -73,12 +72,24 @@ const props = defineProps({
width: { width: {
default: COMPONENT_WIDTH, default: COMPONENT_WIDTH,
type: String type: String
},
showBtn: {
type: Boolean,
default: false
},
isAll: {
type: Boolean,
default: false //所有类型都可以用这个接口返回的是id
} }
}); });
const actionUrl = computed(() => const actionUrl = computed(() => {
props.isImg ? "/mosty-base/minio/image/upload/id" : "/mosty-base/minio/file/upload" if (props.isAll) {
); return "/mosty-base/minio/image/upload/id";
} else {
return props.isImg ? "/mosty-base/minio/image/upload/id": "/mosty-base/minio/file/upload";
}
});
const emits = defineEmits(["update:modelValue", "handleChange"]); const emits = defineEmits(["update:modelValue", "handleChange"]);
@ -104,33 +115,25 @@ const getSuffix = (fileName) => {
//excel XLS //excel XLS
const excelist = ["xls", "xlsx"]; const excelist = ["xls", "xlsx"];
if (excelist.includes(suffix)) return "XLS"; if (excelist.includes(suffix)) return "XLS";
// 匹配 word // 匹配 word
var wordlist = ["doc", "docx"]; var wordlist = ["doc", "docx"];
if (wordlist.includes(suffix)) return "DOC"; if (wordlist.includes(suffix)) return "DOC";
//pdf //pdf
if (suffix === "pdf") return "PDF"; if (suffix === "pdf") return "PDF";
//视频 音频 //视频 音频
var videolist = ["mp4", "m2v", "mkv", "rmvb", "wmv", "avi", "flv", "mov", "m4v"]; var videolist = ["mp4","m2v","mkv","rmvb","wmv","avi","flv","mov","m4v"];
if (videolist.includes(suffix)) return "VIDEO"; if (videolist.includes(suffix)) return "VIDEO";
var musiclist = ["mp3", "wav", "wmv"]; var musiclist = ["mp3", "wav", "wmv"];
if (musiclist.includes(suffix)) return "MUSIC"; if (musiclist.includes(suffix)) return "MUSIC";
var pptlist = ["ppt", "pptx"]; var pptlist = ["ppt", "pptx"];
if (pptlist.includes(suffix)) return "PPT"; if (pptlist.includes(suffix)) return "PPT";
//压缩包 //压缩包
var yslist = ["7z", "rar", "zip", "apz", "ar", "hpk", "hyp", "hbc2"]; var yslist = ["7z", "rar", "zip", "apz", "ar", "hpk", "hyp", "hbc2"];
if (yslist.includes(suffix)) return "YS"; if (yslist.includes(suffix)) return "YS";
//否则返回other //否则返回other
return "OTHER"; return "OTHER";
}; };
const imageUrl = ref("");
const store = useStore(); const store = useStore();
const dialogImageUrl = ref(""); const dialogImageUrl = ref("");
const dialogVisible = ref(false); const dialogVisible = ref(false);
@ -139,47 +142,37 @@ const headers = ref({
Authorization: store.getters.token Authorization: store.getters.token
}); });
const propsModelValue = ref()
const fileList = ref([]); const fileList = ref([]);
watch(() => props.modelValue, (val) => { watch(() => props.modelValue,(val) => {
console.log(val,"xxxxxxxxxxx"); let arr = val ? (Array.isArray(val) ? val :[val]): [];
if (Array.isArray(val)) { if (arr.length > 0) {
propsModelValue.value=val fileList.value = arr.map((el) => {
if (Object.prototype.toString.call(el) === "[object Object]") {
return { url: `/mosty-base/minio/image/download/` + el, name: el.name};
} else { } else {
propsModelValue.value = val ? val.split(',') : []
}
if (propsModelValue.value) {
fileList.value = propsModelValue.value.map((el) => {
return { url: `/mosty-base/minio/image/download/` + el }; return { url: `/mosty-base/minio/image/download/` + el };
});
} }
},{deep:true,immediate:true}); });
}else{
onMounted(() => { fileList.value = [];
// 初始化数据 }
// if (propsModelValue.value) { },
// fileList.value = propsModelValue.value.map((el) => { { immediate: true }
// return { url: `/mosty-base/minio/image/download/` + el }; );
// });
// }
});
const handlerSuccess = (res, file) => { const handlerSuccess = (res, file) => {
file.url = `/mosty-base/minio/image/download/` + res.data; file.url = `/mosty-base/minio/image/download/` + res.data;
fileList.value.push(file); fileList.value.push(file);
if (Array.isArray(propsModelValue.value)) { let arr = props.modelValue ? props.modelValue : [];
propsModelValue.value.push(res.data); if(props.isImg){
} else { arr.push(res.data);
propsModelValue.value =propsModelValue.value? propsModelValue.value.split(','):[] }else{
propsModelValue.value.push(res.data); arr.push({url:res.data,name:file.name});
} }
emits("update:modelValue", arr);
console.log( propsModelValue.value); emits("handleChange", props.modelValue);
emits("update:modelValue", propsModelValue.value.toString());
// emits("handleChange", propsModelValue.value);
}; };
const handlePreview = (file) => { };
const handleExceed = (files, fileList) => { const handleExceed = (files, fileList) => {
ElMessage.warning(`限制,只能上传${props.limit}个文件或图片`); ElMessage.warning(`限制,只能上传${props.limit}个文件或图片`);
}; };
@ -187,7 +180,7 @@ const handleExceed = (files, fileList) => {
const beforeImgUpload = (file) => { const beforeImgUpload = (file) => {
if (props.isImg) { if (props.isImg) {
let isIMG = false; let isIMG = false;
if (getSuffix(file.name) === "IMG" || getSuffix(file.name) === "MUSIC") { if (getSuffix(file.name) === "IMG") {
isIMG = true; isIMG = true;
} }
const isLt5M = file.size / 1024 / 1024 < 5; const isLt5M = file.size / 1024 / 1024 < 5;
@ -202,62 +195,27 @@ const beforeImgUpload = (file) => {
return true; return true;
} }
}; };
const handleAvatarSuccess = (res, file) => {
imageUrl.value = URL.createObjectURL(file.raw);
};
//查询图片 //查询图片
const handlePictureCardPreview = (file) => { const handlePictureCardPreview = (file) => {
dialogImageUrl.value = file.url; dialogImageUrl.value = file.url;
dialogVisible.value = true; dialogVisible.value = true;
}; };
const handleDownload = (file) => { const handleDownload = (file) => {
console.log(file); window.open(file.response.data);
// window.open(file.response.data);
window.open(file);
}; };
const handleRemove = (file) => { const handleRemove = (file) => {
let index = fileList.value.findIndex(function (item) { let index = fileList.value.findIndex(function (item) {
return item.url === file.url; return item.url === file.url;
}); });
fileList.value.splice(index, 1); fileList.value.splice(index, 1);
propsModelValue.value.splice(index, 1); props.modelValue.splice(index, 1);
// emits("handleChange", propsModelValue.value); emits("handleChange", props.modelValue);
emits("update:modelValue", propsModelValue.value.toString()); emits("update:modelValue", props.modelValue);
}; };
watch( const propsModelValue = ref();
() => props.modelValue,
(val) => {
let arr = val ? val : [];
if(Array.isArray(arr)){
if (arr && arr.length > 0) {
fileList.value = arr.map((el) => {
return { url: `/mosty-base/minio/image/download/` + el };
});
}
}else{
arr.split(",").map(item=>{
return { url: `/mosty-base/minio/image/download/` + item };
})
}
},
{ immediate: true }
);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.avatar-uploader {
width: 100%;
display: flex;
flex-wrap: wrap;
align-items: center;
}
.avatar-uploader .el-upload { .avatar-uploader .el-upload {
border: 1px dashed #d9d9d9; border: 1px dashed #d9d9d9;
border-radius: 6px; border-radius: 6px;
@ -309,11 +267,4 @@ arr.split(",").map(item=>{
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
} }
} }
::v-deep .el-upload-list--picture-card {
display: flex;
align-items: center;
padding-top: 7px;
box-sizing: border-box;
}
</style> </style>

View File

@ -31,7 +31,7 @@
<MOSTY.Date v-else-if="item.type == 'date'" :type="item.lx ? item.lx : 'date'" width="100%" clearable <MOSTY.Date v-else-if="item.type == 'date'" :type="item.lx ? item.lx : 'date'" width="100%" clearable
v-model="listQuery[item.prop]" /> v-model="listQuery[item.prop]" />
<!-- 上传 upload limit:'限制张数'--> <!-- 上传 upload limit:'限制张数'-->
<MOSTY.Upload v-else-if="item.type == 'upload'" :isImg="item.isImg" :limit="item.limit" width="100%" <MOSTY.Upload v-else-if="item.type == 'upload'" :isAll="item.isAll" :showBtn="item.showBtn" :isImg="item.isImg" :limit="item.limit" width="100%"
v-model="listQuery[item.prop]" /> v-model="listQuery[item.prop]" />
<!--选择checkbox --> <!--选择checkbox -->
<MOSTY.CheckBox v-else-if="item.type == 'checkbox'" width="100%" clearable v-model="listQuery[item.prop]" <MOSTY.CheckBox v-else-if="item.type == 'checkbox'" width="100%" clearable v-model="listQuery[item.prop]"

View File

@ -69,10 +69,12 @@ function getDateById (id) {
} }
const save = () => { const save = () => {
FormRef.value.submit(()=>{ FormRef.value.submit((val)=>{
loading.value = true; loading.value = true;
let url = title.value == '新增' ? `/mosty-base/baxx/jxda/add` : `/mosty-base/baxx/jxda/edit`; let url = title.value == '新增' ? `/mosty-base/baxx/jxda/add` : `/mosty-base/baxx/jxda/edit`;
qcckPost(listQuery.value, url).then(() => { let params = { ...val }
params.fj = params.fj ? params.fj.join(','):''
qcckPost(params, url).then(() => {
loading.value = false; loading.value = false;
proxy.$message.success("保存成功"); proxy.$message.success("保存成功");
emit("refresh"); emit("refresh");
@ -84,7 +86,7 @@ const save = () => {
} }
const close = () => { const close = () => {
dialogForm.value = false; dialogForm.value = false;
listQuery.value = {fj:''} listQuery.value = {fj:[]}
FormRef.value.reset() FormRef.value.reset()
};; };;

View File

@ -36,7 +36,7 @@ const formList = reactive([
{ label: "视频标题", prop: "spbt", type: "input" }, { label: "视频标题", prop: "spbt", type: "input" },
], ],
[ [
{ label: "附件", prop: "fjid", type: "upload"}, { label: "附件", prop: "fjid", type: "upload",isImg:false,showBtn:true,limit:2 ,isAll:true},
], ],
]) ])
@ -46,14 +46,23 @@ const init = (type, row = {}) => {
dialogForm.value = true; dialogForm.value = true;
openType.value = type; openType.value = type;
title.value = type == "add" ? "新增" : "编辑"; title.value = type == "add" ? "新增" : "编辑";
listQuery.value = { ...row } if(row) getDateById(row.id)
}; };
const getDateById = (id) =>{
qcckPost({},'/mosty-base/baxx/sok/getInfo/'+id).then(res=>{
res.fjid = res.fjid ? JSON.parse(res.fjid):[];
listQuery.value = res || {}
})
}
const save = () => { const save = () => {
FormRef.value.submit(()=>{ FormRef.value.submit((val)=>{
loading.value = true; loading.value = true;
let url = title.value == '新增' ? `/mosty-base/baxx/sok/add` : `/mosty-base/baxx/sok/edit`; let url = title.value == '新增' ? `/mosty-base/baxx/sok/add` : `/mosty-base/baxx/sok/edit`;
qcckPost(listQuery.value, url).then(() => { let params = {...val }
params.fjid = params.fjid ? JSON.stringify(params.fjid):''
qcckPost(params, url).then(() => {
loading.value = false; loading.value = false;
proxy.$message.success("保存成功"); proxy.$message.success("保存成功");
emit("refresh"); emit("refresh");
@ -65,6 +74,7 @@ const save = () => {
} }
const close = () => { const close = () => {
dialogForm.value = false; dialogForm.value = false;
listQuery.value.fjid = []
FormRef.value.reset() FormRef.value.reset()
};; };;

View File

@ -23,7 +23,7 @@
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="primary" link @click="addEdit('edit', row)">编辑</el-link> <el-link type="primary" link @click="addEdit('edit', row)">编辑</el-link>
<el-link type="primary" link @click="addEdit('detail', row)">详情</el-link> <el-link type="primary" link @click="addEdit('detail', row)">详情</el-link>
<el-link type="danger" link @click="handleDelete(row.id)">删除</el-link> <el-link type="danger" link @click="handleDelete([row.id])">删除</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -115,7 +115,7 @@ const getList = () => {
// 删除 // 删除
const handleDelete = (ids) => { const handleDelete = (ids) => {
proxy.$modal.confirm("是否确认删除该视频?").then(() => { proxy.$modal.confirm("是否确认删除该视频?").then(() => {
qcckPost({ ids }, "/mosty-base/baxx/sok/remove").then(() => { qcckPost(ids, "/mosty-base/baxx/sok/remove").then(() => {
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
getList(); getList();
}); });

View File

@ -47,7 +47,7 @@ const formList = reactive([
]) ])
const rules = { const rules = {
pxgs: [{ required: true, message: "请输入考试成绩", trigger: "change" }], pxgs: [{ required: true, message: "请选择培训公司", trigger: "change" }],
} }
const open = (row = {}, type = 'updata') => { const open = (row = {}, type = 'updata') => {

View File

@ -27,13 +27,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="培训开始时间" prop="kssj" style="width: 100%;"> <el-form-item label="培训时间" prop="kssjJssj" style="width: 100%;">
<el-date-picker v-model="formData.kssj" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请输入培训开始时间" style="width: 100%;" /> <el-date-picker v-model="formData.kssjJssj" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="选择开始时间" end-placeholder="选择结束时间" placeholder="请输入培训开始时间" style="width: 100%;" @change="handleTimeChange" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训结束时间" prop="jssj" style="width: 100%;">
<el-date-picker v-model="formData.jssj" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请输入培训结束时间" style="width: 100%;" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -94,7 +89,7 @@
</MyTable> </MyTable>
</div> </div>
<select-personnel-dialog ref="selectPersonnelRef" v-model="visible" @change="handleChange" /> <select-personnel-dialog ref="selectPersonnelRef" v-model="visible" :default-select-keys="defaultSelectKeys" @change="handleChange" />
</div> </div>
</template> </template>
@ -141,12 +136,15 @@ const pageData = reactive({
] ]
}); });
const defaultSelectKeys = computed(() => {
return pageData.tableData?.map(i => i.id)
})
const rules = { const rules = {
xmmc: [{ required: true, message: "请输入培训项目名称", trigger: "change" }], xmmc: [{ required: true, message: "请输入培训项目名称", trigger: "change" }],
pxdz: [{ required: true, message: "请输入培训地址", trigger: "change" }], pxdz: [{ required: true, message: "请输入培训地址", trigger: "change" }],
xxdz: [{ required: true, message: "请输入详细地址", trigger: "change" }], xxdz: [{ required: true, message: "请输入详细地址", trigger: "change" }],
kssj: [{ required: true, message: "请输入培训开始时间", trigger: "change" }], kssjJssj: [{ required: true, message: "请选择开始结束培训时间", trigger: "change" }],
jssj: [{ required: true, message: "请输入培训结束时间", trigger: "change" }],
pxrq: [{ required: true, message: "请输入培训日期", trigger: "change" }], pxrq: [{ required: true, message: "请输入培训日期", trigger: "change" }],
kcmc: [{ required: true, message: "请输入课程名称", trigger: "change" }], kcmc: [{ required: true, message: "请输入课程名称", trigger: "change" }],
zzdw: [{ required: true, message: "请输入组织单位", trigger: "change" }], zzdw: [{ required: true, message: "请输入组织单位", trigger: "change" }],
@ -180,6 +178,7 @@ const init = () => {
const close = () => { const close = () => {
FormRef.value.resetFields() FormRef.value.resetFields()
pageData.tableData = []
showDialog.value = false showDialog.value = false
} }
@ -188,6 +187,12 @@ const handleDelItem = (row) => {
pageData.tableData.splice(index, 1) pageData.tableData.splice(index, 1)
} }
const handleTimeChange = (val) => {
const [start, end] = val
formData.value.kssj = start
formData.value.jssj = end
}
const handleChange = (val) => { const handleChange = (val) => {
pageData.tableData = [...pageData.tableData, ...val]?.filter((i, index, arr) => arr?.findIndex(s => i?.id === s?.id) === index) pageData.tableData = [...pageData.tableData, ...val]?.filter((i, index, arr) => arr?.findIndex(s => i?.id === s?.id) === index)
} }
@ -195,11 +200,14 @@ const handleChange = (val) => {
const save = () => { const save = () => {
if (pageData.tableData.length === 0) return proxy.$message.warning('请选择培训保安人员') if (pageData.tableData.length === 0) return proxy.$message.warning('请选择培训保安人员')
const ryidList = pageData.tableData?.map(i => i?.id) const ryidList = pageData.tableData?.map(i => i?.id)
const { pxkcList, pxxmid } = formData.value const { pxkcList, ...rest } = formData.value
FormRef.value.validate( async (valid) => { FormRef.value.validate( async (valid) => {
if (!valid) return
// 新增项目、修改项目
const url = !formData.value?.id ? `/mosty-base/baxx/pxxm/add` : `/mosty-base/baxx/pxxm/edit` const url = !formData.value?.id ? `/mosty-base/baxx/pxxm/add` : `/mosty-base/baxx/pxxm/edit`
const res = await qcckPost(formData.value, url) const res = await qcckPost({ ...rest }, url)
await qcckPost({ pxkcList, pxxmid: res?.id, ryidList }, !formData.value?.id ? `/mosty-base/baxx/pxkc/saveList` : `/mosty-base/baxx/pxkc/updateList`) // 新增课程、修改课程
await qcckPost({ pxkcList: formData.value.pxkcList, pxxmid: res?.id, ryidList }, !formData.value?.id ? `/mosty-base/baxx/pxkc/saveList` : `/mosty-base/baxx/pxkc/updateList`)
proxy.$message.success('新增培训项目成功') proxy.$message.success('新增培训项目成功')
emits("refresh"); emits("refresh");
close() close()

View File

@ -24,7 +24,7 @@
</template> </template>
<script setup> <script setup>
import { computed, ref, reactive, getCurrentInstance } from 'vue'; import { computed, ref, reactive, getCurrentInstance, watchEffect } from 'vue';
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import MyTable from '@/components/aboutTable/MyTable.vue'; import MyTable from '@/components/aboutTable/MyTable.vue';
@ -58,6 +58,7 @@ const pageData = reactive({
tableData: [{}], tableData: [{}],
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowKey: "id",
rowHieght: 61, rowHieght: 61,
showIndex: false, showIndex: false,
showSelectType: "checkBox", showSelectType: "checkBox",
@ -79,6 +80,10 @@ const pageData = reactive({
] ]
}); });
watchEffect(() => {
pageData.tableConfiger.defaultSelectKeys = props.defaultSelectKeys
})
const open = async () => { const open = async () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
@ -92,6 +97,7 @@ const open = async () => {
pageData.total = res.total pageData.total = res.total
visible.value = true visible.value = true
} }
} finally { } finally {
pageData.tableConfiger.loading = false pageData.tableConfiger.loading = false
} }
@ -99,6 +105,7 @@ const open = async () => {
const handleClose = () => { const handleClose = () => {
selectList.value = [] selectList.value = []
pageData.tableData = []
visible.value = false visible.value = false
} }

View File

@ -69,7 +69,7 @@ const searchConfiger = ref([
]); ]);
const pageData = reactive({ const pageData = reactive({
tableData: [{}], tableData: [],
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,

View File

@ -10,7 +10,7 @@ const serverHost = "http://192.168.1.32:8066";//波哥
// const serverHost = "http://127.0.0.1:8006" // const serverHost = "http://127.0.0.1:8006"
module.exports = { module.exports = {
publicPath: "./", publicPath: "./",
outputDir: "xf", outputDir: "ab",
assetsDir: "static", assetsDir: "static",
lintOnSave: false, //process.env.NODE_ENV === 'development', lintOnSave: false, //process.env.NODE_ENV === 'development',
productionSourceMap: false, productionSourceMap: false,