1 files renamed
1 files modified
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getMedia, deleteAllFile } from '@/api/media/media'; // 导入媒体相关的 API 方法 |
| | | import { getAirportList } from '@/api/device/device'; // 导入设备相关的 API 方法 |
| | | import { mapGetters } from 'vuex'; // 从 Vuex 导入 mapGetters |
| | | import func from '@/utils/func'; // 导入工具函数 |
| | | import { getMedia, deleteAllFile } from '@/api/resource/media'; |
| | | import { getAirportList } from '@/api/device/device'; |
| | | import { mapGetters } from 'vuex'; |
| | | import func from '@/utils/func'; |
| | | |
| | | export default { |
| | | data() { |
| | | // 计算默认的开始和结束日期 |
| | | const endDate = new Date(); // 当前日期 |
| | | const startDate = new Date(); // 一个月前的日期 |
| | | startDate.setMonth(startDate.getMonth() - 1); |
| | | |
| | | // 格式化为 YYYY-MM-DD 字符串,与 valueFormat 一致 |
| | | const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`; |
| | | const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`; |
| | | |
| | | return { |
| | | form: {}, // 表单数据对象 |
| | | query: {}, // 搜索查询条件 |
| | | loading: true, // 表格加载状态 |
| | | page: { // 分页数据 |
| | | pageSize: 10, // 每页显示数量 |
| | | currentPage: 1, // 当前页码 |
| | | total: 0, // 总记录数 |
| | | form: {}, |
| | | // 初始化 query,设置默认时间范围 |
| | | query: { |
| | | daterange: [defaultStartDate, defaultEndDate] |
| | | }, |
| | | taskBox: false, // 控制弹窗显示状态 |
| | | selectionList: [], // 选中的行数据列表 |
| | | selectedWorkspaceId: null, // 选中的工作区 ID |
| | | option: { // Avue CRUD 表格配置 |
| | | height: 'auto', // 表格高度自动调整 |
| | | calcHeight: 32, // 计算高度的偏移量 |
| | | tip: false, // 不显示提示 |
| | | searchShow: true, // 显示搜索栏 |
| | | searchMenuSpan: 6,// 搜索栏宽度占比 |
| | | border: true, // 显示边框 |
| | | index: true, // 显示序号列 |
| | | viewBtn: true, // 显示查看按钮 |
| | | selection: true, // 允许多选 |
| | | dialogClickModal: false, // 对话框点击遮罩不关闭 |
| | | delBtn: false, // 不显示默认删除按钮 |
| | | column: [ // 表格列配置 |
| | | loading: true, |
| | | page: { |
| | | pageSize: 10, |
| | | currentPage: 1, |
| | | total: 0, |
| | | }, |
| | | taskBox: false, |
| | | selectionList: [], |
| | | selectedWorkspaceId: null, |
| | | option: { |
| | | height: 'auto', |
| | | calcHeight: 32, |
| | | tip: false, |
| | | searchShow: true, |
| | | searchMenuSpan: 6, |
| | | border: true, |
| | | index: true, |
| | | viewBtn: true, |
| | | selection: true, |
| | | dialogClickModal: false, |
| | | delBtn: false, |
| | | column: [ |
| | | { |
| | | label: '机场选择', // 列标题 |
| | | prop: 'airportNickname', // 数据字段 |
| | | type: 'select', // 下拉选择类型 |
| | | search: true, // 可搜索 |
| | | searchSpan: 5, // 搜索栏宽度占比 |
| | | dicData: [], // 下拉选项数据 |
| | | props: { // 下拉选项映射 |
| | | label: '机场选择', |
| | | prop: 'airportNickname', |
| | | type: 'select', |
| | | search: true, |
| | | searchSpan: 5, |
| | | dicData: [], |
| | | props: { |
| | | label: 'nickname', |
| | | value: 'nickname', |
| | | }, |
| | | hide: true, // 默认隐藏 |
| | | hide: true, |
| | | }, |
| | | { |
| | | label: '创建日期', // 列标题 |
| | | prop: 'daterange', // 数据字段 |
| | | type: 'daterange', // 日期范围选择类型 |
| | | search: true, // 可搜索 |
| | | searchRange: true, // 支持范围搜索 |
| | | searchSpan: 6, // 搜索栏宽度占比 |
| | | format: 'YYYY-MM-DD', // 显示格式 |
| | | valueFormat: 'YYYY-MM-DD', // 值格式 |
| | | startPlaceholder: '开始时间', // 开始时间占位符 |
| | | endPlaceholder: '结束时间', // 结束时间占位符 |
| | | viewDisplay: false, // 查看时不显示 |
| | | hide: true, // 默认隐藏 |
| | | value: [new Date(new Date().setMonth(new Date().getMonth() - 1)), new Date()], // 默认值:过去一个月至今 |
| | | label: '创建日期', |
| | | prop: 'daterange', |
| | | type: 'daterange', |
| | | search: true, |
| | | searchRange: true, |
| | | searchSpan: 6, |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD', |
| | | startPlaceholder: '开始时间', |
| | | endPlaceholder: '结束时间', |
| | | viewDisplay: false, |
| | | hide: true, |
| | | searchValue: [defaultStartDate, defaultEndDate] // 设置搜索表单默认值,确保显示 |
| | | }, |
| | | { label: '任务名称', prop: 'job_name' }, // 任务名称列 |
| | | { label: '文件名称', prop: 'file_name' }, // 文件名称列 |
| | | { label: '拍摄时间', prop: 'create_time' }, // 拍摄时间列 |
| | | { label: '文件路径', prop: 'object_key' }, // 文件路径列 |
| | | { label: '设备负载', prop: 'payload' }, // 设备负载列 |
| | | { label: '任务名称', prop: 'job_name' }, |
| | | { label: '文件名称', prop: 'file_name' }, |
| | | { label: '拍摄时间', prop: 'create_time' }, |
| | | { label: '文件路径', prop: 'object_key' }, |
| | | { label: '设备负载', prop: 'payload' }, |
| | | ], |
| | | }, |
| | | data: [], // 表格数据 |
| | | taskForm: {}, // 弹窗表单数据 |
| | | taskOption: { // 弹窗表单配置 |
| | | submitBtn: false, // 不显示提交按钮 |
| | | emptyBtn: false, // 不显示清空按钮 |
| | | column: [ // 表单列配置 |
| | | data: [], |
| | | taskForm: {}, |
| | | taskOption: { |
| | | submitBtn: false, |
| | | emptyBtn: false, |
| | | column: [ |
| | | { |
| | | label: '任务上传', // 上传字段标题 |
| | | prop: 'taskFile', // 数据字段 |
| | | type: 'upload', // 上传类型 |
| | | drag: true, // 支持拖拽上传 |
| | | loadText: '任务上传中,请稍等', // 上传中提示 |
| | | span: 24, // 占用整行 |
| | | propsHttp: { // HTTP 响应映射 |
| | | label: '任务上传', |
| | | prop: 'taskFile', |
| | | type: 'upload', |
| | | drag: true, |
| | | loadText: '任务上传中,请稍等', |
| | | span: 24, |
| | | propsHttp: { |
| | | res: 'data', |
| | | }, |
| | | action: '/blade-resource/oss/endpoint/put-file-task', // 上传接口地址 |
| | | action: '/blade-resource/oss/endpoint/put-file-task', |
| | | }, |
| | | ], |
| | | }, |
| | | domainUrl: '', // 媒体文件域名,从 API 获取 |
| | | domainUrl: '', |
| | | }; |
| | | }, |
| | | computed: { |
| | | func() { // 计算属性,返回工具函数 |
| | | func() { |
| | | return func; |
| | | }, |
| | | ...mapGetters(['permission']), // 从 Vuex 获取权限数据 |
| | | permissionList() { // 计算权限列表 |
| | | ...mapGetters(['permission']), |
| | | permissionList() { |
| | | return { |
| | | addBtn: false, // 不显示添加按钮 |
| | | editBtn: false, // 不显示编辑按钮 |
| | | viewBtn: this.validData(this.permission.attach_view, false), // 查看权限 |
| | | delBtn: this.validData(this.permission.attach_delete, false), // 删除权限 |
| | | addBtn: false, |
| | | editBtn: false, |
| | | viewBtn: this.validData(this.permission.attach_view, false), |
| | | delBtn: this.validData(this.permission.attach_delete, false), |
| | | }; |
| | | }, |
| | | ids() { // 计算选中的行 ID 列表 |
| | | ids() { |
| | | let ids = []; |
| | | this.selectionList.forEach(ele => { |
| | | ids.push(ele.id); |
| | |
| | | return ids.join(','); |
| | | }, |
| | | }, |
| | | mounted() { // 组件挂载时执行 |
| | | this.loadAirportList(); // 加载机场列表 |
| | | this.onLoad(this.page); // 加载初始数据 |
| | | mounted() { |
| | | this.loadAirportList(); |
| | | // 初始化时强制设置搜索表单默认值并加载数据 |
| | | this.$refs.crud.setSearch({ daterange: this.query.daterange }); |
| | | this.onLoad(this.page, this.query); |
| | | }, |
| | | methods: { |
| | | // 加载机场下拉列表数据 |
| | | loadAirportList() { |
| | | getAirportList().then(res => { |
| | | const airportData = res.data.data || []; |
| | |
| | | console.error('加载机场列表时出错:', error); |
| | | }); |
| | | }, |
| | | // 打开上传弹窗 |
| | | handleUpload() { |
| | | this.taskBox = true; |
| | | }, |
| | | // 处理上传完成后的操作 |
| | | uploadAfter(res, done) { |
| | | this.taskBox = false; // 关闭弹窗 |
| | | this.refreshChange(); // 刷新表格 |
| | | done(); // 完成上传 |
| | | this.taskBox = false; |
| | | this.refreshChange(); |
| | | done(); |
| | | }, |
| | | // 删除单行数据 |
| | | handleRowDelete(row) { |
| | | this.$confirm('确定删除此文件?', { |
| | | confirmButtonText: '确定', |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then(() => { |
| | | return deleteAllFile(row.id); // 调用删除 API |
| | | return deleteAllFile(row.id); |
| | | }) |
| | | .then(() => { |
| | | this.onLoad(this.page); // 重新加载数据 |
| | | this.onLoad(this.page); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: '删除成功!', |
| | |
| | | }); |
| | | }); |
| | | }, |
| | | // 删除行(由 avue-crud 触发) |
| | | rowDel(row) { |
| | | this.$confirm('确定将选择数据及对应的文件删除?', { |
| | | confirmButtonText: '确定', |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then(() => { |
| | | return deleteAllFile(row.id); // 调用删除 API |
| | | return deleteAllFile(row.id); |
| | | }) |
| | | .then(() => { |
| | | this.onLoad(this.page); // 重新加载数据 |
| | | this.onLoad(this.page); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: '操作成功!', |
| | | }); |
| | | }); |
| | | }, |
| | | // 重置搜索条件 |
| | | searchReset() { |
| | | this.query = {}; |
| | | // 重置时恢复默认值 |
| | | const endDate = new Date(); |
| | | const startDate = new Date(); |
| | | startDate.setMonth(startDate.getMonth() - 1); |
| | | const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`; |
| | | const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`; |
| | | this.query = { |
| | | daterange: [defaultStartDate, defaultEndDate] |
| | | }; |
| | | this.selectedWorkspaceId = null; |
| | | this.onLoad(this.page); |
| | | // 更新搜索表单显示 |
| | | this.$refs.crud.setSearch({ daterange: this.query.daterange }); |
| | | this.onLoad(this.page, this.query); |
| | | }, |
| | | // 处理搜索条件变化 |
| | | searchChange(params, done) { |
| | | this.query = params; |
| | | this.page.currentPage = 1; |
| | |
| | | this.onLoad(this.page, params); |
| | | done(); |
| | | }, |
| | | // 更新选中的行列表 |
| | | selectionChange(list) { |
| | | this.selectionList = list; |
| | | }, |
| | | // 清空选择 |
| | | selectionClear() { |
| | | this.selectionList = []; |
| | | this.$refs.crud.toggleSelection(); |
| | | }, |
| | | // 处理页码变化 |
| | | currentChange(currentPage) { |
| | | this.page.currentPage = currentPage; |
| | | this.onLoad(this.page, this.query); |
| | | }, |
| | | // 处理每页数量变化 |
| | | sizeChange(pageSize) { |
| | | this.page.pageSize = pageSize; |
| | | this.onLoad(this.page, this.query); |
| | | }, |
| | | // 刷新表格数据 |
| | | refreshChange() { |
| | | this.onLoad(this.page, this.query); |
| | | }, |
| | | // 从 API 加载表格数据 |
| | | onLoad(page, params = {}) { |
| | | this.loading = true; |
| | | const { daterange } = params; |
| | | let create_time = this.create_time; |
| | | let end_time = this.end_time; |
| | | let create_time = null; // 修改为 null,避免未定义变量引用 |
| | | let end_time = null; |
| | | |
| | | if (daterange && Array.isArray(daterange) && daterange.length === 2) { |
| | | const startStr = daterange[0]; |
| | |
| | | airportNickname: item.airportNickname, |
| | | id: item.id, |
| | | })); |
| | | this.domainUrl = data.data.list.length > 0 ? data.data.list[0].domain_url : 'http://localhost:2888/manage/resource'; // 设置域名 |
| | | this.domainUrl = data.data.list.length > 0 ? data.data.list[0].domain_url : 'http://localhost:2888/manage/resource'; |
| | | } else { |
| | | this.data = []; |
| | | } |
| | |
| | | console.error('加载媒体数据时出错:', error); |
| | | }); |
| | | }, |
| | | // 格式化时间戳为可读日期 |
| | | formatCreateTime(createTime) { |
| | | if (typeof createTime !== 'number' || isNaN(createTime)) { |
| | | return ''; |
| | |
| | | const seconds = String(date.getSeconds()).padStart(2, '0'); |
| | | return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
| | | }, |
| | | // 处理查看行(打开图片或视频) |
| | | handleRowView(row) { |
| | | const mediaUrl = this.domainUrl + row.object_key; // 拼接完整媒体 URL |
| | | const mediaType = this.getMediaType(row.object_key); // 判断媒体类型 |
| | | const mediaUrl = this.domainUrl + row.object_key; |
| | | const mediaType = this.getMediaType(row.object_key); |
| | | |
| | | if (mediaType === 'image') { |
| | | window.open(mediaUrl, '_blank'); // 图片在新窗口打开 |
| | | } else if (mediaType === 'video') { |
| | | // 临时测试:视频也在新窗口打开 |
| | | window.open(mediaUrl, '_blank'); |
| | | // this.showVideo(mediaUrl); // 原逻辑:视频在弹窗中播放 |
| | | } else if (mediaType === 'video') { |
| | | window.open(mediaUrl, '_blank'); |
| | | } |
| | | }, |
| | | // 判断文件是图片还是视频 |
| | | getMediaType(objectKey) { |
| | | const extension = objectKey.split('.').pop().toLowerCase(); // 获取文件扩展名 |
| | | const extension = objectKey.split('.').pop().toLowerCase(); |
| | | if (['jpg', 'jpeg', 'png', 'gif'].includes(extension)) { |
| | | return 'image'; // 是图片 |
| | | return 'image'; |
| | | } else if (['mp4', 'avi', 'mov'].includes(extension)) { |
| | | return 'video'; // 是视频 |
| | | return 'video'; |
| | | } |
| | | return 'unknown'; // 未知类型 |
| | | return 'unknown'; |
| | | }, |
| | | // 在弹窗中显示视频 |
| | | showVideo(url) { |
| | | this.taskBox = true; // 打开弹窗 |
| | | this.taskBox = true; |
| | | this.taskForm = { |
| | | videoUrl: url, // 设置视频 URL |
| | | videoUrl: url, |
| | | }; |
| | | this.taskOption = { // 配置视频播放选项 |
| | | this.taskOption = { |
| | | submitBtn: false, |
| | | emptyBtn: false, |
| | | column: [ |
| | |
| | | type: 'video', |
| | | span: 24, |
| | | props: { |
| | | controls: true, // 显示控制条 |
| | | autoplay: false, // 不自动播放 |
| | | controls: true, |
| | | autoplay: false, |
| | | }, |
| | | }, |
| | | ], |
| | | }; |
| | | }, |
| | | // 检查权限有效性(假设这是定义在其他地方的工具方法) |
| | | validData(val, def) { |
| | | return typeof val !== 'undefined' ? val : def; |
| | | }, |