src/assets/logo/logo.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/FileUpload/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Navbar.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/monitor/operlog/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/assets/logo/logo.pngsrc/components/FileUpload/index.vue
@@ -3,16 +3,14 @@ <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" :show-file-list="false" :limit="limit" :on-progress="handleUploadProgress" :show-file-list="true" :headers="headers" class="upload-file-uploader" ref="fileUploadRef" :auto-upload="false" > <!-- 上传按钮 --> <el-button type="primary">选取文件</el-button> @@ -20,25 +18,23 @@ <!-- 上传提示 --> <div class="el-upload__tip" v-if="showTip"> 请上传 <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template> 的文件 <!-- <template v-if="fileSize">--> <!-- 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>--> <!-- </template>--> 文件 </div> <!-- 文件列表 --> <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> <el-link :href="`${file.url}`" :underline="false" target="_blank"> <span class="el-icon-document"> {{ getFileName(file.name) }} </span> </el-link> <div class="ele-upload-list__item-content-action"> <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link> </div> </li> </transition-group> <!-- <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">--> <!-- <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">--> <!-- <el-link :href="`${file.url}`" :underline="false" target="_blank">--> <!-- <span class="el-icon-document"> {{ getFileName(file.name) }} </span>--> <!-- </el-link>--> <!-- <div class="ele-upload-list__item-content-action">--> <!-- <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>--> <!-- </div>--> <!-- </li>--> <!-- </transition-group>--> </div> </template> @@ -46,11 +42,12 @@ import { listByIds, delOss } from "@/api/system/oss"; import { propTypes } from '@/utils/propTypes'; import { globalHeaders } from "@/utils/request"; import { LoadingInstance } from 'element-plus/es/components/loading/src/loading'; let downloadLoadingInstance: LoadingInstance; const props = defineProps({ modelValue: [String, Object, Array], // 数量限制 limit: propTypes.number.def(5), limit: propTypes.number.def(10), // 大小限制(MB) fileSize: propTypes.number.def(5), // 文件类型, 例如['png', 'jpg', 'jpeg'] @@ -60,7 +57,7 @@ }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const emit = defineEmits(['update:modelValue']); const emit = defineEmits(['update:modelValue','closePopup']); const number = ref(0); const uploadList = ref<any[]>([]); @@ -70,49 +67,85 @@ const fileList = ref<any[]>([]); const showTip = computed( () => props.isShowTip && (props.fileType || props.fileSize) () => props.isShowTip && (props.fileSize) ); const fileUploadRef = ref<ElUploadInstance>(); watch(() => props.modelValue, async val => { if (val) { let temp = 1; // 首先将值转为数组 let list = []; if (Array.isArray(val)) { list = val; } else { const res = await listByIds(val as string) list = res.data.map((oss) => { const data = { name: oss.originalName, url: oss.url, ossId: oss.ossId }; return data; }); } // 然后将数组转为对象数组 fileList.value = list.map(item => { item = { name: item.name, url: item.url, ossId: item.ossId }; item.uid = item.uid || new Date().getTime() + temp++; return item; }); } else { fileList.value = []; return []; } }, { deep: true, immediate: true }); // watch(() => props.modelValue, async val => { // console.log(val,props.modelValue); // if (val) { // let temp = 1; // // 首先将值转为数组 // let list = []; // if (Array.isArray(val)) { // list = val; // } else { // const res = await listByIds(val as string) // list = res.data.map((oss) => { // const data = { name: oss.originalName, url: oss.url, ossId: oss.ossId }; // return data; // }); // } // // 然后将数组转为对象数组 // fileList.value = list.map(item => { // item = { name: item.name, url: item.url, ossId: item.ossId }; // item.uid = item.uid || new Date().getTime() + temp++; // return item; // }); // } else { // fileList.value = []; // return []; // } // }, { deep: true, immediate: true }); // const fileUploadRef = ref<UploadInstance>() const handleCilck = async () => { console.log('子组件方法'); await fileUploadRef.value!.submit() // let val = props.modelValue // if (val) { // let temp = 1; // // 首先将值转为数组 // let list = []; // if (Array.isArray(val)) { // list = val; // } else { // const res = await listByIds(val as string) // list = res.data.map((oss) => { // const data = { name: oss.originalName, url: oss.url, ossId: oss.ossId }; // return data; // }); // } // // 然后将数组转为对象数组 // fileList.value = list.map(item => { // item = { name: item.name, url: item.url, ossId: item.ossId }; // item.uid = item.uid || new Date().getTime() + temp++; // return item; // }); // } else { // fileList.value = []; // return []; // } } // 第二部:暴露方法 defineExpose({ handleCilck }) // 上传前校检格式和大小 const handleBeforeUpload = (file: any) => { // 校检文件类型 if (props.fileType.length) { const fileName = file.name.split('.'); const fileExt = fileName[fileName.length - 1]; const isTypeOk = props.fileType.indexOf(fileExt) >= 0; if (!isTypeOk) { proxy?.$modal.msgError(`文件格式不正确, 请上传${props.fileType.join("/")}格式文件!`); return false; } } // if (props.fileType.length) { // const fileName = file.name.split('.'); // const fileExt = fileName[fileName.length - 1]; // const isTypeOk = props.fileType.indexOf(fileExt) >= 0; // if (!isTypeOk) { // proxy?.$modal.msgError(`文件格式不正确, 请上传${props.fileType.join("/")}格式文件!`); // return false; // } // } // 校检文件大小 if (props.fileSize) { const isLt = file.size / 1024 / 1024 < props.fileSize; @@ -135,10 +168,16 @@ const handleUploadError = () => { proxy?.$modal.msgError("上传文件失败"); } const handleUploadProgress=(e: any) => { downloadLoadingInstance = ElLoading.service({ text: '正在上传文件,请稍候', background: 'rgba(0, 0, 0, 0.7)' }); } // 上传成功回调 const handleUploadSuccess = (res: any, file: UploadFile) => { if (res.code === 200) { emit('closePopup') console.log('调用父组件'); fileUploadRef.value!.clearFiles() downloadLoadingInstance.close(); uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); uploadedSuccessfully(); } else { @@ -147,6 +186,7 @@ proxy?.$modal.msgError(res.msg); fileUploadRef.value?.handleRemove(file); uploadedSuccessfully(); downloadLoadingInstance.close(); } } src/layout/components/Navbar.vue
@@ -4,7 +4,7 @@ <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" /> <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" /> <div class="right-menu flex align-center"> <div class="right-menu flex align-center" style="display:none;"> <template v-if="appStore.device !== 'mobile'"> <!-- <el-select--> <!-- v-model="companyName"--> src/views/index.vue
@@ -10,9 +10,9 @@ <el-form-item label="原名" prop="originalName"> <el-input v-model="queryParams.originalName" placeholder="请输入原名" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="文件后缀" prop="fileSuffix"> <el-input v-model="queryParams.fileSuffix" placeholder="请输入文件后缀" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> <!-- <el-form-item label="文件后缀" prop="fileSuffix">--> <!-- <el-input v-model="queryParams.fileSuffix" placeholder="请输入文件后缀" clearable style="width: 200px" @keyup.enter="handleQuery" />--> <!-- </el-form-item>--> <!-- <el-form-item label="创建时间">--> <!-- <el-date-picker--> <!-- v-model="dateRangeCreateTime"--> @@ -42,12 +42,12 @@ <el-col :span="1.5"> <el-button type="primary" plain icon="Upload" @click="handleFile" v-if="isContains(useUserStore().permissions, 'system:oss:upload')">上传文件</el-button> </el-col> <el-col :span="1.5"> <el-button type="primary" plain icon="Upload" @click="handleImage" v-if="isContains(useUserStore().permissions, 'system:oss:upload')">上传图片</el-button> </el-col> <el-col :span="1.5"> <el-button type="primary" plain icon="Upload" @click="handleVideo" v-if="isContains(useUserStore().permissions, 'system:oss:upload')">上传视频</el-button> </el-col> <!-- <el-col :span="1.5">--> <!-- <el-button type="primary" plain icon="Upload" @click="handleImage" v-if="isContains(useUserStore().permissions, 'system:oss:upload')">上传图片</el-button>--> <!-- </el-col>--> <!-- <el-col :span="1.5">--> <!-- <el-button type="primary" plain icon="Upload" @click="handleVideo" v-if="isContains(useUserStore().permissions, 'system:oss:upload')">上传视频</el-button>--> <!-- </el-col>--> <el-col :span="1.5"> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-if="isContains(useUserStore().permissions, 'system:oss:remove')"> 删除 @@ -83,7 +83,7 @@ <!-- <el-table-column label="对象存储主键" align="center" prop="ossId" v-if="true" />--> <!-- <el-table-column label="文件名" align="center" prop="fileName" />--> <el-table-column label="原名" align="center" prop="originalName" /> <el-table-column label="文件后缀" align="center" prop="fileSuffix" /> <!-- <el-table-column label="文件后缀" align="center" prop="fileSuffix" />--> <!-- <el-table-column label="文件展示" align="center" prop="url">--> <!-- <template #default="scope">--> <!-- <ImagePreview--> @@ -96,11 +96,11 @@ <!-- <span v-text="scope.row.url" v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" />--> <!-- </template>--> <!-- </el-table-column>--> <el-table-column label="创建时间" align="center" prop="createTime" width="180" sortable="custom"> <template #default="scope"> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180" sortable="custom">--> <!-- <template #default="scope">--> <!-- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>--> <!-- </template>--> <!-- </el-table-column>--> <el-table-column label="上传人" align="center" prop="createByName" /> <!-- <el-table-column label="服务商" align="center" prop="service" sortable="custom" />--> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> @@ -124,7 +124,7 @@ <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-form ref="ossFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="文件名"> <fileUpload v-model="form.file" v-if="type === 0" /> <fileUpload ref="childFile" @closePopup="getList()" v-model="form.file" v-if="type === 0" /> <imageUpload v-model="form.file" v-if="type === 1" /> <video-upload v-model="form.file" v-if="type === 2" />" </el-form-item> @@ -189,6 +189,7 @@ const inputRef = ref<any>() const inputSty =ref<any>() const currentIp = ref('') const childFile = ref<any>() // 默认排序 const defaultSort = ref({ prop: 'createTime', order: 'ascending' }); @@ -341,9 +342,12 @@ dialog.title = "上传视频"; } /** 提交按钮 */ const submitForm = () => { const submitForm = async () => { await childFile.value.handleCilck() dialog.visible = false; getList(); // setTimeout(() =>{ getList();},1000) } const handleCode = async (row: OssVO) => { console.log(row, row.ossId); src/views/monitor/operlog/index.vue
@@ -7,33 +7,33 @@ <el-form-item label="操作地址" prop="operIp"> <el-input v-model="queryParams.operIp" placeholder="请输入操作地址" clearable style="width: 240px;" @keyup.enter="handleQuery"/> </el-form-item> <el-form-item label="系统模块" prop="title"> <el-input v-model="queryParams.title" placeholder="请输入系统模块" clearable style="width: 240px;" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="操作人员" prop="operName"> <el-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px;" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="类型" prop="businessType"> <el-select v-model="queryParams.businessType" placeholder="操作类型" clearable style="width: 240px"> <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="状态" prop="status"> <el-select v-model="queryParams.status" placeholder="操作状态" clearable style="width: 240px"> <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="操作时间" style="width: 308px"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" ></el-date-picker> </el-form-item> <!-- <el-form-item label="系统模块" prop="title">--> <!-- <el-input v-model="queryParams.title" placeholder="请输入系统模块" clearable style="width: 240px;" @keyup.enter="handleQuery" />--> <!-- </el-form-item>--> <!-- <el-form-item label="操作人员" prop="operName">--> <!-- <el-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px;" @keyup.enter="handleQuery" />--> <!-- </el-form-item>--> <!-- <el-form-item label="类型" prop="businessType">--> <!-- <el-select v-model="queryParams.businessType" placeholder="操作类型" clearable style="width: 240px">--> <!-- <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item label="状态" prop="status">--> <!-- <el-select v-model="queryParams.status" placeholder="操作状态" clearable style="width: 240px">--> <!-- <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item label="操作时间" style="width: 308px">--> <!-- <el-date-picker--> <!-- v-model="dateRange"--> <!-- value-format="YYYY-MM-DD HH:mm:ss"--> <!-- type="daterange"--> <!-- range-separator="-"--> <!-- start-placeholder="开始日期"--> <!-- end-placeholder="结束日期"--> <!-- :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"--> <!-- ></el-date-picker>--> <!-- </el-form-item>--> <el-form-item> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button> @@ -77,15 +77,15 @@ <dict-tag :options="sys_oper_type" :value="scope.row.businessType" /> </template> </el-table-column> <el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> <!-- <el-table-column--> <!-- label="操作人员"--> <!-- align="center"--> <!-- width="110"--> <!-- prop="operName"--> <!-- :show-overflow-tooltip="true"--> <!-- sortable="custom"--> <!-- :sort-orders="['descending', 'ascending']"--> <!-- />--> <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" /> <el-table-column label="操作状态" align="center" prop="status"> <template #default="scope"> @@ -97,26 +97,26 @@ <span>{{ parseTime(scope.row.operTime) }}</span> </template> </el-table-column> <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" > <template #default="scope"> <span>{{ scope.row.costTime }}毫秒</span> </template> </el-table-column> <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="详细" placement="top"> <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:operlog:query']"> </el-button> </el-tooltip> </template> </el-table-column> <!-- <el-table-column--> <!-- label="消耗时间"--> <!-- align="center"--> <!-- prop="costTime"--> <!-- width="110"--> <!-- :show-overflow-tooltip="true"--> <!-- sortable="custom"--> <!-- :sort-orders="['descending', 'ascending']"--> <!-- >--> <!-- <template #default="scope">--> <!-- <span>{{ scope.row.costTime }}毫秒</span>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">--> <!-- <template #default="scope">--> <!-- <el-tooltip content="详细" placement="top">--> <!-- <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:operlog:query']"> </el-button>--> <!-- </el-tooltip>--> <!-- </template>--> <!-- </el-table-column>--> </el-table> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />